From f23ecaf4e1fe23343684b2fe8ac607a30f323adf Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 21 May 2022 22:42:21 -0700 Subject: [PATCH 001/252] Turn prettier off in eslint --- .eslintrc.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index b62c1067b7..a220dbb2de 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -64,6 +64,7 @@ "rules": { "import/no-unresolved": "off", "import/named": "off", - "import/namespace": "off" + "import/namespace": "off", + "prettier/prettier": "off" } } From bf27e7167ba7636e0aca0321309556f448b9a9c9 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 21 May 2022 22:43:04 -0700 Subject: [PATCH 002/252] Modify subscribe to mutate instead of creating a new array each update --- packages/fiber/src/core/store.ts | 39 ++++++++++++++------------------ 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 49a1991fd0..8ec2aacc5d 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -286,29 +286,24 @@ const createStore = ( priority: number, store: UseBoundStore>, ) => { - set(({ internal }) => ({ - internal: { - ...internal, - // If this subscription was given a priority, it takes rendering into its own hands - // For that reason we switch off automatic rendering and increase the manual flag - // As long as this flag is positive there can be no internal rendering at all - // because there could be multiple render subscriptions - priority: internal.priority + (priority > 0 ? 1 : 0), - // Register subscriber and sort layers from lowest to highest, meaning, - // highest priority renders last (on top of the other frames) - subscribers: [...internal.subscribers, { ref, priority, store }].sort((a, b) => a.priority - b.priority), - }, - })) + const internal = get().internal + // If this subscription was given a priority, it takes rendering into its own hands + // For that reason we switch off automatic rendering and increase the manual flag + // As long as this flag is positive there can be no internal rendering at all + // because there could be multiple render subscriptions + internal.priority = internal.priority + (priority > 0 ? 1 : 0) + internal.subscribers.push({ ref, priority, store }) + // Register subscriber and sort layers from lowest to highest, meaning, + // highest priority renders last (on top of the other frames) + internal.subscribers = internal.subscribers.sort((a, b) => a.priority - b.priority) return () => { - set(({ internal }) => ({ - internal: { - ...internal, - // Decrease manual flag if this subscription had a priority - priority: internal.priority - (priority > 0 ? 1 : 0), - // Remove subscriber from list - subscribers: internal.subscribers.filter((s) => s.ref !== ref), - }, - })) + const internal = get().internal + if (internal?.subscribers) { + // Decrease manual flag if this subscription had a priority + internal.priority = internal.priority - (priority > 0 ? 1 : 0) + // Remove subscriber from list + internal.subscribers = internal.subscribers.filter((s) => s.ref !== ref) + } } }, }, From 76fc37eae43e142770262cdce21814b72e432c6c Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 23 May 2022 08:56:53 -0700 Subject: [PATCH 003/252] Initial implementation of useUpdate --- example/src/demos/Update.tsx | 59 +++++++++++++++ example/src/demos/index.tsx | 2 + packages/fiber/src/core/hooks.tsx | 14 ++++ packages/fiber/src/core/index.tsx | 11 +++ packages/fiber/src/core/loop.ts | 4 ++ packages/fiber/src/core/stages.ts | 116 ++++++++++++++++++++++++++++++ packages/fiber/src/core/store.ts | 26 ++++--- 7 files changed, 223 insertions(+), 9 deletions(-) create mode 100644 example/src/demos/Update.tsx create mode 100644 packages/fiber/src/core/stages.ts diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx new file mode 100644 index 0000000000..45aee62e23 --- /dev/null +++ b/example/src/demos/Update.tsx @@ -0,0 +1,59 @@ +import React, { useState, useRef } from 'react' +import { Canvas, useThree, useUpdate } from '@react-three/fiber' +import { a, useSpring } from '@react-spring/three' +import { OrbitControls } from '@react-three/drei' +import { Group } from 'three' + +// TODO: Test creating a custom pipeline. +// TODO: Create method for modifying FixedStage options. +// TODO: Decide best way to pass through remainder/factor for fixed states and write interp example. +// TODO: Add render with 'auto' | 'manual' options to root. +// TODO: Remove useFrame loop and move useFrame subscribers to the useUpdate loop (inside update stage?) +// TODO: Refactor priority and frames in the store. They are confusing and I don't think necessary. + +function Update() { + const groupRef = useRef(null!) + + const [active, setActive] = useState(0) + const state = useThree() + // create a common spring that will be used later to interpolate other values + const { spring } = useSpring({ + spring: active, + config: { mass: 5, tension: 400, friction: 50, precision: 0.0001 }, + }) + // interpolate values from common spring + const scale = spring.to([0, 1], [1, 2]) + const rotation = spring.to([0, 1], [0, Math.PI]) + + useUpdate(() => { + if (groupRef.current) { + groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 + } + }) + + useUpdate(({ clock }) => { + if (groupRef.current) { + const t = clock.getElapsedTime() + const scalar = (Math.sin(t) + 2) / 2 + groupRef.current.scale.set(scalar, scalar, scalar) + } + }, 'fixed') + + return ( + + setActive(Number(!active))}> + + + + + + ) +} + +export default function App() { + return ( + + + + ) +} diff --git a/example/src/demos/index.tsx b/example/src/demos/index.tsx index e2c31327e7..42ae2d5f5b 100644 --- a/example/src/demos/index.tsx +++ b/example/src/demos/index.tsx @@ -24,6 +24,7 @@ const Test = { Component: lazy(() => import('./Test')) } const Viewcube = { Component: lazy(() => import('./Viewcube')) } const Portals = { Component: lazy(() => import('./Portals')) } const ViewTracking = { Component: lazy(() => import('./ViewTracking')) } +const Update = { Component: lazy(() => import('./Update')) } export { Animation, @@ -50,4 +51,5 @@ export { MultiView, Portals, ViewTracking, + Update, } diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 246dcacc56..ebe5092e09 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -4,6 +4,7 @@ import { StateSelector, EqualityChecker } from 'zustand' import { suspend, preload, clear } from 'suspend-react' import { context, RootState, RenderCallback } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' +import { UpdateCallback } from './stages' export interface Loader extends THREE.Loader { load( @@ -51,6 +52,19 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): return null } +export function useUpdate(callback: UpdateCallback, stage: string = 'update'): null { + const stagesMap = useStore().getState().internal.stagesMap + const ref = useMutableCallback(callback) + useIsomorphicLayoutEffect(() => { + if (stagesMap[stage]) { + stagesMap[stage].add(ref) + } else { + throw `A '${stage}' stage does not exist.` + } + }, [stage]) + return null +} + /** * Returns a node graph of an object with named nodes & materials. * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usegraph diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 850f7fe093..16905953d8 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -31,6 +31,7 @@ import { setDeep, } from './utils' import { useStore } from './hooks' +import { Stage, StandardPipeline } from './stages' const roots = new Map() const { invalidate, advance } = createLoop(roots) @@ -98,6 +99,8 @@ export type RenderProps = { onCreated?: (state: RootState) => void /** Response for pointer clicks that have missed any target */ onPointerMissed?: (event: MouseEvent) => void + /** Create a custom pipeline of stages */ + pipeline?: Stage[] } const createRendererInstance = (gl: GLProps, canvas: TElement): THREE.WebGLRenderer => { @@ -169,6 +172,7 @@ function createRoot(canvas: TCanvas): ReconcilerRoot(canvas: TCanvas): ReconcilerRoot ({ performance: { ...state.performance, ...performance } })) + // Create update pipeline. If no custom pipeline is supplied, use the standard. + pipeline = pipeline ?? StandardPipeline + state.set(({ internal }) => ({ internal: { ...internal, stages: pipeline! } })) + for (const stage of pipeline) { + state.internal.stagesMap[stage.name] = stage + } + // Set locals onCreated = onCreatedCallback configured = true diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 82afb4a3a1..54983ef63d 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -54,6 +54,10 @@ function render(timestamp: number, state: RootState, frame?: THREE.XRFrame) { subscription = subscribers[i] subscription.ref.current(subscription.store.getState(), delta, frame) } + // Call subscribers (useUpdate) + for (const stage of state.internal.stages) { + stage.frame(state, delta, frame) + } // Render content if (!state.internal.priority && state.gl.render) state.gl.render(state.scene, state.camera) // Decrease frame count diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts new file mode 100644 index 0000000000..5f9c1da7e6 --- /dev/null +++ b/packages/fiber/src/core/stages.ts @@ -0,0 +1,116 @@ +import { MutableRefObject, useLayoutEffect, useRef } from 'react' +import { Root } from './renderer' +import { RootState } from './store' + +export interface UpdateCallback { + (state: RootState, delta: number, frame?: THREE.XRFrame | undefined): void +} + +export type UpdateCallbackRef = MutableRefObject + +export class Stage { + name: string + subscribers: UpdateCallbackRef[] + + constructor(name: string) { + this.name = name + this.subscribers = [] + } + + frame(state: RootState, delta: number, frame?: THREE.XRFrame | undefined) { + const subs = this.subscribers + + for (let i = 0; i < subs.length; i++) { + subs[i].current(state, delta) + } + } + + add(callback: UpdateCallbackRef) { + this.subscribers = [...this.subscribers, callback] + + return () => { + this.subscribers = this.subscribers.filter((cb) => { + return cb !== callback + }) + } + } +} + +const FPS_30 = 1 / 30 + +export class FixedStage extends Stage { + private fixedStep: number + private maxSubsteps: number + private accumulator: number + + constructor(name: string, fixedStep = FPS_30, maxSubSteps = 5) { + super(name) + + this.fixedStep = fixedStep + this.maxSubsteps = maxSubSteps + this.accumulator = 0 + } + + frame(state: RootState, delta: number, frame?: THREE.XRFrame | undefined) { + const initialTime = performance.now() + let substeps = 0 + + this.accumulator += delta + + while (this.accumulator >= this.fixedStep && substeps < this.maxSubsteps) { + this.accumulator -= this.fixedStep + substeps++ + + super.frame(state, this.fixedStep) + + if (performance.now() - initialTime > this.fixedStep * 1000) { + // The framerate is not interactive anymore. Better bail out. + break + } + } + // If the this.accumulator is bigger than delta, set it to 1. + // It should never be bigger than delta unless something went wrong. + this.accumulator = this.accumulator % this.fixedStep + } + + set(options: { fixedStep?: number; maxSubSteps?: number }) { + const { fixedStep, maxSubSteps } = options + if (fixedStep) this.fixedStep = fixedStep + if (maxSubSteps) this.maxSubsteps = maxSubSteps + } +} + +const Early = new Stage('early') +const Fixed = new FixedStage('fixed') +const Update = new Stage('update') +const Late = new Stage('late') +const Render = new Stage('render') +const After = new Stage('after') + +export const Standard = { Early, Fixed, Update, Late, Render, After } +export const StandardPipeline = [Early, Fixed, Update, Late, Render, After] + +// stages: readonly Stage[] + +// export function createPipelines(roots: Map) { +// roots.forEach((root) => { +// const stagesMap = root.store.getState().internal.stagesMap + +// for (const stage of stages) { +// stagesMap[stage.name] = stage +// } +// }) + +// const useUpdate = (callback: UpdateCallback, stage: typeof stages[number]['name']) => { +// const ref = useRef(callback) +// ref.current = callback + +// useLayoutEffect(() => { +// return stagesMap[stage].add(ref) +// }, [stage]) +// } + +// return { +// useUpdate, +// } +// } diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 8ec2aacc5d..cb03d3589c 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -4,6 +4,7 @@ import create, { GetState, SetState, StoreApi, UseBoundStore } from 'zustand' import { prepare } from './renderer' import { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' import { calculateDpr, Camera, isOrthographicCamera, updateCamera } from './utils' +import { Stage } from './stages' // Keys that shouldn't be copied between R3F stores export const privateKeys = [ @@ -64,17 +65,21 @@ export type Performance = { export type Renderer = { render: (scene: THREE.Scene, camera: THREE.Camera) => any } export const isRenderer = (def: any) => !!def?.render +export type StagesMap = { [key: string]: Stage } + export type InternalState = { - active: boolean - priority: number - frames: number - lastEvent: React.MutableRefObject interaction: THREE.Object3D[] hovered: Map> subscribers: Subscription[] capturedMap: Map> initialClick: [x: number, y: number] initialHits: THREE.Object3D[] + lastEvent: React.MutableRefObject + active: boolean + priority: number + frames: number + stages: Stage[] + stagesMap: StagesMap subscribe: ( callback: React.MutableRefObject, priority: number, @@ -269,18 +274,21 @@ const createStore = ( previousRoot: undefined, internal: { - active: false, - priority: 0, - frames: 0, - lastEvent: React.createRef(), - + // Events interaction: [], hovered: new Map>(), subscribers: [], initialClick: [0, 0], initialHits: [], capturedMap: new Map(), + lastEvent: React.createRef(), + // Updates + active: false, + priority: 0, + frames: 0, + stages: [], + stagesMap: {}, subscribe: ( ref: React.MutableRefObject, priority: number, From be934509d19afea3fa1704010c2dac1f126f1438 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 23 May 2022 11:44:16 -0700 Subject: [PATCH 004/252] Can supply custome pipeline. Throws an error if Standard.Update or Standard.Render is not included --- example/src/demos/Update.tsx | 22 +++++++++++++++++++--- packages/fiber/src/core/hooks.tsx | 4 ++-- packages/fiber/src/core/index.tsx | 6 +++++- packages/fiber/src/core/stages.ts | 25 ------------------------- packages/fiber/src/index.tsx | 1 + packages/fiber/src/native/Canvas.tsx | 2 ++ packages/fiber/src/web/Canvas.tsx | 2 ++ 7 files changed, 31 insertions(+), 31 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 45aee62e23..a95dc7a354 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -1,10 +1,11 @@ import React, { useState, useRef } from 'react' -import { Canvas, useThree, useUpdate } from '@react-three/fiber' +import { Canvas, FixedStage, Stage, Standard, useThree, useUpdate } from '@react-three/fiber' import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' import { Group } from 'three' +import { useEffect } from 'react' -// TODO: Test creating a custom pipeline. +// TODO: Throw error if Update or Render stage is not included. // TODO: Create method for modifying FixedStage options. // TODO: Decide best way to pass through remainder/factor for fixed states and write interp example. // TODO: Add render with 'auto' | 'manual' options to root. @@ -39,6 +40,8 @@ function Update() { } }, 'fixed') + useEffect(() => console.log(state), []) + return ( setActive(Number(!active))}> @@ -51,8 +54,21 @@ function Update() { } export default function App() { + const InputStage = new Stage('input') + const PhysicsStage = new FixedStage('physics') + const stages = [ + Standard.Early, + InputStage, + Standard.Fixed, + PhysicsStage, + Standard.Update, + Standard.Late, + Standard.Render, + Standard.After, + ] + return ( - + ) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index ebe5092e09..84e3a1de92 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -52,9 +52,10 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): return null } -export function useUpdate(callback: UpdateCallback, stage: string = 'update'): null { +export function useUpdate(callback: UpdateCallback, stage: string = 'update') { const stagesMap = useStore().getState().internal.stagesMap const ref = useMutableCallback(callback) + useIsomorphicLayoutEffect(() => { if (stagesMap[stage]) { stagesMap[stage].add(ref) @@ -62,7 +63,6 @@ export function useUpdate(callback: UpdateCallback, stage: string = 'update'): n throw `A '${stage}' stage does not exist.` } }, [stage]) - return null } /** diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 16905953d8..28723b6b7c 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -31,7 +31,7 @@ import { setDeep, } from './utils' import { useStore } from './hooks' -import { Stage, StandardPipeline } from './stages' +import { Stage, Standard, StandardPipeline } from './stages' const roots = new Map() const { invalidate, advance } = createLoop(roots) @@ -293,6 +293,10 @@ function createRoot(canvas: TCanvas): ReconcilerRoot ({ internal: { ...internal, stages: pipeline! } })) for (const stage of pipeline) { state.internal.stagesMap[stage.name] = stage diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 5f9c1da7e6..8c3cba09ef 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -89,28 +89,3 @@ const After = new Stage('after') export const Standard = { Early, Fixed, Update, Late, Render, After } export const StandardPipeline = [Early, Fixed, Update, Late, Render, After] - -// stages: readonly Stage[] - -// export function createPipelines(roots: Map) { -// roots.forEach((root) => { -// const stagesMap = root.store.getState().internal.stagesMap - -// for (const stage of stages) { -// stagesMap[stage.name] = stage -// } -// }) - -// const useUpdate = (callback: UpdateCallback, stage: typeof stages[number]['name']) => { -// const ref = useRef(callback) -// ref.current = callback - -// useLayoutEffect(() => { -// return stagesMap[stage].add(ref) -// }, [stage]) -// } - -// return { -// useUpdate, -// } -// } diff --git a/packages/fiber/src/index.tsx b/packages/fiber/src/index.tsx index 5307895cc0..119c0770dc 100644 --- a/packages/fiber/src/index.tsx +++ b/packages/fiber/src/index.tsx @@ -17,3 +17,4 @@ export type { ObjectMap, Camera } from './core/utils' export * from './web/Canvas' export { createPointerEvents as events } from './web/events' export * from './core' +export { Stage, FixedStage, Standard } from './core/stages' diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index 59cb45d121..692494e274 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -35,6 +35,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( camera, onPointerMissed, onCreated, + pipeline, ...props }, forwardedRef, @@ -98,6 +99,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( performance, raycaster, camera, + pipeline, // expo-gl can only render at native dpr/resolution // https://github.com/expo/expo-three/issues/39 dpr: PixelRatio.get(), diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 33551104c4..d5876b17a4 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -41,6 +41,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f camera, onPointerMissed, onCreated, + pipeline, ...props }, forwardedRef, @@ -82,6 +83,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f performance, raycaster, camera, + pipeline, size: { width, height }, // Pass mutable reference to onPointerMissed so it's free to update onPointerMissed: (...args) => handlePointerMissed.current?.(...args), From f3690b26606520544b707b59e69ec9acedc61ad2 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 23 May 2022 19:17:18 -0700 Subject: [PATCH 005/252] Add method to update FixedStage options --- example/src/demos/Update.tsx | 31 ++++++++++++++++++++++--------- packages/fiber/src/core/stages.ts | 4 +++- packages/fiber/src/core/store.ts | 19 +++++++++++++++---- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index a95dc7a354..c903844ec1 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -1,19 +1,21 @@ -import React, { useState, useRef } from 'react' +import React, { useState, useRef, useEffect } from 'react' import { Canvas, FixedStage, Stage, Standard, useThree, useUpdate } from '@react-three/fiber' import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' -import { Group } from 'three' -import { useEffect } from 'react' +import * as THREE from 'three' -// TODO: Throw error if Update or Render stage is not included. -// TODO: Create method for modifying FixedStage options. // TODO: Decide best way to pass through remainder/factor for fixed states and write interp example. // TODO: Add render with 'auto' | 'manual' options to root. // TODO: Remove useFrame loop and move useFrame subscribers to the useUpdate loop (inside update stage?) // TODO: Refactor priority and frames in the store. They are confusing and I don't think necessary. +// TODO: Add a maxDelta in loops for tab safety. (It keeps accumulating.) + +const colorA = new THREE.Color('#6246ea') +const colorB = new THREE.Color('#e45858') function Update() { - const groupRef = useRef(null!) + const groupRef = useRef(null!) + const matRef = useRef(null!) const [active, setActive] = useState(0) const state = useThree() @@ -26,7 +28,8 @@ function Update() { const scale = spring.to([0, 1], [1, 2]) const rotation = spring.to([0, 1], [0, Math.PI]) - useUpdate(() => { + useUpdate((state, dt) => { + // console.log(dt) if (groupRef.current) { groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 } @@ -38,15 +41,25 @@ function Update() { const scalar = (Math.sin(t) + 2) / 2 groupRef.current.scale.set(scalar, scalar, scalar) } + + if (matRef.current) { + const t = clock.getElapsedTime() + const factor = Math.sin(t) + 1 + matRef.current.color.lerpColors(colorA, colorB, factor) + } }, 'fixed') - useEffect(() => console.log(state), []) + useEffect(() => { + state.setFixedStage('fixed', { fixedStep: 1 / 60 }) + }, [state]) + + useEffect(() => console.log(state), [state]) return ( setActive(Number(!active))}> - + diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 8c3cba09ef..3422e828b6 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -8,6 +8,8 @@ export interface UpdateCallback { export type UpdateCallbackRef = MutableRefObject +export type FixedStageOptions = { fixedStep?: number; maxSubSteps?: number } + export class Stage { name: string subscribers: UpdateCallbackRef[] @@ -73,7 +75,7 @@ export class FixedStage extends Stage { this.accumulator = this.accumulator % this.fixedStep } - set(options: { fixedStep?: number; maxSubSteps?: number }) { + set(options: FixedStageOptions) { const { fixedStep, maxSubSteps } = options if (fixedStep) this.fixedStep = fixedStep if (maxSubSteps) this.maxSubsteps = maxSubSteps diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index cb03d3589c..19e858baff 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -4,7 +4,7 @@ import create, { GetState, SetState, StoreApi, UseBoundStore } from 'zustand' import { prepare } from './renderer' import { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' import { calculateDpr, Camera, isOrthographicCamera, updateCamera } from './utils' -import { Stage } from './stages' +import { FixedStage, FixedStageOptions, Stage } from './stages' // Keys that shouldn't be copied between R3F stores export const privateKeys = [ @@ -65,7 +65,8 @@ export type Performance = { export type Renderer = { render: (scene: THREE.Scene, camera: THREE.Camera) => any } export const isRenderer = (def: any) => !!def?.render -export type StagesMap = { [key: string]: Stage } +type StageTypes = Stage | FixedStage +export type StagesMap = { [key: string]: StageTypes } export type InternalState = { interaction: THREE.Object3D[] @@ -78,7 +79,7 @@ export type InternalState = { active: boolean priority: number frames: number - stages: Stage[] + stages: StageTypes[] stagesMap: StagesMap subscribe: ( callback: React.MutableRefObject, @@ -144,6 +145,8 @@ export type RootState = { setDpr: (dpr: Dpr) => void /** Shortcut to frameloop flags */ setFrameloop: (frameloop?: 'always' | 'demand' | 'never') => void + /** Shortcut to set FixedStage options */ + setFixedStage: (name: string, options: FixedStageOptions) => void /** When the canvas was clicked but nothing was hit */ onPointerMissed?: (event: MouseEvent) => void /** If this state model is layerd (via createPortal) then this contains the previous layer */ @@ -271,7 +274,15 @@ const createStore = ( } set(() => ({ frameloop })) }, - + setFixedStage: (name: string, options: FixedStageOptions) => { + const internal = get().internal + const stage = internal.stagesMap[name] + if (stage instanceof FixedStage) { + stage.set(options) + } else { + console.warn(`No FixedStage named ${name} exist.`) + } + }, previousRoot: undefined, internal: { // Events From d7a544c4df4eb0a01ef08ee6cf9443e7bc538eed Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Tue, 24 May 2022 00:53:15 -0700 Subject: [PATCH 006/252] Add factor to FixedStage and example for how to use it to interpolate --- example/src/demos/Update.tsx | 28 +++++++++++++++++----------- packages/fiber/src/core/stages.ts | 12 ++++++++++++ packages/fiber/src/core/store.ts | 19 +++++++++++++++---- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index c903844ec1..06fd87669a 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -4,7 +4,6 @@ import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' import * as THREE from 'three' -// TODO: Decide best way to pass through remainder/factor for fixed states and write interp example. // TODO: Add render with 'auto' | 'manual' options to root. // TODO: Remove useFrame loop and move useFrame subscribers to the useUpdate loop (inside update stage?) // TODO: Refactor priority and frames in the store. They are confusing and I don't think necessary. @@ -16,6 +15,7 @@ const colorB = new THREE.Color('#e45858') function Update() { const groupRef = useRef(null!) const matRef = useRef(null!) + const [fixed] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) const [active, setActive] = useState(0) const state = useThree() @@ -28,29 +28,35 @@ function Update() { const scale = spring.to([0, 1], [1, 2]) const rotation = spring.to([0, 1], [0, Math.PI]) - useUpdate((state, dt) => { - // console.log(dt) - if (groupRef.current) { - groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 - } - }) - useUpdate(({ clock }) => { if (groupRef.current) { const t = clock.getElapsedTime() const scalar = (Math.sin(t) + 2) / 2 - groupRef.current.scale.set(scalar, scalar, scalar) + fixed.scale.set(scalar, scalar, scalar) + // groupRef.current.scale.set(scalar, scalar, scalar) } if (matRef.current) { const t = clock.getElapsedTime() const factor = Math.sin(t) + 1 - matRef.current.color.lerpColors(colorA, colorB, factor) + fixed.color.lerpColors(colorA, colorB, factor) + // matRef.current.color.lerpColors(colorA, colorB, factor) } }, 'fixed') + useUpdate((state) => { + // With interpolation of the fixed stage + const factor = (state.getStage('fixed') as FixedStage)?.get().factor + groupRef.current.scale.lerp(fixed.scale, factor) + matRef.current.color.lerp(fixed.color, factor) + + if (groupRef.current) { + groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 + } + }) + useEffect(() => { - state.setFixedStage('fixed', { fixedStep: 1 / 60 }) + state.setStage('fixed', { fixedStep: 1 / 15 }) }, [state]) useEffect(() => console.log(state), [state]) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 3422e828b6..466ef39f78 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -44,6 +44,7 @@ export class FixedStage extends Stage { private fixedStep: number private maxSubsteps: number private accumulator: number + private factor: number constructor(name: string, fixedStep = FPS_30, maxSubSteps = 5) { super(name) @@ -51,6 +52,7 @@ export class FixedStage extends Stage { this.fixedStep = fixedStep this.maxSubsteps = maxSubSteps this.accumulator = 0 + this.factor = 0 } frame(state: RootState, delta: number, frame?: THREE.XRFrame | undefined) { @@ -73,6 +75,7 @@ export class FixedStage extends Stage { // If the this.accumulator is bigger than delta, set it to 1. // It should never be bigger than delta unless something went wrong. this.accumulator = this.accumulator % this.fixedStep + this.factor = this.accumulator / this.fixedStep } set(options: FixedStageOptions) { @@ -80,6 +83,15 @@ export class FixedStage extends Stage { if (fixedStep) this.fixedStep = fixedStep if (maxSubSteps) this.maxSubsteps = maxSubSteps } + + get() { + return { + fixedStep: this.fixedStep, + maxSubsteps: this.maxSubsteps, + accumulator: this.accumulator, + factor: this.factor, + } + } } const Early = new Stage('early') diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 19e858baff..676bdc2254 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -145,8 +145,10 @@ export type RootState = { setDpr: (dpr: Dpr) => void /** Shortcut to frameloop flags */ setFrameloop: (frameloop?: 'always' | 'demand' | 'never') => void - /** Shortcut to set FixedStage options */ - setFixedStage: (name: string, options: FixedStageOptions) => void + /** Shortcut to set stage options */ + setStage: (name: string, options: FixedStageOptions) => void + /** Convenience get function for stages */ + getStage: (name: string) => StageTypes | undefined /** When the canvas was clicked but nothing was hit */ onPointerMissed?: (event: MouseEvent) => void /** If this state model is layerd (via createPortal) then this contains the previous layer */ @@ -274,13 +276,22 @@ const createStore = ( } set(() => ({ frameloop })) }, - setFixedStage: (name: string, options: FixedStageOptions) => { + setStage: (name: string, options: FixedStageOptions) => { const internal = get().internal const stage = internal.stagesMap[name] if (stage instanceof FixedStage) { stage.set(options) } else { - console.warn(`No FixedStage named ${name} exist.`) + console.warn(`No FixedStage named ${name} exists.`) + } + }, + getStage: (name: string) => { + const internal = get().internal + const stage = internal.stagesMap[name] + if (stage) { + return stage + } else { + console.warn(`No Stage named ${name} exists.`) } }, previousRoot: undefined, From d721b52bb92c9577e1851d0d815c4e3c2ba57781 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Tue, 24 May 2022 10:42:26 -0700 Subject: [PATCH 007/252] Fix interpolation example. Rename factor to alpha --- example/src/demos/Update.tsx | 15 +++++++++------ packages/fiber/src/core/stages.ts | 8 ++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 06fd87669a..6b78b7b168 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -16,6 +16,7 @@ function Update() { const groupRef = useRef(null!) const matRef = useRef(null!) const [fixed] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) + const [prev] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) const [active, setActive] = useState(0) const state = useThree() @@ -32,23 +33,25 @@ function Update() { if (groupRef.current) { const t = clock.getElapsedTime() const scalar = (Math.sin(t) + 2) / 2 + prev.scale.copy(fixed.scale) fixed.scale.set(scalar, scalar, scalar) // groupRef.current.scale.set(scalar, scalar, scalar) } if (matRef.current) { const t = clock.getElapsedTime() - const factor = Math.sin(t) + 1 - fixed.color.lerpColors(colorA, colorB, factor) - // matRef.current.color.lerpColors(colorA, colorB, factor) + const alpha = Math.sin(t) + 1 + prev.color.copy(fixed.color) + fixed.color.lerpColors(colorA, colorB, alpha) + // matRef.current.color.lerpColors(colorA, colorB, alpha) } }, 'fixed') useUpdate((state) => { // With interpolation of the fixed stage - const factor = (state.getStage('fixed') as FixedStage)?.get().factor - groupRef.current.scale.lerp(fixed.scale, factor) - matRef.current.color.lerp(fixed.color, factor) + const alpha = (state.getStage('fixed') as FixedStage)?.get().alpha + groupRef.current.scale.lerpVectors(prev.scale, fixed.scale, alpha) + matRef.current.color.lerpColors(prev.color, fixed.color, alpha) if (groupRef.current) { groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 466ef39f78..fa9f251bf7 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -44,7 +44,7 @@ export class FixedStage extends Stage { private fixedStep: number private maxSubsteps: number private accumulator: number - private factor: number + private alpha: number constructor(name: string, fixedStep = FPS_30, maxSubSteps = 5) { super(name) @@ -52,7 +52,7 @@ export class FixedStage extends Stage { this.fixedStep = fixedStep this.maxSubsteps = maxSubSteps this.accumulator = 0 - this.factor = 0 + this.alpha = 0 } frame(state: RootState, delta: number, frame?: THREE.XRFrame | undefined) { @@ -75,7 +75,7 @@ export class FixedStage extends Stage { // If the this.accumulator is bigger than delta, set it to 1. // It should never be bigger than delta unless something went wrong. this.accumulator = this.accumulator % this.fixedStep - this.factor = this.accumulator / this.fixedStep + this.alpha = this.accumulator / this.fixedStep } set(options: FixedStageOptions) { @@ -89,7 +89,7 @@ export class FixedStage extends Stage { fixedStep: this.fixedStep, maxSubsteps: this.maxSubsteps, accumulator: this.accumulator, - factor: this.factor, + alpha: this.alpha, } } } From d4377bf1066d47104be7c429b883d6f4c6f8be4b Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Tue, 24 May 2022 10:54:51 -0700 Subject: [PATCH 008/252] Tryin an alternative method for working with stages in loops --- example/src/demos/Update.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 6b78b7b168..d4c134877d 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -1,4 +1,4 @@ -import React, { useState, useRef, useEffect } from 'react' +import React, { useState, useRef, useEffect, useMemo } from 'react' import { Canvas, FixedStage, Stage, Standard, useThree, useUpdate } from '@react-three/fiber' import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' @@ -19,7 +19,9 @@ function Update() { const [prev] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) const [active, setActive] = useState(0) - const state = useThree() + const getStage = useThree((state) => state.getStage) + const fixedStage = useMemo(() => getStage('fixed') as FixedStage, [getStage]) + // create a common spring that will be used later to interpolate other values const { spring } = useSpring({ spring: active, @@ -49,7 +51,10 @@ function Update() { useUpdate((state) => { // With interpolation of the fixed stage - const alpha = (state.getStage('fixed') as FixedStage)?.get().alpha + const alpha = fixedStage.get().alpha + // Can also get from inside the loop using state. + // const alpha = (state.getStage('fixed') as FixedStage).get().alpha + groupRef.current.scale.lerpVectors(prev.scale, fixed.scale, alpha) matRef.current.color.lerpColors(prev.color, fixed.color, alpha) @@ -59,10 +64,9 @@ function Update() { }) useEffect(() => { - state.setStage('fixed', { fixedStep: 1 / 15 }) - }, [state]) - - useEffect(() => console.log(state), [state]) + // state.setStage('fixed', { fixedStep: 1 / 15 }) + fixedStage.set({ fixedStep: 1 / 15 }) + }, [fixedStage]) return ( From 8b22ca34000e688bf282e5b68eaf28bb29d643d1 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 16:53:56 -0700 Subject: [PATCH 009/252] Add render flag. Remove setStage --- example/src/demos/Update.tsx | 6 ++++-- packages/fiber/src/core/index.tsx | 4 ++++ packages/fiber/src/core/loop.ts | 2 +- packages/fiber/src/core/store.ts | 21 ++++++++------------- packages/fiber/src/native/Canvas.tsx | 2 ++ packages/fiber/src/web/Canvas.tsx | 2 ++ 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index d4c134877d..a2049e5491 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -4,7 +4,7 @@ import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' import * as THREE from 'three' -// TODO: Add render with 'auto' | 'manual' options to root. +// ✅ Add render with 'auto' | 'manual' flags to root. // TODO: Remove useFrame loop and move useFrame subscribers to the useUpdate loop (inside update stage?) // TODO: Refactor priority and frames in the store. They are confusing and I don't think necessary. // TODO: Add a maxDelta in loops for tab safety. (It keeps accumulating.) @@ -63,6 +63,8 @@ function Update() { } }) + useUpdate(({ gl, scene, camera }) => gl.render(scene, camera), 'render') + useEffect(() => { // state.setStage('fixed', { fixedStep: 1 / 15 }) fixedStage.set({ fixedStep: 1 / 15 }) @@ -94,7 +96,7 @@ export default function App() { ] return ( - + ) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 28723b6b7c..178764143f 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -101,6 +101,7 @@ export type RenderProps = { onPointerMissed?: (event: MouseEvent) => void /** Create a custom pipeline of stages */ pipeline?: Stage[] + render?: 'auto' | 'manual' } const createRendererInstance = (gl: GLProps, canvas: TElement): THREE.WebGLRenderer => { @@ -173,6 +174,7 @@ function createRoot(canvas: TCanvas): ReconcilerRoot(canvas: TCanvas): ReconcilerRoot void /** Shortcut to manual setting the pixel ratio */ setDpr: (dpr: Dpr) => void - /** Shortcut to frameloop flags */ + /** Shortcut to setting frameloop flags */ setFrameloop: (frameloop?: 'always' | 'demand' | 'never') => void - /** Shortcut to set stage options */ - setStage: (name: string, options: FixedStageOptions) => void + /** Shortcut to setting render flags */ + setRender: (render?: 'auto' | 'manual') => void /** Convenience get function for stages */ getStage: (name: string) => StageTypes | undefined /** When the canvas was clicked but nothing was hit */ @@ -218,6 +220,7 @@ const createStore = ( mouse: pointer, frameloop: 'always', + render: 'auto', onPointerMissed: undefined, performance: { @@ -276,15 +279,7 @@ const createStore = ( } set(() => ({ frameloop })) }, - setStage: (name: string, options: FixedStageOptions) => { - const internal = get().internal - const stage = internal.stagesMap[name] - if (stage instanceof FixedStage) { - stage.set(options) - } else { - console.warn(`No FixedStage named ${name} exists.`) - } - }, + setRender: (render: 'auto' | 'manual' = 'auto') => set(() => ({ render })), getStage: (name: string) => { const internal = get().internal const stage = internal.stagesMap[name] diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index 692494e274..9789a0d2e9 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -36,6 +36,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( onPointerMissed, onCreated, pipeline, + render, ...props }, forwardedRef, @@ -100,6 +101,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( raycaster, camera, pipeline, + render, // expo-gl can only render at native dpr/resolution // https://github.com/expo/expo-three/issues/39 dpr: PixelRatio.get(), diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index d5876b17a4..8e5e098d95 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -42,6 +42,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f onPointerMissed, onCreated, pipeline, + render, ...props }, forwardedRef, @@ -84,6 +85,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f raycaster, camera, pipeline, + render, size: { width, height }, // Pass mutable reference to onPointerMissed so it's free to update onPointerMissed: (...args) => handlePointerMissed.current?.(...args), From 404be9726766b015bed1c6f330da4d1f1ba17e8e Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 17:06:17 -0700 Subject: [PATCH 010/252] FixedStages now takes an options object --- example/src/demos/Update.tsx | 21 +++++++++++++++------ packages/fiber/src/core/stages.ts | 8 ++++---- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index a2049e5491..8b1c0bd7b9 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -4,7 +4,12 @@ import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' import * as THREE from 'three' +// ✅ Create a custom pipeline for advanced usecases. +// ✅ Throw error if Update or Render stage is not included in a pipeline. +// ✅ Add alpha to FixedStage and write interpolation example. +// ✅ Add getStage method for interacting with Stages. Can get() and set() this way. // ✅ Add render with 'auto' | 'manual' flags to root. +// ✅ Update useFrame to use mutation for subscriptions. // TODO: Remove useFrame loop and move useFrame subscribers to the useUpdate loop (inside update stage?) // TODO: Refactor priority and frames in the store. They are confusing and I don't think necessary. // TODO: Add a maxDelta in loops for tab safety. (It keeps accumulating.) @@ -18,6 +23,7 @@ function Update() { const [fixed] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) const [prev] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) + const interpolate = true const [active, setActive] = useState(0) const getStage = useThree((state) => state.getStage) const fixedStage = useMemo(() => getStage('fixed') as FixedStage, [getStage]) @@ -37,7 +43,6 @@ function Update() { const scalar = (Math.sin(t) + 2) / 2 prev.scale.copy(fixed.scale) fixed.scale.set(scalar, scalar, scalar) - // groupRef.current.scale.set(scalar, scalar, scalar) } if (matRef.current) { @@ -45,7 +50,6 @@ function Update() { const alpha = Math.sin(t) + 1 prev.color.copy(fixed.color) fixed.color.lerpColors(colorA, colorB, alpha) - // matRef.current.color.lerpColors(colorA, colorB, alpha) } }, 'fixed') @@ -55,8 +59,13 @@ function Update() { // Can also get from inside the loop using state. // const alpha = (state.getStage('fixed') as FixedStage).get().alpha - groupRef.current.scale.lerpVectors(prev.scale, fixed.scale, alpha) - matRef.current.color.lerpColors(prev.color, fixed.color, alpha) + if (interpolate) { + groupRef.current.scale.lerpVectors(prev.scale, fixed.scale, alpha) + matRef.current.color.lerpColors(prev.color, fixed.color, alpha) + } else { + groupRef.current.scale.copy(fixed.scale) + matRef.current.color.copy(fixed.color) + } if (groupRef.current) { groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 @@ -65,8 +74,8 @@ function Update() { useUpdate(({ gl, scene, camera }) => gl.render(scene, camera), 'render') + // Modify the fixed stage's step at runtime. useEffect(() => { - // state.setStage('fixed', { fixedStep: 1 / 15 }) fixedStage.set({ fixedStep: 1 / 15 }) }, [fixedStage]) @@ -83,7 +92,7 @@ function Update() { export default function App() { const InputStage = new Stage('input') - const PhysicsStage = new FixedStage('physics') + const PhysicsStage = new FixedStage('physics', { fixedStep: 1 / 30 }) const stages = [ Standard.Early, InputStage, diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index fa9f251bf7..1ae4c8b624 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -38,7 +38,7 @@ export class Stage { } } -const FPS_30 = 1 / 30 +const FPS_50 = 1 / 50 export class FixedStage extends Stage { private fixedStep: number @@ -46,11 +46,11 @@ export class FixedStage extends Stage { private accumulator: number private alpha: number - constructor(name: string, fixedStep = FPS_30, maxSubSteps = 5) { + constructor(name: string, options?: { fixedStep?: number; maxSubSteps?: number }) { super(name) - this.fixedStep = fixedStep - this.maxSubsteps = maxSubSteps + this.fixedStep = options?.fixedStep ?? FPS_50 + this.maxSubsteps = options?.maxSubSteps ?? 6 this.accumulator = 0 this.alpha = 0 } From 6f143a49a2741def860da43cd33f4a3a69a3fa55 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 17:45:23 -0700 Subject: [PATCH 011/252] Rename render to update inside loop --- packages/fiber/src/core/loop.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 8233f1e7f5..901ec90f93 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -39,7 +39,7 @@ function run(effects: GlobalRenderCallback[], timestamp: number) { let subscribers: Subscription[] let subscription: Subscription -function render(timestamp: number, state: RootState, frame?: THREE.XRFrame) { +function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { // Run local effects let delta = state.clock.getDelta() // In frameloop='never' mode, clock times are updated using the provided timestamp @@ -88,7 +88,7 @@ export function createLoop(roots: Map) { (state.frameloop === 'always' || state.internal.frames > 0) && !state.gl.xr?.isPresenting ) { - repeat += render(timestamp, state) + repeat += update(timestamp, state) } }) @@ -125,8 +125,8 @@ export function createLoop(roots: Map) { frame?: THREE.XRFrame, ): void { if (runGlobalEffects) run(globalEffects, timestamp) - if (!state) roots.forEach((root) => render(timestamp, root.store.getState())) - else render(timestamp, state, frame) + if (!state) roots.forEach((root) => update(timestamp, root.store.getState())) + else update(timestamp, state, frame) if (runGlobalEffects) run(globalAfterEffects, timestamp) } From 38925124f67c94597a464b73f390f0b7bd91fa6c Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 20:01:58 -0700 Subject: [PATCH 012/252] Fix useUpdate not properly removing subscribers --- packages/fiber/src/core/hooks.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 84e3a1de92..998a6f623b 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -55,14 +55,8 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): export function useUpdate(callback: UpdateCallback, stage: string = 'update') { const stagesMap = useStore().getState().internal.stagesMap const ref = useMutableCallback(callback) - - useIsomorphicLayoutEffect(() => { - if (stagesMap[stage]) { - stagesMap[stage].add(ref) - } else { - throw `A '${stage}' stage does not exist.` - } - }, [stage]) + if (!stagesMap[stage]) throw `A '${stage}' stage does not exist.` + useIsomorphicLayoutEffect(() => stagesMap[stage].add(ref), [stage]) } /** From 3d4a93f57ec4b7fa50338b2086085a5ba2e98ca0 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 22:15:32 -0700 Subject: [PATCH 013/252] useFrame loop and render function integrated into the stages pipeline. priority flag deprecated for render --- example/src/demos/Update.tsx | 12 +++++++--- packages/fiber/src/core/loop.ts | 38 +++++++++++++++++++++++-------- packages/fiber/src/core/stages.ts | 4 ++-- packages/fiber/src/core/store.ts | 10 ++++++-- 4 files changed, 48 insertions(+), 16 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 8b1c0bd7b9..81335e18a7 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect, useMemo } from 'react' -import { Canvas, FixedStage, Stage, Standard, useThree, useUpdate } from '@react-three/fiber' +import { Canvas, FixedStage, Stage, Standard, useFrame, useThree, useUpdate } from '@react-three/fiber' import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' import * as THREE from 'three' @@ -10,7 +10,7 @@ import * as THREE from 'three' // ✅ Add getStage method for interacting with Stages. Can get() and set() this way. // ✅ Add render with 'auto' | 'manual' flags to root. // ✅ Update useFrame to use mutation for subscriptions. -// TODO: Remove useFrame loop and move useFrame subscribers to the useUpdate loop (inside update stage?) +// ✅ The useFrame loop is executed in the update stage. // TODO: Refactor priority and frames in the store. They are confusing and I don't think necessary. // TODO: Add a maxDelta in loops for tab safety. (It keeps accumulating.) @@ -56,7 +56,8 @@ function Update() { useUpdate((state) => { // With interpolation of the fixed stage const alpha = fixedStage.get().alpha - // Can also get from inside the loop using state. + + // Can also get from inside the loop using state // const alpha = (state.getStage('fixed') as FixedStage).get().alpha if (interpolate) { @@ -66,12 +67,17 @@ function Update() { groupRef.current.scale.copy(fixed.scale) matRef.current.color.copy(fixed.color) } + }) + // For backwards compatability, useFrame gets executed in the update stage + // A positive priority switches rendering to manual + useFrame(() => { if (groupRef.current) { groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 } }) + // Use our own render function by setting render to 'manual' useUpdate(({ gl, scene, camera }) => gl.render(scene, camera), 'render') // Modify the fixed stage's step at runtime. diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 901ec90f93..e74508bb5d 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -48,24 +48,17 @@ function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { state.clock.oldTime = state.clock.elapsedTime state.clock.elapsedTime = timestamp } - // Call subscribers (useFrame) - subscribers = state.internal.subscribers - for (i = 0; i < subscribers.length; i++) { - subscription = subscribers[i] - subscription.ref.current(subscription.store.getState(), delta, frame) - } // Call subscribers (useUpdate) for (const stage of state.internal.stages) { stage.frame(state, delta, frame) } - // Render content - if (!state.internal.priority && state.gl.render && state.render === 'auto') state.gl.render(state.scene, state.camera) - // Decrease frame count + state.internal.frames = Math.max(0, state.internal.frames - 1) return state.frameloop === 'always' ? 1 : state.internal.frames } export function createLoop(roots: Map) { + let init = true let running = false let repeat: number let frame: number @@ -82,6 +75,33 @@ export function createLoop(roots: Map) { // Render all roots roots.forEach((root) => { state = root.store.getState() + + // Initialize the loop on first run + if (init) { + // Add useFrame loop to update stage + const updateStage = state.getStage('update') + const frameCallback = { + current: (state: RootState, delta: number, frame?: THREE.XRFrame | undefined) => { + subscribers = state.internal.subscribers + for (i = 0; i < subscribers.length; i++) { + subscription = subscribers[i] + subscription.ref.current(subscription.store.getState(), delta, frame) + } + }, + } + updateStage!.add(frameCallback) + + // Add render callback to render stage + const renderStage = state.getStage('render') + const renderCallback = { + current: (state: RootState) => { + if (state.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) + }, + } + renderStage!.add(renderCallback) + init = false + } + // If the frameloop is invalidated, do not run another frame if ( state.internal.active && diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 1ae4c8b624..5b62d7d47a 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -23,7 +23,7 @@ export class Stage { const subs = this.subscribers for (let i = 0; i < subs.length; i++) { - subs[i].current(state, delta) + subs[i].current(state, delta, frame) } } @@ -65,7 +65,7 @@ export class FixedStage extends Stage { this.accumulator -= this.fixedStep substeps++ - super.frame(state, this.fixedStep) + super.frame(state, this.fixedStep, frame) if (performance.now() - initialTime > this.fixedStep * 1000) { // The framerate is not interactive anymore. Better bail out. diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 0a9c11d3dc..2a7b0c7702 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -311,21 +311,27 @@ const createStore = ( priority: number, store: UseBoundStore>, ) => { - const internal = get().internal + const state = get() + const internal = state.internal // If this subscription was given a priority, it takes rendering into its own hands // For that reason we switch off automatic rendering and increase the manual flag // As long as this flag is positive there can be no internal rendering at all // because there could be multiple render subscriptions internal.priority = internal.priority + (priority > 0 ? 1 : 0) + // We use the render flag and deprecate priority + if (internal.priority && state.render === 'auto') set(() => ({ render: 'manual' })) internal.subscribers.push({ ref, priority, store }) // Register subscriber and sort layers from lowest to highest, meaning, // highest priority renders last (on top of the other frames) internal.subscribers = internal.subscribers.sort((a, b) => a.priority - b.priority) return () => { - const internal = get().internal + const state = get() + const internal = state.internal if (internal?.subscribers) { // Decrease manual flag if this subscription had a priority internal.priority = internal.priority - (priority > 0 ? 1 : 0) + // We use the render flag and deprecate priority + if (!internal.priority && state.render === 'manual') set(() => ({ render: 'auto' })) // Remove subscriber from list internal.subscribers = internal.subscribers.filter((s) => s.ref !== ref) } From 19f12be3e142f1f8032509f4f2c46f7c963bf633 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 22:22:10 -0700 Subject: [PATCH 014/252] Update notes --- example/src/demos/Update.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 81335e18a7..3f7668e43a 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -8,10 +8,10 @@ import * as THREE from 'three' // ✅ Throw error if Update or Render stage is not included in a pipeline. // ✅ Add alpha to FixedStage and write interpolation example. // ✅ Add getStage method for interacting with Stages. Can get() and set() this way. -// ✅ Add render with 'auto' | 'manual' flags to root. +// ✅ Add render with 'auto' | 'manual' flags to root. The priority flag is deprecated for the render flag. +// ✅ The render function is executed inside the render stage. // ✅ Update useFrame to use mutation for subscriptions. // ✅ The useFrame loop is executed in the update stage. -// TODO: Refactor priority and frames in the store. They are confusing and I don't think necessary. // TODO: Add a maxDelta in loops for tab safety. (It keeps accumulating.) const colorA = new THREE.Color('#6246ea') From 0915f0e2f07636d602cdadb438b58e521d275642 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 22:43:53 -0700 Subject: [PATCH 015/252] Update callbacks now consume their own store instead of a passed in state --- packages/fiber/src/core/hooks.tsx | 5 +++-- packages/fiber/src/core/loop.ts | 9 +++++---- packages/fiber/src/core/stages.ts | 24 +++++++++++++----------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 998a6f623b..9db32e0b44 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -53,10 +53,11 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): } export function useUpdate(callback: UpdateCallback, stage: string = 'update') { - const stagesMap = useStore().getState().internal.stagesMap + const store = useStore() + const stagesMap = store.getState().internal.stagesMap const ref = useMutableCallback(callback) if (!stagesMap[stage]) throw `A '${stage}' stage does not exist.` - useIsomorphicLayoutEffect(() => stagesMap[stage].add(ref), [stage]) + useIsomorphicLayoutEffect(() => stagesMap[stage].add(ref, store), [stage]) } /** diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index e74508bb5d..df1418c4f3 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -50,7 +50,7 @@ function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { } // Call subscribers (useUpdate) for (const stage of state.internal.stages) { - stage.frame(state, delta, frame) + stage.frame(delta, frame) } state.internal.frames = Math.max(0, state.internal.frames - 1) @@ -74,7 +74,8 @@ export function createLoop(roots: Map) { // Render all roots roots.forEach((root) => { - state = root.store.getState() + const store = root.store + state = store.getState() // Initialize the loop on first run if (init) { @@ -89,7 +90,7 @@ export function createLoop(roots: Map) { } }, } - updateStage!.add(frameCallback) + updateStage!.add(frameCallback, store) // Add render callback to render stage const renderStage = state.getStage('render') @@ -98,7 +99,7 @@ export function createLoop(roots: Map) { if (state.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) }, } - renderStage!.add(renderCallback) + renderStage!.add(renderCallback, store) init = false } diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 5b62d7d47a..edebecae4b 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -1,5 +1,5 @@ -import { MutableRefObject, useLayoutEffect, useRef } from 'react' -import { Root } from './renderer' +import { MutableRefObject } from 'react' +import { StoreApi, UseBoundStore } from 'zustand' import { RootState } from './store' export interface UpdateCallback { @@ -7,32 +7,34 @@ export interface UpdateCallback { } export type UpdateCallbackRef = MutableRefObject +type Store = UseBoundStore> +export type UpdateSubscription = { ref: UpdateCallbackRef; store: Store } export type FixedStageOptions = { fixedStep?: number; maxSubSteps?: number } export class Stage { name: string - subscribers: UpdateCallbackRef[] + subscribers: UpdateSubscription[] constructor(name: string) { this.name = name this.subscribers = [] } - frame(state: RootState, delta: number, frame?: THREE.XRFrame | undefined) { + frame(delta: number, frame?: THREE.XRFrame | undefined) { const subs = this.subscribers for (let i = 0; i < subs.length; i++) { - subs[i].current(state, delta, frame) + subs[i].ref.current(subs[i].store.getState(), delta, frame) } } - add(callback: UpdateCallbackRef) { - this.subscribers = [...this.subscribers, callback] + add(ref: UpdateCallbackRef, store: Store) { + this.subscribers = [...this.subscribers, { ref, store }] return () => { - this.subscribers = this.subscribers.filter((cb) => { - return cb !== callback + this.subscribers = this.subscribers.filter((sub) => { + return sub.ref !== ref }) } } @@ -55,7 +57,7 @@ export class FixedStage extends Stage { this.alpha = 0 } - frame(state: RootState, delta: number, frame?: THREE.XRFrame | undefined) { + frame(delta: number, frame?: THREE.XRFrame | undefined) { const initialTime = performance.now() let substeps = 0 @@ -65,7 +67,7 @@ export class FixedStage extends Stage { this.accumulator -= this.fixedStep substeps++ - super.frame(state, this.fixedStep, frame) + super.frame(this.fixedStep, frame) if (performance.now() - initialTime > this.fixedStep * 1000) { // The framerate is not interactive anymore. Better bail out. From 0ecf0db0c81ad0c4f911436fd22757f44098598a Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 25 May 2022 23:52:55 -0700 Subject: [PATCH 016/252] Add maxDelta for loops. HUD render example --- example/src/demos/Update.tsx | 54 +++++++++++++++++++++++++++++-- packages/fiber/src/core/loop.ts | 2 ++ packages/fiber/src/core/stages.ts | 10 +++--- packages/fiber/src/core/store.ts | 2 ++ 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 3f7668e43a..3b8ce0121c 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -1,4 +1,4 @@ -import React, { useState, useRef, useEffect, useMemo } from 'react' +import React, { useState, useRef, useEffect, useMemo, useLayoutEffect } from 'react' import { Canvas, FixedStage, Stage, Standard, useFrame, useThree, useUpdate } from '@react-three/fiber' import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' @@ -12,11 +12,46 @@ import * as THREE from 'three' // ✅ The render function is executed inside the render stage. // ✅ Update useFrame to use mutation for subscriptions. // ✅ The useFrame loop is executed in the update stage. -// TODO: Add a maxDelta in loops for tab safety. (It keeps accumulating.) +// ✅ Add a maxDelta in loops for tab safety. const colorA = new THREE.Color('#6246ea') const colorB = new THREE.Color('#e45858') +// Quick and dirty HUD implementation. +function useHud() { + const size = useThree((state) => state.size) + + const hud = useMemo(() => { + const hudCanvas = document.createElement('canvas') + hudCanvas.width = size.width + hudCanvas.height = size.height + const hudBitmap = hudCanvas.getContext('2d')! + hudBitmap.font = '600 40px Inter' + hudBitmap.textAlign = 'center' + hudBitmap.fillStyle = 'rgba(245,10,10,0.75)' + hudBitmap.fillText('Canvas drawn HUD', size.width / 2, size.height / 2) + return hudCanvas + }, [size.height, size.width]) + + const camera = useMemo( + () => new THREE.OrthographicCamera(-size.width / 2, size.width / 2, size.height / 2, -size.height / 2, 0, 30), + [size.height, size.width], + ) + const [scene] = useState(() => new THREE.Scene()) + const texture = useMemo(() => new THREE.CanvasTexture(hud), [hud]) + const material = useMemo(() => new THREE.MeshBasicMaterial({ map: texture, transparent: true }), [texture]) + const mesh = useMemo( + () => new THREE.Mesh(new THREE.PlaneBufferGeometry(size.width, size.height), material), + [material, size.height, size.width], + ) + + useLayoutEffect(() => { + scene.add(mesh) + }, [scene, mesh]) + + return { scene, camera } +} + function Update() { const groupRef = useRef(null!) const matRef = useRef(null!) @@ -28,6 +63,8 @@ function Update() { const getStage = useThree((state) => state.getStage) const fixedStage = useMemo(() => getStage('fixed') as FixedStage, [getStage]) + const { scene: sceneHud, camera: cameraHud } = useHud() + // create a common spring that will be used later to interpolate other values const { spring } = useSpring({ spring: active, @@ -78,7 +115,16 @@ function Update() { }) // Use our own render function by setting render to 'manual' - useUpdate(({ gl, scene, camera }) => gl.render(scene, camera), 'render') + useUpdate(({ gl, scene, camera }) => { + if (gl.autoClear) gl.autoClear = false + gl.clear() + gl.render(scene, camera) + }, 'render') + + useUpdate(({ gl }) => { + gl.clearDepth() + gl.render(sceneHud, cameraHud) + }, 'hud') // Modify the fixed stage's step at runtime. useEffect(() => { @@ -99,6 +145,7 @@ function Update() { export default function App() { const InputStage = new Stage('input') const PhysicsStage = new FixedStage('physics', { fixedStep: 1 / 30 }) + const HudStage = new Stage('hud') const stages = [ Standard.Early, InputStage, @@ -107,6 +154,7 @@ export default function App() { Standard.Update, Standard.Late, Standard.Render, + HudStage, Standard.After, ] diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index df1418c4f3..b5a2daf80e 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -47,6 +47,8 @@ function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { delta = timestamp - state.clock.elapsedTime state.clock.oldTime = state.clock.elapsedTime state.clock.elapsedTime = timestamp + } else { + delta = Math.min(delta, state.internal.maxDelta) } // Call subscribers (useUpdate) for (const stage of state.internal.stages) { diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index edebecae4b..656deb4317 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -69,13 +69,15 @@ export class FixedStage extends Stage { super.frame(this.fixedStep, frame) - if (performance.now() - initialTime > this.fixedStep * 1000) { - // The framerate is not interactive anymore. Better bail out. + if (performance.now() - initialTime > this.fixedStep * 200) { + // The framerate is not interactive anymore. break } } - // If the this.accumulator is bigger than delta, set it to 1. - // It should never be bigger than delta unless something went wrong. + + // The accumulator will only be larger than the fixed step if we had to + // bail early due to hitting the max substep limit. In that case, we want to + // shave off the excess so we don't fall behind next frame. this.accumulator = this.accumulator % this.fixedStep this.alpha = this.accumulator / this.fixedStep } diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 2a7b0c7702..76ff2c8f44 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -81,6 +81,7 @@ export type InternalState = { frames: number stages: StageTypes[] stagesMap: StagesMap + maxDelta: number subscribe: ( callback: React.MutableRefObject, priority: number, @@ -306,6 +307,7 @@ const createStore = ( frames: 0, stages: [], stagesMap: {}, + maxDelta: 1 / 10, subscribe: ( ref: React.MutableRefObject, priority: number, From cce5b468327db0fb12a6bc366e3893eb3ffb0a2c Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Thu, 26 May 2022 16:40:47 -0700 Subject: [PATCH 017/252] Add createPipeline for when the root is initialized --- packages/fiber/src/core/index.tsx | 53 ++++++++++++++++++++++++------- packages/fiber/src/core/loop.ts | 32 +------------------ 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 178764143f..756ea2e20d 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -1,7 +1,7 @@ import * as THREE from 'three' import * as React from 'react' import { ConcurrentRoot } from 'react-reconciler/constants' -import create, { UseBoundStore } from 'zustand' +import create, { StoreApi, UseBoundStore } from 'zustand' import * as ReactThreeFiber from '../three-types' import { @@ -15,6 +15,7 @@ import { Performance, PrivateKeys, privateKeys, + Subscription, } from './store' import { createRenderer, extend, Root } from './renderer' import { createLoop, addEffect, addAfterEffect, addTail } from './loop' @@ -119,6 +120,44 @@ const createRendererInstance = (gl: GLProps, canvas: T }) } +const createPipeline = (pipeline: Stage[] | undefined, store: UseBoundStore>) => { + const state = store.getState() + let subscribers: Subscription[] + let subscription: Subscription + + pipeline = pipeline ?? StandardPipeline + + if (!pipeline.includes(Standard.Update)) throw 'The Standard.Update stage is required for R3F.' + if (!pipeline.includes(Standard.Render)) throw 'The Standard.Render stage is required for R3F.' + + state.set(({ internal }) => ({ internal: { ...internal, stages: pipeline! } })) + for (const stage of pipeline) { + state.internal.stagesMap[stage.name] = stage + } + + // Add useFrame loop to update stage + const updateStage = state.getStage('update') + const frameCallback = { + current: (state: RootState, delta: number, frame?: THREE.XRFrame | undefined) => { + subscribers = state.internal.subscribers + for (let i = 0; i < subscribers.length; i++) { + subscription = subscribers[i] + subscription.ref.current(subscription.store.getState(), delta, frame) + } + }, + } + updateStage!.add(frameCallback, store) + + // Add render callback to render stage + const renderStage = state.getStage('render') + const renderCallback = { + current: (state: RootState) => { + if (state.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) + }, + } + renderStage!.add(renderCallback, store) +} + export type ReconcilerRoot = { configure: (config?: RenderProps) => ReconcilerRoot render: (element: React.ReactNode) => UseBoundStore @@ -295,16 +334,8 @@ function createRoot(canvas: TCanvas): ReconcilerRoot ({ performance: { ...state.performance, ...performance } })) - // Create update pipeline. If no custom pipeline is supplied, use the standard. - pipeline = pipeline ?? StandardPipeline - - if (!pipeline.includes(Standard.Update)) throw 'The Standard.Update stage is required for R3F.' - if (!pipeline.includes(Standard.Render)) throw 'The Standard.Render stage is required for R3F.' - - state.set(({ internal }) => ({ internal: { ...internal, stages: pipeline! } })) - for (const stage of pipeline) { - state.internal.stagesMap[stage.name] = stage - } + // Create update pipeline. + if (pipeline !== state.internal.stages) createPipeline(pipeline, store) // Set locals onCreated = onCreatedCallback diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index b5a2daf80e..538bcaaf66 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -37,8 +37,6 @@ function run(effects: GlobalRenderCallback[], timestamp: number) { for (i = 0; i < effects.length; i++) effects[i](timestamp) } -let subscribers: Subscription[] -let subscription: Subscription function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { // Run local effects let delta = state.clock.getDelta() @@ -60,7 +58,6 @@ function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { } export function createLoop(roots: Map) { - let init = true let running = false let repeat: number let frame: number @@ -76,34 +73,7 @@ export function createLoop(roots: Map) { // Render all roots roots.forEach((root) => { - const store = root.store - state = store.getState() - - // Initialize the loop on first run - if (init) { - // Add useFrame loop to update stage - const updateStage = state.getStage('update') - const frameCallback = { - current: (state: RootState, delta: number, frame?: THREE.XRFrame | undefined) => { - subscribers = state.internal.subscribers - for (i = 0; i < subscribers.length; i++) { - subscription = subscribers[i] - subscription.ref.current(subscription.store.getState(), delta, frame) - } - }, - } - updateStage!.add(frameCallback, store) - - // Add render callback to render stage - const renderStage = state.getStage('render') - const renderCallback = { - current: (state: RootState) => { - if (state.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) - }, - } - renderStage!.add(renderCallback, store) - init = false - } + state = root.store.getState() // If the frameloop is invalidated, do not run another frame if ( From 8ac25dba48ff64700c5fc79731927d65f822b125 Mon Sep 17 00:00:00 2001 From: krispya Date: Sun, 29 May 2022 12:47:24 -0700 Subject: [PATCH 018/252] Update packages/fiber/src/core/stages.ts Co-authored-by: Gianmarco --- packages/fiber/src/core/stages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 656deb4317..e234bed3a9 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -30,7 +30,7 @@ export class Stage { } add(ref: UpdateCallbackRef, store: Store) { - this.subscribers = [...this.subscribers, { ref, store }] + this.subscribers.push({ ref, store }) return () => { this.subscribers = this.subscribers.filter((sub) => { From d88f7f891ad4679b35ffe2107e9a6c4aeaa77ea9 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sun, 29 May 2022 14:30:26 -0700 Subject: [PATCH 019/252] Rename pipeline to stages --- packages/fiber/src/core/index.tsx | 22 +++++++++++----------- packages/fiber/src/native/Canvas.tsx | 4 ++-- packages/fiber/src/web/Canvas.tsx | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 756ea2e20d..0d26b3a0c5 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -100,8 +100,8 @@ export type RenderProps = { onCreated?: (state: RootState) => void /** Response for pointer clicks that have missed any target */ onPointerMissed?: (event: MouseEvent) => void - /** Create a custom pipeline of stages */ - pipeline?: Stage[] + /** Create a custom lifecycle of stages */ + stages?: Stage[] render?: 'auto' | 'manual' } @@ -120,18 +120,18 @@ const createRendererInstance = (gl: GLProps, canvas: T }) } -const createPipeline = (pipeline: Stage[] | undefined, store: UseBoundStore>) => { +const createStages = (stages: Stage[] | undefined, store: UseBoundStore>) => { const state = store.getState() let subscribers: Subscription[] let subscription: Subscription - pipeline = pipeline ?? StandardPipeline + stages = stages ?? StandardPipeline - if (!pipeline.includes(Standard.Update)) throw 'The Standard.Update stage is required for R3F.' - if (!pipeline.includes(Standard.Render)) throw 'The Standard.Render stage is required for R3F.' + if (!stages.includes(Standard.Update)) throw 'The Standard.Update stage is required for R3F.' + if (!stages.includes(Standard.Render)) throw 'The Standard.Render stage is required for R3F.' - state.set(({ internal }) => ({ internal: { ...internal, stages: pipeline! } })) - for (const stage of pipeline) { + state.set(({ internal }) => ({ internal: { ...internal, stages: stages! } })) + for (const stage of stages) { state.internal.stagesMap[stage.name] = stage } @@ -212,7 +212,7 @@ function createRoot(canvas: TCanvas): ReconcilerRoot(canvas: TCanvas): ReconcilerRoot ({ performance: { ...state.performance, ...performance } })) - // Create update pipeline. - if (pipeline !== state.internal.stages) createPipeline(pipeline, store) + // Create update stages. + if (stages !== state.internal.stages) createStages(stages, store) // Set locals onCreated = onCreatedCallback diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index 9789a0d2e9..d19317ce25 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -35,7 +35,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( camera, onPointerMissed, onCreated, - pipeline, + stages, render, ...props }, @@ -100,7 +100,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( performance, raycaster, camera, - pipeline, + stages, render, // expo-gl can only render at native dpr/resolution // https://github.com/expo/expo-three/issues/39 diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 8e5e098d95..49a510935e 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -41,7 +41,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f camera, onPointerMissed, onCreated, - pipeline, + stages, render, ...props }, @@ -84,7 +84,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f performance, raycaster, camera, - pipeline, + stages, render, size: { width, height }, // Pass mutable reference to onPointerMissed so it's free to update From a01e9b2060396eaede8cc16bcecf8d664d96394d Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 30 May 2022 12:01:44 -0700 Subject: [PATCH 020/252] Add Stages enum. Checks are runtime. Also added an example for extending the enum --- example/src/demos/Update.tsx | 70 +++++++++++++++++-------------- packages/fiber/src/core/index.tsx | 4 +- packages/fiber/src/core/stages.ts | 12 +++++- packages/fiber/src/index.tsx | 2 +- 4 files changed, 53 insertions(+), 35 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 3b8ce0121c..7f8218648f 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -1,26 +1,49 @@ import React, { useState, useRef, useEffect, useMemo, useLayoutEffect } from 'react' -import { Canvas, FixedStage, Stage, Standard, useFrame, useThree, useUpdate } from '@react-three/fiber' +import { + Canvas, + FixedStage, + Stage, + Standard, + useFrame, + useThree, + useUpdate, + Stages as StandardStages, +} from '@react-three/fiber' import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' import * as THREE from 'three' -// ✅ Create a custom pipeline for advanced usecases. -// ✅ Throw error if Update or Render stage is not included in a pipeline. -// ✅ Add alpha to FixedStage and write interpolation example. -// ✅ Add getStage method for interacting with Stages. Can get() and set() this way. -// ✅ Add render with 'auto' | 'manual' flags to root. The priority flag is deprecated for the render flag. -// ✅ The render function is executed inside the render stage. -// ✅ Update useFrame to use mutation for subscriptions. -// ✅ The useFrame loop is executed in the update stage. -// ✅ Add a maxDelta in loops for tab safety. - const colorA = new THREE.Color('#6246ea') const colorB = new THREE.Color('#e45858') +const InputStage = new Stage('input') +const PhysicsStage = new FixedStage('physics', { fixedStep: 1 / 30 }) +const HudStage = new Stage('hud') +const stages = [ + Standard.Early, + InputStage, + Standard.Fixed, + PhysicsStage, + Standard.Update, + Standard.Late, + Standard.Render, + HudStage, + Standard.After, +] + +enum CustomStages { + Input = 'input', + Physics = 'physics', + Hud = 'hud', +} + +// TS workaround for extending an enum +type Stages = StandardStages | CustomStages +const Stages = { ...StandardStages, ...CustomStages } + // Quick and dirty HUD implementation. function useHud() { const size = useThree((state) => state.size) - const hud = useMemo(() => { const hudCanvas = document.createElement('canvas') hudCanvas.width = size.width @@ -88,7 +111,7 @@ function Update() { prev.color.copy(fixed.color) fixed.color.lerpColors(colorA, colorB, alpha) } - }, 'fixed') + }, Stages.Fixed) useUpdate((state) => { // With interpolation of the fixed stage @@ -119,12 +142,12 @@ function Update() { if (gl.autoClear) gl.autoClear = false gl.clear() gl.render(scene, camera) - }, 'render') + }, Stages.Render) useUpdate(({ gl }) => { gl.clearDepth() gl.render(sceneHud, cameraHud) - }, 'hud') + }, Stages.Hud) // Modify the fixed stage's step at runtime. useEffect(() => { @@ -143,23 +166,8 @@ function Update() { } export default function App() { - const InputStage = new Stage('input') - const PhysicsStage = new FixedStage('physics', { fixedStep: 1 / 30 }) - const HudStage = new Stage('hud') - const stages = [ - Standard.Early, - InputStage, - Standard.Fixed, - PhysicsStage, - Standard.Update, - Standard.Late, - Standard.Render, - HudStage, - Standard.After, - ] - return ( - + ) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 0d26b3a0c5..3daae1c5b7 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -32,7 +32,7 @@ import { setDeep, } from './utils' import { useStore } from './hooks' -import { Stage, Standard, StandardPipeline } from './stages' +import { Stage, Standard, StandardStages } from './stages' const roots = new Map() const { invalidate, advance } = createLoop(roots) @@ -125,7 +125,7 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore Date: Mon, 30 May 2022 16:46:07 -0700 Subject: [PATCH 021/252] Documentation added. Standard renamed to StandardStages to be more explicit --- example/src/demos/Update.tsx | 2 +- packages/fiber/src/core/hooks.tsx | 11 +++++- packages/fiber/src/core/index.tsx | 8 ++-- packages/fiber/src/core/stages.ts | 64 ++++++++++++++++++++++++++----- packages/fiber/src/core/store.ts | 11 +++++- packages/fiber/src/index.tsx | 2 +- 6 files changed, 79 insertions(+), 19 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 7f8218648f..382beb1386 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -3,7 +3,7 @@ import { Canvas, FixedStage, Stage, - Standard, + StandardStages as Standard, useFrame, useThree, useUpdate, diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 9db32e0b44..7609085da5 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -4,7 +4,7 @@ import { StateSelector, EqualityChecker } from 'zustand' import { suspend, preload, clear } from 'suspend-react' import { context, RootState, RenderCallback } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' -import { UpdateCallback } from './stages' +import { Stages, UpdateCallback } from './stages' export interface Loader extends THREE.Loader { load( @@ -52,11 +52,18 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): return null } -export function useUpdate(callback: UpdateCallback, stage: string = 'update') { +/** + * Executes a callback in a given update stage. + * The default stages can be accessed through the Stages enum. + */ +export function useUpdate(callback: UpdateCallback, stage: string = Stages.Update) { const store = useStore() const stagesMap = store.getState().internal.stagesMap + // Memoize ref const ref = useMutableCallback(callback) + // Throw an error if a stage does not exist if (!stagesMap[stage]) throw `A '${stage}' stage does not exist.` + // Subscribe on mount, unsubscribe on unmount useIsomorphicLayoutEffect(() => stagesMap[stage].add(ref, store), [stage]) } diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 3daae1c5b7..47cf208d00 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -32,7 +32,7 @@ import { setDeep, } from './utils' import { useStore } from './hooks' -import { Stage, Standard, StandardStages } from './stages' +import { Stage, StandardLifecycle, StandardStages } from './stages' const roots = new Map() const { invalidate, advance } = createLoop(roots) @@ -125,10 +125,10 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore ({ internal: { ...internal, stages: stages! } })) for (const stage of stages) { diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 24c8d06c0b..a9d0c67a55 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -10,8 +10,14 @@ export type UpdateCallbackRef = MutableRefObject type Store = UseBoundStore> export type UpdateSubscription = { ref: UpdateCallbackRef; store: Store } -export type FixedStageOptions = { fixedStep?: number; maxSubSteps?: number } - +export type FixedStageOptions = { fixedStep?: number; maxSubsteps?: number } +export type FixedStageProps = { fixedStep: number; maxSubsteps: number; accumulator: number; alpha: number } + +/** + * Class representing a stage that updates every frame. + * Stages are used to build a lifecycle of effects for an app's frameloop. + * @param {string} name - Name of the stage. + */ export class Stage { name: string subscribers: UpdateSubscription[] @@ -21,6 +27,11 @@ export class Stage { this.subscribers = [] } + /** + * Executes all callback subscriptions on the stage. + * @param {number} delta - Delta time between frame calls. + * @param {THREE.XRFrame | undefined} [frame] - The XR frame if it exists. + */ frame(delta: number, frame?: THREE.XRFrame | undefined) { const subs = this.subscribers @@ -29,6 +40,12 @@ export class Stage { } } + /** + * Adds a callback subscriber to the stage. + * @param {UpdateCallbackRef} ref - The mutable callback reference. + * @param {Store} store - The store to be used with the callback execution. + * @returns {() => void} A function to remove the subscription. + */ add(ref: UpdateCallbackRef, store: Store) { this.subscribers.push({ ref, store }) @@ -40,9 +57,17 @@ export class Stage { } } -// Using Unity's default here. +// Using Unity's fixedStep default. const FPS_50 = 1 / 50 +/** + * Class representing a stage that updates every frame at a fixed rate. + * @param {string} name - Name of the stage. + * @param {FixedStageOptions} [options] - Options for the fixed stage. + * @param {number} [options.fixedStep] - Fixed step rate. + * @param {number} [options.maxSubsteps] - Maximum number of substeps. + * @extends Stage + */ export class FixedStage extends Stage { private fixedStep: number private maxSubsteps: number @@ -58,6 +83,11 @@ export class FixedStage extends Stage { this.alpha = 0 } + /** + * Executes all callback subscriptions on the stage. + * @param {number} delta - Delta time between frame calls. + * @param {THREE.XRFrame | undefined} [frame] - The XR frame if it exists. + */ frame(delta: number, frame?: THREE.XRFrame | undefined) { const initialTime = performance.now() let substeps = 0 @@ -77,19 +107,33 @@ export class FixedStage extends Stage { } // The accumulator will only be larger than the fixed step if we had to - // bail early due to hitting the max substep limit. In that case, we want to - // shave off the excess so we don't fall behind next frame. + // bail early due to hitting the max substep limit or execution time lagging. + // In that case, we want to shave off the excess so we don't fall behind next frame. this.accumulator = this.accumulator % this.fixedStep this.alpha = this.accumulator / this.fixedStep } + /** + * Set the fixed stage properties. + * @param {FixedStageOptions} options - Options for the fixed stage. + * @param {number} [options.fixedStep] - Fixed step rate. + * @param {number} [options.maxSubsteps] - Maximum number of substeps. + */ set(options: FixedStageOptions) { - const { fixedStep, maxSubSteps } = options + const { fixedStep, maxSubsteps } = options if (fixedStep) this.fixedStep = fixedStep - if (maxSubSteps) this.maxSubsteps = maxSubSteps + if (maxSubsteps) this.maxSubsteps = maxSubsteps } - get() { + /** + * Get the fixed stage properties. + * @returns {FixedStageProps} props The fixed stage properties. + * @returns {number} props.fixedStep The fixed step rate. + * @returns {number} props.maxSubsteps The maximum number of substeps. + * @returns {number} props.accumulator The time left over in the accumulator. + * @returns {number} props.alpha The ratio of remaining time and step size. Useful for interpolation. + */ + get(): FixedStageProps { return { fixedStep: this.fixedStep, maxSubsteps: this.maxSubsteps, @@ -106,8 +150,8 @@ const Late = new Stage('late') const Render = new Stage('render') const After = new Stage('after') -export const Standard = { Early, Fixed, Update, Late, Render, After } -export const StandardStages = [Early, Fixed, Update, Late, Render, After] +export const StandardStages = { Early, Fixed, Update, Late, Render, After } +export const StandardLifecycle = [Early, Fixed, Update, Late, Render, After] export enum Stages { Early = 'early', diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 76ff2c8f44..fad29587c3 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -303,11 +303,20 @@ const createStore = ( // Updates active: false, - priority: 0, frames: 0, + /** + * The ordered stages defining the lifecycle. + */ stages: [], + /** + * The stages map, where the key is the stage name and the value is the stage. + */ stagesMap: {}, + /** + * The max delta time between two frames. + */ maxDelta: 1 / 10, + priority: 0, subscribe: ( ref: React.MutableRefObject, priority: number, diff --git a/packages/fiber/src/index.tsx b/packages/fiber/src/index.tsx index 6df9631d79..3e92fab974 100644 --- a/packages/fiber/src/index.tsx +++ b/packages/fiber/src/index.tsx @@ -17,4 +17,4 @@ export type { ObjectMap, Camera } from './core/utils' export * from './web/Canvas' export { createPointerEvents as events } from './web/events' export * from './core' -export { Stage, FixedStage, Standard, Stages } from './core/stages' +export { Stage, FixedStage, StandardStages, Stages } from './core/stages' From 7776cf5285d5c7563288a36e038aaeef324ebb53 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 4 Jun 2022 14:31:47 -0700 Subject: [PATCH 022/252] Convert FixedStage to use getters and setters --- example/src/demos/Update.tsx | 4 +- packages/fiber/src/core/stages.ts | 75 +++++++++++++++---------------- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 382beb1386..aad155e7b1 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -115,7 +115,7 @@ function Update() { useUpdate((state) => { // With interpolation of the fixed stage - const alpha = fixedStage.get().alpha + const alpha = fixedStage.alpha // Can also get from inside the loop using state // const alpha = (state.getStage('fixed') as FixedStage).get().alpha @@ -151,7 +151,7 @@ function Update() { // Modify the fixed stage's step at runtime. useEffect(() => { - fixedStage.set({ fixedStep: 1 / 15 }) + fixedStage.fixedStep = 1 / 15 }, [fixedStage]) return ( diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index a9d0c67a55..9997164945 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -69,18 +69,18 @@ const FPS_50 = 1 / 50 * @extends Stage */ export class FixedStage extends Stage { - private fixedStep: number - private maxSubsteps: number - private accumulator: number - private alpha: number + private _fixedStep: number + private _maxSubsteps: number + private _accumulator: number + private _alpha: number constructor(name: string, options?: { fixedStep?: number; maxSubSteps?: number }) { super(name) - this.fixedStep = options?.fixedStep ?? FPS_50 - this.maxSubsteps = options?.maxSubSteps ?? 6 - this.accumulator = 0 - this.alpha = 0 + this._fixedStep = options?.fixedStep ?? FPS_50 + this._maxSubsteps = options?.maxSubSteps ?? 6 + this._accumulator = 0 + this._alpha = 0 } /** @@ -92,15 +92,15 @@ export class FixedStage extends Stage { const initialTime = performance.now() let substeps = 0 - this.accumulator += delta + this._accumulator += delta - while (this.accumulator >= this.fixedStep && substeps < this.maxSubsteps) { - this.accumulator -= this.fixedStep + while (this._accumulator >= this._fixedStep && substeps < this._maxSubsteps) { + this._accumulator -= this._fixedStep substeps++ - super.frame(this.fixedStep, frame) + super.frame(this._fixedStep, frame) - if (performance.now() - initialTime > this.fixedStep * 200) { + if (performance.now() - initialTime > this._fixedStep * 200) { // The framerate is not interactive anymore. break } @@ -109,37 +109,32 @@ export class FixedStage extends Stage { // The accumulator will only be larger than the fixed step if we had to // bail early due to hitting the max substep limit or execution time lagging. // In that case, we want to shave off the excess so we don't fall behind next frame. - this.accumulator = this.accumulator % this.fixedStep - this.alpha = this.accumulator / this.fixedStep + this._accumulator = this._accumulator % this._fixedStep + this._alpha = this._accumulator / this._fixedStep } - /** - * Set the fixed stage properties. - * @param {FixedStageOptions} options - Options for the fixed stage. - * @param {number} [options.fixedStep] - Fixed step rate. - * @param {number} [options.maxSubsteps] - Maximum number of substeps. - */ - set(options: FixedStageOptions) { - const { fixedStep, maxSubsteps } = options - if (fixedStep) this.fixedStep = fixedStep - if (maxSubsteps) this.maxSubsteps = maxSubsteps + get fixedStep() { + return this._fixedStep } - /** - * Get the fixed stage properties. - * @returns {FixedStageProps} props The fixed stage properties. - * @returns {number} props.fixedStep The fixed step rate. - * @returns {number} props.maxSubsteps The maximum number of substeps. - * @returns {number} props.accumulator The time left over in the accumulator. - * @returns {number} props.alpha The ratio of remaining time and step size. Useful for interpolation. - */ - get(): FixedStageProps { - return { - fixedStep: this.fixedStep, - maxSubsteps: this.maxSubsteps, - accumulator: this.accumulator, - alpha: this.alpha, - } + set fixedStep(fixedStep: number) { + this._fixedStep = fixedStep + } + + get maxSubsteps() { + return this._maxSubsteps + } + + set maxSubsteps(maxSubsteps: number) { + this._maxSubsteps = maxSubsteps + } + + get accumulator() { + return this._accumulator + } + + get alpha() { + return this._alpha } } From 24e25ca6bde1e380d79b683057c31814ae440164 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 4 Jun 2022 15:29:30 -0700 Subject: [PATCH 023/252] Use instance objects to identify stage updates --- example/src/demos/Update.tsx | 41 ++++++++++++------------------- packages/fiber/src/core/hooks.tsx | 15 +++++------ packages/fiber/src/core/index.tsx | 17 +++++-------- packages/fiber/src/core/stages.ts | 13 ++-------- packages/fiber/src/core/store.ts | 27 +++----------------- packages/fiber/src/index.tsx | 2 +- 6 files changed, 36 insertions(+), 79 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index aad155e7b1..11c3fd92ad 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -1,14 +1,5 @@ import React, { useState, useRef, useEffect, useMemo, useLayoutEffect } from 'react' -import { - Canvas, - FixedStage, - Stage, - StandardStages as Standard, - useFrame, - useThree, - useUpdate, - Stages as StandardStages, -} from '@react-three/fiber' +import { Canvas, FixedStage, Stage, useFrame, useThree, useUpdate, Stages as Standard } from '@react-three/fiber' import { a, useSpring } from '@react-spring/three' import { OrbitControls } from '@react-three/drei' import * as THREE from 'three' @@ -19,7 +10,7 @@ const colorB = new THREE.Color('#e45858') const InputStage = new Stage('input') const PhysicsStage = new FixedStage('physics', { fixedStep: 1 / 30 }) const HudStage = new Stage('hud') -const stages = [ +const lifecycle = [ Standard.Early, InputStage, Standard.Fixed, @@ -31,16 +22,18 @@ const stages = [ Standard.After, ] -enum CustomStages { - Input = 'input', - Physics = 'physics', - Hud = 'hud', +const Stages = { + Early: Standard.Early, + Input: InputStage, + Fixed: Standard.Fixed, + Physics: PhysicsStage, + Update: Standard.Update, + Late: Standard.Late, + Render: Standard.Render, + Hud: HudStage, + After: Standard.After, } -// TS workaround for extending an enum -type Stages = StandardStages | CustomStages -const Stages = { ...StandardStages, ...CustomStages } - // Quick and dirty HUD implementation. function useHud() { const size = useThree((state) => state.size) @@ -83,8 +76,6 @@ function Update() { const interpolate = true const [active, setActive] = useState(0) - const getStage = useThree((state) => state.getStage) - const fixedStage = useMemo(() => getStage('fixed') as FixedStage, [getStage]) const { scene: sceneHud, camera: cameraHud } = useHud() @@ -115,7 +106,7 @@ function Update() { useUpdate((state) => { // With interpolation of the fixed stage - const alpha = fixedStage.alpha + const alpha = Stages.Fixed.alpha // Can also get from inside the loop using state // const alpha = (state.getStage('fixed') as FixedStage).get().alpha @@ -151,8 +142,8 @@ function Update() { // Modify the fixed stage's step at runtime. useEffect(() => { - fixedStage.fixedStep = 1 / 15 - }, [fixedStage]) + Stages.Fixed.fixedStep = 1 / 15 + }, []) return ( @@ -167,7 +158,7 @@ function Update() { export default function App() { return ( - + ) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 7609085da5..49cab74b10 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -2,9 +2,9 @@ import * as THREE from 'three' import * as React from 'react' import { StateSelector, EqualityChecker } from 'zustand' import { suspend, preload, clear } from 'suspend-react' -import { context, RootState, RenderCallback } from './store' +import { context, RootState, RenderCallback, StageTypes } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' -import { Stages, UpdateCallback } from './stages' +import { Stage, Stages, UpdateCallback } from './stages' export interface Loader extends THREE.Loader { load( @@ -54,17 +54,18 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): /** * Executes a callback in a given update stage. - * The default stages can be accessed through the Stages enum. + * Uses the stage instance to indetify which stage to target in the lifecycle. */ -export function useUpdate(callback: UpdateCallback, stage: string = Stages.Update) { +export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.Update) { const store = useStore() - const stagesMap = store.getState().internal.stagesMap + const stages = store.getState().internal.stages + const match = stages.find((s) => s === stage) // Memoize ref const ref = useMutableCallback(callback) // Throw an error if a stage does not exist - if (!stagesMap[stage]) throw `A '${stage}' stage does not exist.` + if (!match) throw `A '${stage}' stage does not exist.` // Subscribe on mount, unsubscribe on unmount - useIsomorphicLayoutEffect(() => stagesMap[stage].add(ref, store), [stage]) + useIsomorphicLayoutEffect(() => match.add(ref, store), [stage]) } /** diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 87d1689b86..501f2a59cc 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -32,7 +32,7 @@ import { setDeep, } from './utils' import { useStore } from './hooks' -import { Stage, StandardLifecycle, StandardStages } from './stages' +import { Stage, Lifecycle, Stages } from './stages' const roots = new Map() const { invalidate, advance } = createLoop(roots) @@ -125,18 +125,14 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore ({ internal: { ...internal, stages: stages! } })) - for (const stage of stages) { - state.internal.stagesMap[stage.name] = stage - } // Add useFrame loop to update stage - const updateStage = state.getStage('update') const frameCallback = { current: (state: RootState, delta: number, frame?: THREE.XRFrame | undefined) => { subscribers = state.internal.subscribers @@ -146,16 +142,15 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore { if (state.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) }, } - renderStage!.add(renderCallback, store) + Stages.Render.add(renderCallback, store) } export type ReconcilerRoot = { diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 9997164945..f2d9cc0104 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -145,14 +145,5 @@ const Late = new Stage('late') const Render = new Stage('render') const After = new Stage('after') -export const StandardStages = { Early, Fixed, Update, Late, Render, After } -export const StandardLifecycle = [Early, Fixed, Update, Late, Render, After] - -export enum Stages { - Early = 'early', - Fixed = 'fixed', - Update = 'update', - Late = 'late', - Render = 'render', - After = 'after', -} +export const Stages = { Early, Fixed, Update, Late, Render, After } +export const Lifecycle = [Early, Fixed, Update, Late, Render, After] diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index fad29587c3..2b9ec8a782 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -65,8 +65,7 @@ export type Performance = { export type Renderer = { render: (scene: THREE.Scene, camera: THREE.Camera) => any } export const isRenderer = (def: any) => !!def?.render -type StageTypes = Stage | FixedStage -export type StagesMap = { [key: string]: StageTypes } +export type StageTypes = Stage | FixedStage export type InternalState = { interaction: THREE.Object3D[] @@ -79,8 +78,9 @@ export type InternalState = { active: boolean priority: number frames: number + /** The ordered stages defining the lifecycle. */ stages: StageTypes[] - stagesMap: StagesMap + /** The max delta time between two frames. */ maxDelta: number subscribe: ( callback: React.MutableRefObject, @@ -150,8 +150,6 @@ export type RootState = { setFrameloop: (frameloop?: 'always' | 'demand' | 'never') => void /** Shortcut to setting render flags */ setRender: (render?: 'auto' | 'manual') => void - /** Convenience get function for stages */ - getStage: (name: string) => StageTypes | undefined /** When the canvas was clicked but nothing was hit */ onPointerMissed?: (event: MouseEvent) => void /** If this state model is layerd (via createPortal) then this contains the previous layer */ @@ -281,15 +279,6 @@ const createStore = ( set(() => ({ frameloop })) }, setRender: (render: 'auto' | 'manual' = 'auto') => set(() => ({ render })), - getStage: (name: string) => { - const internal = get().internal - const stage = internal.stagesMap[name] - if (stage) { - return stage - } else { - console.warn(`No Stage named ${name} exists.`) - } - }, previousRoot: undefined, internal: { // Events @@ -304,17 +293,7 @@ const createStore = ( // Updates active: false, frames: 0, - /** - * The ordered stages defining the lifecycle. - */ stages: [], - /** - * The stages map, where the key is the stage name and the value is the stage. - */ - stagesMap: {}, - /** - * The max delta time between two frames. - */ maxDelta: 1 / 10, priority: 0, subscribe: ( diff --git a/packages/fiber/src/index.tsx b/packages/fiber/src/index.tsx index 3e92fab974..187ea36e56 100644 --- a/packages/fiber/src/index.tsx +++ b/packages/fiber/src/index.tsx @@ -17,4 +17,4 @@ export type { ObjectMap, Camera } from './core/utils' export * from './web/Canvas' export { createPointerEvents as events } from './web/events' export * from './core' -export { Stage, FixedStage, StandardStages, Stages } from './core/stages' +export { Stage, FixedStage, Stages } from './core/stages' From 2e901c0ed9ffb69fcd07f3218bb33f375c3fde0d Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 4 Jun 2022 15:29:50 -0700 Subject: [PATCH 024/252] Simplify Update example --- example/src/demos/Update.tsx | 41 ------------------------------------ 1 file changed, 41 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 11c3fd92ad..a00ddb07b1 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -34,40 +34,6 @@ const Stages = { After: Standard.After, } -// Quick and dirty HUD implementation. -function useHud() { - const size = useThree((state) => state.size) - const hud = useMemo(() => { - const hudCanvas = document.createElement('canvas') - hudCanvas.width = size.width - hudCanvas.height = size.height - const hudBitmap = hudCanvas.getContext('2d')! - hudBitmap.font = '600 40px Inter' - hudBitmap.textAlign = 'center' - hudBitmap.fillStyle = 'rgba(245,10,10,0.75)' - hudBitmap.fillText('Canvas drawn HUD', size.width / 2, size.height / 2) - return hudCanvas - }, [size.height, size.width]) - - const camera = useMemo( - () => new THREE.OrthographicCamera(-size.width / 2, size.width / 2, size.height / 2, -size.height / 2, 0, 30), - [size.height, size.width], - ) - const [scene] = useState(() => new THREE.Scene()) - const texture = useMemo(() => new THREE.CanvasTexture(hud), [hud]) - const material = useMemo(() => new THREE.MeshBasicMaterial({ map: texture, transparent: true }), [texture]) - const mesh = useMemo( - () => new THREE.Mesh(new THREE.PlaneBufferGeometry(size.width, size.height), material), - [material, size.height, size.width], - ) - - useLayoutEffect(() => { - scene.add(mesh) - }, [scene, mesh]) - - return { scene, camera } -} - function Update() { const groupRef = useRef(null!) const matRef = useRef(null!) @@ -77,8 +43,6 @@ function Update() { const interpolate = true const [active, setActive] = useState(0) - const { scene: sceneHud, camera: cameraHud } = useHud() - // create a common spring that will be used later to interpolate other values const { spring } = useSpring({ spring: active, @@ -135,11 +99,6 @@ function Update() { gl.render(scene, camera) }, Stages.Render) - useUpdate(({ gl }) => { - gl.clearDepth() - gl.render(sceneHud, cameraHud) - }, Stages.Hud) - // Modify the fixed stage's step at runtime. useEffect(() => { Stages.Fixed.fixedStep = 1 / 15 From 9a72afdb3439803789dbdaf4463af82fc564c599 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sun, 5 Jun 2022 15:48:41 -0700 Subject: [PATCH 025/252] Cleaned up remaining stage name code. Made sure delta cannot go below 0 --- example/src/demos/Update.tsx | 6 +++--- packages/fiber/src/core/hooks.tsx | 7 +++---- packages/fiber/src/core/loop.ts | 2 +- packages/fiber/src/core/stages.ts | 21 +++++++++------------ 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index a00ddb07b1..b4bf5ff6f5 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -7,9 +7,9 @@ import * as THREE from 'three' const colorA = new THREE.Color('#6246ea') const colorB = new THREE.Color('#e45858') -const InputStage = new Stage('input') -const PhysicsStage = new FixedStage('physics', { fixedStep: 1 / 30 }) -const HudStage = new Stage('hud') +const InputStage = new Stage() +const PhysicsStage = new FixedStage({ fixedStep: 1 / 30 }) +const HudStage = new Stage() const lifecycle = [ Standard.Early, InputStage, diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 49cab74b10..5cb8375277 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -59,13 +59,12 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.Update) { const store = useStore() const stages = store.getState().internal.stages - const match = stages.find((s) => s === stage) // Memoize ref const ref = useMutableCallback(callback) - // Throw an error if a stage does not exist - if (!match) throw `A '${stage}' stage does not exist.` + // Throw an error if a stage does not exist in the lifecycle + if (!stages.includes(stage)) throw `The stage does not exist in the lifecycle.` // Subscribe on mount, unsubscribe on unmount - useIsomorphicLayoutEffect(() => match.add(ref, store), [stage]) + useIsomorphicLayoutEffect(() => stage.add(ref, store), [stage]) } /** diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 538bcaaf66..88ad36c514 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -46,7 +46,7 @@ function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { state.clock.oldTime = state.clock.elapsedTime state.clock.elapsedTime = timestamp } else { - delta = Math.min(delta, state.internal.maxDelta) + delta = Math.max(Math.min(delta, state.internal.maxDelta), 0) } // Call subscribers (useUpdate) for (const stage of state.internal.stages) { diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index f2d9cc0104..056f87c015 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -16,14 +16,11 @@ export type FixedStageProps = { fixedStep: number; maxSubsteps: number; accumula /** * Class representing a stage that updates every frame. * Stages are used to build a lifecycle of effects for an app's frameloop. - * @param {string} name - Name of the stage. */ export class Stage { - name: string subscribers: UpdateSubscription[] - constructor(name: string) { - this.name = name + constructor() { this.subscribers = [] } @@ -74,8 +71,8 @@ export class FixedStage extends Stage { private _accumulator: number private _alpha: number - constructor(name: string, options?: { fixedStep?: number; maxSubSteps?: number }) { - super(name) + constructor(options?: { fixedStep?: number; maxSubSteps?: number }) { + super() this._fixedStep = options?.fixedStep ?? FPS_50 this._maxSubsteps = options?.maxSubSteps ?? 6 @@ -138,12 +135,12 @@ export class FixedStage extends Stage { } } -const Early = new Stage('early') -const Fixed = new FixedStage('fixed') -const Update = new Stage('update') -const Late = new Stage('late') -const Render = new Stage('render') -const After = new Stage('after') +const Early = new Stage() +const Fixed = new FixedStage() +const Update = new Stage() +const Late = new Stage() +const Render = new Stage() +const After = new Stage() export const Stages = { Early, Fixed, Update, Late, Render, After } export const Lifecycle = [Early, Fixed, Update, Late, Render, After] From 36dbefec56bde5cf7864d8ed4cda76a7a94241e1 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sun, 5 Jun 2022 15:51:35 -0700 Subject: [PATCH 026/252] Made useUpdate's exception make more sense --- packages/fiber/src/core/hooks.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 5cb8375277..1af17f54b6 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -62,7 +62,7 @@ export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.U // Memoize ref const ref = useMutableCallback(callback) // Throw an error if a stage does not exist in the lifecycle - if (!stages.includes(stage)) throw `The stage does not exist in the lifecycle.` + if (!stages.includes(stage)) throw `An invoked stage does not exist in the lifecycle.` // Subscribe on mount, unsubscribe on unmount useIsomorphicLayoutEffect(() => stage.add(ref, store), [stage]) } From 23cd91bb5e92605931c116a8bf101db5b3da5ce9 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sun, 5 Jun 2022 21:54:57 -0700 Subject: [PATCH 027/252] The frameloop prop now accepts an object and legacy string --- example/src/demos/Update.tsx | 5 +-- packages/fiber/src/core/index.tsx | 9 +++--- packages/fiber/src/core/store.ts | 48 ++++++++++++++++++---------- packages/fiber/src/native/Canvas.tsx | 2 -- packages/fiber/src/web/Canvas.tsx | 2 -- 5 files changed, 39 insertions(+), 27 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index b4bf5ff6f5..107583ba50 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -86,7 +86,8 @@ function Update() { // For backwards compatability, useFrame gets executed in the update stage // A positive priority switches rendering to manual - useFrame(() => { + useFrame((state) => { + console.log(state) if (groupRef.current) { groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 } @@ -117,7 +118,7 @@ function Update() { export default function App() { return ( - + ) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 501f2a59cc..748ca1a606 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -16,6 +16,8 @@ import { PrivateKeys, privateKeys, Subscription, + FrameloopLegacy, + Frameloop, } from './store' import { createRenderer, extend, Root } from './renderer' import { createLoop, addEffect, addAfterEffect, addTail } from './loop' @@ -72,7 +74,7 @@ export type RenderProps = { * R3F's render mode. Set to `demand` to only render on state change or `never` to take control. * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#on-demand-rendering */ - frameloop?: 'always' | 'demand' | 'never' + frameloop?: Frameloop /** * R3F performance options for adaptive performance. * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#movement-regression @@ -147,7 +149,7 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore { - if (state.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) + if (state.internal.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) }, } Stages.Render.add(renderCallback, store) @@ -208,7 +210,6 @@ function createRoot(canvas: TCanvas): ReconcilerRoot(canvas: TCanvas): ReconcilerRoot void +type LegacyAlways = 'always' +export type FrameloopMode = LegacyAlways | 'auto' | 'demand' | 'never' +type FrameloopRender = 'auto' | 'manual' +export type FrameloopLegacy = 'always' | 'demand' | 'never' +export type Frameloop = FrameloopLegacy | { mode?: FrameloopMode; render?: FrameloopRender; maxDelta?: number } + export type Performance = { /** Current performance normal, between min and max */ current: number @@ -80,6 +86,8 @@ export type InternalState = { frames: number /** The ordered stages defining the lifecycle. */ stages: StageTypes[] + /** Render function flags */ + render: 'auto' | 'manual' /** The max delta time between two frames. */ maxDelta: number subscribe: ( @@ -120,10 +128,8 @@ export type RootState = { linear: boolean /** Shortcut to gl.toneMapping = NoTonemapping */ flat: boolean - /** Update loop flags */ - frameloop: 'always' | 'demand' | 'never' - /** Render function flags */ - render: 'auto' | 'manual' + /** Update frame loop flags */ + frameloop: FrameloopLegacy /** Adaptive performance interface */ performance: Performance /** Reactive pixel-size of the canvas */ @@ -147,9 +153,7 @@ export type RootState = { /** Shortcut to manual setting the pixel ratio */ setDpr: (dpr: Dpr) => void /** Shortcut to setting frameloop flags */ - setFrameloop: (frameloop?: 'always' | 'demand' | 'never') => void - /** Shortcut to setting render flags */ - setRender: (render?: 'auto' | 'manual') => void + setFrameloop: (frameloop: Frameloop) => void /** When the canvas was clicked but nothing was hit */ onPointerMissed?: (event: MouseEvent) => void /** If this state model is layerd (via createPortal) then this contains the previous layer */ @@ -219,7 +223,6 @@ const createStore = ( mouse: pointer, frameloop: 'always', - render: 'auto', onPointerMissed: undefined, performance: { @@ -265,9 +268,20 @@ const createStore = ( const resolved = calculateDpr(dpr) return { viewport: { ...state.viewport, dpr: resolved, initialDpr: state.viewport.initialDpr || resolved } } }), - setFrameloop: (frameloop: 'always' | 'demand' | 'never' = 'always') => { - const clock = get().clock - + setFrameloop: (frameloop: Frameloop) => { + const state = get() + const mode: FrameloopLegacy = + typeof frameloop === 'string' + ? frameloop + : frameloop?.mode === 'auto' + ? 'always' + : frameloop?.mode ?? state.frameloop + const render = + typeof frameloop === 'string' ? state.internal.render : frameloop?.render ?? state.internal.render + const maxDelta = + typeof frameloop === 'string' ? state.internal.maxDelta : frameloop?.maxDelta ?? state.internal.maxDelta + + const clock = state.clock // if frameloop === "never" clock.elapsedTime is updated using advance(timestamp) clock.stop() clock.elapsedTime = 0 @@ -276,9 +290,8 @@ const createStore = ( clock.start() clock.elapsedTime = 0 } - set(() => ({ frameloop })) + set(() => ({ frameloop: mode, internal: { ...state.internal, render, maxDelta } })) }, - setRender: (render: 'auto' | 'manual' = 'auto') => set(() => ({ render })), previousRoot: undefined, internal: { // Events @@ -294,6 +307,7 @@ const createStore = ( active: false, frames: 0, stages: [], + render: 'auto', maxDelta: 1 / 10, priority: 0, subscribe: ( @@ -309,7 +323,8 @@ const createStore = ( // because there could be multiple render subscriptions internal.priority = internal.priority + (priority > 0 ? 1 : 0) // We use the render flag and deprecate priority - if (internal.priority && state.render === 'auto') set(() => ({ render: 'manual' })) + if (internal.priority && state.internal.render === 'auto') + set(() => ({ internal: { ...state.internal, render: 'manual' } })) internal.subscribers.push({ ref, priority, store }) // Register subscriber and sort layers from lowest to highest, meaning, // highest priority renders last (on top of the other frames) @@ -321,7 +336,8 @@ const createStore = ( // Decrease manual flag if this subscription had a priority internal.priority = internal.priority - (priority > 0 ? 1 : 0) // We use the render flag and deprecate priority - if (!internal.priority && state.render === 'manual') set(() => ({ render: 'auto' })) + if (!internal.priority && state.internal.render === 'manual') + set(() => ({ internal: { ...state.internal, render: 'auto' } })) // Remove subscriber from list internal.subscribers = internal.subscribers.filter((s) => s.ref !== ref) } diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index d19317ce25..ae3b861376 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -36,7 +36,6 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( onPointerMissed, onCreated, stages, - render, ...props }, forwardedRef, @@ -101,7 +100,6 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( raycaster, camera, stages, - render, // expo-gl can only render at native dpr/resolution // https://github.com/expo/expo-three/issues/39 dpr: PixelRatio.get(), diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 49a510935e..ae01759f89 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -42,7 +42,6 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f onPointerMissed, onCreated, stages, - render, ...props }, forwardedRef, @@ -85,7 +84,6 @@ export const Canvas = /*#__PURE__*/ React.forwardRef(f raycaster, camera, stages, - render, size: { width, height }, // Pass mutable reference to onPointerMissed so it's free to update onPointerMissed: (...args) => handlePointerMissed.current?.(...args), From 39318023c06249e18d3a3319944c5b4d4ba56d54 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sun, 5 Jun 2022 22:07:07 -0700 Subject: [PATCH 028/252] Simplify FixedState parameters --- example/src/demos/Update.tsx | 2 +- packages/fiber/src/core/stages.ts | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index 107583ba50..d5fbd67381 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -8,7 +8,7 @@ const colorA = new THREE.Color('#6246ea') const colorB = new THREE.Color('#e45858') const InputStage = new Stage() -const PhysicsStage = new FixedStage({ fixedStep: 1 / 30 }) +const PhysicsStage = new FixedStage(1 / 30) const HudStage = new Stage() const lifecycle = [ Standard.Early, diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 056f87c015..4c87db4d7a 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -60,9 +60,8 @@ const FPS_50 = 1 / 50 /** * Class representing a stage that updates every frame at a fixed rate. * @param {string} name - Name of the stage. - * @param {FixedStageOptions} [options] - Options for the fixed stage. - * @param {number} [options.fixedStep] - Fixed step rate. - * @param {number} [options.maxSubsteps] - Maximum number of substeps. + * @param {number} [fixedStep] - Fixed step rate. + * @param {number} [maxSubsteps] - Maximum number of substeps. * @extends Stage */ export class FixedStage extends Stage { @@ -71,11 +70,11 @@ export class FixedStage extends Stage { private _accumulator: number private _alpha: number - constructor(options?: { fixedStep?: number; maxSubSteps?: number }) { + constructor(fixedStep?: number, maxSubSteps?: number) { super() - this._fixedStep = options?.fixedStep ?? FPS_50 - this._maxSubsteps = options?.maxSubSteps ?? 6 + this._fixedStep = fixedStep ?? FPS_50 + this._maxSubsteps = maxSubSteps ?? 6 this._accumulator = 0 this._alpha = 0 } From 406263a6ca760583b29e3543b29ece000ae3975a Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sun, 5 Jun 2022 22:10:03 -0700 Subject: [PATCH 029/252] Revert "Turn prettier off in eslint" This reverts commit f23ecaf4e1fe23343684b2fe8ac607a30f323adf. --- .eslintrc.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index a220dbb2de..b62c1067b7 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -64,7 +64,6 @@ "rules": { "import/no-unresolved": "off", "import/named": "off", - "import/namespace": "off", - "prettier/prettier": "off" + "import/namespace": "off" } } From 5cc8be5871c27b5f779bd6ae56e5262eba920c73 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 6 Jun 2022 08:34:19 -0700 Subject: [PATCH 030/252] Clean up example --- example/src/demos/Update.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index d5fbd67381..ee2cb944a8 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -86,8 +86,7 @@ function Update() { // For backwards compatability, useFrame gets executed in the update stage // A positive priority switches rendering to manual - useFrame((state) => { - console.log(state) + useFrame(() => { if (groupRef.current) { groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 } From 9f921c7a37baa41950efd4257c1aa97a81090177 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 6 Jun 2022 08:34:42 -0700 Subject: [PATCH 031/252] useUpdate throws an Error instead of a string --- packages/fiber/src/core/hooks.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 1af17f54b6..df30f1b75f 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -62,7 +62,7 @@ export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.U // Memoize ref const ref = useMutableCallback(callback) // Throw an error if a stage does not exist in the lifecycle - if (!stages.includes(stage)) throw `An invoked stage does not exist in the lifecycle.` + if (!stages.includes(stage)) throw new Error(`An invoked stage does not exist in the lifecycle.`) // Subscribe on mount, unsubscribe on unmount useIsomorphicLayoutEffect(() => stage.add(ref, store), [stage]) } From b1502e0d89b2c3eb8a11aa35036412fe4b4ab5ae Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 18 Jun 2022 18:56:39 -0700 Subject: [PATCH 032/252] feat: Stages has a delta that measures how long it took to execute. FixedStages also has substepDeltas returning an array of deltas for each substep --- packages/fiber/src/core/stages.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 4c87db4d7a..d0b745fa59 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -18,10 +18,12 @@ export type FixedStageProps = { fixedStep: number; maxSubsteps: number; accumula * Stages are used to build a lifecycle of effects for an app's frameloop. */ export class Stage { - subscribers: UpdateSubscription[] + private subscribers: UpdateSubscription[] + private _delta: number constructor() { this.subscribers = [] + this._delta = 0 } /** @@ -31,10 +33,13 @@ export class Stage { */ frame(delta: number, frame?: THREE.XRFrame | undefined) { const subs = this.subscribers + const initialTime = performance.now() for (let i = 0; i < subs.length; i++) { subs[i].ref.current(subs[i].store.getState(), delta, frame) } + + this._delta = performance.now() - initialTime } /** @@ -52,6 +57,10 @@ export class Stage { }) } } + + get delta() { + return this._delta + } } // Using Unity's fixedStep default. @@ -69,6 +78,8 @@ export class FixedStage extends Stage { private _maxSubsteps: number private _accumulator: number private _alpha: number + private _fixedDelta: number + private _substepDelta: number[] constructor(fixedStep?: number, maxSubSteps?: number) { super() @@ -77,6 +88,8 @@ export class FixedStage extends Stage { this._maxSubsteps = maxSubSteps ?? 6 this._accumulator = 0 this._alpha = 0 + this._fixedDelta = 0 + this._substepDelta = [] } /** @@ -87,6 +100,7 @@ export class FixedStage extends Stage { frame(delta: number, frame?: THREE.XRFrame | undefined) { const initialTime = performance.now() let substeps = 0 + this._substepDelta = [] this._accumulator += delta @@ -95,6 +109,7 @@ export class FixedStage extends Stage { substeps++ super.frame(this._fixedStep, frame) + this._substepDelta.push(super.delta) if (performance.now() - initialTime > this._fixedStep * 200) { // The framerate is not interactive anymore. @@ -102,6 +117,8 @@ export class FixedStage extends Stage { } } + this._fixedDelta = performance.now() - initialTime + // The accumulator will only be larger than the fixed step if we had to // bail early due to hitting the max substep limit or execution time lagging. // In that case, we want to shave off the excess so we don't fall behind next frame. @@ -109,6 +126,14 @@ export class FixedStage extends Stage { this._alpha = this._accumulator / this._fixedStep } + get delta() { + return this._fixedDelta + } + + get substepDelta() { + return this._substepDelta + } + get fixedStep() { return this._fixedStep } From b086e6a5079fd6f0a9341c8e9242a704c5786986 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 18 Jun 2022 18:56:50 -0700 Subject: [PATCH 033/252] Remove bad comment --- example/src/demos/Update.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx index ee2cb944a8..af15651da9 100644 --- a/example/src/demos/Update.tsx +++ b/example/src/demos/Update.tsx @@ -72,9 +72,6 @@ function Update() { // With interpolation of the fixed stage const alpha = Stages.Fixed.alpha - // Can also get from inside the loop using state - // const alpha = (state.getStage('fixed') as FixedStage).get().alpha - if (interpolate) { groupRef.current.scale.lerpVectors(prev.scale, fixed.scale, alpha) matRef.current.color.lerpColors(prev.color, fixed.color, alpha) From 1775dc1b82c388b29e34014af9d733582905578b Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 18 Jun 2022 18:59:14 -0700 Subject: [PATCH 034/252] refactor(FixedStage): Remove while look failsafe. It used arbitrary values and now that we have deltas there are useland ways to hanlde this --- packages/fiber/src/core/stages.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index d0b745fa59..c92ad9990c 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -110,11 +110,6 @@ export class FixedStage extends Stage { super.frame(this._fixedStep, frame) this._substepDelta.push(super.delta) - - if (performance.now() - initialTime > this._fixedStep * 200) { - // The framerate is not interactive anymore. - break - } } this._fixedDelta = performance.now() - initialTime From 9746c059d377a6d831cc00010982cbb03ad4f632 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sun, 19 Jun 2022 16:17:05 -0700 Subject: [PATCH 035/252] refactor(stages): Rename delta to frameTime --- packages/fiber/src/core/stages.ts | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index c92ad9990c..b75d56e746 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -19,11 +19,11 @@ export type FixedStageProps = { fixedStep: number; maxSubsteps: number; accumula */ export class Stage { private subscribers: UpdateSubscription[] - private _delta: number + private _frameTime: number constructor() { this.subscribers = [] - this._delta = 0 + this._frameTime = 0 } /** @@ -39,7 +39,7 @@ export class Stage { subs[i].ref.current(subs[i].store.getState(), delta, frame) } - this._delta = performance.now() - initialTime + this._frameTime = performance.now() - initialTime } /** @@ -58,8 +58,8 @@ export class Stage { } } - get delta() { - return this._delta + get frameTime() { + return this._frameTime } } @@ -78,8 +78,8 @@ export class FixedStage extends Stage { private _maxSubsteps: number private _accumulator: number private _alpha: number - private _fixedDelta: number - private _substepDelta: number[] + private _fixedFrameTime: number + private _substepFrameTime: number[] constructor(fixedStep?: number, maxSubSteps?: number) { super() @@ -88,8 +88,8 @@ export class FixedStage extends Stage { this._maxSubsteps = maxSubSteps ?? 6 this._accumulator = 0 this._alpha = 0 - this._fixedDelta = 0 - this._substepDelta = [] + this._fixedFrameTime = 0 + this._substepFrameTime = [] } /** @@ -100,7 +100,7 @@ export class FixedStage extends Stage { frame(delta: number, frame?: THREE.XRFrame | undefined) { const initialTime = performance.now() let substeps = 0 - this._substepDelta = [] + this._substepFrameTime = [] this._accumulator += delta @@ -109,10 +109,10 @@ export class FixedStage extends Stage { substeps++ super.frame(this._fixedStep, frame) - this._substepDelta.push(super.delta) + this._substepFrameTime.push(super.frameTime) } - this._fixedDelta = performance.now() - initialTime + this._fixedFrameTime = performance.now() - initialTime // The accumulator will only be larger than the fixed step if we had to // bail early due to hitting the max substep limit or execution time lagging. @@ -121,12 +121,12 @@ export class FixedStage extends Stage { this._alpha = this._accumulator / this._fixedStep } - get delta() { - return this._fixedDelta + get frameTime() { + return this._fixedFrameTime } - get substepDelta() { - return this._substepDelta + get substepFrameTime() { + return this._substepFrameTime } get fixedStep() { From aa7c81f2b218a307a883c81f8ff3531be95fc835 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 20 Jun 2022 15:37:58 -0700 Subject: [PATCH 036/252] refactor(FixedStage): Rename substepFrameTime to substepTimes --- packages/fiber/src/core/stages.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index b75d56e746..03efad94d4 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -79,7 +79,7 @@ export class FixedStage extends Stage { private _accumulator: number private _alpha: number private _fixedFrameTime: number - private _substepFrameTime: number[] + private _substepTimes: number[] constructor(fixedStep?: number, maxSubSteps?: number) { super() @@ -89,7 +89,7 @@ export class FixedStage extends Stage { this._accumulator = 0 this._alpha = 0 this._fixedFrameTime = 0 - this._substepFrameTime = [] + this._substepTimes = [] } /** @@ -100,7 +100,7 @@ export class FixedStage extends Stage { frame(delta: number, frame?: THREE.XRFrame | undefined) { const initialTime = performance.now() let substeps = 0 - this._substepFrameTime = [] + this._substepTimes = [] this._accumulator += delta @@ -109,7 +109,7 @@ export class FixedStage extends Stage { substeps++ super.frame(this._fixedStep, frame) - this._substepFrameTime.push(super.frameTime) + this._substepTimes.push(super.frameTime) } this._fixedFrameTime = performance.now() - initialTime @@ -125,8 +125,8 @@ export class FixedStage extends Stage { return this._fixedFrameTime } - get substepFrameTime() { - return this._substepFrameTime + get substepTimes() { + return this._substepTimes } get fixedStep() { From 57829d4373fd8bfedc8a8746da218d4abe858b95 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 20 Jun 2022 19:59:58 -0500 Subject: [PATCH 037/252] chore: bump to 9.0.0-alpha.0 --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 13e901a0fb..ff19207a9e 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "8.0.27", + "version": "9.0.0-alpha.0", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index ae61a1232d..bd6d4333d8 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "8.0.16", + "version": "9.0.0-alpha.0", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -22,8 +22,8 @@ ] }, "peerDependencies": { - "react": ">=17.0", - "@react-three/fiber": ">=8.0.26", - "three": ">=0.126" + "react": ">=18.0", + "@react-three/fiber": ">=9.0.0", + "three": ">=0.133" } } From 5c9544f2be71dc7a05187025fa9d63f2643cc9ac Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 29 Jul 2022 10:44:54 -0500 Subject: [PATCH 038/252] [v9] refactor(core)!: always set colormanagement, use r141 WebXR types (#2377) --- docs/tutorials/v8-migration-guide.mdx | 6 ++--- package.json | 4 +-- packages/fiber/package.json | 2 +- packages/fiber/src/core/index.tsx | 12 +++------ packages/fiber/src/core/loop.ts | 9 ++----- packages/fiber/src/core/stages.ts | 27 +++++++++---------- packages/fiber/src/core/store.ts | 4 +-- packages/fiber/src/core/utils.ts | 15 ----------- .../web/__snapshots__/canvas.test.tsx.snap | 2 +- packages/test-renderer/package.json | 2 +- yarn.lock | 22 +++++++++++---- 11 files changed, 46 insertions(+), 59 deletions(-) diff --git a/docs/tutorials/v8-migration-guide.mdx b/docs/tutorials/v8-migration-guide.mdx index f9d18c7541..1e6bf7081c 100644 --- a/docs/tutorials/v8-migration-guide.mdx +++ b/docs/tutorials/v8-migration-guide.mdx @@ -198,7 +198,7 @@ The `vr` prop was removed in favor of automatic WebXR switching. Whenever a sess In addition to the automatic rendering, useFrame will expose the current [`XRFrame`](https://developer.mozilla.org/en-US/docs/Web/API/XRFrame) obtained via [XRSession#requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/XRSession/requestAnimationFrame). ```ts -useFrame((state: RootState, delta: number, frame?: THREE.XRFrame) => { ... }) +useFrame((state: RootState, delta: number, frame?: XRFrame) => { ... }) ``` This removes the need for custom rendering loops when using WebXR pose data and abstractions like `useXRFrame` of [@react-three/xr](https://github.com/pmndrs/react-xr). @@ -218,7 +218,7 @@ This is also supported by all cameras that you create, be it a THREE.Perspective ```jsx import { PerspectiveCamera } from '@react-three/drei' - +; ``` @@ -333,7 +333,7 @@ window.addEventListener('resize', () => { root.configure({ events, camera: { position: [0, 0, 50], fov: 50 }, - size: { width: window.innerWidth, height: window.innerHeight } + size: { width: window.innerWidth, height: window.innerHeight }, }) root.render() }) diff --git a/package.json b/package.json index 774e561a15..66adc6259f 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@types/react-native": "0.67.4", "@types/react-test-renderer": "^17.0.1", "@types/scheduler": "^0.16.2", - "@types/three": "^0.139.0", + "@types/three": "^0.141.0", "@typescript-eslint/eslint-plugin": "^5.17.0", "@typescript-eslint/parser": "^5.17.0", "eslint": "^8.12.0", @@ -78,7 +78,7 @@ "react-native": "0.67.4", "react-test-renderer": "^18.0.0", "regenerator-runtime": "^0.13.9", - "three": "^0.139.0", + "three": "^0.141.0", "three-stdlib": "^2.8.11", "ts-jest": "^27.1.4", "typescript": "^4.6.3" diff --git a/packages/fiber/package.json b/packages/fiber/package.json index ff19207a9e..5e34a2eb8c 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -57,7 +57,7 @@ "react": ">=18.0", "react-dom": ">=18.0", "react-native": ">=0.64", - "three": ">=0.133" + "three": ">=0.141" }, "peerDependenciesMeta": { "react-dom": { diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index af7033a78a..da473102bd 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -31,7 +31,6 @@ import { useIsomorphicLayoutEffect, Camera, updateCamera, - setDeep, } from './utils' import { useStore } from './hooks' import { Stage, Lifecycle, Stages } from './stages' @@ -136,7 +135,7 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore { + current: (state: RootState, delta: number, frame?: XRFrame | undefined) => { subscribers = state.internal.subscribers for (let i = 0; i < subscribers.length; i++) { subscription = subscribers[i] @@ -248,7 +247,7 @@ function createRoot(canvas: TCanvas): ReconcilerRoot { + const handleXRFrame: XRFrameRequestCallback = (timestamp: number, frame?: XRFrame) => { const state = store.getState() if (state.frameloop === 'never') return advance(timestamp, true, state, frame) @@ -294,11 +293,8 @@ function createRoot(canvas: TCanvas): ReconcilerRoot, timestamp: number) { effects.forEach(({callback}) => callback(timestamp)) } -function update(timestamp: number, state: RootState, frame?: THREE.XRFrame) { +function update(timestamp: number, state: RootState, frame?: XRFrame) { // Run local effects let delta = state.clock.getDelta() // In frameloop='never' mode, clock times are updated using the provided timestamp @@ -112,12 +112,7 @@ export function createLoop(roots: Map) { } } - function advance( - timestamp: number, - runGlobalEffects: boolean = true, - state?: RootState, - frame?: THREE.XRFrame, - ): void { + function advance(timestamp: number, runGlobalEffects: boolean = true, state?: RootState, frame?: XRFrame): void { if (runGlobalEffects) run(globalEffects, timestamp) if (!state) roots.forEach((root) => update(timestamp, root.store.getState())) else update(timestamp, state, frame) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 03efad94d4..98a97341b7 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -3,7 +3,7 @@ import { StoreApi, UseBoundStore } from 'zustand' import { RootState } from './store' export interface UpdateCallback { - (state: RootState, delta: number, frame?: THREE.XRFrame | undefined): void + (state: RootState, delta: number, frame?: XRFrame): void } export type UpdateCallbackRef = MutableRefObject @@ -28,10 +28,10 @@ export class Stage { /** * Executes all callback subscriptions on the stage. - * @param {number} delta - Delta time between frame calls. - * @param {THREE.XRFrame | undefined} [frame] - The XR frame if it exists. + * @param delta - Delta time between frame calls. + * @param [frame] - The XR frame if it exists. */ - frame(delta: number, frame?: THREE.XRFrame | undefined) { + frame(delta: number, frame?: XRFrame) { const subs = this.subscribers const initialTime = performance.now() @@ -44,9 +44,9 @@ export class Stage { /** * Adds a callback subscriber to the stage. - * @param {UpdateCallbackRef} ref - The mutable callback reference. - * @param {Store} store - The store to be used with the callback execution. - * @returns {() => void} A function to remove the subscription. + * @param ref - The mutable callback reference. + * @param store - The store to be used with the callback execution. + * @returns A function to remove the subscription. */ add(ref: UpdateCallbackRef, store: Store) { this.subscribers.push({ ref, store }) @@ -68,10 +68,9 @@ const FPS_50 = 1 / 50 /** * Class representing a stage that updates every frame at a fixed rate. - * @param {string} name - Name of the stage. - * @param {number} [fixedStep] - Fixed step rate. - * @param {number} [maxSubsteps] - Maximum number of substeps. - * @extends Stage + * @param name - Name of the stage. + * @param [fixedStep] - Fixed step rate. + * @param [maxSubsteps] - Maximum number of substeps. */ export class FixedStage extends Stage { private _fixedStep: number @@ -94,10 +93,10 @@ export class FixedStage extends Stage { /** * Executes all callback subscriptions on the stage. - * @param {number} delta - Delta time between frame calls. - * @param {THREE.XRFrame | undefined} [frame] - The XR frame if it exists. + * @param delta - Delta time between frame calls. + * @param [frame] - The XR frame if it exists. */ - frame(delta: number, frame?: THREE.XRFrame | undefined) { + frame(delta: number, frame?: XRFrame) { const initialTime = performance.now() let substeps = 0 this._substepTimes = [] diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index bb9b88670c..b1a17881bf 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -47,7 +47,7 @@ export type Viewport = Size & { aspect: number } -export type RenderCallback = (state: RootState, delta: number, frame?: THREE.XRFrame) => void +export type RenderCallback = (state: RootState, delta: number, frame?: XRFrame) => void type LegacyAlways = 'always' export type FrameloopMode = LegacyAlways | 'auto' | 'demand' | 'never' @@ -170,7 +170,7 @@ const context = React.createContext>(null!) const createStore = ( invalidate: (state?: RootState, frames?: number) => void, - advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: THREE.XRFrame) => void, + advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: XRFrame) => void, ): UseBoundStore => { const rootState = create((set, get) => { const position = new THREE.Vector3() diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index fd7402b78b..737c2a1f05 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -321,11 +321,6 @@ export function applyProps(instance: Instance, data: InstanceProps | DiffSet) { else if (targetProp instanceof THREE.Layers && value instanceof THREE.Layers) targetProp.mask = value.mask // Otherwise just set ... else targetProp.set(value) - // For versions of three which don't support THREE.ColorManagement, - // Auto-convert sRGB colors - // https://github.com/pmndrs/react-three-fiber/issues/344 - const supportsColorManagement = 'ColorManagement' in THREE - if (!supportsColorManagement && !rootState.linear && isColor) targetProp.convertSRGBToLinear() } // Else, just overwrite the value } else { @@ -381,13 +376,3 @@ export function updateCamera(camera: Camera & { manual?: boolean }, size: Size) camera.updateMatrixWorld() } } - -/** - * Safely sets a deeply-nested value on an object. - */ -export function setDeep(obj: any, value: any, keys: string[]) { - const key = keys.pop()! - const target = keys.reduce((acc, key) => acc[key], obj) - - return (target[key] = value) -} diff --git a/packages/fiber/tests/web/__snapshots__/canvas.test.tsx.snap b/packages/fiber/tests/web/__snapshots__/canvas.test.tsx.snap index 56d34347fe..560516675d 100644 --- a/packages/fiber/tests/web/__snapshots__/canvas.test.tsx.snap +++ b/packages/fiber/tests/web/__snapshots__/canvas.test.tsx.snap @@ -9,7 +9,7 @@ exports[`web Canvas should correctly mount 1`] = ` style="width: 100%; height: 100%;" > =18.0", "@react-three/fiber": ">=9.0.0", - "three": ">=0.133" + "three": ">=0.141" } } diff --git a/yarn.lock b/yarn.lock index 3304bc5413..738950b3ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2263,10 +2263,17 @@ "@types/react" "*" csstype "^3.0.2" -"@types/three@^0.139.0": - version "0.139.0" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.139.0.tgz#69af1f0c52f8eea390f513e05478af1dd7f49e6f" - integrity sha512-4V/jZhyq7Mv05coUzxL3bz8AuBOSi/1F0RY7ujisHTV0Amy/fnYJ+s7TSJ1/hXjZukSkpuFRgV+wvWUEMbsMbQ== +"@types/three@^0.141.0": + version "0.141.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.141.0.tgz#d9d81a54b28ebc2a56931dfd4d9c54d25c20d6c8" + integrity sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA== + dependencies: + "@types/webxr" "*" + +"@types/webxr@*": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.4.0.tgz#ad06c96a324293e0d5175d13dd5ded5931f90ba3" + integrity sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg== "@types/yargs-parser@*": version "21.0.0" @@ -8660,11 +8667,16 @@ three-stdlib@^2.8.11, three-stdlib@^2.8.12, three-stdlib@^2.9.1: potpack "^1.0.1" zstddec "^0.0.2" -three@^0.139.0, three@^0.139.2: +three@^0.139.2: version "0.139.2" resolved "https://registry.yarnpkg.com/three/-/three-0.139.2.tgz#b110799a15736df673b9293e31653a4ac73648dd" integrity sha512-gV7q7QY8rogu7HLFZR9cWnOQAUedUhu2WXAnpr2kdXZP9YDKsG/0ychwQvWkZN5PlNw9mv5MoCTin6zNTXoONg== +three@^0.141.0: + version "0.141.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" + integrity sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA== + throat@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" From 5860b5c2706aa02471c3ef554c0ce5fa928627d1 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 2 Aug 2022 10:49:24 -0500 Subject: [PATCH 039/252] chore: fix lint --- packages/fiber/src/core/loop.ts | 10 +++++----- packages/fiber/src/native/events.ts | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index d4532a90fc..be0fab21b0 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -3,12 +3,12 @@ import { Root } from './renderer' import { RootState, Subscription } from './store' type GlobalRenderCallback = (timeStamp: number) => void -type SubItem = {callback: GlobalRenderCallback} +type SubItem = { callback: GlobalRenderCallback } function createSubs(callback: GlobalRenderCallback, subs: Set): () => void { - const sub = {callback} - subs.add(sub); - return () => void subs.delete(sub); + const sub = { callback } + subs.add(sub) + return () => void subs.delete(sub) } let i @@ -35,7 +35,7 @@ export const addAfterEffect = (callback: GlobalRenderCallback) => createSubs(cal export const addTail = (callback: GlobalRenderCallback) => createSubs(callback, globalTailEffects) function run(effects: Set, timestamp: number) { - effects.forEach(({callback}) => callback(timestamp)) + effects.forEach(({ callback }) => callback(timestamp)) } function update(timestamp: number, state: RootState, frame?: XRFrame) { diff --git a/packages/fiber/src/native/events.ts b/packages/fiber/src/native/events.ts index b415773825..a793209306 100644 --- a/packages/fiber/src/native/events.ts +++ b/packages/fiber/src/native/events.ts @@ -3,6 +3,7 @@ import { RootState } from '../core/store' import { createEvents, DomEvent, EventManager, Events } from '../core/events' import { GestureResponderEvent } from 'react-native' // @ts-ignore +// eslint-disable-next-line import Pressability from 'react-native/Libraries/Pressability/Pressability' const EVENTS = { From f9fb114c56c533a1ed60f7537cb079eb72911b1c Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 2 Aug 2022 10:49:57 -0500 Subject: [PATCH 040/252] chore: bump native deps --- package.json | 8 +- packages/fiber/package.json | 8 +- yarn.lock | 1647 +++++++++++++++++++++++------------ 3 files changed, 1080 insertions(+), 583 deletions(-) diff --git a/package.json b/package.json index 66adc6259f..a9d3dbd333 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@types/jest": "^27.4.1", "@types/react": "^18.0.5", "@types/react-dom": "^18.0.1", - "@types/react-native": "0.67.4", + "@types/react-native": "0.69.5", "@types/react-test-renderer": "^17.0.1", "@types/scheduler": "^0.16.2", "@types/three": "^0.141.0", @@ -65,8 +65,8 @@ "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.4.0", - "expo-asset": "^8.4.6", - "expo-gl": "^11.1.2", + "expo-asset": "~8.6.0", + "expo-gl": "~11.4.0", "husky": "^7.0.4", "jest": "^27.5.1", "jest-cli": "^27.5.1", @@ -75,7 +75,7 @@ "pretty-quick": "^3.1.3", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-native": "0.67.4", + "react-native": "0.69.3", "react-test-renderer": "^18.0.0", "regenerator-runtime": "^0.13.9", "three": "^0.141.0", diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 5e34a2eb8c..8d2a3f4830 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -51,12 +51,12 @@ "zustand": "^3.7.1" }, "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-gl": ">=11.0", + "expo": ">=46.0", + "expo-asset": ">=8.6", + "expo-gl": ">=11.4", "react": ">=18.0", "react-dom": ">=18.0", - "react-native": ">=0.64", + "react-native": ">=0.69", "three": ">=0.141" }, "peerDependenciesMeta": { diff --git a/yarn.lock b/yarn.lock index 738950b3ae..269e1fff15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,11 +16,30 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/code-frame@~7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== +"@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== + "@babel/core@7.17.8": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" @@ -42,7 +61,7 @@ json5 "^2.1.2" semver "^6.3.0" -"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.14.8", "@babel/core@^7.7.2", "@babel/core@^7.7.7", "@babel/core@^7.8.0": +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.14.8", "@babel/core@^7.7.2", "@babel/core@^7.7.7", "@babel/core@^7.8.0": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== @@ -63,6 +82,27 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/core@^7.13.16": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + "@babel/generator@^7.14.0", "@babel/generator@^7.17.7", "@babel/generator@^7.17.9", "@babel/generator@^7.7.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" @@ -72,6 +112,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a" + integrity sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA== + dependencies: + "@babel/types" "^7.18.10" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" @@ -79,6 +128,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" @@ -97,6 +153,16 @@ browserslist "^4.17.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" @@ -110,6 +176,19 @@ "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" + integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-create-regexp-features-plugin@^7.16.7": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" @@ -118,6 +197,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^5.0.1" +"@babel/helper-create-regexp-features-plugin@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" + integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" + "@babel/helper-define-polyfill-provider@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" @@ -139,6 +226,11 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" @@ -154,6 +246,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" @@ -161,6 +261,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" @@ -168,6 +275,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" @@ -175,6 +289,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" @@ -189,6 +310,20 @@ "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" @@ -196,11 +331,23 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" @@ -210,6 +357,16 @@ "@babel/helper-wrap-function" "^7.16.8" "@babel/types" "^7.16.8" +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + "@babel/helper-replace-supers@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" @@ -221,6 +378,17 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + "@babel/helper-simple-access@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" @@ -228,6 +396,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" @@ -235,6 +410,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + dependencies: + "@babel/types" "^7.18.9" + "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" @@ -242,16 +424,38 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/helper-wrap-function@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" @@ -262,6 +466,16 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" +"@babel/helper-wrap-function@^7.18.9": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz#a7fcd3ab9b1be4c9b52cf7d7fdc1e88c2ce93396" + integrity sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ== + dependencies: + "@babel/helper-function-name" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + "@babel/helpers@^7.17.8", "@babel/helpers@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" @@ -271,6 +485,24 @@ "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" @@ -280,11 +512,16 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.8", "@babel/parser@^7.17.9": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.8", "@babel/parser@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== +"@babel/parser@^7.13.16", "@babel/parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.10.tgz#94b5f8522356e69e8277276adf67ed280c90ecc1" + integrity sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" @@ -301,6 +538,16 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.16.7" +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952" + integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-proposal-async-generator-functions@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" @@ -310,7 +557,7 @@ "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.16.7": +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== @@ -318,6 +565,14 @@ "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-class-static-block@^7.16.7": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" @@ -367,7 +622,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== @@ -375,6 +630,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" @@ -402,7 +665,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.1.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== @@ -411,6 +674,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.16.11": version "7.16.11" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" @@ -493,6 +765,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -577,6 +856,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" @@ -658,7 +944,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.16.7": +"@babel/plugin-transform-flow-strip-types@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== @@ -666,6 +952,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-flow" "^7.16.7" +"@babel/plugin-transform-flow-strip-types@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz#5b4cc521426263b5ce08893a2db41097ceba35bf" + integrity sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-flow" "^7.18.6" + "@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" @@ -705,7 +999,7 @@ "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.7.5": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.7.5": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== @@ -715,6 +1009,16 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.13.8": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.16.7": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" @@ -734,6 +1038,14 @@ "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" + integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" @@ -748,13 +1060,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-object-assign@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.16.7.tgz#5fe08d63dccfeb6a33aa2638faf98e5c584100f8" - integrity sha512-R8mawvm3x0COTJtveuoqZIjNypn2FjfvXZr4pSQ8VhEFBuQGBz4XhHasZtHXjgXU4XptZ4HtGof3NoYc93ZH9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" @@ -824,7 +1129,7 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.16.7": +"@babel/plugin-transform-regenerator@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== @@ -895,6 +1200,15 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-typescript" "^7.16.7" +"@babel/plugin-transform-typescript@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.10.tgz#b23401b32f1f079396bcaed01667a54ebe4f9f85" + integrity sha512-j2HQCJuMbi88QftIb5zlRu3c7PU+sXNnscqsrjqegoGiCgXR569pEdben9vly5QHKL2ilYkfnSwu64zsZo/VYQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-typescript" "^7.18.6" + "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" @@ -990,14 +1304,14 @@ core-js-compat "^3.20.2" semver "^6.3.0" -"@babel/preset-flow@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.16.7.tgz#7fd831323ab25eeba6e4b77a589f680e30581cbd" - integrity sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug== +"@babel/preset-flow@^7.13.13": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb" + integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-flow-strip-types" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-flow-strip-types" "^7.18.6" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -1022,7 +1336,16 @@ "@babel/plugin-transform-react-jsx-development" "^7.16.7" "@babel/plugin-transform-react-pure-annotations" "^7.16.7" -"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.16.7": +"@babel/preset-typescript@^7.13.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/preset-typescript@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== @@ -1031,10 +1354,10 @@ "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-transform-typescript" "^7.16.7" -"@babel/register@^7.0.0": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.17.7.tgz#5eef3e0f4afc07e25e847720e7b987ae33f08d0b" - integrity sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA== +"@babel/register@^7.13.16": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" + integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1042,6 +1365,13 @@ pirates "^4.0.5" source-map-support "^0.5.16" +"@babel/runtime@^7.0.0": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.17.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" @@ -1058,6 +1388,15 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/template@^7.18.10", "@babel/template@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" @@ -1074,6 +1413,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.10.tgz#37ad97d1cb00efa869b91dd5d1950f8a6cf0cb08" + integrity sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" @@ -1082,6 +1437,15 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" + integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1312,14 +1676,6 @@ resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-10.1.2.tgz#d2fb7b968141139e5c2419553e5295382c265e7d" integrity sha512-bbZIpW6fdyf7FMaeDmw3cBbkTqsecxEkwlVKgVfqqXWBPLH6azxhPA2V9F7OhoZSVrsnMYw7QuyK6qutXPjEew== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - "@emotion/is-prop-valid@^1.1.0": version "1.1.2" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" @@ -1357,6 +1713,72 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@expo/config-plugins@~5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-5.0.0.tgz#19f699aafa5809756b9be055189a14842f8da7ae" + integrity sha512-Bgjgv64f/XqpXXKPAoGhc5dbmuJB8eOBkhV6FMI/RMP06HfL7EQvXgcBBoJThLAZVyd29XikFgaCvABt/NavxQ== + dependencies: + "@expo/config-types" "^46.0.0" + "@expo/json-file" "8.2.36" + "@expo/plist" "0.0.18" + "@expo/sdk-runtime-versions" "^1.0.0" + "@react-native/normalize-color" "^2.0.0" + chalk "^4.1.2" + debug "^4.3.1" + find-up "~5.0.0" + getenv "^1.0.0" + glob "7.1.6" + resolve-from "^5.0.0" + semver "^7.3.5" + slash "^3.0.0" + xcode "^3.0.1" + xml2js "0.4.23" + +"@expo/config-types@^46.0.0": + version "46.0.1" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-46.0.1.tgz#ba5d6197222039de13aefdf0171d24b027781cd0" + integrity sha512-LQWGDagQ0YXGSJyLomNDZrYXj/cUP+wczs9y2M8MB9UDoSU6dbLRMiSX0FMhhKKdxBK0p92VQxZyqOzGpIYfSw== + +"@expo/config@~7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-7.0.0.tgz#0289d4cadff48eaed33683384c41ae9a90bb8b00" + integrity sha512-4807iau5gTcCAMUDWxsXfBX4E3embZJREO9c098GiRgAvCBc7PCqdGs9jEAKakCxmPbMGBURL17rKYAsHtZuQw== + dependencies: + "@babel/code-frame" "~7.10.4" + "@expo/config-plugins" "~5.0.0" + "@expo/config-types" "^46.0.0" + "@expo/json-file" "8.2.36" + getenv "^1.0.0" + glob "7.1.6" + require-from-string "^2.0.2" + resolve-from "^5.0.0" + semver "7.3.2" + slugify "^1.3.4" + sucrase "^3.20.0" + +"@expo/json-file@8.2.36": + version "8.2.36" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.36.tgz#62a505cb7f30a34d097386476794680a3f7385ff" + integrity sha512-tOZfTiIFA5KmMpdW9KF7bc6CFiGjb0xnbieJhTGlHrLL+ps2G0OkqmuZ3pFEXBOMnJYUVpnSy++52LFxvpa5ZQ== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^1.0.1" + write-file-atomic "^2.3.0" + +"@expo/plist@0.0.18": + version "0.0.18" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.18.tgz#9abcde78df703a88f6d9fa1a557ee2f045d178b0" + integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w== + dependencies: + "@xmldom/xmldom" "~0.7.0" + base64-js "^1.2.3" + xmlbuilder "^14.0.0" + +"@expo/sdk-runtime-versions@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" + integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== + "@hapi/hoek@^9.0.0": version "9.2.1" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" @@ -1586,11 +2008,25 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/resolve-uri@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" @@ -1604,6 +2040,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@manypkg/find-root@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" @@ -1700,30 +2144,73 @@ pirates "^4.0.1" source-map-support "^0.5.16" -"@react-native-community/cli-debugger-ui@^6.0.0-rc.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-6.0.0.tgz#ef9eb1268d85c1bd3caf2c4d36dc350bb080f254" - integrity sha512-onf6vtvqSzOr6bNEWhPzgcJP2UQhA0VY6c8tXwNczIONC/ahnN93LPBB/uXDbn9d/kLMvE7oUJiqRadZWHk6aA== +"@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" + integrity sha512-IwS1M1NHg6+qL8PThZYMSIMYbZ6Zbx+lIck9PLBskbosFo24M3lCOflOl++Bggjakp6mR+sRXxLMexid/GeOsQ== + dependencies: + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + execa "^1.0.0" + prompts "^2.4.0" + +"@react-native-community/cli-config@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-8.0.4.tgz#40e9e4e12ba70a6e12d1e777373af6fa1ac2e4e6" + integrity sha512-0vcrIETka1Tr0blr0AjVkoP/1yynvarJQXi8Yry/XB3BLenrkUFxolqqA3Ff55KFQ7t1IzAuFtfuVZs25LvyDQ== + dependencies: + "@react-native-community/cli-tools" "^8.0.4" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + glob "^7.1.3" + joi "^17.2.1" + +"@react-native-community/cli-debugger-ui@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-8.0.0.tgz#98263dc525e65015e2d6392c940114028f87e8e9" + integrity sha512-u2jq06GZwZ9sRERzd9FIgpW6yv4YOW4zz7Ym/B8eSzviLmy3yI/8mxJtvlGW+J8lBsfMcQoqJpqI6Rl1nZy9yQ== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-hermes@^6.3.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-6.3.0.tgz#92b2f07d08626a60f6893c3e3d57c1538c8fb5a7" - integrity sha512-Uhbm9bubyZLZ12vFCIfWbE/Qi3SBTbYIN/TC08EudTLhv/KbPomCQnmFsnJ7AXQFuOZJs73mBxoEAYSbRbwyVA== +"@react-native-community/cli-doctor@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-8.0.4.tgz#9216867f0d8590868dc5b8035f62bbcac68b3254" + integrity sha512-Blw/66qwoEoKrtwn3O9iTtXbt4YWlwqNse5BJeRDzlSdutWTX4PgJu/34gyvOHGysNlrf+GYkeyqqxI/y0s07A== dependencies: - "@react-native-community/cli-platform-android" "^6.3.0" - "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-config" "^8.0.4" + "@react-native-community/cli-platform-ios" "^8.0.4" + "@react-native-community/cli-tools" "^8.0.4" chalk "^4.1.2" + command-exists "^1.2.8" + envinfo "^7.7.2" + execa "^1.0.0" hermes-profile-transformer "^0.0.6" ip "^1.1.5" + node-stream-zip "^1.9.1" + ora "^5.4.1" + prompts "^2.4.0" + semver "^6.3.0" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" -"@react-native-community/cli-platform-android@^6.0.0", "@react-native-community/cli-platform-android@^6.3.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-6.3.0.tgz#ab7d156bd69a392493323eeaba839a874c0e201f" - integrity sha512-d5ufyYcvrZoHznYm5bjBXaiHIJv552t5gYtQpnUsxBhHSQ8QlaNmlLUyeSPRDfOw4ND9b0tPHqs4ufwx6vp/fQ== +"@react-native-community/cli-hermes@^8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-8.0.5.tgz#639edc6b0ce73f705e4b737e3de1cc47d42516ff" + integrity sha512-Zm0wM6SfgYAEX1kfJ1QBvTayabvh79GzmjHyuSnEROVNPbl4PeCG4WFbwy489tGwOP9Qx9fMT5tRIFCD8bp6/g== + dependencies: + "@react-native-community/cli-platform-android" "^8.0.5" + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@^8.0.2", "@react-native-community/cli-platform-android@^8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-8.0.5.tgz#da11d2678adeca98e83494d68de80e50571b4af4" + integrity sha512-z1YNE4T1lG5o9acoQR1GBvf7mq6Tzayqo/za5sHVSOJAC9SZOuVN/gg/nkBa9a8n5U7qOMFXfwhTMNqA474gXA== dependencies: - "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-tools" "^8.0.4" chalk "^4.1.2" execa "^1.0.0" fs-extra "^8.1.0" @@ -1732,117 +2219,107 @@ lodash "^4.17.15" logkitty "^0.7.1" slash "^3.0.0" - xmldoc "^1.1.2" -"@react-native-community/cli-platform-ios@^6.0.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-6.2.0.tgz#ceaa23995511a8e400b506632ac7e6a66a17ec2a" - integrity sha512-k15MhExxLiLDDZOeuPgvTxbp0CsoLQQpk2Du0HjZDePqqWcKJylQqMZru1o8HuQHPcEr+b71HIs5V+lKyFYpfg== +"@react-native-community/cli-platform-ios@^8.0.2", "@react-native-community/cli-platform-ios@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.4.tgz#15225c09a1218a046f11165a54bf14b59dad7020" + integrity sha512-7Jdptedfg/J0Xo2rQbJ4jmo+PMYOiIiRcNDCSI5dBcNkQfSq4MMYUnKQx5DdZHgrfxE0O1vE4iNmJdd4wePz8w== dependencies: - "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-tools" "^8.0.4" chalk "^4.1.2" + execa "^1.0.0" glob "^7.1.3" js-yaml "^3.13.1" lodash "^4.17.15" - ora "^3.4.0" + ora "^5.4.1" plist "^3.0.2" - xcode "^2.0.0" -"@react-native-community/cli-plugin-metro@^6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-6.4.0.tgz#70b7908d6b548481f37ed58167f9460d325ae21c" - integrity sha512-lcrNODvHd3ZVhiEshXAjyBoqP44rjhkytkOSUpnZHAcmMLiguxDmvhWeWqbwu3XqSX/f0gVKmfj81t+opI1bSw== +"@react-native-community/cli-plugin-metro@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-8.0.4.tgz#a364a50a2e05fc5d0b548759e499e5b681b6e4cc" + integrity sha512-UWzY1eMcEr/6262R2+d0Is5M3L/7Y/xXSDIFMoc5Rv5Wucl3hJM/TxHXmByvHpuJf6fJAfqOskyt4bZCvbI+wQ== dependencies: - "@react-native-community/cli-server-api" "^6.4.0" - "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-server-api" "^8.0.4" + "@react-native-community/cli-tools" "^8.0.4" chalk "^4.1.2" - metro "^0.66.1" - metro-config "^0.66.1" - metro-core "^0.66.1" - metro-react-native-babel-transformer "^0.66.1" - metro-resolver "^0.66.1" - metro-runtime "^0.66.1" + metro "^0.70.1" + metro-config "^0.70.1" + metro-core "^0.70.1" + metro-react-native-babel-transformer "^0.70.1" + metro-resolver "^0.70.1" + metro-runtime "^0.70.1" readline "^1.3.0" -"@react-native-community/cli-server-api@^6.4.0": - version "6.4.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-6.4.3.tgz#b52444454f40bfb54a84ab52bf42e9f8002917f5" - integrity sha512-Ywy2x+PhIUZXgE74YiCYXylSVnuEBcq5cNfYLR3AwOvrILjh03smXfCca8s2V2LWUlzmWN6+L85FJGsT92MUJA== +"@react-native-community/cli-server-api@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-8.0.4.tgz#d45d895a0a6e8b960c9d677188d414a996faa4d3" + integrity sha512-Orr14njx1E70CVrUA8bFdl+mrnbuXUjf1Rhhm0RxUadFpvkHuOi5dh8Bryj2MKtf8eZrpEwZ7tuQPhJEULW16A== dependencies: - "@react-native-community/cli-debugger-ui" "^6.0.0-rc.0" - "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-debugger-ui" "^8.0.0" + "@react-native-community/cli-tools" "^8.0.4" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.0" - nocache "^2.1.0" + nocache "^3.0.1" pretty-format "^26.6.2" serve-static "^1.13.1" - ws "^1.1.0" + ws "^7.5.1" -"@react-native-community/cli-tools@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-6.2.0.tgz#8f4adc2d83ab96e5654348533c8fa602742c4fce" - integrity sha512-08ssz4GMEnRxC/1FgTTN/Ud7mExQi5xMphItPjfHiTxpZPhrFn+IMx6mya0ncFEhhxQ207wYlJMRLPRRdBZ8oA== +"@react-native-community/cli-tools@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-8.0.4.tgz#994b9d56c84472491c876b71acd4356773fcbe65" + integrity sha512-ePN9lGxh6LRFiotyddEkSmuqpQhnq2iw9oiXYr4EFWpIEy0yCigTuSTiDF68+c8M9B+7bTwkRpz/rMPC4ViO5Q== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" + find-up "^5.0.0" lodash "^4.17.15" mime "^2.4.1" node-fetch "^2.6.0" open "^6.2.0" + ora "^5.4.1" semver "^6.3.0" - shell-quote "1.6.1" + shell-quote "^1.7.3" -"@react-native-community/cli-types@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-6.0.0.tgz#90269fbdc7229d5e3b8f2f3e029a94083551040d" - integrity sha512-K493Fk2DMJC0ZM8s8gnfseKxGasIhuDaCUDeLZcoCSFlrjKEuEs1BKKEJiev0CARhKEXKOyyp/uqYM9nWhisNw== +"@react-native-community/cli-types@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-8.0.0.tgz#72d24178e5ed1c2d271da43e0a4a4f59178f261a" + integrity sha512-1lZS1PEvMlFaN3Se1ksyoFWzMjk+YfKi490GgsqKJln9gvFm8tqVPdnXttI5Uf2DQf3BMse8Bk8dNH4oV6Ewow== dependencies: - ora "^3.4.0" + joi "^17.2.1" -"@react-native-community/cli@^6.0.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-6.4.0.tgz#0b61a4b5f11293b0b79a0e78f80777387a9529a9" - integrity sha512-UNvYnWaALa4mJEaWdLY3fVK+csZzx/Ja/FGvXISPJ9W9lrKvGtyXkidViUCPbPtMsJUi7teA4uIShHn0mbGmnQ== - dependencies: - "@react-native-community/cli-debugger-ui" "^6.0.0-rc.0" - "@react-native-community/cli-hermes" "^6.3.0" - "@react-native-community/cli-plugin-metro" "^6.4.0" - "@react-native-community/cli-server-api" "^6.4.0" - "@react-native-community/cli-tools" "^6.2.0" - "@react-native-community/cli-types" "^6.0.0" - appdirsjs "^1.2.4" +"@react-native-community/cli@^8.0.3": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-8.0.5.tgz#902a13b5336508f7989fddf39e6bf85b63a66de9" + integrity sha512-X0AMNK+sKDJQX8eQRkqgddJsZPWlHgLryX7O9usj78UFEK8VqVYtpv08piWecfAhC2mZU4/Lww4bKu9uJ1rdyQ== + dependencies: + "@react-native-community/cli-clean" "^8.0.4" + "@react-native-community/cli-config" "^8.0.4" + "@react-native-community/cli-debugger-ui" "^8.0.0" + "@react-native-community/cli-doctor" "^8.0.4" + "@react-native-community/cli-hermes" "^8.0.5" + "@react-native-community/cli-plugin-metro" "^8.0.4" + "@react-native-community/cli-server-api" "^8.0.4" + "@react-native-community/cli-tools" "^8.0.4" + "@react-native-community/cli-types" "^8.0.0" chalk "^4.1.2" - command-exists "^1.2.8" commander "^2.19.0" - cosmiconfig "^5.1.0" - deepmerge "^3.2.0" - envinfo "^7.7.2" execa "^1.0.0" find-up "^4.1.0" fs-extra "^8.1.0" - glob "^7.1.3" graceful-fs "^4.1.3" - joi "^17.2.1" leven "^3.1.0" lodash "^4.17.15" minimist "^1.2.0" - node-stream-zip "^1.9.1" - ora "^3.4.0" - pretty-format "^26.6.2" prompts "^2.4.0" semver "^6.3.0" - serve-static "^1.13.1" - strip-ansi "^5.2.0" - sudo-prompt "^9.0.0" - wcwidth "^1.0.1" "@react-native/assets@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== -"@react-native/normalize-color@2.0.0": +"@react-native/normalize-color@2.0.0", "@react-native/normalize-color@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567" integrity sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw== @@ -2193,10 +2670,10 @@ dependencies: "@types/react" "*" -"@types/react-native@0.67.4": - version "0.67.4" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.67.4.tgz#97a8d3cff2a7606f247008e93d9fe2a3879bc84e" - integrity sha512-L81CB6W1m0s7d+TH/loP318+VKPwwjWQBUTVYQ1+lQTWiE5jHxyihgCmd7JbwLICo708FRSDwJW7pJoiZHy6yg== +"@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" + integrity sha512-mSUCuGUsW2kJlZiu4GmdYVDKZX/52iyC9rm6dxAmflJj1b7kSO/CMSDy5WbcfS8QerxTqbYGTrIwHD0GnXHzbQ== dependencies: "@types/react" "*" @@ -2402,6 +2879,11 @@ resolved "https://registry.yarnpkg.com/@webgpu/glslang/-/glslang-0.0.15.tgz#f5ccaf6015241e6175f4b90906b053f88483d1f2" integrity sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q== +"@xmldom/xmldom@~0.7.0": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d" + integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A== + abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -2545,13 +3027,10 @@ ansi-styles@^6.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@^3.0.3: version "3.1.2" @@ -2603,11 +3082,6 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= - array-includes@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" @@ -2619,16 +3093,6 @@ array-includes@^3.1.4: get-intrinsic "^1.1.1" is-string "^1.0.7" -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -2701,12 +3165,10 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.4.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" +async@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" @@ -2879,7 +3341,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.5.1: +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2916,6 +3378,15 @@ big-integer@1.6.x: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blueimp-md5@^2.10.0: version "2.19.0" resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" @@ -3026,6 +3497,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" @@ -3112,14 +3591,7 @@ caniuse-lite@^1.0.30001317: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.1.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3196,13 +3668,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -3210,10 +3675,10 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.0.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== cli-truncate@^2.1.0: version "2.1.0" @@ -3315,11 +3780,6 @@ colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -colors@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3337,6 +3797,11 @@ commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -3548,7 +4013,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4224,11 +4689,6 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -4300,28 +4760,46 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" -expo-asset@^8.4.6: - version "8.4.6" - resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-8.4.6.tgz#1c40e9badac66dbd3d2be2810711937e5b9b09bd" - integrity sha512-Kpzcmmf1lceHnZkAdJOvq7l7SU/hCL59vAj2xUZS66U6lFkUf7LNEA/NzILA56loCd4cka5ShYlWs+BMchyFDQ== +expo-asset@~8.6.0: + version "8.6.1" + resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-8.6.1.tgz#86355b3e231e8aa6cf68a456ce9746dff1478b48" + integrity sha512-urbUp1YtwH2J0Qc3inGQJdqTjWKML77SeMNgff+iR9MUE8gDkFqSCDjrBi7i5Oj5DDtq43mmtDg8G8ei6Vchcg== dependencies: blueimp-md5 "^2.10.0" + expo-constants "~13.2.2" + expo-file-system "~14.1.0" invariant "^2.2.4" md5-file "^3.2.3" path-browserify "^1.0.0" - url-parse "^1.4.4" + url-parse "^1.5.9" + +expo-constants@~13.2.2: + version "13.2.3" + resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-13.2.3.tgz#526711851d8ebec1f0b1f06d9b91271b119e4f33" + integrity sha512-2Rrp7GtSTeW7gNz3BsZ+AWMBbBaBnymELuo1ecTQ6fga8F5IRXgj1TW5yFpTmqOTtVfCiQfS0M1QO+JZEatPCQ== + dependencies: + "@expo/config" "~7.0.0" + uuid "^3.3.2" + +expo-file-system@~14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-14.1.0.tgz#4fa410873ef12ac8bec873593f7489f4305a14b8" + integrity sha512-lJcPGQ8yKXVknVkD5TmcJnR/TpQbEL0JP8hknLejfq3FIqPqI/LBFn31YiP37grxW8lITz1al8pq5T6CSUjAzQ== + dependencies: + "@expo/config-plugins" "~5.0.0" + uuid "^3.4.0" -expo-gl-cpp@~11.1.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/expo-gl-cpp/-/expo-gl-cpp-11.1.1.tgz#883781535658a3598f2262425b1d3527b0e72760" - integrity sha512-BWcJ3cZAo0ZlKueKwb3uRYrRjZPF/CfgE96hBCnLhYBs2TOWt/iV8s5+H0fvZuHBKo13AK/9NdyVRaAb88DKqg== +expo-gl-cpp@~11.4.0: + version "11.4.0" + resolved "https://registry.yarnpkg.com/expo-gl-cpp/-/expo-gl-cpp-11.4.0.tgz#62b4b5c61ef065e94aa790a872aad2eee2ae11ea" + integrity sha512-vt9QYKX/4TxMaNnbv9ww5KILwyCmg91gqwA/6xuo4MqWxGkZoxy+b8lqsQthuPdn+FHgF0BNcvFW9nbN+JeSRg== -expo-gl@^11.1.2: - version "11.1.2" - resolved "https://registry.yarnpkg.com/expo-gl/-/expo-gl-11.1.2.tgz#e0864f7a50d85f3d7242b545096acf1be6fd7d39" - integrity sha512-sNdJObyPUimpWlna4ttdwR9rRHvMn03kqzqc6BVYOWidaPA/T3VsXuuYkPNKc8ps//17U1jvMSl/8FmE0jqRzA== +expo-gl@~11.4.0: + version "11.4.0" + resolved "https://registry.yarnpkg.com/expo-gl/-/expo-gl-11.4.0.tgz#0aa6b05908f1a8405f804f3e1a360a215569b9f2" + integrity sha512-Q0/4git7mNanxPe4/DMC6dk9F1Xu2ACTmacWdoLjS3NByUzFt25vFtrbf9R3FCgWcBlA9ncfVp1CsYgA4+61Dg== dependencies: - expo-gl-cpp "~11.1.0" + expo-gl-cpp "~11.4.0" invariant "^2.2.4" extend-shallow@^2.0.1: @@ -4490,7 +4968,7 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: +find-up@^5.0.0, find-up@~5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -4597,7 +5075,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -4673,6 +5151,11 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +getenv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" + integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -4702,6 +5185,18 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -4830,15 +5325,22 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hermes-engine@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.9.0.tgz#84d9cfe84e8f6b1b2020d6e71b350cec84ed982f" - integrity sha512-r7U+Y4P2Qg/igFVZN+DpT7JFfXUn1MM4dFne8aW+cCrF6RRymof+VqrUHs1kl07j8h8V2CNesU19RKgWbr3qPw== +hermes-engine@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.11.0.tgz#bb224730d230a02a5af02c4e090d1f52d57dd3db" + integrity sha512-7aMUlZja2IyLYAcZ69NBnwJAR5ZOYlSllj0oMpx08a8HzxHOys0eKCzfphrf6D0vX1JGO1QQvVsQKe6TkYherw== + +hermes-estree@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.6.0.tgz#e866fddae1b80aec65fe2ae450a5f2070ad54033" + integrity sha512-2YTGzJCkhdmT6VuNprWjXnvTvw/3iPNw804oc7yknvQpNKo+vJGZmtvLLCghOZf0OwzKaNAzeIMp71zQbNl09w== -hermes-parser@0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.4.7.tgz#410f5129d57183784d205a0538e6fbdcf614c9ea" - integrity sha512-jc+zCtXbtwTiXoMAoXOHepxAaGVFIp89wwE9qcdwnMd/uGVEtPoY8FaFSsx0ThPvyKirdR2EsIIDVrpbSXz1Ag== +hermes-parser@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.6.0.tgz#00d14e91bca830b3c1457050fa4187400cb96328" + integrity sha512-Vf58jBZca2+QBLR9h7B7mdg8oFz2g5ILz1iVouZ5DOrOrAfBmPfJjdjDT8jrO0f+iJ4/hSRrQHqHIjSnTaLUDQ== + dependencies: + hermes-estree "0.6.0" hermes-profile-transformer@^0.0.6: version "0.0.6" @@ -4926,6 +5428,11 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore-walk@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" @@ -4985,7 +5492,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5181,6 +5688,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -5285,6 +5797,11 @@ is-typedarray@^1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -5511,28 +6028,7 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-haste-map@^26.5.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" - -jest-haste-map@^27.5.1: +jest-haste-map@^27.3.1, jest-haste-map@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== @@ -5621,11 +6117,6 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - jest-regex-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" @@ -5711,14 +6202,6 @@ jest-runtime@^27.5.1: slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - jest-serializer@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" @@ -5755,18 +6238,6 @@ jest-snapshot@^27.5.1: pretty-format "^27.5.1" semver "^7.3.2" -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - jest-util@^27.0.0, jest-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" @@ -5816,7 +6287,7 @@ jest-watcher@^27.5.1: jest-util "^27.5.1" string-length "^4.0.1" -jest-worker@^26.0.0, jest-worker@^26.3.0, jest-worker@^26.6.2: +jest-worker@^26.3.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -5825,7 +6296,7 @@ jest-worker@^26.0.0, jest-worker@^26.3.0, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^27.5.1: +jest-worker@^27.2.0, jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -5884,29 +6355,29 @@ jsc-android@^250230.2.1: resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== -jscodeshift@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.11.0.tgz#4f95039408f3f06b0e39bb4d53bc3139f5330e2f" - integrity sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g== - dependencies: - "@babel/core" "^7.1.6" - "@babel/parser" "^7.1.6" - "@babel/plugin-proposal-class-properties" "^7.1.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.1.0" - "@babel/plugin-proposal-optional-chaining" "^7.1.0" - "@babel/plugin-transform-modules-commonjs" "^7.1.0" - "@babel/preset-flow" "^7.0.0" - "@babel/preset-typescript" "^7.1.0" - "@babel/register" "^7.0.0" +jscodeshift@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef" + integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" babel-core "^7.0.0-bridge.0" - colors "^1.1.2" + chalk "^4.1.2" flow-parser "0.*" graceful-fs "^4.2.4" micromatch "^3.1.10" neo-async "^2.5.0" node-dir "^0.1.17" - recast "^0.20.3" - temp "^0.8.1" + recast "^0.20.4" + temp "^0.8.4" write-file-atomic "^2.3.0" jsdom@^16.6.0: @@ -6007,11 +6478,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.2.2" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c" @@ -6201,17 +6667,18 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: - chalk "^2.0.1" + chalk "^4.1.0" + is-unicode-supported "^0.1.0" log-update@^4.0.0: version "4.0.0" @@ -6322,6 +6789,11 @@ md5-file@^3.2.3: dependencies: buffer-alloc "^1.1.0" +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + meow@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" @@ -6371,93 +6843,79 @@ meshline@^2.0.4: resolved "https://registry.yarnpkg.com/meshline/-/meshline-2.0.4.tgz#39c7bcf36b503397642f2312e6211f2a8ecf75c5" integrity sha512-Jh6DJl/zLqA4xsKvGv5950jr2ukyXQE1wgxs8u94cImHrvL6soVIggqjP+2hVHZXGYaKnWszhtjuCbKNeQyYiw== -metro-babel-register@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.66.2.tgz#c6bbe36c7a77590687ccd74b425dc020d17d05af" - integrity sha512-3F+vsVubUPJYKfVMeol8/7pd8CC287Rw92QYzJD8LEmI980xcgwMUEVBZ0UIAUwlLgiJG/f4Mwhuji2EeBXrPg== +metro-babel-transformer@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.70.3.tgz#dca61852be273824a4b641bd1ecafff07ff3ad1f" + integrity sha512-bWhZRMn+mIOR/s3BDpFevWScz9sV8FGktVfMlF1eJBLoX24itHDbXvTktKBYi38PWIKcHedh6THSFpJogfuwNA== dependencies: "@babel/core" "^7.14.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/register" "^7.0.0" - escape-string-regexp "^1.0.5" - -metro-babel-transformer@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.66.2.tgz#fce0a3e314d28a5e7141c135665e1cc9b8e7ce86" - integrity sha512-aJ/7fc/Xkofw8Fqa51OTDhBzBz26mmpIWrXAZcPdQ8MSTt883EWncxeCEjasc79NJ89BRi7sOkkaWZo2sXlKvw== - dependencies: - "@babel/core" "^7.14.0" - hermes-parser "0.4.7" - metro-source-map "0.66.2" + hermes-parser "0.6.0" + metro-source-map "0.70.3" nullthrows "^1.1.1" -metro-cache-key@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.66.2.tgz#d6463d2a53e887a38419d523962cc24ea0e780b4" - integrity sha512-WtkNmRt41qOpHh1MkNA4nLiQ/m7iGL90ysSKD+fcLqlUnOBKJptPQm0ZUv8Kfqk18ddWX2KmsSbq+Sf3I6XohQ== +metro-cache-key@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.70.3.tgz#898803db04178a8f440598afba7d82a9cf35abf7" + integrity sha512-0zpw+IcpM3hmGd5sKMdxNv3sbOIUYnMUvx1/yaM6vNRReSPmOLX0bP8fYf3CGgk8NEreZ1OHbVsuw7bdKt40Mw== -metro-cache@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.66.2.tgz#e0af4e0a319898f7d42a980f7ee5da153fcfd019" - integrity sha512-5QCYJtJOHoBSbL3H4/Fpl36oA697C3oYHqsce+Hk/dh2qtODUGpS3gOBhvP1B8iB+H8jJMyR75lZq129LJEsIQ== +metro-cache@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.70.3.tgz#42cf3cdf8a7b3691f3bef9a86bed38d4c5f6201f" + integrity sha512-iCix/+z812fUqa6KlOxaTkY6LQQDoXIe/VljXkGIvpygSCmYyhjQpfQVZEVVPezFmUBYXNdabdQ6cYx6JX3yMg== dependencies: - metro-core "0.66.2" - mkdirp "^0.5.1" + metro-core "0.70.3" rimraf "^2.5.4" -metro-config@0.66.2, metro-config@^0.66.1: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.66.2.tgz#e365acdb66ad0cda0182b9c9910760a97ee4293b" - integrity sha512-0C+PrKKIBNNzLZUKN/8ZDJS2U5FLMOTXDWbvBHIdqb6YXz8WplXR2+xlSlaSCCi5b+GR7cWFWUNeKA4GQS1/AQ== +metro-config@0.70.3, metro-config@^0.70.1: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.70.3.tgz#fe6f7330f679d5594e5724af7a69d4dbe1bb5bc3" + integrity sha512-SSCDjSTygoCgzoj61DdrBeJzZDRwQxUEfcgc6t6coxWSExXNR4mOngz0q4SAam49Bmjq9J2Jft6qUKnUTPrRgA== dependencies: cosmiconfig "^5.0.5" jest-validate "^26.5.2" - metro "0.66.2" - metro-cache "0.66.2" - metro-core "0.66.2" - metro-runtime "0.66.2" + metro "0.70.3" + metro-cache "0.70.3" + metro-core "0.70.3" + metro-runtime "0.70.3" -metro-core@0.66.2, metro-core@^0.66.1: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.66.2.tgz#ead776a17b3e5a307e6dc22259db30bf5c7e8490" - integrity sha512-JieLZkef/516yxXYvQxWnf3OWw5rcgWRy76K8JV/wr/i8LGVGulPAXlIi445/QZzXVydzRVASKAEVqyxM5F4mA== +metro-core@0.70.3, metro-core@^0.70.1: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.70.3.tgz#bf4dda15a5185f5a7931de463a1b97ac9ef680a0" + integrity sha512-NzfHB/w5R7yLaOeU1tzPTbBzCRsYSvpKJkLMP0yudszKZzIAZqNdjoEJ9GZ688Wi0ynZxcU0BxukXh4my80ZBw== dependencies: - jest-haste-map "^26.5.2" + jest-haste-map "^27.3.1" lodash.throttle "^4.1.1" - metro-resolver "0.66.2" + metro-resolver "0.70.3" -metro-hermes-compiler@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.66.2.tgz#30290748f83805faa601aa487632444915795823" - integrity sha512-nCVL1g9uR6vrw5+X1wjwZruRyMkndnzGRMqjqoljf+nGEqBTD607CR7elXw4fMWn/EM+1y0Vdq5altUu9LdgCA== +metro-hermes-compiler@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.70.3.tgz#ac7ed656fbcf0a59adcd010d3639e4cfdbc76b4f" + integrity sha512-W6WttLi4E72JL/NyteQ84uxYOFMibe0PUr9aBKuJxxfCq6QRnJKOVcNY0NLW0He2tneXGk+8ZsNz8c0flEvYqg== -metro-inspector-proxy@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.66.2.tgz#a83c76bd2f2fd7b9240be92acf9a8b1d1404547a" - integrity sha512-gnLc9121eznwP0iiA9tCBW8qZjwIsCgwHWMF1g1Qaki9le9tzeJv3dK4/lFNGxyfSaLO7vahQEhsEYsiRnTROg== +metro-inspector-proxy@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.70.3.tgz#321c25b2261e76d8c4bcc39e092714adfcb50a14" + integrity sha512-qQoNdPGrmyoJSWYkxSDpTaAI8xyqVdNDVVj9KRm1PG8niSuYmrCCFGLLFsMvkVYwsCWUGHoGBx0UoAzVp14ejw== dependencies: connect "^3.6.5" debug "^2.2.0" - ws "^1.1.5" + ws "^7.5.1" yargs "^15.3.1" -metro-minify-uglify@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.66.2.tgz#6061dbee4f61e6d5bb3c100e4379ff6f2e16e42b" - integrity sha512-7TUK+L5CmB5x1PVnFbgmjzHW4CUadq9H5jgp0HfFoWT1skXAyEsx0DHkKDXwnot0khnNhBOEfl62ctQOnE110Q== +metro-minify-uglify@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.70.3.tgz#2f28129ca5b8ef958f3e3fcf004c3707c7732e1e" + integrity sha512-oHyjV9WDqOlDE1FPtvs6tIjjeY/oP1PNUPYL1wqyYtqvjN+zzAOrcbsAAL1sv+WARaeiMsWkF2bwtNo+Hghoog== dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.66.2.tgz#fddebcf413ad4ea617d4f47f7c1da401052de734" - integrity sha512-H/nLBAz0MgfDloSe1FjyH4EnbokHFdncyERvLPXDACY3ROVRCeUyFNo70ywRGXW2NMbrV4H7KUyU4zkfWhC2HQ== +metro-react-native-babel-preset@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.70.3.tgz#1c77ec4544ecd5fb6c803e70b21284d7483e4842" + integrity sha512-4Nxc1zEiHEu+GTdEMEsHnRgfaBkg8f/Td3+FcQ8NTSvs+xL3LBrQy6N07idWSQZHIdGFf+tTHvRfSIWLD8u8Tg== dependencies: "@babel/core" "^7.14.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-export-default-from" "^7.0.0" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" @@ -6477,17 +6935,15 @@ metro-react-native-babel-preset@0.66.2: "@babel/plugin-transform-destructuring" "^7.0.0" "@babel/plugin-transform-exponentiation-operator" "^7.0.0" "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" "@babel/plugin-transform-function-name" "^7.0.0" "@babel/plugin-transform-literals" "^7.0.0" "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" "@babel/plugin-transform-parameters" "^7.0.0" "@babel/plugin-transform-react-display-name" "^7.0.0" "@babel/plugin-transform-react-jsx" "^7.0.0" "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-regenerator" "^7.0.0" "@babel/plugin-transform-runtime" "^7.0.0" "@babel/plugin-transform-shorthand-properties" "^7.0.0" "@babel/plugin-transform-spread" "^7.0.0" @@ -6498,61 +6954,63 @@ metro-react-native-babel-preset@0.66.2: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-transformer@0.66.2, metro-react-native-babel-transformer@^0.66.1: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.66.2.tgz#768f341e7c3d3d1c38189799c9884b90d1c32eb7" - integrity sha512-z1ab7ihIT0pJrwgi9q2IH+LcW/xUWMQ0hH+Mrk7wbKQB0RnJdXFoxphrfoVHBHMUu+TBPetUcEkKawkK1e7Cng== +metro-react-native-babel-transformer@0.70.3, metro-react-native-babel-transformer@^0.70.1: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.70.3.tgz#195597c32488f820aa9e441bbca7c04fe7de7a2d" + integrity sha512-WKBU6S/G50j9cfmFM4k4oRYprd8u3qjleD4so1E2zbTNILg+gYla7ZFGCAvi2G0ZcqS2XuGCR375c2hF6VVvwg== dependencies: "@babel/core" "^7.14.0" babel-preset-fbjs "^3.4.0" - hermes-parser "0.4.7" - metro-babel-transformer "0.66.2" - metro-react-native-babel-preset "0.66.2" - metro-source-map "0.66.2" + hermes-parser "0.6.0" + metro-babel-transformer "0.70.3" + metro-react-native-babel-preset "0.70.3" + metro-source-map "0.70.3" nullthrows "^1.1.1" -metro-resolver@0.66.2, metro-resolver@^0.66.1: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.66.2.tgz#f743ddbe7a12dd137d1f7a555732cafcaea421f8" - integrity sha512-pXQAJR/xauRf4kWFj2/hN5a77B4jLl0Fom5I3PHp6Arw/KxSBp0cnguXpGLwNQ6zQC0nxKCoYGL9gQpzMnN7Hw== +metro-resolver@0.70.3, metro-resolver@^0.70.1: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.70.3.tgz#c64fdd6d0a88fa62f3f99f87e539b5f603bd47bf" + integrity sha512-5Pc5S/Gs4RlLbziuIWtvtFd9GRoILlaRC8RZDVq5JZWcWHywKy/PjNmOBNhpyvtRlzpJfy/ssIfLhu8zINt1Mw== dependencies: absolute-path "^0.0.0" -metro-runtime@0.66.2, metro-runtime@^0.66.1: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.66.2.tgz#3409ee957b949b6c7b72ef6ed2b9af9a4f4a910e" - integrity sha512-vFhKBk2ot9FS4b+2v0OTa/guCF/QDAOJubY0CNg7PzCS5+w4y3IvZIcPX4SSS1t8pYEZBLvtdtTDarlDl81xmg== +metro-runtime@0.70.3, metro-runtime@^0.70.1: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.70.3.tgz#09231b9d05dcbdfb5a13df0a45307273e6fe1168" + integrity sha512-22xU7UdXZacniTIDZgN2EYtmfau2pPyh97Dcs+cWrLcJYgfMKjWBtesnDcUAQy3PHekDYvBdJZkoQUeskYTM+w== + dependencies: + "@babel/runtime" "^7.0.0" -metro-source-map@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.66.2.tgz#b5304a282a5d55fa67b599265e9cf3217175cdd7" - integrity sha512-038tFmB7vSh73VQcDWIbr5O1m+WXWyYafDaOy+1A/2K308YP0oj33gbEgDnZsLZDwcJ+xt1x6KUEBIzlX4YGeQ== +metro-source-map@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.70.3.tgz#f5976108c18d4661eaa4d188c96713e5d67a903b" + integrity sha512-zsYtZGrwRbbGEFHtmMqqeCH9K9aTGNVPsurMOWCUeQA3VGyVGXPGtLMC+CdAM9jLpUyg6jw2xh0esxi+tYH7Uw== dependencies: "@babel/traverse" "^7.14.0" "@babel/types" "^7.0.0" invariant "^2.2.4" - metro-symbolicate "0.66.2" + metro-symbolicate "0.70.3" nullthrows "^1.1.1" - ob1 "0.66.2" + ob1 "0.70.3" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.66.2.tgz#addd095ce5f77e73ca21ddb5dfb396ff5d4fa041" - integrity sha512-u+DeQHyAFXVD7mVP+GST/894WHJ3i/U8oEJFnT7U3P52ZuLgX8n4tMNxhqZU12RcLR6etF8143aP0Ktx1gFLEQ== +metro-symbolicate@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.70.3.tgz#b039e5629c4ed0c999ea0496d580e1c98260f5cb" + integrity sha512-JTYkF1dpeDUssQ84juE1ycnhHki2ylJBBdJE1JHtfu5oC+z1ElDbBdPHq90Uvt8HbRov/ZAnxvv7Zy6asS+WCA== dependencies: invariant "^2.2.4" - metro-source-map "0.66.2" + metro-source-map "0.70.3" nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.66.2.tgz#39dd044a23b1343e4f2d2ec34d08128cdf255ed4" - integrity sha512-KTvqplh0ut7oDKovvDG6yzXM02R6X+9b2oVG+qYq8Zd3aCGTi51ASx4ThCNkAHyEvCuJdYg9fxXTL+j+wvhB5w== +metro-transform-plugins@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.70.3.tgz#7fe87cd0d8979b4d5d6e375751d86188fff38fd9" + integrity sha512-dQRIJoTkWZN2IVS2KzgS1hs7ZdHDX3fS3esfifPkqFAEwHiLctCf0EsPgIknp0AjMLvmGWfSLJigdRB/dc0ASw== dependencies: "@babel/core" "^7.14.0" "@babel/generator" "^7.14.0" @@ -6560,29 +7018,29 @@ metro-transform-plugins@0.66.2: "@babel/traverse" "^7.14.0" nullthrows "^1.1.1" -metro-transform-worker@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.66.2.tgz#0a8455992132c479721accd52c9bd47deb77769e" - integrity sha512-dO4PtYOMGB7Vzte8aIzX39xytODhmbJrBYPu+zYzlDjyefJZT7BkZ0LkPIThtyJi96xWcGqi9JBSo0CeRupAHw== +metro-transform-worker@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.70.3.tgz#62bfa28ebef98803531c4bcb558de5fc804c94ef" + integrity sha512-MtVVsnHhhBOp9GRLCdAb2mD1dTCsIzT4+m34KMRdBDCEbDIb90YafT5prpU8qbj5uKd0o2FOQdrJ5iy5zQilHw== dependencies: "@babel/core" "^7.14.0" "@babel/generator" "^7.14.0" "@babel/parser" "^7.14.0" "@babel/types" "^7.0.0" babel-preset-fbjs "^3.4.0" - metro "0.66.2" - metro-babel-transformer "0.66.2" - metro-cache "0.66.2" - metro-cache-key "0.66.2" - metro-hermes-compiler "0.66.2" - metro-source-map "0.66.2" - metro-transform-plugins "0.66.2" + metro "0.70.3" + metro-babel-transformer "0.70.3" + metro-cache "0.70.3" + metro-cache-key "0.70.3" + metro-hermes-compiler "0.70.3" + metro-source-map "0.70.3" + metro-transform-plugins "0.70.3" nullthrows "^1.1.1" -metro@0.66.2, metro@^0.66.1: - version "0.66.2" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.66.2.tgz#f21759bf00995470e7577b5b88a5277963f24492" - integrity sha512-uNsISfcQ3iKKSHoN5Q+LAh0l3jeeg7ZcNZ/4BAHGsk02erA0OP+l2m+b5qYVoPptHz9Oc3KyG5oGJoTu41pWjg== +metro@0.70.3, metro@^0.70.1: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.70.3.tgz#4290f538ab5446c7050e718b5c5823eea292c5c2" + integrity sha512-uEWS7xg8oTetQDABYNtsyeUjdLhH3KAvLFpaFFoJqUpOk2A3iygszdqmjobFl6W4zrvKDJS+XxdMR1roYvUhTw== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.14.0" @@ -6593,7 +7051,7 @@ metro@0.66.2, metro@^0.66.1: "@babel/types" "^7.0.0" absolute-path "^0.0.0" accepts "^1.3.7" - async "^2.4.0" + async "^3.2.2" chalk "^4.0.0" ci-info "^2.0.0" connect "^3.6.5" @@ -6601,31 +7059,29 @@ metro@0.66.2, metro@^0.66.1: denodeify "^1.2.1" error-stack-parser "^2.0.6" fs-extra "^1.0.0" - graceful-fs "^4.1.3" - hermes-parser "0.4.7" + graceful-fs "^4.2.4" + hermes-parser "0.6.0" image-size "^0.6.0" invariant "^2.2.4" - jest-haste-map "^26.5.2" - jest-worker "^26.0.0" + jest-haste-map "^27.3.1" + jest-worker "^27.2.0" lodash.throttle "^4.1.1" - metro-babel-register "0.66.2" - metro-babel-transformer "0.66.2" - metro-cache "0.66.2" - metro-cache-key "0.66.2" - metro-config "0.66.2" - metro-core "0.66.2" - metro-hermes-compiler "0.66.2" - metro-inspector-proxy "0.66.2" - metro-minify-uglify "0.66.2" - metro-react-native-babel-preset "0.66.2" - metro-resolver "0.66.2" - metro-runtime "0.66.2" - metro-source-map "0.66.2" - metro-symbolicate "0.66.2" - metro-transform-plugins "0.66.2" - metro-transform-worker "0.66.2" + metro-babel-transformer "0.70.3" + metro-cache "0.70.3" + metro-cache-key "0.70.3" + metro-config "0.70.3" + metro-core "0.70.3" + metro-hermes-compiler "0.70.3" + metro-inspector-proxy "0.70.3" + metro-minify-uglify "0.70.3" + metro-react-native-babel-preset "0.70.3" + metro-resolver "0.70.3" + metro-runtime "0.70.3" + metro-source-map "0.70.3" + metro-symbolicate "0.70.3" + metro-transform-plugins "0.70.3" + metro-transform-worker "0.70.3" mime-types "^2.1.27" - mkdirp "^0.5.1" node-fetch "^2.2.0" nullthrows "^1.1.1" rimraf "^2.5.4" @@ -6634,10 +7090,10 @@ metro@0.66.2, metro@^0.66.1: strip-ansi "^6.0.0" temp "0.8.3" throat "^5.0.0" - ws "^1.1.5" + ws "^7.5.1" yargs "^15.3.1" -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -6686,11 +7142,6 @@ mime@^2.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -6717,7 +7168,7 @@ minimist-options@4.1.0, minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: +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== @@ -6778,6 +7229,15 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nanoid@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" @@ -6820,10 +7280,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nocache@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" - integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== node-dir@^0.1.17: version "0.1.17" @@ -6864,13 +7324,6 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -6922,12 +7375,12 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -ob1@0.66.2: - version "0.66.2" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.66.2.tgz#8caf548202cf2688944bae47db405a08bca17a61" - integrity sha512-RFewnL/RjE0qQBOuM+2bbY96zmJPIge/aDtsiDbLSb+MOiK8CReAhBHDgL+zrA3F1hQk00lMWpUwYcep750plA== +ob1@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.70.3.tgz#f48cd5a5abf54b0c423b1b06b6d4ff4d049816cb" + integrity sha512-Vy9GGhuXgDRY01QA6kdhToPd8AkLdLpX9GjH5kpqluVqTu70mgOm7tpGoJDZGaNbr9nJlJgnipqHJQRPORixIQ== -object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -7036,13 +7489,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -7089,21 +7535,19 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - -ora@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" wcwidth "^1.0.1" os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: @@ -7328,7 +7772,7 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -plist@^3.0.2, plist@^3.0.5: +plist@^3.0.2: version "3.0.5" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== @@ -7336,6 +7780,14 @@ plist@^3.0.2, plist@^3.0.5: base64-js "^1.5.1" xmlbuilder "^9.0.7" +plist@^3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" + integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -7448,7 +7900,7 @@ prompts@^2.0.1, prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.0, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.0, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -7512,10 +7964,10 @@ react-composer@^5.0.2: dependencies: prop-types "^15.6.0" -react-devtools-core@4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.19.1.tgz#bc37c2ef2f48f28c6af4c7292be9dca1b63deace" - integrity sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw== +react-devtools-core@4.24.0: + version "4.24.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.0.tgz#7daa196bdc64f3626b3f54f2ff2b96f7c4fdf017" + integrity sha512-Rw7FzYOOzcfyUPaAm9P3g0tFdGqGq2LLiAI+wjYcp6CsF3DeeMrRS3HZAho4s273C29G/DJhx0e8BpRE/QZNGg== dependencies: shell-quote "^1.6.1" ws "^7" @@ -7548,24 +8000,30 @@ react-merge-refs@^1.1.0: resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== -react-native-codegen@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.0.8.tgz#b7796a54074139d956fff2862cf1285db43c891b" - integrity sha512-k/944+0XD+8l7zDaiKfYabyEKmAmyZgS1mj+4LcSRPyHnrjgCHKrh/Y6jM6kucQ6xU1+1uyMmF/dSkikxK8i+Q== +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" + integrity sha512-TOZEqBarczcyYN3iZE3VpKkooOevaAzBq9n7lU0h9mQUvtRhLVyolc+a5K6cWI0e4v4K69I0MqzjPcPeFKo32Q== dependencies: + "@babel/parser" "^7.14.0" flow-parser "^0.121.0" - jscodeshift "^0.11.0" + jscodeshift "^0.13.1" nullthrows "^1.1.1" -react-native@0.67.4: - version "0.67.4" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.67.4.tgz#57a1503daa81f66a61f521ff67b259f126d87f9c" - integrity sha512-NA9d9lNJu9TViEJu2uZxWXUP+QNUilGGA5tdMbVFedNroOH1lnQ3n/FAVoGK1gqGarCgNTtheBxUpEa979Cu8w== +react-native-gradle-plugin@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.7.tgz#96602f909745239deab7b589443f14fce5da2056" + integrity sha512-+4JpbIx42zGTONhBTIXSyfyHICHC29VTvhkkoUOJAh/XHPEixpuBduYgf6Y4y9wsN1ARlQhBBoptTvXvAFQf5g== + +react-native@0.69.3: + version "0.69.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.69.3.tgz#8fc7afe0a302294262a6b49ba2089483db734c05" + integrity sha512-SyGkcoEUa/BkO+wKVnv4OsnLSNfUM5zLNXS3iT/3eXjKX91/FKBH/nfR9BE1c60X5LQe/P5QYqr6WPX3TRSQkA== dependencies: "@jest/create-cache-key-function" "^27.0.1" - "@react-native-community/cli" "^6.0.0" - "@react-native-community/cli-platform-android" "^6.0.0" - "@react-native-community/cli-platform-ios" "^6.0.0" + "@react-native-community/cli" "^8.0.3" + "@react-native-community/cli-platform-android" "^8.0.2" + "@react-native-community/cli-platform-ios" "^8.0.2" "@react-native/assets" "1.0.0" "@react-native/normalize-color" "2.0.0" "@react-native/polyfills" "2.0.0" @@ -7573,23 +8031,26 @@ react-native@0.67.4: anser "^1.4.9" base64-js "^1.1.2" event-target-shim "^5.0.1" - hermes-engine "~0.9.0" + hermes-engine "~0.11.0" invariant "^2.2.4" jsc-android "^250230.2.1" - metro-react-native-babel-transformer "0.66.2" - metro-runtime "0.66.2" - metro-source-map "0.66.2" + memoize-one "^5.0.0" + metro-react-native-babel-transformer "0.70.3" + metro-runtime "0.70.3" + metro-source-map "0.70.3" + mkdirp "^0.5.1" nullthrows "^1.1.1" pretty-format "^26.5.2" promise "^8.0.3" - prop-types "^15.7.2" - react-devtools-core "4.19.1" - react-native-codegen "^0.0.8" + react-devtools-core "4.24.0" + react-native-codegen "^0.69.1" + react-native-gradle-plugin "^0.0.7" react-refresh "^0.4.0" + react-shallow-renderer "16.15.0" regenerator-runtime "^0.13.2" - scheduler "^0.20.2" + scheduler "^0.21.0" stacktrace-parser "^0.1.3" - use-subscription "^1.0.0" + use-sync-external-store "^1.0.0" whatwg-fetch "^3.0.0" ws "^6.1.4" @@ -7611,7 +8072,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.13.1: +react-shallow-renderer@16.15.0, react-shallow-renderer@^16.13.1: version "16.15.0" resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== @@ -7676,6 +8137,15 @@ read-yaml-file@^1.1.0: pify "^4.0.1" strip-bom "^3.0.0" +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -7694,7 +8164,7 @@ readline@^1.3.0: resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= -recast@^0.20.3: +recast@^0.20.4: version "0.20.5" resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== @@ -7775,6 +8245,18 @@ regexpu-core@^5.0.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +regexpu-core@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" + integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + regjsgen@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" @@ -7787,11 +8269,6 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" @@ -7871,14 +8348,6 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -7935,11 +8404,6 @@ rollup@^2.32.0, rollup@^2.59.0: optionalDependencies: fsevents "~2.3.2" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -7959,6 +8423,11 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -7971,22 +8440,7 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sax@^1.2.1: +sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -7998,14 +8452,6 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler@^0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" @@ -8023,6 +8469,11 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -8125,17 +8576,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -shell-quote@^1.6.1: +shell-quote@^1.6.1, shell-quote@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== @@ -8154,7 +8595,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-plist@^1.0.0: +simple-plist@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== @@ -8208,6 +8649,11 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +slugify@^1.3.4: + version "1.6.5" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.5.tgz#c8f5c072bf2135b80703589b39a3d41451fbe8c8" + integrity sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ== + smartwrap@^1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-1.2.5.tgz#45ee3e09ac234e5f7f17c16e916f511834f3cd23" @@ -8389,7 +8835,7 @@ statuses@~1.5.0: stream-buffers@2.2.x: version "2.2.0" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" - integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= + integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== stream-transform@^2.1.3: version "2.1.3" @@ -8464,6 +8910,13 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -8540,6 +8993,18 @@ styled-components@^5.3.5: shallowequal "^1.1.0" supports-color "^5.5.0" +sucrase@^3.20.0: + version "3.25.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.25.0.tgz#6dffa34e614b3347877507a4380cc4f022b7b7aa" + integrity sha512-WxTtwEYXSmZArPGStGBicyRsg5TBEFhT5b7N+tF+zauImP0Acy+CoUK0/byJ8JNPK/5lbpWIVuFagI4+0l85QQ== + dependencies: + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + sudo-prompt@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" @@ -8602,7 +9067,7 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -temp@^0.8.1: +temp@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== @@ -8646,6 +9111,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + three-mesh-bvh@^0.5.7: version "0.5.9" resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.9.tgz#bfa51d38e0fd221d8c2822ec0202c6521b418533" @@ -8805,6 +9284,11 @@ troika-worker-utils@^0.46.0: resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.46.0.tgz#1b698090af78b51a27e03881c90237a2e648d6c4" integrity sha512-bzOx5f2ZBxkFhXtIvDJlLn2AI3bzCkGVbCndl/2dL5QZrwHEKl45OEIilCxYQQWJG1rEbOD9O80tMjoYjw19OA== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + ts-jest@^27.1.4: version "27.1.4" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00" @@ -8927,11 +9411,6 @@ uglify-es@^3.1.9: commander "~2.13.0" source-map "~0.6.1" -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= - unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" @@ -9010,7 +9489,7 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse@^1.4.4: +url-parse@^1.5.9: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -9023,17 +9502,17 @@ use-error-boundary@^2.0.6: resolved "https://registry.yarnpkg.com/use-error-boundary/-/use-error-boundary-2.0.6.tgz#10f0cd45f6e53cedca8a567fa2b7bc8c709e4420" integrity sha512-AWCVKSAanLe6R/on/ZkHYtGKfXs8BQX6z/TUGYqtvkajLqQyrGKJJscbahtq8OyN8L3LqTRjJWx4gCOLmfIObw== -use-subscription@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.6.0.tgz#86ace4f60675a4c360712975c4933ac95c7e7f35" - integrity sha512-0Y/cTLlZfw547tJhJMoRA16OUbVqRm6DmvGpiGbmLST6BIA5KU5cKlvlz8DVMrACnWpyEjCkgmhLatthP4jUbA== +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@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -9048,11 +9527,16 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2: +uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -9111,7 +9595,7 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walker@^1.0.7, walker@~1.0.5: +walker@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -9274,14 +9758,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^1.1.0, ws@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== - dependencies: - options ">=0.0.5" - ultron "1.0.x" - ws@^6.1.4: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -9294,36 +9770,57 @@ ws@^7, ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== -xcode@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" - integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== +ws@^7.5.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xcode@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" + integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== dependencies: - simple-plist "^1.0.0" - uuid "^3.3.2" + simple-plist "^1.1.0" + uuid "^7.0.3" xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml2js@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" + integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== + +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmldoc@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.1.2.tgz#6666e029fe25470d599cd30e23ff0d1ed50466d7" - integrity sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ== - dependencies: - sax "^1.2.1" - xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From b88631e2e583b7918b7fc3ba2112e09e574cfe0d Mon Sep 17 00:00:00 2001 From: Hendrik Mans Date: Fri, 12 Aug 2022 14:17:44 +0200 Subject: [PATCH 041/252] refactor(Canvas)!: rename `Props` to `CanvasProps` (#2434) --- .changeset/lemon-glasses-kneel.md | 5 +++++ packages/fiber/src/native/Canvas.tsx | 4 ++-- packages/fiber/src/web/Canvas.tsx | 6 ++++-- 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 .changeset/lemon-glasses-kneel.md diff --git a/.changeset/lemon-glasses-kneel.md b/.changeset/lemon-glasses-kneel.md new file mode 100644 index 0000000000..33cfc3d10e --- /dev/null +++ b/.changeset/lemon-glasses-kneel.md @@ -0,0 +1,5 @@ +--- +'@react-three/fiber': major +--- + +**Breaking Change:** Renamed the props interfaces exported by `web/Canvas.tsx` and `mobile/Canvas.tsx` from the generic `Props` to the more specific `CanvasProps`. diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index 3eed1a7c14..62685a010f 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -8,7 +8,7 @@ import { createTouchEvents } from './events' import { RootState, Size } from '../core/store' import { polyfills } from './polyfills' -export interface Props extends Omit, 'size' | 'dpr'>, ViewProps { +export interface CanvasProps extends Omit, 'size' | 'dpr'>, ViewProps { children: React.ReactNode style?: ViewStyle } @@ -17,7 +17,7 @@ export interface Props extends Omit, 'size' | 'dp * A native canvas which accepts threejs elements as children. * @see https://docs.pmnd.rs/react-three-fiber/api/canvas */ -export const Canvas = /*#__PURE__*/ React.forwardRef( +export const Canvas = /*#__PURE__*/ React.forwardRef( ( { children, diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 769da7af7e..cf81436786 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -6,7 +6,9 @@ import { SetBlock, Block, ErrorBoundary, useMutableCallback, useIsomorphicLayout import { ReconcilerRoot, extend, createRoot, unmountComponentAtNode, RenderProps } from '../core' import { createPointerEvents } from './events' -export interface Props extends Omit, 'size'>, React.HTMLAttributes { +export interface CanvasProps + extends Omit, 'size'>, + React.HTMLAttributes { children: React.ReactNode /** Canvas fallback content, similar to img's alt prop */ fallback?: React.ReactNode @@ -21,7 +23,7 @@ export interface Props extends Omit, 'size'>, Rea * A DOM canvas which accepts threejs elements as children. * @see https://docs.pmnd.rs/react-three-fiber/api/canvas */ -export const Canvas = /*#__PURE__*/ React.forwardRef(function Canvas( +export const Canvas = /*#__PURE__*/ React.forwardRef(function Canvas( { children, fallback, From b2ffbe428c6db8b35cec9a7edf04b749ba78ce32 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Fri, 12 Aug 2022 17:15:59 -0700 Subject: [PATCH 042/252] chore: update three-stdlib --- package.json | 2 +- yarn.lock | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 71b8072fd6..8fe9ea1a7b 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "react-test-renderer": "^18.0.0", "regenerator-runtime": "^0.13.9", "three": "^0.141.0", - "three-stdlib": "^2.8.11", + "three-stdlib": "^2.13.0", "ts-jest": "^27.1.4", "typescript": "^4.6.3" }, diff --git a/yarn.lock b/yarn.lock index 269e1fff15..66c55c20e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9130,7 +9130,23 @@ three-mesh-bvh@^0.5.7: resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.9.tgz#bfa51d38e0fd221d8c2822ec0202c6521b418533" integrity sha512-WKvJtM2HXoKOxe4XwZFuPYp885XYEh3DasoUIeGyynnTh++8ZUi2KCI1zganvtc9ob67mcBulXVBhdaC2BqBnQ== -three-stdlib@^2.8.11, three-stdlib@^2.8.12, three-stdlib@^2.9.1: +three-stdlib@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.13.0.tgz#48baf2f85a781437e42cd53f672ea44ccce4a801" + integrity sha512-hFTTX6K6y8jrDREtzx1nl029rcOYJ5R8YBWg7M3s7uhcAx0fhs4d8tS+dj82vPksLDlMW8Pu/x0CVTRrqiUFDQ== + dependencies: + "@babel/runtime" "^7.16.7" + "@webgpu/glslang" "^0.0.15" + chevrotain "^10.1.2" + draco3d "^1.4.1" + fflate "^0.6.9" + ktx-parse "^0.2.1" + mmd-parser "^1.0.4" + opentype.js "^1.3.3" + potpack "^1.0.1" + zstddec "^0.0.2" + +three-stdlib@^2.8.12, three-stdlib@^2.9.1: version "2.9.1" resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.9.1.tgz#300abf6cf12ab388e515fd8572217288dffe4736" integrity sha512-e+Hyd47ssVTy2UzUfmaccB7m30qITVMdvGs/QypeGdJa3uwhw1zR9jO/ce61S65Omiy/oGDMWG8dJIZxyQ7u8w== From 6555febca2cc9ebeeeb59e9366162af2eb7edae8 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Fri, 12 Aug 2022 17:41:25 -0700 Subject: [PATCH 043/252] chore(examples): Update dependencies --- example/package.json | 12 +- example/vite.config.ts | 4 +- yarn.lock | 479 +++++++++++++++++++++++------------------ 3 files changed, 276 insertions(+), 219 deletions(-) diff --git a/example/package.json b/example/package.json index 246ef8650d..b3c070727f 100644 --- a/example/package.json +++ b/example/package.json @@ -9,24 +9,24 @@ "dependencies": { "@react-spring/core": "^9.4.4", "@react-spring/three": "^9.4.4", - "@react-three/drei": "^9.1.2", + "@react-three/drei": "^9.21.0", "@use-gesture/react": "latest", "react": "^18.0.0", "react-dom": "^18.0.0", "react-merge-refs": "^1.1.0", "react-use-refs": "^1.0.1", "styled-components": "^5.3.5", - "three": "^0.139.2", - "three-stdlib": "^2.9.1", + "three": "^0.141.0", + "three-stdlib": "^2.13.0", "use-error-boundary": "^2.0.6", "wouter": "^2.8.0-alpha.2", "zustand": "^3.7.1" }, "devDependencies": { - "@types/react": "^17.0.43", + "@types/react": "^18.0.0", "@types/styled-components": "^5.1.24", - "@vitejs/plugin-react-refresh": "^1.3.6", + "@vitejs/plugin-react": "^2.0.1", "typescript": "^4.6.3", - "vite": "^2.9.1" + "vite": "^3.0.7" } } diff --git a/example/vite.config.ts b/example/vite.config.ts index 8b45cd77f6..17380e104d 100644 --- a/example/vite.config.ts +++ b/example/vite.config.ts @@ -1,9 +1,9 @@ import { defineConfig } from 'vite' -import reactRefresh from '@vitejs/plugin-react-refresh' +import react from '@vitejs/plugin-react' export default defineConfig({ optimizeDeps: { exclude: ['@react-three/fiber'], }, - plugins: [reactRefresh()], + plugins: [react()], }) diff --git a/yarn.lock b/yarn.lock index 66c55c20e1..8075149b52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -61,7 +61,7 @@ json5 "^2.1.2" semver "^6.3.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.14.8", "@babel/core@^7.7.2", "@babel/core@^7.7.7", "@babel/core@^7.8.0": +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.7.2", "@babel/core@^7.7.7", "@babel/core@^7.8.0": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== @@ -82,7 +82,7 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/core@^7.13.16": +"@babel/core@^7.13.16", "@babel/core@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== @@ -793,6 +793,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -1096,20 +1103,41 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" -"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.14.5": +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.16.7.tgz#f432ad0cba14c4a1faf44f0076c69e42a4d4479e" integrity sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA== dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.14.5": +"@babel/plugin-transform-react-jsx-self@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" + integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz#1879c3f23629d287cc6186a6c683154509ec70c0" integrity sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw== dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-react-jsx-source@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz#06e9ae8a14d2bc19ce6e3c447d842032a50598fc" + integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.16.7": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" @@ -1121,6 +1149,17 @@ "@babel/plugin-syntax-jsx" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" + integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.18.10" + "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" @@ -1698,6 +1737,11 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== +"@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== + "@eslint/eslintrc@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" @@ -2375,26 +2419,26 @@ resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.4.4.tgz#97c69881788e624d7cc68d4385fdaa9b5fd20642" integrity sha512-KpxKt/D//q/t/6FBcde/RE36LKp8PpWu7kFEMLwpzMGl9RpcexunmYOQJWwmJWtkQjgE1YRr7DzBMryz6La1cQ== -"@react-three/drei@^9.1.2": - version "9.4.2" - resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.4.2.tgz#fede0831105047d2d19612fd6590b3607029e8a6" - integrity sha512-lACXlvMobHwnGPX0XwKfPB6D+q6D6XEnhxk2FC0P+WexUyouV3oMh72nk8BkOtduvxNe6iYJMVdwHhNmbHbk9w== +"@react-three/drei@^9.21.0": + version "9.21.0" + resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.21.0.tgz#2b04786db97b07c88c4dc3db64a86e953568907b" + integrity sha512-+j0L9+sfIGIwoR0O/UwtBWW0Oo/AWj9nnvKTtRS4e2awHA872lHdOHL+L5e6jKJyV4ZyjOEkQFE8QaJXDPYgBQ== dependencies: "@babel/runtime" "^7.11.2" "@react-spring/three" "^9.3.1" "@use-gesture/react" "^10.2.0" - detect-gpu "^4.0.14" + detect-gpu "^4.0.19" glsl-noise "^0.0.0" lodash.omit "^4.5.0" lodash.pick "^4.4.0" meshline "^2.0.4" - react-composer "^5.0.2" + react-composer "^5.0.3" react-merge-refs "^1.1.0" stats.js "^0.17.0" suspend-react "^0.0.8" - three-mesh-bvh "^0.5.7" - three-stdlib "^2.8.12" - troika-three-text "^0.46.3" + three-mesh-bvh "^0.5.10" + three-stdlib "^2.13.0" + troika-three-text "^0.46.4" utility-types "^3.10.0" zustand "^3.5.13" @@ -2454,14 +2498,6 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/pluginutils@^4.1.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== - dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -2700,7 +2736,7 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^17", "@types/react@^17.0.43": +"@types/react@^17": version "17.0.44" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.44.tgz#c3714bd34dd551ab20b8015d9d0dbec812a51ec7" integrity sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g== @@ -2709,6 +2745,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^18.0.0": + version "18.0.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" + integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -2863,16 +2908,18 @@ dependencies: "@use-gesture/core" "10.2.11" -"@vitejs/plugin-react-refresh@^1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-refresh/-/plugin-react-refresh-1.3.6.tgz#19818392db01e81746cfeb04e096ab3010e79fe3" - integrity sha512-iNR/UqhUOmFFxiezt0em9CgmiJBdWR+5jGxB2FihaoJfqGt76kiwaKoVOJVU5NYcDWMdN06LbyN2VIGIoYdsEA== +"@vitejs/plugin-react@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.0.1.tgz#3197c01d8e4a4eb9fed829c7888c467a43aadd4e" + integrity sha512-uINzNHmjrbunlFtyVkST6lY1ewSfz/XwLufG0PIqvLGnpk2nOIOa/1CACTDNcKi1/RwaCzJLmsXwm1NsUVV/NA== dependencies: - "@babel/core" "^7.14.8" - "@babel/plugin-transform-react-jsx-self" "^7.14.5" - "@babel/plugin-transform-react-jsx-source" "^7.14.5" - "@rollup/pluginutils" "^4.1.1" - react-refresh "^0.10.0" + "@babel/core" "^7.18.10" + "@babel/plugin-transform-react-jsx" "^7.18.10" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-jsx-self" "^7.18.6" + "@babel/plugin-transform-react-jsx-source" "^7.18.6" + magic-string "^0.26.2" + react-refresh "^0.14.0" "@webgpu/glslang@^0.0.15": version "0.0.15" @@ -4127,10 +4174,10 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-gpu@^4.0.14: - version "4.0.17" - resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-4.0.17.tgz#e65a14f327e1be78c6861e1224d9b96843120629" - integrity sha512-e5G1RSOcKEVeIGJ76RFg8q6q9Ol2BgU5feu+1XGKOU9XWg5f+Oh5zbUVmERm4h0RueT9kepCchFawDCnT7gbFA== +detect-gpu@^4.0.19: + version "4.0.34" + resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-4.0.34.tgz#c9f9238f2eaa1fb450a989a8429d054a37319db7" + integrity sha512-dDQ5hZDb/MfeJhza+PygGrOAVwf5PgwuXRQOcm2Yf9Qfkg0fD7VeBFMfgXD2GM465JhkDrfEa+vWtiRbC3b3dQ== dependencies: webgl-constants "^1.1.1" @@ -4305,131 +4352,132 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild-android-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz#fc5f95ce78c8c3d790fa16bc71bd904f2bb42aa1" - integrity sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw== - -esbuild-android-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz#44356fbb9f8de82a5cdf11849e011dfb3ad0a8a8" - integrity sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg== - -esbuild-darwin-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz#3d9324b21489c70141665c2e740d6e84f16f725d" - integrity sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ== - -esbuild-darwin-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz#2a8040c2e465131e5281034f3c72405e643cb7b2" - integrity sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw== - -esbuild-freebsd-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz#d82c387b4d01fe9e8631f97d41eb54f2dbeb68a3" - integrity sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww== - -esbuild-freebsd-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz#e8ce2e6c697da6c7ecd0cc0ac821d47c5ab68529" - integrity sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA== - -esbuild-linux-32@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz#a4a261e2af91986ea62451f2db712a556cb38a15" - integrity sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw== - -esbuild-linux-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz#4a9500f9197e2c8fcb884a511d2c9d4c2debde72" - integrity sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg== - -esbuild-linux-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz#c91c21e25b315464bd7da867365dd1dae14ca176" - integrity sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw== - -esbuild-linux-arm@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz#90e23bca2e6e549affbbe994f80ba3bb6c4d934a" - integrity sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg== - -esbuild-linux-mips64le@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz#40e11afb08353ff24709fc89e4db0f866bc131d2" - integrity sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA== - -esbuild-linux-ppc64le@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz#9e8a588c513d06cc3859f9dcc52e5fdfce8a1a5e" - integrity sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg== - -esbuild-linux-riscv64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz#e578c09b23b3b97652e60e3692bfda628b541f06" - integrity sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A== - -esbuild-linux-s390x@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz#3c9dab40d0d69932ffded0fd7317bb403626c9bc" - integrity sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg== - -esbuild-netbsd-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz#e27847f6d506218291619b8c1e121ecd97628494" - integrity sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A== - -esbuild-openbsd-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz#c94c04c557fae516872a586eae67423da6d2fabb" - integrity sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg== - -esbuild-sunos-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz#9b79febc0df65a30f1c9bd63047d1675511bf99d" - integrity sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ== - -esbuild-windows-32@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz#910d11936c8d2122ffdd3275e5b28d8a4e1240ec" - integrity sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w== - -esbuild-windows-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz#21b4ce8b42a4efc63f4b58ec617f1302448aad26" - integrity sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ== - -esbuild-windows-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz#ba21546fecb7297667d0052d00150de22c044b24" - integrity sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q== - -esbuild@^0.14.27: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.36.tgz#0023a73eab57886ac5605df16ee421e471a971b3" - integrity sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw== +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== optionalDependencies: - esbuild-android-64 "0.14.36" - esbuild-android-arm64 "0.14.36" - esbuild-darwin-64 "0.14.36" - esbuild-darwin-arm64 "0.14.36" - esbuild-freebsd-64 "0.14.36" - esbuild-freebsd-arm64 "0.14.36" - esbuild-linux-32 "0.14.36" - esbuild-linux-64 "0.14.36" - esbuild-linux-arm "0.14.36" - esbuild-linux-arm64 "0.14.36" - esbuild-linux-mips64le "0.14.36" - esbuild-linux-ppc64le "0.14.36" - esbuild-linux-riscv64 "0.14.36" - esbuild-linux-s390x "0.14.36" - esbuild-netbsd-64 "0.14.36" - esbuild-openbsd-64 "0.14.36" - esbuild-sunos-64 "0.14.36" - esbuild-windows-32 "0.14.36" - esbuild-windows-64 "0.14.36" - esbuild-windows-arm64 "0.14.36" + "@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" escalade@^3.1.1: version "3.1.1" @@ -5583,6 +5631,13 @@ is-core-module@^2.2.0, is-core-module@^2.8.1: dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6733,6 +6788,13 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.26.2: + version "0.26.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432" + integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== + dependencies: + sourcemap-codec "^1.4.8" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -7238,10 +7300,10 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" - integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== +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== nanomatch@^1.2.9: version "1.2.13" @@ -7798,12 +7860,12 @@ postcss-value-parser@^4.0.2: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.12: - version "8.4.12" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" - integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== +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== dependencies: - nanoid "^3.3.1" + nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -7957,10 +8019,10 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -react-composer@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/react-composer/-/react-composer-5.0.2.tgz#131cb53326abb07363795ad3abb0dc4a3005ee05" - integrity sha512-6E2UNjUF0e7KRY+/faU2Hv7D9zagXnYdTfSSCGdYfuds6mRnVpN19vrbHXShaQzJNVXL4VOUb8qq6DvClDIG1g== +react-composer@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-composer/-/react-composer-5.0.3.tgz#7beb9513da5e8687f4f434ea1333ef36a4f3091b" + integrity sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA== dependencies: prop-types "^15.6.0" @@ -8062,10 +8124,10 @@ react-reconciler@^0.27.0: loose-envify "^1.1.0" scheduler "^0.21.0" -react-refresh@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3" - integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ== +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== react-refresh@^0.4.0: version "0.4.3" @@ -8340,6 +8402,15 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" @@ -8397,7 +8468,14 @@ rimraf@~2.6.2: dependencies: glob "^7.1.3" -rollup@^2.32.0, rollup@^2.59.0: +"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== + optionalDependencies: + fsevents "~2.3.2" + +rollup@^2.32.0: version "2.70.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.2.tgz#808d206a8851628a065097b7ba2053bd83ba0c0d" integrity sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg== @@ -9125,10 +9203,10 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -three-mesh-bvh@^0.5.7: - version "0.5.9" - resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.9.tgz#bfa51d38e0fd221d8c2822ec0202c6521b418533" - integrity sha512-WKvJtM2HXoKOxe4XwZFuPYp885XYEh3DasoUIeGyynnTh++8ZUi2KCI1zganvtc9ob67mcBulXVBhdaC2BqBnQ== +three-mesh-bvh@^0.5.10: + version "0.5.15" + resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.15.tgz#bcf681d784d8988618344a5e11e7ded7e76ee86a" + integrity sha512-jxE5iGjcoEMiyxUs7hMeZL6jBXBz9973ilqhXPhKlA1f7eitjIxRTtu7UWVQy+PhxXTsknmPzWmN5c+uAa/anA== three-stdlib@^2.13.0: version "2.13.0" @@ -9146,27 +9224,6 @@ three-stdlib@^2.13.0: potpack "^1.0.1" zstddec "^0.0.2" -three-stdlib@^2.8.12, three-stdlib@^2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.9.1.tgz#300abf6cf12ab388e515fd8572217288dffe4736" - integrity sha512-e+Hyd47ssVTy2UzUfmaccB7m30qITVMdvGs/QypeGdJa3uwhw1zR9jO/ce61S65Omiy/oGDMWG8dJIZxyQ7u8w== - dependencies: - "@babel/runtime" "^7.16.7" - "@webgpu/glslang" "^0.0.15" - chevrotain "^10.1.2" - draco3d "^1.4.1" - fflate "^0.6.9" - ktx-parse "^0.2.1" - mmd-parser "^1.0.4" - opentype.js "^1.3.3" - potpack "^1.0.1" - zstddec "^0.0.2" - -three@^0.139.2: - version "0.139.2" - resolved "https://registry.yarnpkg.com/three/-/three-0.139.2.tgz#b110799a15736df673b9293e31653a4ac73648dd" - integrity sha512-gV7q7QY8rogu7HLFZR9cWnOQAUedUhu2WXAnpr2kdXZP9YDKsG/0ychwQvWkZN5PlNw9mv5MoCTin6zNTXoONg== - three@^0.141.0: version "0.141.0" resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" @@ -9280,7 +9337,7 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -troika-three-text@^0.46.3: +troika-three-text@^0.46.4: version "0.46.4" resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.46.4.tgz#77627ac2ac4765d5248c857a8b42f82c25f2d034" integrity sha512-Qsv0HhUKTZgSmAJs5wvO7YlBoJSP9TGPLmrg+K9pbQq4lseQdcevbno/WI38bwJBZ/qS56hvfqEzY0zUEFzDIw== @@ -9580,15 +9637,15 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vite@^2.9.1: - version "2.9.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.5.tgz#08ef37ac7a6d879c96f328b791732c9a00ea25ea" - integrity sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg== +vite@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.7.tgz#f1e379857e9c5d652126f8b20d371e1365eb700f" + integrity sha512-dILhvKba1mbP1wCezVQx/qhEK7/+jVn9ciadEcyKMMhZpsuAi/eWZfJRMkmYlkSFG7Qq9NvJbgFq4XOBxugJsA== dependencies: - esbuild "^0.14.27" - postcss "^8.4.12" - resolve "^1.22.0" - rollup "^2.59.0" + esbuild "^0.14.47" + postcss "^8.4.16" + resolve "^1.22.1" + rollup ">=2.75.6 <2.77.0 || ~2.77.0" optionalDependencies: fsevents "~2.3.2" From 8966ff8422c8da0f6cb0d4512204a1bbb3278ce9 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Fri, 12 Aug 2022 17:59:15 -0700 Subject: [PATCH 044/252] fix: createStages would run multipel times --- packages/fiber/src/core/index.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index e0851d44e5..0e0605b6dc 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -127,12 +127,12 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore ({ internal: { ...internal, stages: stages! } })) + state.set(({ internal }) => ({ internal: { ...internal, stages: _stages } })) // Add useFrame loop to update stage const frameCallback = { @@ -344,8 +344,8 @@ function createRoot(canvas: TCanvas): ReconcilerRoot ({ performance: { ...state.performance, ...performance } })) - // Create update stages. - if (stages !== state.internal.stages) createStages(stages, store) + // Create update stages. Only do this once on init + if (state.internal.stages.length === 0) createStages(stages, store) // Set locals onCreated = onCreatedCallback From 9d1c21b9fa9c11df779f72c0cd51fbd9aa32be30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Sat, 13 Aug 2022 11:05:50 +0200 Subject: [PATCH 045/252] publish 9.0.0-alpha.1 --- packages/fiber/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 8d2a3f4830..2aa3dfa40e 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.0", + "version": "9.0.0-alpha.1", "description": "A React renderer for Threejs", "keywords": [ "react", From 228ea8229b3354dc7aa7299818f32947ae6e9bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Sat, 20 Aug 2022 16:40:32 +0200 Subject: [PATCH 046/252] feat: add eventtarget and eventprefix to web/canvas --- docs/API/canvas.mdx | 2 ++ packages/fiber/src/web/Canvas.tsx | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/API/canvas.mdx b/docs/API/canvas.mdx index 4f54d3dad8..9a0384aeca 100644 --- a/docs/API/canvas.mdx +++ b/docs/API/canvas.mdx @@ -37,6 +37,8 @@ const App = () => ( | legacy | Enables THREE.ColorManagement.legacyMode in three r139 or later | `false` | | linear | Switch off automatic sRGB encoding and gamma correction | `false` | | events | Configuration for the event manager, as a function of state | `import { events } from "@react-three/fiber"` | +| eventTarget | The target where events are being subscribed to | `gl.domElement.parentNode` | +| eventPrefix | The event prefix that is cast into canvas pointer x/y events | `offset` | | flat | Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` | `false` | | onCreated | Callback after the canvas has rendered (but not yet committed) | `(state) => {}` | | onPointerMissed | Response for pointer clicks that have missed any target | `(event) => {}` | diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index cf81436786..f041b62921 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -5,6 +5,7 @@ import type { Options as ResizeOptions } from 'react-use-measure' import { SetBlock, Block, ErrorBoundary, useMutableCallback, useIsomorphicLayoutEffect } from '../core/utils' import { ReconcilerRoot, extend, createRoot, unmountComponentAtNode, RenderProps } from '../core' import { createPointerEvents } from './events' +import { DomEvent } from '../core/events' export interface CanvasProps extends Omit, 'size'>, @@ -17,6 +18,10 @@ export interface CanvasProps * @see https://github.com/pmndrs/react-use-measure#api */ resize?: ResizeOptions + /** The target where events are being subscribed to, default: the div that wraps canvas */ + eventTarget?: HTMLElement + /** The event prefix that is cast into canvas pointer x/y events, default: "offset" */ + eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen' } /** @@ -31,6 +36,8 @@ export const Canvas = /*#__PURE__*/ React.forwardRef handlePointerMissed.current?.(...args), onCreated: (state) => { - state.events.connect?.(divRef.current) + // Connect to event source + state.events.connect?.(eventTarget ? eventTarget : divRef.current) + // Set up compute function + if (eventPrefix) { + state.setEvents({ + compute: (event, state) => { + const x = event[(eventPrefix + 'X') as keyof DomEvent] as number + const y = event[(eventPrefix + 'Y') as keyof DomEvent] as number + state.pointer.set((x / state.size.width) * 2 - 1, -(y / state.size.height) * 2 + 1) + state.raycaster.setFromCamera(state.pointer, state.camera) + }, + }) + } + // Call onCreated callback onCreated?.(state) }, }) From 9661c96fce2cc8c8bb5e095da062bf6be95123d8 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 20 Aug 2022 11:44:43 -0500 Subject: [PATCH 047/252] fix!: remove *BufferGeometry type aliases (#2443) --- packages/fiber/src/three-types.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 5cd2ba0f0c..4eb84bdc46 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -286,24 +286,6 @@ export interface ThreeElements { // geometry instancedBufferGeometry: InstancedBufferGeometryProps bufferGeometry: BufferGeometryProps - boxBufferGeometry: BoxBufferGeometryProps - circleBufferGeometry: CircleBufferGeometryProps - coneBufferGeometry: ConeBufferGeometryProps - cylinderBufferGeometry: CylinderBufferGeometryProps - dodecahedronBufferGeometry: DodecahedronBufferGeometryProps - extrudeBufferGeometry: ExtrudeBufferGeometryProps - icosahedronBufferGeometry: IcosahedronBufferGeometryProps - latheBufferGeometry: LatheBufferGeometryProps - octahedronBufferGeometry: OctahedronBufferGeometryProps - planeBufferGeometry: PlaneBufferGeometryProps - polyhedronBufferGeometry: PolyhedronBufferGeometryProps - ringBufferGeometry: RingBufferGeometryProps - shapeBufferGeometry: ShapeBufferGeometryProps - sphereBufferGeometry: SphereBufferGeometryProps - tetrahedronBufferGeometry: TetrahedronBufferGeometryProps - torusBufferGeometry: TorusBufferGeometryProps - torusKnotBufferGeometry: TorusKnotBufferGeometryProps - tubeBufferGeometry: TubeBufferGeometryProps wireframeGeometry: WireframeGeometryProps tetrahedronGeometry: TetrahedronGeometryProps octahedronGeometry: OctahedronGeometryProps From fa1d76259b083785039317b19342111437aec824 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 21 Aug 2022 13:32:44 -0500 Subject: [PATCH 048/252] fix: check instance prototype for auto-attach (#2449) --- packages/fiber/src/core/renderer.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/fiber/src/core/renderer.ts b/packages/fiber/src/core/renderer.ts index 28eedf9b59..6763d8cbb6 100644 --- a/packages/fiber/src/core/renderer.ts +++ b/packages/fiber/src/core/renderer.ts @@ -92,12 +92,6 @@ function createRenderer(_roots: Map, _getEventPriority?: let name = `${type[0].toUpperCase()}${type.slice(1)}` let instance: Instance - // Auto-attach geometries and materials - if (attach === undefined) { - if (name.endsWith('Geometry')) attach = 'geometry' - else if (name.endsWith('Material')) attach = 'material' - } - if (type === 'primitive') { if (props.object === undefined) throw new Error("R3F: Primitives without 'object' are invalid!") const object = props.object as Instance @@ -124,6 +118,12 @@ function createRenderer(_roots: Map, _getEventPriority?: }) } + // Auto-attach geometries and materials + if (instance.attach === undefined) { + if (instance instanceof THREE.BufferGeometry) instance.attach = 'geometry' + else if (instance instanceof THREE.Material) instance.attach = 'material' + } + // It should NOT call onUpdate on object instanciation, because it hasn't been added to the // view yet. If the callback relies on references for instance, they won't be ready yet, this is // why it passes "true" here From 9937644c69aa64de589688d4ca688357e0585818 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 1 Sep 2022 05:57:44 -0500 Subject: [PATCH 049/252] refactor: remove onUpdate prop (#2480) --- docs/API/events.mdx | 3 --- docs/tutorials/events-and-interaction.mdx | 1 - packages/fiber/src/core/renderer.ts | 14 +------------- packages/fiber/src/core/utils.ts | 7 ------- packages/fiber/src/three-types.ts | 1 - 5 files changed, 1 insertion(+), 25 deletions(-) diff --git a/docs/API/events.mdx b/docs/API/events.mdx index 977652e7fa..20a9c36fc3 100644 --- a/docs/API/events.mdx +++ b/docs/API/events.mdx @@ -6,8 +6,6 @@ nav: 8 `three.js` objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on them. We support pointer events, clicks and wheel-scroll. Events contain the browser event as well as the `three.js` event data (object, point, distance, etc). You may want to [polyfill](https://github.com/jquery/PEP) them, if that's a concern. -Additionally, there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`. - Also notice the `onPointerMissed` on the canvas element, which fires on clicks that haven't hit _any_ meshes. ```jsx @@ -24,7 +22,6 @@ Also notice the `onPointerMissed` on the canvas element, which fires on clicks t onPointerLeave={(e) => console.log('leave')} // see note 1 onPointerMove={(e) => console.log('move')} onPointerMissed={() => console.log('missed')} - onUpdate={(self) => console.log('props have been updated')} /> ``` diff --git a/docs/tutorials/events-and-interaction.mdx b/docs/tutorials/events-and-interaction.mdx index a73fac93ac..bed3280f88 100644 --- a/docs/tutorials/events-and-interaction.mdx +++ b/docs/tutorials/events-and-interaction.mdx @@ -26,7 +26,6 @@ Any mesh in React Three Fiber has a large number of events, 13 to be more precis onPointerLeave={(e) => console.log('leave')} onPointerMove={(e) => console.log('move')} onPointerMissed={() => console.log('missed')} - onUpdate={(self) => console.log('props have been updated')} /> ``` diff --git a/packages/fiber/src/core/renderer.ts b/packages/fiber/src/core/renderer.ts index 71c7e935f5..e064d172f2 100644 --- a/packages/fiber/src/core/renderer.ts +++ b/packages/fiber/src/core/renderer.ts @@ -3,17 +3,7 @@ import { UseBoundStore } from 'zustand' import Reconciler from 'react-reconciler' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' import { DefaultEventPriority } from 'react-reconciler/constants' -import { - is, - prepare, - diffProps, - DiffSet, - applyProps, - updateInstance, - invalidateInstance, - attach, - detach, -} from './utils' +import { is, prepare, diffProps, DiffSet, applyProps, invalidateInstance, attach, detach } from './utils' import { RootState } from './store' import { EventHandlers, removeInteractivity } from './events' @@ -148,7 +138,6 @@ function createRenderer(_roots: Map, _getEventPriority?: if (!added) parentInstance.__r3f?.objects.push(child) if (!child.__r3f) prepare(child, {}) child.__r3f.parent = parentInstance - updateInstance(child) invalidateInstance(child) } } @@ -174,7 +163,6 @@ function createRenderer(_roots: Map, _getEventPriority?: if (!added) parentInstance.__r3f?.objects.push(child) if (!child.__r3f) prepare(child, {}) child.__r3f.parent = parentInstance - updateInstance(child) invalidateInstance(child) } } diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index 80e2ce0da5..fac273d344 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -343,9 +343,6 @@ export function applyProps(instance: Instance, data: InstanceProps | DiffSet) { if (localState.eventCount) rootState.internal.interaction.push(instance as unknown as THREE.Object3D) } - // Call the update lifecycle when it is being updated, but only when it is part of the scene - if (changes.length && instance.parent) updateInstance(instance) - return instance } @@ -354,10 +351,6 @@ export function invalidateInstance(instance: Instance) { if (state && state.internal.frames === 0) state.invalidate() } -export function updateInstance(instance: Instance) { - instance.onUpdate?.(instance) -} - export function updateCamera(camera: Camera & { manual?: boolean }, size: Size) { // https://github.com/pmndrs/react-three-fiber/issues/92 // Do not mess with the camera if it belongs to the user diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index a1c3fbed56..ec393b4920 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -39,7 +39,6 @@ export interface NodeProps { children?: React.ReactNode ref?: React.Ref key?: React.Key - onUpdate?: (self: T) => void } export type ExtendedColors = { [K in keyof T]: T[K] extends THREE.Color | undefined ? Color : T[K] } From 8bb056462a82a051b783e6f30320af2ff4bef0ef Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 9 Sep 2022 04:34:35 -0500 Subject: [PATCH 050/252] [v9] refactor!: remove `updateStyle` from `Size` (#2489) --- docs/API/hooks.mdx | 4 ++-- packages/fiber/src/core/index.tsx | 17 ++++------------- packages/fiber/src/core/store.ts | 18 +++++++----------- packages/fiber/tests/core/hooks.test.tsx | 2 +- .../src/__tests__/RTTR.hooks.test.tsx | 2 +- 5 files changed, 15 insertions(+), 28 deletions(-) diff --git a/docs/API/hooks.mdx b/docs/API/hooks.mdx index 9e280c18a1..e1213e9226 100644 --- a/docs/API/hooks.mdx +++ b/docs/API/hooks.mdx @@ -63,14 +63,14 @@ The hook is reactive, if you resize the browser for instance, you get fresh meas | legacy | Disables global color management via `THREE.ColorManagement` | `boolean` | | frameloop | Render mode: always, demand, never | `always`, `demand`, `never` | | performance | System regression | `{ current: number, min: number, max: number, debounce: number, regress: () => void }` | -| size | Canvas size in pixels | `{ width: number, height: numberm top: numberm left: numberm updateStyle?: boolean }` | +| size | Canvas size in pixels | `{ width: number, height: number, top: number, left: number }` | | viewport | Viewport size in three.js units | `{ width: number, height: number, initialDpr: number, dpr: number, factor: number, distance: number, aspect: number, getCurrentViewport: (camera?: Camera, target?: THREE.Vector3, size?: Size) => Viewport }` | | xr | XR interface, manages WebXR rendering | `{ connect: () => void, disconnect: () => void }` | | set | Allows you to set any state property | `(state: SetState) => void` | | get | Allows you to retrieve any state property non-reactively | `() => GetState` | | invalidate | Request a new render, given that `frameloop === 'demand'` | `() => void` | | advance | Advance one tick, given that `frameloop === 'never'` | `(timestamp: number, runGlobalEffects?: boolean) => void` | -| setSize | Resize the canvas | `(width: number, height: number, updateStyle?: boolean, top?: number, left?: number) => void` | +| setSize | Resize the canvas | `(width: number, height: number, top?: number, left?: number) => void` | | setDpr | Set the pixel-ratio | `(dpr: number) => void` | | setFrameloop | Shortcut to set the current render mode | `(frameloop?: 'always', 'demand', 'never') => void` | | setEvents | Shortcut to setting the event layer | `(events: Partial>) => void` | diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 0e0605b6dc..223b3ed00d 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -161,22 +161,13 @@ export type ReconcilerRoot = { unmount: () => void } -function isCanvas(maybeCanvas: unknown): maybeCanvas is HTMLCanvasElement { - return maybeCanvas instanceof HTMLCanvasElement -} - -function computeInitialSize(canvas: HTMLCanvasElement | OffscreenCanvas, defaultSize?: Size): Size { - if (defaultSize) { - return defaultSize - } - - if (isCanvas(canvas) && canvas.parentElement) { +function computeInitialSize(canvas: HTMLCanvasElement | OffscreenCanvas, size?: Size): Size { + if (!size && canvas instanceof HTMLCanvasElement && canvas.parentElement) { const { width, height, top, left } = canvas.parentElement.getBoundingClientRect() - return { width, height, top, left } } - return { width: 0, height: 0, top: 0, left: 0 } + return { width: 0, height: 0, top: 0, left: 0, ...size } } function createRoot(canvas: TCanvas): ReconcilerRoot { @@ -334,7 +325,7 @@ function createRoot(canvas: TCanvas): ReconcilerRoot void /** Shortcut to setting the event layer */ setEvents: (events: Partial>) => void - /** - * Shortcut to manual sizing - * - * @todo before releasing next major version (v9), re-order arguments here to width, height, top, left, updateStyle - */ - setSize: (width: number, height: number, updateStyle?: boolean, top?: number, left?: number) => void + /** Shortcut to manual sizing */ + setSize: (width: number, height: number, top?: number, left?: number) => void /** Shortcut to manual setting the pixel ratio */ setDpr: (dpr: Dpr) => void /** Shortcut to setting frameloop flags */ @@ -248,7 +244,7 @@ const createStore = ( }, }, - size: { width: 0, height: 0, top: 0, left: 0, updateStyle: false }, + size: { width: 0, height: 0, top: 0, left: 0 }, viewport: { initialDpr: 0, dpr: 0, @@ -264,9 +260,9 @@ const createStore = ( setEvents: (events: Partial>) => set((state) => ({ ...state, events: { ...state.events, ...events } })), - setSize: (width: number, height: number, updateStyle?: boolean, top?: number, left?: number) => { + setSize: (width: number, height: number, top: number = 0, left: number = 0) => { const camera = get().camera - const size = { width, height, top: top || 0, left: left || 0, updateStyle } + const size = { width, height, top, left } set((state) => ({ size, viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) } })) }, setDpr: (dpr: Dpr) => @@ -370,7 +366,7 @@ const createStore = ( // Update camera & renderer updateCamera(camera, size) gl.setPixelRatio(viewport.dpr) - gl.setSize(size.width, size.height, size.updateStyle) + gl.setSize(size.width, size.height) } // Update viewport once the camera changes diff --git a/packages/fiber/tests/core/hooks.test.tsx b/packages/fiber/tests/core/hooks.test.tsx index d2a4bc3639..066d16b4dd 100644 --- a/packages/fiber/tests/core/hooks.test.tsx +++ b/packages/fiber/tests/core/hooks.test.tsx @@ -75,7 +75,7 @@ describe('hooks', () => { expect(result.camera instanceof THREE.Camera).toBeTruthy() expect(result.scene instanceof THREE.Scene).toBeTruthy() expect(result.raycaster instanceof THREE.Raycaster).toBeTruthy() - expect(result.size).toEqual({ height: 0, width: 0, top: 0, left: 0, updateStyle: false }) + expect(result.size).toEqual({ height: 0, width: 0, top: 0, left: 0 }) }) it('can handle useFrame hook', async () => { diff --git a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx index a0394bc09a..ca717196fa 100644 --- a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx @@ -41,7 +41,7 @@ describe('ReactThreeTestRenderer Hooks', () => { expect(result.camera instanceof THREE.Camera).toBeTruthy() expect(result.scene instanceof THREE.Scene).toBeTruthy() expect(result.raycaster instanceof THREE.Raycaster).toBeTruthy() - expect(result.size).toEqual({ height: 0, width: 0, top: 0, left: 0, updateStyle: false }) + expect(result.size).toEqual({ height: 0, width: 0, top: 0, left: 0 }) }) it('can handle useLoader hook', async () => { From 7d02d65e7840772c790f692b27b15a6bd2607946 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 9 Sep 2022 05:19:45 -0500 Subject: [PATCH 051/252] fix!: type unstable_act (#2490) --- packages/fiber/src/core/index.tsx | 9 ++++++++- packages/test-renderer/src/index.tsx | 6 ++---- packages/test-renderer/src/types/public.ts | 2 -- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 223b3ed00d..efa4b14c61 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -561,7 +561,14 @@ reconciler.injectIntoDevTools({ version: React.version, }) -const act = (React as any).unstable_act +declare module 'react' { + const unstable_act: (cb: () => Promise) => Promise +} + +/** + * Safely flush async effects when testing, simulating a legacy root. + */ +const act = React.unstable_act export * from './hooks' export { diff --git a/packages/test-renderer/src/index.tsx b/packages/test-renderer/src/index.tsx index 38e77c9ca5..97a95b0082 100644 --- a/packages/test-renderer/src/index.tsx +++ b/packages/test-renderer/src/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import * as THREE from 'three' -import { extend, _roots as mockRoots, createRoot, reconciler, act as _act } from '@react-three/fiber' +import { extend, _roots as mockRoots, createRoot, reconciler, act } from '@react-three/fiber' import { toTree } from './helpers/tree' import { toGraph } from './helpers/graph' @@ -12,14 +12,12 @@ import { createWebGLContext } from './createWebGLContext' import { createEventFirer } from './fireEvent' import type { MockScene } from './types/internal' -import type { CreateOptions, Renderer, Act } from './types/public' +import type { CreateOptions, Renderer } from './types/public' import { wrapFiber } from './createTestInstance' // Extend catalogue for render API in tests. extend(THREE) -const act = _act as unknown as Act - type X = | ((contextId: 'webgl', options?: WebGLContextAttributes) => WebGLRenderingContext | null) | ((contextId: 'webgl2', options?: WebGLContextAttributes) => WebGL2RenderingContext | null) diff --git a/packages/test-renderer/src/types/public.ts b/packages/test-renderer/src/types/public.ts index 35229ee446..a759c74e5a 100644 --- a/packages/test-renderer/src/types/public.ts +++ b/packages/test-renderer/src/types/public.ts @@ -17,8 +17,6 @@ export type MockSyntheticEvent = { export type CreateOptions = CreateCanvasParameters & RenderProps -export type Act = (cb: () => Promise) => Promise - export type Renderer = { scene: ReactThreeTestInstance unmount: () => Promise From e440d083d4d0fc6355f91ce8dc9c88add1da04fc Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 9 Sep 2022 07:09:27 -0500 Subject: [PATCH 052/252] fix(types): don't declare unstable_act (#2492) --- packages/fiber/src/core/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index efa4b14c61..0181a35375 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -561,14 +561,12 @@ reconciler.injectIntoDevTools({ version: React.version, }) -declare module 'react' { - const unstable_act: (cb: () => Promise) => Promise -} +type Act = (cb: () => Promise) => Promise /** * Safely flush async effects when testing, simulating a legacy root. */ -const act = React.unstable_act +const act: Act = (React as any).unstable_act export * from './hooks' export { @@ -587,6 +585,7 @@ export { addAfterEffect, addTail, getRootState, + Act, act, roots as _roots, } From 770fd0a88f06cc98b8bd7d35769731032b3c57b4 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 9 Sep 2022 07:18:33 -0500 Subject: [PATCH 053/252] [v9] chore(tests): cleanup test config, harden previous renderer tests (#2491) --- .github/workflows/test.yml | 2 +- jest.config.js | 2 +- packages/fiber/__mocks__/expo-file-system.ts | 1 - packages/fiber/__mocks__/expo-gl.ts | 13 +- .../Libraries/Pressability/Pressability.ts | 6 +- .../fiber/__mocks__/react-native/index.ts | 43 +- .../canvas.native.test.tsx.snap} | 0 .../__snapshots__/canvas.test.tsx.snap | 0 ...canvas.test.tsx => canvas.native.test.tsx} | 35 +- .../fiber/tests/{web => }/canvas.test.tsx | 39 +- .../fiber/tests/{core => }/events.test.tsx | 3 +- .../fiber/tests/{core => }/hooks.test.tsx | 87 +--- packages/fiber/tests/native/hooks.test.tsx | 123 ----- .../fiber/tests/{core => }/renderer.test.tsx | 472 +++++++----------- packages/fiber/tests/setupTests.ts | 23 - packages/fiber/tests/{core => }/utils.test.ts | 12 +- packages/shared/asyncUtils.ts | 97 ---- packages/shared/pointerEventPolyfill.ts | 32 -- packages/shared/setupTests.ts | 55 +- .../src/__tests__/RTTR.hooks.test.tsx | 19 +- 20 files changed, 303 insertions(+), 761 deletions(-) delete mode 100644 packages/fiber/__mocks__/expo-file-system.ts rename packages/fiber/tests/{native/__snapshots__/canvas.test.tsx.snap => __snapshots__/canvas.native.test.tsx.snap} (100%) rename packages/fiber/tests/{web => }/__snapshots__/canvas.test.tsx.snap (100%) rename packages/fiber/tests/{native/canvas.test.tsx => canvas.native.test.tsx} (53%) rename packages/fiber/tests/{web => }/canvas.test.tsx (62%) rename packages/fiber/tests/{core => }/events.test.tsx (99%) rename packages/fiber/tests/{core => }/hooks.test.tsx (66%) delete mode 100644 packages/fiber/tests/native/hooks.test.tsx rename packages/fiber/tests/{core => }/renderer.test.tsx (53%) delete mode 100644 packages/fiber/tests/setupTests.ts rename packages/fiber/tests/{core => }/utils.test.ts (90%) delete mode 100644 packages/shared/asyncUtils.ts delete mode 100644 packages/shared/pointerEventPolyfill.ts diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0651351e86..8d7979929b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: run: yarn run build - name: Jest run - run: yarn run test + run: yarn run dev && yarn run test - name: Report Fiber size run: yarn run analyze-fiber diff --git a/jest.config.js b/jest.config.js index e0390621a2..fd70dfe3bc 100644 --- a/jest.config.js +++ b/jest.config.js @@ -22,5 +22,5 @@ module.exports = { moduleFileExtensions: ['js', 'ts', 'tsx'], verbose: false, testTimeout: 30000, - setupFilesAfterEnv: ['/packages/shared/setupTests.ts', '/packages/fiber/tests/setupTests.ts'], + setupFilesAfterEnv: ['/packages/shared/setupTests.ts'], } diff --git a/packages/fiber/__mocks__/expo-file-system.ts b/packages/fiber/__mocks__/expo-file-system.ts deleted file mode 100644 index 69229eac07..0000000000 --- a/packages/fiber/__mocks__/expo-file-system.ts +++ /dev/null @@ -1 +0,0 @@ -export const readAsStringAsync = async () => new Promise((res) => res('')) diff --git a/packages/fiber/__mocks__/expo-gl.ts b/packages/fiber/__mocks__/expo-gl.ts index 53af806015..d225919baf 100644 --- a/packages/fiber/__mocks__/expo-gl.ts +++ b/packages/fiber/__mocks__/expo-gl.ts @@ -1,11 +1,14 @@ import * as React from 'react' -import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext' +import type { GLViewProps, ExpoWebGLRenderingContext } from 'expo-gl' + +export function GLView({ onContextCreate }: GLViewProps) { + const canvas = React.useMemo(() => Object.assign(document.createElement('canvas'), { width: 1280, height: 800 }), []) -export const GLView = ({ onContextCreate }: { onContextCreate: (gl: any) => void }) => { React.useLayoutEffect(() => { - const gl = createWebGLContext({ width: 1280, height: 800 } as HTMLCanvasElement) - onContextCreate(gl) - }, []) + const gl = canvas.getContext('webgl2') as ExpoWebGLRenderingContext + gl.endFrameEXP = () => {} + onContextCreate?.(gl) + }, [canvas, onContextCreate]) return null } diff --git a/packages/fiber/__mocks__/react-native/Libraries/Pressability/Pressability.ts b/packages/fiber/__mocks__/react-native/Libraries/Pressability/Pressability.ts index 4cb71fac2e..3cc18eb1cd 100644 --- a/packages/fiber/__mocks__/react-native/Libraries/Pressability/Pressability.ts +++ b/packages/fiber/__mocks__/react-native/Libraries/Pressability/Pressability.ts @@ -1,2 +1,4 @@ -const mock = {} -export default mock +export default class { + getEventHandlers = () => ({}) + reset() {} +} diff --git a/packages/fiber/__mocks__/react-native/index.ts b/packages/fiber/__mocks__/react-native/index.ts index f73c732922..a0137a5b61 100644 --- a/packages/fiber/__mocks__/react-native/index.ts +++ b/packages/fiber/__mocks__/react-native/index.ts @@ -2,29 +2,26 @@ import * as React from 'react' import { ViewProps, LayoutChangeEvent } from 'react-native' // Mocks a View or container as React sees it -const Container = React.memo( - React.forwardRef(({ onLayout, ...props }: ViewProps, ref) => { - React.useLayoutEffect(() => { - onLayout?.({ - nativeEvent: { - layout: { - x: 0, - y: 0, - width: 1280, - height: 800, - }, +class NativeContainer extends React.Component { + componentDidMount(): void { + this.props.onLayout?.({ + nativeEvent: { + layout: { + x: 0, + y: 0, + width: 1280, + height: 800, }, - } as LayoutChangeEvent) + }, + } as LayoutChangeEvent) + } - ref = { current: { props } } - }, []) - - return null - }), -) + render() { + return this.props.children + } +} -export const View = Container -export const Pressable = Container +export const View = NativeContainer export const StyleSheet = { absoluteFill: { @@ -35,3 +32,9 @@ export const StyleSheet = { bottom: 0, }, } + +export const PixelRatio = { + get() { + return 1 + }, +} diff --git a/packages/fiber/tests/native/__snapshots__/canvas.test.tsx.snap b/packages/fiber/tests/__snapshots__/canvas.native.test.tsx.snap similarity index 100% rename from packages/fiber/tests/native/__snapshots__/canvas.test.tsx.snap rename to packages/fiber/tests/__snapshots__/canvas.native.test.tsx.snap diff --git a/packages/fiber/tests/web/__snapshots__/canvas.test.tsx.snap b/packages/fiber/tests/__snapshots__/canvas.test.tsx.snap similarity index 100% rename from packages/fiber/tests/web/__snapshots__/canvas.test.tsx.snap rename to packages/fiber/tests/__snapshots__/canvas.test.tsx.snap diff --git a/packages/fiber/tests/native/canvas.test.tsx b/packages/fiber/tests/canvas.native.test.tsx similarity index 53% rename from packages/fiber/tests/native/canvas.test.tsx rename to packages/fiber/tests/canvas.native.test.tsx index ef926ad50a..39d98181cc 100644 --- a/packages/fiber/tests/native/canvas.test.tsx +++ b/packages/fiber/tests/canvas.native.test.tsx @@ -1,48 +1,43 @@ import * as React from 'react' import { View } from 'react-native' -import { act, create, ReactTestRenderer } from 'react-test-renderer' - -import { Canvas } from '../../src/native' +import { create } from 'react-test-renderer' +import { Canvas, act } from '../src/native' describe('native Canvas', () => { it('should correctly mount', async () => { - let renderer: ReactTestRenderer = null! - - await act(async () => { - renderer = create( + const renderer = await act(async () => + create( , - ) - }) + ), + ) - expect(renderer.toTree()).toMatchSnapshot() + expect(renderer.toJSON()).toMatchSnapshot() }) it('should forward ref', async () => { const ref = React.createRef() - await act(async () => { + await act(async () => create( , - ) - }) + ), + ) - expect(ref.current).toBeDefined() + expect(ref.current).toBeInstanceOf(View) }) it('should correctly unmount', async () => { - let renderer: ReactTestRenderer = null! - - await act(async () => { - renderer = create( + const renderer = await act(async () => + create( , - ) - }) + ), + ) expect(() => renderer.unmount()).not.toThrow() }) diff --git a/packages/fiber/tests/web/canvas.test.tsx b/packages/fiber/tests/canvas.test.tsx similarity index 62% rename from packages/fiber/tests/web/canvas.test.tsx rename to packages/fiber/tests/canvas.test.tsx index 6703f47e0d..297e76e084 100644 --- a/packages/fiber/tests/web/canvas.test.tsx +++ b/packages/fiber/tests/canvas.test.tsx @@ -1,20 +1,16 @@ -// use default export for jest.spyOn import React from 'react' -import { render, RenderResult } from '@testing-library/react' - -import { Canvas, act } from '../../src' +import { render } from '@testing-library/react' +import { Canvas, act } from '../src' describe('web Canvas', () => { it('should correctly mount', async () => { - let renderer: RenderResult = null! - - await act(async () => { - renderer = render( + const renderer = await act(async () => + render( , - ) - }) + ), + ) expect(renderer.container).toMatchSnapshot() }) @@ -22,26 +18,25 @@ describe('web Canvas', () => { it('should forward ref', async () => { const ref = React.createRef() - await act(async () => { + await act(async () => render( , - ) - }) + ), + ) - expect(ref.current).toBeDefined() + expect(ref.current).toBeInstanceOf(HTMLCanvasElement) }) it('should correctly unmount', async () => { - let renderer: RenderResult = null! - await act(async () => { - renderer = render( + const renderer = await act(async () => + render( , - ) - }) + ), + ) expect(() => renderer.unmount()).not.toThrow() }) @@ -49,13 +44,13 @@ describe('web Canvas', () => { it('plays nice with react SSR', async () => { const useLayoutEffect = jest.spyOn(React, 'useLayoutEffect') - await act(async () => { + await act(async () => render( , - ) - }) + ), + ) expect(useLayoutEffect).not.toHaveBeenCalled() }) diff --git a/packages/fiber/tests/core/events.test.tsx b/packages/fiber/tests/events.test.tsx similarity index 99% rename from packages/fiber/tests/core/events.test.tsx rename to packages/fiber/tests/events.test.tsx index 5a753acb5c..4d1854506d 100644 --- a/packages/fiber/tests/core/events.test.tsx +++ b/packages/fiber/tests/events.test.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { render, fireEvent, RenderResult } from '@testing-library/react' - -import { Canvas, act } from '../../src' +import { Canvas, act } from '../src' const getContainer = () => document.querySelector('canvas')?.parentNode?.parentNode as HTMLDivElement diff --git a/packages/fiber/tests/core/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx similarity index 66% rename from packages/fiber/tests/core/hooks.test.tsx rename to packages/fiber/tests/hooks.test.tsx index 066d16b4dd..fad5964d10 100644 --- a/packages/fiber/tests/core/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -1,47 +1,11 @@ import * as React from 'react' import * as THREE from 'three' import * as Stdlib from 'three-stdlib' -import { createCanvas } from '@react-three/test-renderer/src/createTestCanvas' -import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext' +import { createRoot, advance, useLoader, act, useThree, useGraph, useFrame, ObjectMap } from '../src' -import { asyncUtils } from '../../../shared/asyncUtils' - -import { createRoot, advance, useLoader, act, useThree, useGraph, useFrame, ObjectMap } from '../../src' - -const resolvers: (() => void)[] = [] - -const { waitFor } = asyncUtils(act, (resolver: () => void) => { - resolvers.push(resolver) -}) +const root = createRoot(document.createElement('canvas')) describe('hooks', () => { - let canvas: HTMLCanvasElement = null! - - beforeEach(() => { - canvas = createCanvas({ - beforeReturn: (canvas) => { - function getContext( - contextId: '2d', - options?: CanvasRenderingContext2DSettings, - ): CanvasRenderingContext2D | null - function getContext( - contextId: 'bitmaprenderer', - options?: ImageBitmapRenderingContextSettings, - ): ImageBitmapRenderingContext | null - function getContext(contextId: 'webgl', options?: WebGLContextAttributes): WebGLRenderingContext | null - function getContext(contextId: 'webgl2', options?: WebGLContextAttributes): WebGL2RenderingContext | null - function getContext(contextId: string): RenderingContext | null { - if (contextId === 'webgl' || contextId === 'webgl2') { - return createWebGLContext(canvas) - } - return null - } - - canvas.getContext = getContext - }, - }) - }) - it('can handle useThree hook', async () => { let result = {} as { camera: THREE.Camera @@ -68,9 +32,7 @@ describe('hooks', () => { return } - await act(async () => { - createRoot(canvas).render() - }) + await act(async () => root.render()) expect(result.camera instanceof THREE.Camera).toBeTruthy() expect(result.scene instanceof THREE.Scene).toBeTruthy() @@ -96,14 +58,9 @@ describe('hooks', () => { ) } - let scene: THREE.Scene = null! - await act( - async () => - (scene = createRoot(canvas) - .configure({ frameloop: 'never' }) - .render() - .getState().scene), - ) + const store = await act(async () => root.configure({ frameloop: 'never' }).render()) + const { scene } = store.getState() + advance(Date.now()) expect(scene.children[0].position.x).toEqual(1) expect(frameCalls.length).toBeGreaterThan(0) @@ -125,18 +82,8 @@ describe('hooks', () => { return } - let scene: THREE.Scene = null! - await act(async () => { - scene = createRoot(canvas) - .render( - - - , - ) - .getState().scene - }) - - await waitFor(() => expect(scene.children[0]).toBeDefined()) + const store = await act(async () => root.render()) + const { scene } = store.getState() expect(scene.children[0]).toBe(MockMesh) }) @@ -183,18 +130,8 @@ describe('hooks', () => { ) } - let scene: THREE.Scene = null! - await act(async () => { - scene = createRoot(canvas) - .render( - - - , - ) - .getState().scene - }) - - await waitFor(() => expect(scene.children[0]).toBeDefined()) + const store = await act(async () => root.render()) + const { scene } = store.getState() expect(scene.children[0]).toBe(MockMesh) }) @@ -230,9 +167,7 @@ describe('hooks', () => { return } - await act(async () => { - createRoot(canvas).render() - }) + await act(async () => root.render()) expect(result).toEqual({ nodes: { diff --git a/packages/fiber/tests/native/hooks.test.tsx b/packages/fiber/tests/native/hooks.test.tsx deleted file mode 100644 index 0907f57e56..0000000000 --- a/packages/fiber/tests/native/hooks.test.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import * as React from 'react' -import * as THREE from 'three' -import * as Stdlib from 'three-stdlib' -import { createCanvas } from '@react-three/test-renderer/src/createTestCanvas' -import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext' - -import { asyncUtils } from '../../../shared/asyncUtils' - -import { createRoot, useLoader, act } from '../../src/native' -import { polyfills } from '../../src/native/polyfills' - -polyfills() - -const resolvers: (() => void)[] = [] - -const { waitFor } = asyncUtils(act, (resolver: () => void) => { - resolvers.push(resolver) -}) - -describe('useLoader', () => { - let canvas: HTMLCanvasElement = null! - - beforeEach(() => { - canvas = createCanvas({ - beforeReturn: (canvas) => { - function getContext( - contextId: '2d', - options?: CanvasRenderingContext2DSettings, - ): CanvasRenderingContext2D | null - function getContext( - contextId: 'bitmaprenderer', - options?: ImageBitmapRenderingContextSettings, - ): ImageBitmapRenderingContext | null - function getContext(contextId: 'webgl', options?: WebGLContextAttributes): WebGLRenderingContext | null - function getContext(contextId: 'webgl2', options?: WebGLContextAttributes): WebGL2RenderingContext | null - function getContext(contextId: string): RenderingContext | null { - if (contextId === 'webgl' || contextId === 'webgl2') { - return createWebGLContext(canvas) - } - return null - } - - canvas.getContext = getContext - }, - }) - - // Emulate GLTFLoader - jest.spyOn(Stdlib, 'GLTFLoader').mockImplementation( - () => - ({ - load: jest.fn().mockImplementation((_input, onLoad) => { - onLoad(true) - }), - parse: jest.fn().mockImplementation((_data, _, onLoad) => { - onLoad(true) - }), - } as unknown as Stdlib.GLTFLoader), - ) - }) - - it('produces data textures for TextureLoader', async () => { - let texture: any - - const Component = () => { - texture = useLoader(THREE.TextureLoader, '/texture.jpg') - return null - } - - await act(async () => { - createRoot(canvas).render( - - - , - ) - }) - - await waitFor(() => expect(texture).toBeDefined()) - - expect(texture.isDataTexture).toBe(true) - }) - - it('can load external assets using the loader signature', async () => { - let gltf: any - - const Component = () => { - gltf = useLoader(Stdlib.GLTFLoader, 'http://test.local/test.glb') - return null - } - - await act(async () => { - createRoot(canvas).render( - - - , - ) - }) - - await waitFor(() => expect(gltf).toBeDefined()) - - expect(gltf).toBe(true) - }) - - it('can parse assets using the file system', async () => { - let gltf: any - - const Component = () => { - gltf = useLoader(Stdlib.GLTFLoader, 1 as any) - return null - } - - await act(async () => { - createRoot(canvas).render( - - - , - ) - }) - - await waitFor(() => expect(gltf).toBeDefined()) - - expect(gltf).toBe(true) - }) -}) diff --git a/packages/fiber/tests/core/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx similarity index 53% rename from packages/fiber/tests/core/renderer.test.tsx rename to packages/fiber/tests/renderer.test.tsx index e742c6d2c3..821b027405 100644 --- a/packages/fiber/tests/core/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -1,8 +1,5 @@ import * as React from 'react' import * as THREE from 'three' -import { createCanvas } from '@react-three/test-renderer/src/createTestCanvas' -import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext' - import { ReconcilerRoot, createRoot, @@ -12,10 +9,10 @@ import { ReactThreeFiber, useThree, createPortal, -} from '../../src/index' +} from '../src/index' import { UseBoundStore } from 'zustand' -import { privateKeys, RootState } from '../../src/core/store' -import { Instance } from '../../src/core/renderer' +import { privateKeys, RootState } from '../src/core/store' +import { suspend } from 'suspend-react' type ComponentMesh = THREE.Mesh @@ -68,49 +65,18 @@ beforeAll(() => { describe('renderer', () => { let root: ReconcilerRoot = null! - beforeEach(() => { - const canvas = createCanvas({ - beforeReturn: (canvas) => { - function getContext( - contextId: '2d', - options?: CanvasRenderingContext2DSettings, - ): CanvasRenderingContext2D | null - function getContext( - contextId: 'bitmaprenderer', - options?: ImageBitmapRenderingContextSettings, - ): ImageBitmapRenderingContext | null - function getContext(contextId: 'webgl', options?: WebGLContextAttributes): WebGLRenderingContext | null - function getContext(contextId: 'webgl2', options?: WebGLContextAttributes): WebGL2RenderingContext | null - function getContext(contextId: string): RenderingContext | null { - if (contextId === 'webgl' || contextId === 'webgl2') { - return createWebGLContext(canvas) - } - return null - } - - canvas.getContext = getContext - }, - }) - root = createRoot(canvas) - }) - - afterEach(() => { - root.unmount() - }) + beforeEach(() => (root = createRoot(document.createElement('canvas')))) + afterEach(async () => act(async () => root.unmount())) it('renders a simple component', async () => { - const Mesh = () => { - return ( - - - - - ) - } - let scene: THREE.Scene = null! - await act(async () => { - scene = root.render().getState().scene - }) + const Mesh = () => ( + + + + + ) + const store = await act(async () => root.render()) + const { scene } = store.getState() expect(scene.children[0].type).toEqual('Mesh') expect((scene.children[0] as ComponentMesh).geometry.type).toEqual('BoxGeometry') @@ -122,16 +88,22 @@ describe('renderer', () => { it('renders an empty scene', async () => { const Empty = () => null - let scene: THREE.Scene = null! - await act(async () => { - scene = root.render().getState().scene - }) + + const store = await act(async () => root.render()) + const { scene } = store.getState() expect(scene.type).toEqual('Scene') expect(scene.children).toEqual([]) }) it('can render a composite component', async () => { + const Child = () => ( + + + + + ) + class Parent extends React.Component { render() { return ( @@ -143,28 +115,17 @@ describe('renderer', () => { } } - const Child = () => { - return ( - - - - - ) - } + const store = await act(async () => root.render()) + const { scene } = store.getState() - let scene: THREE.Scene = null! - await act(async () => { - scene = root.render().getState().scene - }) + const parent = scene.children[0] as ObjectWithBackground + expect(parent).toBeInstanceOf(THREE.Group) + expect(parent.background.getStyle()).toEqual('rgb(0,0,0)') - expect(scene.children[0].type).toEqual('Group') - expect((scene.children[0] as ObjectWithBackground).background.getStyle()).toEqual('rgb(0,0,0)') - expect(scene.children[0].children[0].type).toEqual('Mesh') - expect((scene.children[0].children[0] as ComponentMesh).geometry.type).toEqual('BoxGeometry') - expect((scene.children[0].children[0] as ComponentMesh).material.type).toEqual('MeshBasicMaterial') - expect( - (scene.children[0].children[0] as THREE.Mesh).material.type, - ).toEqual('MeshBasicMaterial') + const child = parent.children[0] as ComponentMesh + expect(child).toBeInstanceOf(THREE.Mesh) + expect(child.geometry).toBeInstanceOf(THREE.BoxGeometry) + expect(child.material).toBeInstanceOf(THREE.MeshBasicMaterial) }) it('renders some basics with an update', async () => { @@ -198,54 +159,44 @@ describe('renderer', () => { return null } - let scene: THREE.Scene = null! - await act(async () => { - scene = root.render().getState().scene - }) + const store = await act(async () => root.render()) + const { scene } = store.getState() expect(scene.children[0].position.x).toEqual(7) expect(renders).toBe(6) }) it('updates types & names', async () => { - let scene: THREE.Scene = null! - await act(async () => { - scene = root - .render( - - - - - , - ) - .getState().scene - }) - - expect((scene.children[0] as THREE.Mesh).material.type).toEqual( - 'MeshBasicMaterial', - ) - expect((scene.children[0] as THREE.Mesh).material.name).toEqual( - 'basicMat', + const store = await act(async () => + root.render( + + + + + , + ), ) + const { scene } = store.getState() - await act(async () => { - scene = root - .render( - - - - - , - ) - .getState().scene - }) + const basic = scene.children[0] as ComponentMesh + expect(basic.material).toBeInstanceOf(THREE.MeshBasicMaterial) + expect(basic.material.name).toBe('basicMat') + expect(basic.material.color.toArray()).toStrictEqual([0, 0, 0]) - expect((scene.children[0] as THREE.Mesh).material.type).toEqual( - 'MeshStandardMaterial', - ) - expect((scene.children[0] as THREE.Mesh).material.name).toEqual( - 'standardMat', + await act(async () => + root.render( + + + + + , + ), ) + + const standard = scene.children[0] as ComponentMesh + expect(standard.material).toBeInstanceOf(THREE.MeshStandardMaterial) + expect(standard.material.name).toBe('standardMat') + expect(standard.material.color.toArray()).toStrictEqual([255, 255, 255]) }) it('should forward ref three object', async () => { @@ -268,108 +219,48 @@ describe('renderer', () => { ) } - await act(async () => { - root.render() - }) + await act(async () => root.render()) - expect(immutableRef.current).toBeTruthy() - expect(mutableRef.current).toBeTruthy() - expect(mutableRefSpecific.current).toBeTruthy() + expect(immutableRef.current).toBeInstanceOf(THREE.Mesh) + expect(mutableRef.current).toBeInstanceOf(THREE.Mesh) + expect(mutableRefSpecific.current).toBeInstanceOf(THREE.Mesh) }) - it('attaches Object3D children that use attach', async () => { - let scene: THREE.Scene = null! - await act(async () => { - scene = root - .render( - - - , - ) - .getState().scene - }) - - const attachedMesh = (scene.children[0] as HasObject3dMember).attachment - expect(attachedMesh).toBeDefined() - expect(attachedMesh?.type).toBe('Mesh') - // attaching is *instead of* being a regular child - expect(scene.children[0].children.length).toBe(0) - }) - - it('can attach a Scene', async () => { - let scene: THREE.Scene = null! - await act(async () => { - scene = root - .render( - - - , - ) - .getState().scene - }) + it('attaches children that use attach', async () => { + const store = await act(async () => + root.render( + + + , + ), + ) + const { scene } = store.getState() - const attachedScene = (scene.children[0] as HasObject3dMember).attachment - expect(attachedScene).toBeDefined() - expect(attachedScene?.type).toBe('Scene') - // attaching is *instead of* being a regular child - expect(scene.children[0].children.length).toBe(0) + const object = scene.children[0] as HasObject3dMember + expect(object.attachment).toBeInstanceOf(THREE.Mesh) + expect(object.children.length).toBe(0) }) - describe('attaches Object3D children that use attachFns', () => { + describe('attaches children that use attachFns', () => { it('attachFns with cleanup', async () => { - let scene: THREE.Scene = null! - await act(async () => { - scene = root - .render( - - (parent.customAttach(self), () => parent.detach(self))} /> - , - ) - .getState().scene - }) - - const attachedMesh = (scene.children[0] as HasObject3dMethods).attachedObj3d - expect(attachedMesh).toBeDefined() - expect(attachedMesh?.type).toBe('Mesh') - // attaching is *instead of* being a regular child - expect(scene.children[0].children.length).toBe(0) - - // and now detach .. - expect((scene.children[0] as HasObject3dMethods).detachedObj3d).toBeUndefined() - - await act(async () => { - root.render() - }) - - const detachedMesh = (scene.children[0] as HasObject3dMethods).detachedObj3d - expect(detachedMesh).toBe(attachedMesh) - }) + const store = await act(async () => + root.render( + + (parent.customAttach(self), () => parent.detach(self))} /> + , + ), + ) + const { scene } = store.getState() + + // Attach + const object = scene.children[0] as HasObject3dMethods + expect(object.attachedObj3d).toBeInstanceOf(THREE.Mesh) + expect(object.children.length).toBe(0) - it('attachFns as functions', async () => { - let scene: THREE.Scene = null! - let attachedMesh: Instance = null! - let detachedMesh: Instance = null! - - await act(async () => { - scene = root - .render( - - ((attachedMesh = parent), () => (detachedMesh = parent))} /> - , - ) - .getState().scene - }) - - expect(attachedMesh).toBeDefined() - expect(attachedMesh?.type).toBe('Object3D') - // attaching is *instead of* being a regular child - expect(scene.children[0].children.length).toBe(0) - - await act(async () => { - root.render() - }) - - expect(detachedMesh).toBe(attachedMesh) + // Detach + expect(object.detachedObj3d).toBeUndefined() + await act(async () => root.render()) + expect(object.detachedObj3d).toBeInstanceOf(THREE.Mesh) }) }) @@ -388,13 +279,8 @@ describe('renderer', () => { } } - await act(async () => { - root.render() - }) - - await act(async () => { - root.unmount() - }) + await act(async () => root.render()) + await act(async () => root.unmount()) expect(log).toEqual(['render Foo', 'mount Foo', 'unmount Foo']) }) @@ -442,7 +328,6 @@ describe('renderer', () => { }) it('will create an identical instance when reconstructing', async () => { - let state: RootState = null! const instances: { uuid: string; parentUUID?: string; childUUID?: string }[] = [] const object1 = new THREE.Group() @@ -454,43 +339,38 @@ describe('renderer', () => { ) - await act(async () => { - state = root.render().getState() - }) + const store = await act(async () => root.render()) + const { scene, internal } = store.getState() instances.push({ - uuid: state.scene.children[0].uuid, - parentUUID: state.scene.children[0].parent?.uuid, - childUUID: state.scene.children[0].children[0]?.uuid, + uuid: scene.children[0].uuid, + parentUUID: scene.children[0].parent?.uuid, + childUUID: scene.children[0].children[0]?.uuid, }) - expect(state.scene.children[0]).toBe(object1) + expect(scene.children[0]).toBe(object1) - await act(async () => { - state = root.render().getState() - }) + await act(async () => root.render()) instances.push({ - uuid: state.scene.children[0].uuid, - parentUUID: state.scene.children[0].parent?.uuid, - childUUID: state.scene.children[0].children[0]?.uuid, + uuid: scene.children[0].uuid, + parentUUID: scene.children[0].parent?.uuid, + childUUID: scene.children[0].children[0]?.uuid, }) const [oldInstance, newInstance] = instances // Swapped to new instance - expect(state.scene.children[0]).toBe(object2) + expect(scene.children[0]).toBe(object2) // Preserves scene hierarchy expect(oldInstance.parentUUID).toBe(newInstance.parentUUID) expect(oldInstance.childUUID).toBe(newInstance.childUUID) // Rebinds events - expect(state.internal.interaction.length).not.toBe(0) + expect(internal.interaction.length).not.toBe(0) }) it('can swap primitives', async () => { - let state: RootState = null! - const o1 = new THREE.Group() o1.add(new THREE.Group()) const o2 = new THREE.Group() @@ -501,36 +381,29 @@ describe('renderer', () => { ) - await act(async () => { - state = root.render().getState() - }) + const store = await act(async () => root.render()) + const { scene } = store.getState() // Initial object is added with children and attachments - expect(state.scene.children[0]).toBe(o1) - expect(state.scene.children[0].children.length).toBe(1) - expect((state.scene.children[0] as any).test).toBeInstanceOf(THREE.Group) + expect(scene.children[0]).toBe(o1) + expect(scene.children[0].children.length).toBe(1) + expect((scene.children[0] as any).test).toBeInstanceOf(THREE.Group) - await act(async () => { - state = root.render().getState() - }) + await act(async () => root.render()) // Swapped to object 2, does not copy old children, copies attachments - expect(state.scene.children[0]).toBe(o2) - expect(state.scene.children[0].children.length).toBe(0) - expect((state.scene.children[0] as any).test).toBeInstanceOf(THREE.Group) + expect(scene.children[0]).toBe(o2) + expect(scene.children[0].children.length).toBe(0) + expect((scene.children[0] as any).test).toBeInstanceOf(THREE.Group) }) it('will make an Orthographic Camera & set the position', async () => { - let camera: THREE.Camera = null! - - await act(async () => { - camera = root - .configure({ orthographic: true, camera: { position: [0, 0, 5] } }) - .render() - .getState().camera - }) + const store = await act(async () => + root.configure({ orthographic: true, camera: { position: [0, 0, 5] } }).render(), + ) + const { camera } = store.getState() - expect(camera.type).toEqual('OrthographicCamera') + expect(camera).toBeInstanceOf(THREE.OrthographicCamera) expect(camera.position.z).toEqual(5) }) @@ -569,22 +442,18 @@ describe('renderer', () => { }) it('should set PCFSoftShadowMap as the default shadow map', async () => { - let state: UseBoundStore = null! - await act(async () => { - state = root.configure({ shadows: true }).render() - }) + const store = await act(async () => root.configure({ shadows: true }).render()) + const { gl } = store.getState() - expect(state.getState().gl.shadowMap.type).toBe(THREE.PCFSoftShadowMap) + expect(gl.shadowMap.type).toBe(THREE.PCFSoftShadowMap) }) it('should set tonemapping to ACESFilmicToneMapping and outputEncoding to sRGBEncoding if linear is false', async () => { - let state: UseBoundStore = null! - await act(async () => { - state = root.configure({ linear: false }).render() - }) + const store = await act(async () => root.configure({ linear: false }).render()) + const { gl } = store.getState() - expect(state.getState().gl.toneMapping).toBe(THREE.ACESFilmicToneMapping) - expect(state.getState().gl.outputEncoding).toBe(THREE.sRGBEncoding) + expect(gl.toneMapping).toBe(THREE.ACESFilmicToneMapping) + expect(gl.outputEncoding).toBe(THREE.sRGBEncoding) }) it('should toggle render mode in xr', async () => { @@ -609,14 +478,12 @@ describe('renderer', () => { it('should respect frameloop="never" in xr', async () => { let respected = true + const Test = () => useFrame(() => (respected = false)) + await act(async () => { - const TestGroup = () => { - useFrame(() => (respected = false)) - return - } const state = root .configure({ frameloop: 'never' }) - .render() + .render() .getState() state.gl.xr.isPresenting = true state.gl.xr.dispatchEvent({ type: 'sessionstart' }) @@ -626,25 +493,19 @@ describe('renderer', () => { }) it('will render components that are extended', async () => { - const testExtend = async () => { - await act(async () => { - extend({ MyColor }) + extend({ MyColor }) - root.render() - }) - } + const store = await act(async () => root.render()) + const { scene } = store.getState() - expect(() => testExtend()).not.toThrow() + const { myColor } = scene as THREE.Scene & { myColor: MyColor } + expect(myColor).toBeInstanceOf(MyColor) + expect(myColor.toArray()).toStrictEqual([0, 0, 1]) }) it('should set renderer props via gl prop', async () => { - let gl: THREE.WebGLRenderer = null! - await act(async () => { - gl = root - .configure({ gl: { physicallyCorrectLights: true } }) - .render() - .getState().gl - }) + const store = await act(async () => root.configure({ gl: { physicallyCorrectLights: true } }).render()) + const { gl } = store.getState() expect(gl.physicallyCorrectLights).toBe(true) }) @@ -652,48 +513,33 @@ describe('renderer', () => { it('should set a renderer via gl callback', async () => { class Renderer extends THREE.WebGLRenderer {} - let gl: Renderer = null! - await act(async () => { - gl = root - .configure({ gl: (canvas) => new Renderer({ canvas }) }) - .render() - .getState().gl - }) + const store = await act(async () => root.configure({ gl: (canvas) => new Renderer({ canvas }) }).render()) + const { gl } = store.getState() expect(gl instanceof Renderer).toBe(true) }) it('should respect color management preferences via gl', async () => { - let gl: THREE.WebGLRenderer = null! - await act(async () => { - gl = root + const store = await act(async () => + root .configure({ gl: { outputEncoding: THREE.LinearEncoding, toneMapping: THREE.NoToneMapping } }) - .render() - .getState().gl - }) + .render(), + ) + const { gl } = store.getState() expect(gl.outputEncoding).toBe(THREE.LinearEncoding) expect(gl.toneMapping).toBe(THREE.NoToneMapping) - await act(async () => { - gl = root - .configure({ flat: true, linear: true }) - .render() - .getState().gl - }) + await act(async () => root.configure({ flat: true, linear: true }).render()) expect(gl.outputEncoding).toBe(THREE.LinearEncoding) expect(gl.toneMapping).toBe(THREE.NoToneMapping) }) it('should respect legacy prop', async () => { - await act(async () => { - root.configure({ legacy: true }).render() - }) + await act(async () => root.configure({ legacy: true }).render()) expect((THREE as any).ColorManagement.legacyMode).toBe(true) - await act(async () => { - root.configure({ legacy: false }).render() - }) + await act(async () => root.configure({ legacy: false }).render()) expect((THREE as any).ColorManagement.legacyMode).toBe(false) }) @@ -762,4 +608,22 @@ describe('renderer', () => { expect(groupHandle).toBeDefined() expect(prevUUID).not.toBe(groupHandle!.uuid) }) + + it('should gracefully handle text', async () => { + const warn = console.warn + console.warn = jest.fn() + + // Mount + await act(async () => root.render(<>one)) + // Update + await act(async () => root.render(<>two)) + // Unmount + await act(async () => root.render(<>)) + // Suspense + const Test = () => suspend(async () => <>four, []) + await act(async () => root.render()) + + expect(console.warn).toHaveBeenCalled() + console.warn = warn + }) }) diff --git a/packages/fiber/tests/setupTests.ts b/packages/fiber/tests/setupTests.ts deleted file mode 100644 index 48dd0d8686..0000000000 --- a/packages/fiber/tests/setupTests.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext' -import * as THREE from 'three' -import { extend } from '../src' - -// Polyfills WebGL canvas -function getContext(contextId: '2d', options?: CanvasRenderingContext2DSettings): CanvasRenderingContext2D | null -function getContext( - contextId: 'bitmaprenderer', - options?: ImageBitmapRenderingContextSettings, -): ImageBitmapRenderingContext | null -function getContext(contextId: 'webgl', options?: WebGLContextAttributes): WebGLRenderingContext | null -function getContext(contextId: 'webgl2', options?: WebGLContextAttributes): WebGL2RenderingContext | null -function getContext(contextId: string): RenderingContext | null { - if (contextId === 'webgl' || contextId === 'webgl2') { - return createWebGLContext(this) - } - return null -} - -HTMLCanvasElement.prototype.getContext = getContext - -// Extend catalogue for render API in tests -extend(THREE) diff --git a/packages/fiber/tests/core/utils.test.ts b/packages/fiber/tests/utils.test.ts similarity index 90% rename from packages/fiber/tests/core/utils.test.ts rename to packages/fiber/tests/utils.test.ts index 9600d68232..0e82a123cc 100644 --- a/packages/fiber/tests/core/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -1,4 +1,4 @@ -import { is } from '../../src/core/utils' +import { is } from '../src/core/utils' describe('is', () => { const myFunc = () => null @@ -8,7 +8,7 @@ describe('is', () => { const myUnd = undefined const myArr = [1, 2, 3] - it('should tell me if something IS a function', () => { + it('should tell me if something is a function', () => { expect(is.fun(myFunc)).toBe(true) expect(is.fun(myObj)).toBe(false) @@ -17,7 +17,7 @@ describe('is', () => { expect(is.fun(myUnd)).toBe(false) expect(is.fun(myArr)).toBe(false) }) - it('should tell me if something IS an object', () => { + it('should tell me if something is an object', () => { expect(is.obj(myFunc)).toBe(false) expect(is.obj(myObj)).toBe(true) @@ -27,7 +27,7 @@ describe('is', () => { expect(is.obj(myUnd)).toBe(false) expect(is.obj(myArr)).toBe(false) }) - it('should tell me if something IS a string', () => { + it('should tell me if something is a string', () => { expect(is.str(myFunc)).toBe(false) expect(is.str(myObj)).toBe(false) @@ -37,7 +37,7 @@ describe('is', () => { expect(is.str(myUnd)).toBe(false) expect(is.str(myArr)).toBe(false) }) - it('should tell me if something IS a number', () => { + it('should tell me if something is a number', () => { expect(is.num(myFunc)).toBe(false) expect(is.num(myObj)).toBe(false) expect(is.num(myStr)).toBe(false) @@ -47,7 +47,7 @@ describe('is', () => { expect(is.num(myUnd)).toBe(false) expect(is.num(myArr)).toBe(false) }) - it('should tell me if something IS undefined', () => { + it('should tell me if something is undefined', () => { expect(is.und(myFunc)).toBe(false) expect(is.und(myObj)).toBe(false) expect(is.und(myStr)).toBe(false) diff --git a/packages/shared/asyncUtils.ts b/packages/shared/asyncUtils.ts deleted file mode 100644 index dc3fc0d991..0000000000 --- a/packages/shared/asyncUtils.ts +++ /dev/null @@ -1,97 +0,0 @@ -// helpers - -import type { Reconciler } from 'react-reconciler' - -class TimeoutError extends Error { - constructor(util: Function, timeout: number) { - super(`Timed out in ${util.name} after ${timeout}ms.`) - } -} - -const resolveAfter = (ms: number): Promise => { - return new Promise((resolve) => setTimeout(resolve, ms)) -} - -const callAfter = async (callback: () => void, ms: number): Promise => { - await resolveAfter(ms) - callback() -} - -const DEFAULT_INTERVAL = 50 -const DEFAULT_TIMEOUT = 5000 - -// types - -type WaitOptions = { - interval?: number | false - timeout?: number | false -} - -type AsyncUtils = { - waitFor: (callback: () => boolean | void, options?: WaitOptions) => Promise -} - -// the utils - -export const asyncUtils = ( - act: Reconciler['act'], - addResolver: (callback: () => void) => void, -): AsyncUtils => { - const wait = async (callback: () => boolean | void, { interval, timeout }: WaitOptions) => { - const checkResult = () => { - const callbackResult = callback() - return callbackResult ?? callbackResult === undefined - } - - const waitForResult = async () => { - while (true) { - await Promise.race( - [new Promise((resolve) => addResolver(resolve)), interval && resolveAfter(interval)].filter(Boolean), - ) - - if (checkResult()) { - return - } - } - } - - let timedOut = false - - if (!checkResult()) { - if (timeout) { - const timeoutPromise = () => - callAfter(() => { - timedOut = true - }, timeout) - - await act(() => Promise.race([waitForResult(), timeoutPromise()])) - } else { - await act(waitForResult) - } - } - - return !timedOut - } - - const waitFor = async ( - callback: () => boolean | void, - { interval = DEFAULT_INTERVAL, timeout = DEFAULT_TIMEOUT }: WaitOptions = {}, - ) => { - const safeCallback = () => { - try { - return callback() - } catch (error: unknown) { - return false - } - } - - const result = await wait(safeCallback, { interval, timeout }) - if (!result && timeout) { - throw new TimeoutError(waitFor, timeout) - } - } - - return { - waitFor, - } -} diff --git a/packages/shared/pointerEventPolyfill.ts b/packages/shared/pointerEventPolyfill.ts deleted file mode 100644 index 2eb497e381..0000000000 --- a/packages/shared/pointerEventPolyfill.ts +++ /dev/null @@ -1,32 +0,0 @@ -// PointerEvent is not in JSDOM -// https://github.com/jsdom/jsdom/pull/2666#issuecomment-691216178 -export const pointerEventPolyfill = () => { - if (!global.PointerEvent) { - class PointerEvent extends MouseEvent { - public height?: number - public isPrimary?: boolean - public pointerId?: number - public pointerType?: string - public pressure?: number - public tangentialPressure?: number - public tiltX?: number - public tiltY?: number - public twist?: number - public width?: number - - constructor(type: string, params: PointerEventInit = {}) { - super(type, params) - this.pointerId = params.pointerId - this.width = params.width - this.height = params.height - this.pressure = params.pressure - this.tangentialPressure = params.tangentialPressure - this.tiltX = params.tiltX - this.tiltY = params.tiltY - this.pointerType = params.pointerType - this.isPrimary = params.isPrimary - } - } - global.PointerEvent = PointerEvent as any - } -} diff --git a/packages/shared/setupTests.ts b/packages/shared/setupTests.ts index 7b0e01e629..6c1d564107 100644 --- a/packages/shared/setupTests.ts +++ b/packages/shared/setupTests.ts @@ -1,5 +1,7 @@ +import * as THREE from 'three' +import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext' +import { extend } from '@react-three/fiber' import 'regenerator-runtime/runtime' -import { pointerEventPolyfill } from './pointerEventPolyfill' declare global { var IS_REACT_ACT_ENVIRONMENT: boolean @@ -8,14 +10,51 @@ declare global { // Let React know that we'll be testing effectful components global.IS_REACT_ACT_ENVIRONMENT = true -pointerEventPolyfill() - // Mock scheduler to test React features jest.mock('scheduler', () => require('scheduler/unstable_mock')) -// Silence react-dom & react-dom/client mismatch in RTL -const logError = global.console.error -global.console.error = (...args: any[]) => { - if (args.join('').startsWith('Warning')) return - return logError(...args) +// PointerEvent is not in JSDOM +// https://github.com/jsdom/jsdom/pull/2666#issuecomment-691216178 +// https://w3c.github.io/pointerevents/#pointerevent-interface +if (!global.PointerEvent) { + global.PointerEvent = class extends MouseEvent implements PointerEvent { + readonly pointerId: number = 0 + readonly width: number = 1 + readonly height: number = 1 + readonly pressure: number = 0 + readonly tangentialPressure: number = 0 + readonly tiltX: number = 0 + readonly tiltY: number = 0 + readonly twist: number = 0 + readonly pointerType: string = '' + readonly isPrimary: boolean = false + + constructor(type: string, params: PointerEventInit = {}) { + super(type, params) + Object.assign(this, params) + } + + getCoalescedEvents = () => [] + getPredictedEvents = () => [] + } } + +// Polyfills WebGL canvas +function getContext(contextId: '2d', options?: CanvasRenderingContext2DSettings): CanvasRenderingContext2D | null +function getContext( + contextId: 'bitmaprenderer', + options?: ImageBitmapRenderingContextSettings, +): ImageBitmapRenderingContext | null +function getContext(contextId: 'webgl', options?: WebGLContextAttributes): WebGLRenderingContext | null +function getContext(contextId: 'webgl2', options?: WebGLContextAttributes): WebGL2RenderingContext | null +function getContext(contextId: string): RenderingContext | null { + if (contextId === 'webgl' || contextId === 'webgl2') { + return createWebGLContext(this) + } + return null +} + +HTMLCanvasElement.prototype.getContext = getContext + +// Extend catalogue for render API in tests +extend(THREE) diff --git a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx index ca717196fa..ece3e7bb9f 100644 --- a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx @@ -1,19 +1,9 @@ import * as React from 'react' import * as Stdlib from 'three-stdlib' import * as THREE from 'three' - import { useFrame, useLoader, useThree } from '@react-three/fiber' - -import { asyncUtils } from '../../../shared/asyncUtils' - import ReactThreeTestRenderer from '../index' -const resolvers: (() => void)[] = [] - -const { waitFor } = asyncUtils(ReactThreeTestRenderer.act, (resolver: () => void) => { - resolvers.push(resolver) -}) - describe('ReactThreeTestRenderer Hooks', () => { it('can handle useThree hook', async () => { let result = {} as { @@ -61,14 +51,7 @@ describe('ReactThreeTestRenderer Hooks', () => { return } - const renderer = await ReactThreeTestRenderer.create( - - - , - ) - - await waitFor(() => expect(renderer.scene.children[0]).toBeDefined()) - + const renderer = await ReactThreeTestRenderer.create() expect(renderer.scene.children[0].instance).toBe(MockMesh) }) From 8e7a835f2b51f6e25e95dfb866c3e5853b564d5d Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Fri, 9 Sep 2022 07:21:51 -0500 Subject: [PATCH 054/252] fix(RTTR): re-export Act type from R3F --- packages/test-renderer/src/types/public.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/test-renderer/src/types/public.ts b/packages/test-renderer/src/types/public.ts index a759c74e5a..62c9840a06 100644 --- a/packages/test-renderer/src/types/public.ts +++ b/packages/test-renderer/src/types/public.ts @@ -45,3 +45,5 @@ export interface TreeNode { } export type Tree = TreeNode[] + +export type { Act } from '@react-three/fiber' From cb6e26449c29dd8e16a4a9814ec4649c4f95cbef Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Fri, 9 Sep 2022 07:29:28 -0500 Subject: [PATCH 055/252] chore: fix conflict --- packages/fiber/tests/hooks.test.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index 1c8a9812b7..3e26acbbb1 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -1,7 +1,18 @@ import * as React from 'react' import * as THREE from 'three' import * as Stdlib from 'three-stdlib' -import { createRoot, advance, useLoader, act, useThree, useGraph, useFrame, ObjectMap, Instance } from '../src' +import { + createRoot, + advance, + useLoader, + act, + useThree, + useGraph, + useFrame, + ObjectMap, + useInstanceHandle, + LocalState, +} from '../src' const root = createRoot(document.createElement('canvas')) @@ -193,8 +204,8 @@ describe('hooks', () => { instance = useInstanceHandle(ref) return } - await act(async () => createRoot(canvas).render()) + await act(async () => root.render()) - expect(instance.current).toBe((ref.current as unknown as Instance).__r3f) + expect(instance.current).toBe((ref.current as unknown as any).__r3f) }) }) From db2c1b4d747ff9dc953c8a96e1e13afdbf1c3df8 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Fri, 9 Sep 2022 07:30:25 -0500 Subject: [PATCH 056/252] chore(tests): cleanup --- packages/fiber/tests/hooks.test.tsx | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index 3e26acbbb1..c6f4e23d14 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -1,18 +1,8 @@ import * as React from 'react' import * as THREE from 'three' import * as Stdlib from 'three-stdlib' -import { - createRoot, - advance, - useLoader, - act, - useThree, - useGraph, - useFrame, - ObjectMap, - useInstanceHandle, - LocalState, -} from '../src' +import { createRoot, advance, useLoader, act, useThree, useGraph, useFrame, ObjectMap, useInstanceHandle } from '../src' +import { Instance, LocalState } from '../src/core/renderer' const root = createRoot(document.createElement('canvas')) @@ -206,6 +196,6 @@ describe('hooks', () => { } await act(async () => root.render()) - expect(instance.current).toBe((ref.current as unknown as any).__r3f) + expect(instance.current).toBe((ref.current as unknown as Instance).__r3f) }) }) From a4415bbd0fd387e1f63964c92b5021032e1d1d3c Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Fri, 9 Sep 2022 07:30:51 -0500 Subject: [PATCH 057/252] chore: lint --- packages/fiber/src/core/loop.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index c6fa1ae7af..f919ed36eb 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -128,12 +128,7 @@ export function createLoop(roots: Map) { } } - function advance( - timestamp: number, - runGlobalEffects: boolean = true, - state?: RootState, - frame?: XRFrame, - ): void { + function advance(timestamp: number, runGlobalEffects: boolean = true, state?: RootState, frame?: XRFrame): void { if (runGlobalEffects) flushGlobalEffects('before', timestamp) if (!state) roots.forEach((root) => update(timestamp, root.store.getState())) else update(timestamp, state, frame) From 5b1bb20e2f1ab94841746b0ac72bcfc89ab93a60 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 14 Sep 2022 19:45:22 -0500 Subject: [PATCH 058/252] [v9] fix: don't updateStyle on offscreen canvas (#2495) --- packages/fiber/src/core/store.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 35eaf24b5c..79df281c64 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -366,7 +366,9 @@ const createStore = ( // Update camera & renderer updateCamera(camera, size) gl.setPixelRatio(viewport.dpr) - gl.setSize(size.width, size.height) + // Play nice with offscreen canvas contexts + const updateStyle = gl.domElement instanceof HTMLCanvasElement + gl.setSize(size.width, size.height, updateStyle) } // Update viewport once the camera changes From 1e7e0a1fa2b4f49598c3ea766da6a0d2a4cd6e4c Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 18 Sep 2022 06:44:41 -0500 Subject: [PATCH 059/252] [v9] refactor!: instance descriptors, dynamically map ThreeElements (#2465) --- docs/tutorials/typescript.mdx | 47 +- example/src/demos/Lines.tsx | 2 +- example/src/demos/Pointcloud.tsx | 2 +- example/typings/global.d.ts | 7 +- packages/fiber/src/core/events.ts | 17 +- packages/fiber/src/core/hooks.tsx | 13 +- packages/fiber/src/core/index.tsx | 24 +- packages/fiber/src/core/renderer.ts | 704 ++++++++------- packages/fiber/src/core/store.ts | 19 +- packages/fiber/src/core/utils.ts | 387 ++++---- packages/fiber/src/index.tsx | 12 +- packages/fiber/src/native.tsx | 12 +- packages/fiber/src/native/Canvas.tsx | 2 +- packages/fiber/src/three-types.ts | 424 +-------- packages/fiber/src/web/Canvas.tsx | 2 +- .../tests/__snapshots__/utils.test.ts.snap | 85 ++ packages/fiber/tests/hooks.test.tsx | 18 +- packages/fiber/tests/index.test.tsx | 220 +++++ packages/fiber/tests/renderer.test.tsx | 827 +++++++----------- packages/fiber/tests/utils.test.ts | 340 ++++++- packages/shared/setupTests.ts | 7 +- .../src/__tests__/RTTR.core.test.tsx | 72 +- .../src/__tests__/RTTR.events.test.tsx | 7 +- .../__snapshots__/RTTR.core.test.tsx.snap | 181 +++- .../test-renderer/src/__tests__/is.test.ts | 82 -- .../test-renderer/src/createTestInstance.ts | 63 +- packages/test-renderer/src/fireEvent.ts | 12 +- packages/test-renderer/src/helpers/graph.ts | 6 +- packages/test-renderer/src/helpers/is.ts | 21 - .../test-renderer/src/helpers/testInstance.ts | 2 +- packages/test-renderer/src/helpers/tree.ts | 21 +- packages/test-renderer/src/index.tsx | 82 +- packages/test-renderer/src/types/internal.ts | 23 - 33 files changed, 1867 insertions(+), 1876 deletions(-) create mode 100644 packages/fiber/tests/__snapshots__/utils.test.ts.snap create mode 100644 packages/fiber/tests/index.test.tsx delete mode 100644 packages/test-renderer/src/__tests__/is.test.ts delete mode 100644 packages/test-renderer/src/helpers/is.ts diff --git a/docs/tutorials/typescript.mdx b/docs/tutorials/typescript.mdx index 4c57ca7bb2..a1646e8cea 100644 --- a/docs/tutorials/typescript.mdx +++ b/docs/tutorials/typescript.mdx @@ -34,35 +34,6 @@ function Box(props) { The exclamation mark is a non-null assertion that will let TS know that `ref.current` is defined when we access it in effects. -## Typing shorthand props - -react-three-fiber accepts short-hand props like scalars, strings, and arrays so you can declaratively set properties without side effects. - -Here are the different variations of props: - -```tsx -import { Euler, Vector3, Color } from 'three' - -rotation: Euler || [x, y, z] -position: Vector3 || [x, y, z] || scalar -color: Color || 'hotpink' || 0xffffff -``` - -Each property has extended types which you can pull from to type these properties. - -```tsx -import { Euler, Vector3, Color } from '@react-three/fiber' -// or -// import { ReactThreeFiber } from '@react-three/fiber' -// ReactThreeFiber.Euler, ReactThreeFiber.Vector3, etc. - -rotation: Euler -position: Vector3 -color: Color -``` - -This is particularly useful if you are typing properties outside of components, such as a store or a hook. - ## Extend usage react-three-fiber can also accept third-party elements and extend them into its internal catalogue. @@ -89,26 +60,14 @@ You can then declaratively create custom elements with primitives, but TypeScrip ``` -### Node Helpers - -react-three-fiber exports helpers that you can use to define different types of nodes. These nodes will type an element that we'll attach to the global JSX namespace. - -```tsx -Node -Object3DNode -BufferGeometryNode -MaterialNode -LightNode -``` - ### Extending ThreeElements -Since our custom element is an object, we'll use `Object3DNode` to define it. +To define our element in JSX, we'll use the `ThreeElement` interface to extend `ThreeElements`. This interface describes three.js classes that are available in the R3F catalog and can be used as native elements. ```tsx import { useRef, useEffect } from 'react' import { GridHelper } from 'three' -import { extend, Object3DNode } from '@react-three/fiber' +import { extend, ThreeElement } from '@react-three/fiber' // Create our custom element class CustomElement extends GridHelper {} @@ -119,7 +78,7 @@ extend({ CustomElement }) // Add types to ThreeElements elements so primitives pick up on it declare module '@react-three/fiber' { interface ThreeElements { - customElement: Object3DNode + customElement: ThreeElement } } diff --git a/example/src/demos/Lines.tsx b/example/src/demos/Lines.tsx index 600d88f7d0..98c8e07582 100644 --- a/example/src/demos/Lines.tsx +++ b/example/src/demos/Lines.tsx @@ -1,5 +1,5 @@ import React, { useRef, useEffect, useState, useCallback, useContext, useMemo } from 'react' -import { extend, Canvas, useThree, ReactThreeFiber } from '@react-three/fiber' +import { extend, Canvas, useThree } from '@react-three/fiber' import { OrbitControls } from 'three-stdlib' extend({ OrbitControls }) diff --git a/example/src/demos/Pointcloud.tsx b/example/src/demos/Pointcloud.tsx index ef8927cb6a..57870cf450 100644 --- a/example/src/demos/Pointcloud.tsx +++ b/example/src/demos/Pointcloud.tsx @@ -1,5 +1,5 @@ import React, { useRef, useEffect, useState, useCallback, useContext, useMemo } from 'react' -import { extend, Canvas, useThree, ReactThreeFiber } from '@react-three/fiber' +import { extend, Canvas, useThree } from '@react-three/fiber' import * as THREE from 'three' import { OrbitControls } from 'three-stdlib' extend({ OrbitControls }) diff --git a/example/typings/global.d.ts b/example/typings/global.d.ts index 38d720c32c..ded4d63081 100644 --- a/example/typings/global.d.ts +++ b/example/typings/global.d.ts @@ -1,11 +1,10 @@ -import { ReactThreeFiber } from '@react-three/fiber' +import { ThreeElement } from '@react-three/fiber' import { OrbitControls } from 'three-stdlib' - import { DotMaterial } from '../src/demos/Pointcloud' declare module '@react-three/fiber' { interface ThreeElements { - orbitControls: ReactThreeFiber.Node - dotMaterial: ReactThreeFiber.MaterialNode + orbitControls: ThreeElement + dotMaterial: ThreeElement } } diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index ccbb35ae4b..74ed4fb74c 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -176,7 +176,8 @@ export function createEvents(store: UseBoundStore) { function filterPointerEvents(objects: THREE.Object3D[]) { return objects.filter((obj) => ['Move', 'Over', 'Enter', 'Out', 'Leave'].some( - (name) => (obj as unknown as Instance).__r3f?.handlers[('onPointer' + name) as keyof EventHandlers], + (name) => + (obj as Instance['object']).__r3f?.handlers[('onPointer' + name) as keyof EventHandlers], ), ) } @@ -242,7 +243,8 @@ export function createEvents(store: UseBoundStore) { let eventObject: THREE.Object3D | null = hit.object // Bubble event up while (eventObject) { - if ((eventObject as unknown as Instance).__r3f?.eventCount) intersections.push({ ...hit, eventObject }) + if ((eventObject as Instance['object']).__r3f?.eventCount) + intersections.push({ ...hit, eventObject }) eventObject = eventObject.parent } } @@ -374,10 +376,10 @@ export function createEvents(store: UseBoundStore) { ) ) { const eventObject = hoveredObj.eventObject - const instance = (eventObject as unknown as Instance).__r3f - const handlers = instance?.handlers + const instance = (eventObject as Instance['object']).__r3f internal.hovered.delete(makeId(hoveredObj)) if (instance?.eventCount) { + const handlers = instance.handlers // Clear out intersects, they are outdated by now const data = { ...hoveredObj, intersections } handlers.onPointerOut?.(data as ThreeEvent) @@ -439,10 +441,11 @@ export function createEvents(store: UseBoundStore) { handleIntersects(hits, event, delta, (data: ThreeEvent) => { const eventObject = data.eventObject - const instance = (eventObject as unknown as Instance).__r3f - const handlers = instance?.handlers + const instance = (eventObject as Instance['object']).__r3f + // Check presence of handlers if (!instance?.eventCount) return + const handlers = instance.handlers if (isPointerMove) { // Move event ... @@ -493,7 +496,7 @@ export function createEvents(store: UseBoundStore) { function pointerMissed(event: MouseEvent, objects: THREE.Object3D[]) { objects.forEach((object: THREE.Object3D) => - (object as unknown as Instance).__r3f?.handlers.onPointerMissed?.(event), + (object as Instance['object']).__r3f?.handlers.onPointerMissed?.(event), ) } diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 080ac7b9ff..beefc24757 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -7,7 +7,7 @@ import { context, RootState, RenderCallback, StageTypes } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' import { Stage, Stages, UpdateCallback } from './stages' import { LoadingManager } from 'three' -import { LocalState, Instance } from './renderer' +import { Instance } from './renderer' export interface Loader extends THREE.Loader { load( @@ -24,14 +24,17 @@ export type ConditionalType = Child extends Parent export type BranchingReturn = ConditionalType /** - * Exposes an object's {@link LocalState}. + * Exposes an object's {@link Instance}. * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#useInstanceHandle * * **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 { - const instance = React.useRef(null!) - useIsomorphicLayoutEffect(() => void (instance.current = (ref.current as unknown as Instance).__r3f), [ref]) +export function useInstanceHandle(ref: React.MutableRefObject): React.MutableRefObject { + const instance = React.useRef(null!) + useIsomorphicLayoutEffect( + () => void (instance.current = (ref.current as unknown as Instance['object']).__r3f!), + [ref], + ) return instance } diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 0181a35375..64fb8c0814 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { ConcurrentRoot } from 'react-reconciler/constants' import create, { StoreApi, UseBoundStore } from 'zustand' -import * as ReactThreeFiber from '../three-types' +import { ThreeElement } from '../three-types' import { Renderer, createStore, @@ -19,9 +19,9 @@ import { FrameloopLegacy, Frameloop, } from './store' -import { createRenderer, extend, Root } from './renderer' +import { reconciler, extend, Root } from './renderer' import { createLoop, addEffect, addAfterEffect, addTail } from './loop' -import { getEventPriority, EventManager, ComputeFunction } from './events' +import { EventManager, ComputeFunction } from './events' import { is, dispose, @@ -31,6 +31,7 @@ import { useIsomorphicLayoutEffect, Camera, updateCamera, + applyProps, } from './utils' import { useStore } from './hooks' import { Stage, Lifecycle, Stages } from './stages' @@ -38,7 +39,6 @@ import { OffscreenCanvas } from 'three' const roots = new Map() const { invalidate, advance } = createLoop(roots) -const { reconciler, applyProps } = createRenderer(roots, getEventPriority) const shallowLoose = { objects: 'shallow', strict: false } as EquConfig type Properties = Pick any ? never : K }[keyof T]> @@ -88,9 +88,9 @@ export type RenderProps = { camera?: ( | Camera | Partial< - ReactThreeFiber.Object3DNode & - ReactThreeFiber.Object3DNode & - ReactThreeFiber.Object3DNode + ThreeElement & + ThreeElement & + ThreeElement > ) & { /** Flags the camera as manual, putting projection into your own hands */ @@ -233,9 +233,9 @@ function createRoot(canvas: TCanvas): ReconcilerRoot(canvas: TCanvas): ReconcilerRoot(canvas: TCanvas): ReconcilerRoot(canvas: TElement, call state.gl?.renderLists?.dispose?.() state.gl?.forceContextLoss?.() if (state.gl?.xr) state.xr.disconnect() - dispose(state) + dispose(state.scene) roots.delete(canvas) if (callback) callback(canvas) } catch (e) { diff --git a/packages/fiber/src/core/renderer.ts b/packages/fiber/src/core/renderer.ts index e064d172f2..b5844453f2 100644 --- a/packages/fiber/src/core/renderer.ts +++ b/packages/fiber/src/core/renderer.ts @@ -2,421 +2,399 @@ import * as THREE from 'three' import { UseBoundStore } from 'zustand' import Reconciler from 'react-reconciler' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' -import { DefaultEventPriority } from 'react-reconciler/constants' -import { is, prepare, diffProps, DiffSet, applyProps, invalidateInstance, attach, detach } from './utils' +import { is, diffProps, applyProps, invalidateInstance, attach, detach, prepare } from './utils' import { RootState } from './store' -import { EventHandlers, removeInteractivity } from './events' +import { removeInteractivity, getEventPriority, EventHandlers } from './events' -export type Root = { fiber: Reconciler.FiberRoot; store: UseBoundStore } +export interface Root { + fiber: Reconciler.FiberRoot + store: UseBoundStore +} -export type LocalState = { - type: string +export type AttachFnType = (parent: any, self: O) => () => void +export type AttachType = string | AttachFnType + +export type ConstructorRepresentation = new (...args: any[]) => any + +export interface Catalogue { + [name: string]: ConstructorRepresentation +} + +export type Args = T extends ConstructorRepresentation ? ConstructorParameters : any[] + +export interface InstanceProps { + args?: Args + object?: T + visible?: boolean + dispose?: null + attach?: AttachType +} + +export interface Instance { root: UseBoundStore - // objects and parent are used when children are added with `attach` instead of being added to the Object3D scene graph - objects: Instance[] + type: string parent: Instance | null - primitive?: boolean + children: Instance[] + props: InstanceProps & Record + object: O & { __r3f?: Instance } eventCount: number handlers: Partial - attach?: AttachType - previousAttach: any - memoizedProps: { [key: string]: any } + attach?: AttachType + previousAttach?: any + isHidden: boolean } -export type AttachFnType = (parent: Instance, self: Instance) => () => void -export type AttachType = string | AttachFnType - interface HostConfig { type: string - props: InstanceProps + props: Instance['props'] container: UseBoundStore instance: Instance textInstance: void suspenseInstance: Instance - hydratableInstance: Instance - publicInstance: Instance + hydratableInstance: never + publicInstance: Instance['object'] hostContext: never - updatePayload: Array + updatePayload: null | [true] | [false, Instance['props']] childSet: never timeoutHandle: number | undefined noTimeout: -1 } -// This type clamps down on a couple of assumptions that we can make regarding native types, which -// could anything from scene objects, THREE.Objects, JSM, user-defined classes and non-scene objects. -// What they all need to have in common is defined here ... -export type BaseInstance = Omit & { - __r3f: LocalState - children: Instance[] - remove: (...object: Instance[]) => Instance - add: (...object: Instance[]) => Instance - raycast?: (raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) => void -} -export type Instance = BaseInstance & { [key: string]: any } +const catalogue: Catalogue = {} +const extend = (objects: Partial): void => void Object.assign(catalogue, objects) + +function createInstance( + type: string, + props: HostConfig['props'], + root: UseBoundStore, +): HostConfig['instance'] { + // Get target from catalogue + const name = `${type[0].toUpperCase()}${type.slice(1)}` + const target = catalogue[name] + + // Validate element target + if (type !== 'primitive' && !target) + throw new Error( + `R3F: ${name} is not part of the THREE namespace! Did you forget to extend? See: https://docs.pmnd.rs/react-three-fiber/api/objects#using-3rd-party-objects-declaratively`, + ) + + // Validate primitives + if (type === 'primitive' && !props.object) throw new Error(`R3F: Primitives without 'object' are invalid!`) + + // Throw if an object or literal was passed for args + if (props.args !== undefined && !Array.isArray(props.args)) throw new Error('R3F: The args prop must be an array!') + + // Create instance + const object = props.object ?? new target(...(props.args ?? [])) + const instance = prepare(object, root, type, props) + + // Auto-attach geometries and materials + if (instance.props.attach === undefined) { + if (instance.object instanceof THREE.BufferGeometry) instance.props.attach = 'geometry' + else if (instance.object instanceof THREE.Material) instance.props.attach = 'material' + } -export type InstanceProps = { - [key: string]: unknown -} & { - args?: any[] - object?: object - visible?: boolean - dispose?: null - attach?: AttachType + // Set initial props + applyProps(instance.object, props) + + return instance } -interface Catalogue { - [name: string]: { - new (...args: any): Instance +// https://github.com/facebook/react/issues/20271 +// This will make sure events and attach are only handled once when trees are complete +function handleContainerEffects(parent: Instance, child: Instance) { + // Bail if tree isn't mounted or parent is not a container. + // This ensures that the tree is finalized and React won't discard results to Suspense + const state = child.root.getState() + if (!parent.parent && parent.object !== state.scene) return + + // Handle interactivity + if (child.eventCount > 0 && child.object.raycast !== null && child.object instanceof THREE.Object3D) { + state.internal.interaction.push(child.object) } + + // Handle attach + if (child.props.attach) attach(parent, child) + for (const childInstance of child.children) handleContainerEffects(child, childInstance) } -let catalogue: Catalogue = {} -let extend = (objects: object): void => void (catalogue = { ...catalogue, ...objects }) +function appendChild(parent: HostConfig['instance'], child: HostConfig['instance'] | HostConfig['textInstance']) { + if (!child) return -function createRenderer(_roots: Map, _getEventPriority?: () => any) { - function createInstance( - type: string, - { args = [], attach, ...props }: InstanceProps, - root: UseBoundStore, - ) { - let name = `${type[0].toUpperCase()}${type.slice(1)}` - let instance: Instance - - if (type === 'primitive') { - if (props.object === undefined) throw new Error("R3F: Primitives without 'object' are invalid!") - const object = props.object as Instance - instance = prepare(object, { type, root, attach, primitive: true }) - } else { - const target = catalogue[name] - if (!target) { - throw new Error( - `R3F: ${name} is not part of the THREE namespace! Did you forget to extend? See: https://docs.pmnd.rs/react-three-fiber/api/objects#using-3rd-party-objects-declaratively`, - ) - } + // Link instances + child.parent = parent + parent.children.push(child) - // Throw if an object or literal was passed for args - if (!Array.isArray(args)) throw new Error('R3F: The args prop must be an array!') - - // Instanciate new object, link it to the root - // Append memoized props with args so it's not forgotten - instance = prepare(new target(...args), { - type, - root, - attach, - // Save args in case we need to reconstruct later for HMR - memoizedProps: { args }, - }) - } + // Add Object3Ds if able + if (!child.props.attach && parent.object instanceof THREE.Object3D && child.object instanceof THREE.Object3D) { + parent.object.add(child.object) + } - // Auto-attach geometries and materials - if (instance.__r3f.attach === undefined) { - if (instance instanceof THREE.BufferGeometry) instance.__r3f.attach = 'geometry' - else if (instance instanceof THREE.Material) instance.__r3f.attach = 'material' - } + // Attach tree once complete + handleContainerEffects(parent, child) - // It should NOT call onUpdate on object instanciation, because it hasn't been added to the - // view yet. If the callback relies on references for instance, they won't be ready yet, this is - // why it passes "true" here - // There is no reason to apply props to injects - if (name !== 'inject') applyProps(instance, props) - return instance - } + // Tree was updated, request a frame + invalidateInstance(child) +} - function appendChild(parentInstance: HostConfig['instance'], child: HostConfig['instance']) { - let added = false - if (child) { - // The attach attribute implies that the object attaches itself on the parent - if (child.__r3f?.attach) { - attach(parentInstance, child, child.__r3f.attach) - } else if (child.isObject3D && parentInstance.isObject3D) { - // add in the usual parent-child way - parentInstance.add(child) - added = true - } - // This is for anything that used attach, and for non-Object3Ds that don't get attached to props; - // that is, anything that's a child in React but not a child in the scenegraph. - if (!added) parentInstance.__r3f?.objects.push(child) - if (!child.__r3f) prepare(child, {}) - child.__r3f.parent = parentInstance - invalidateInstance(child) - } +function insertBefore( + parent: HostConfig['instance'], + child: HostConfig['instance'] | HostConfig['textInstance'], + beforeChild: HostConfig['instance'] | HostConfig['textInstance'], + replace: boolean = false, +) { + if (!child || !beforeChild) return + + // Link instances + child.parent = parent + const childIndex = parent.children.indexOf(beforeChild) + if (childIndex !== -1) parent.children.splice(childIndex, replace ? 1 : 0, child) + if (replace) beforeChild.parent = null + + // Manually splice Object3Ds + if ( + !child.props.attach && + parent.object instanceof THREE.Object3D && + child.object instanceof THREE.Object3D && + beforeChild.object instanceof THREE.Object3D + ) { + child.object.parent = parent.object + parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), 0, child.object) + child.object.dispatchEvent({ type: 'added' }) } - function insertBefore( - parentInstance: HostConfig['instance'], - child: HostConfig['instance'], - beforeChild: HostConfig['instance'], - ) { - let added = false - if (child) { - if (child.__r3f?.attach) { - attach(parentInstance, child, child.__r3f.attach) - } else if (child.isObject3D && parentInstance.isObject3D) { - child.parent = parentInstance as unknown as THREE.Object3D - child.dispatchEvent({ type: 'added' }) - const restSiblings = parentInstance.children.filter((sibling) => sibling !== child) - const index = restSiblings.indexOf(beforeChild) - parentInstance.children = [...restSiblings.slice(0, index), child, ...restSiblings.slice(index)] - added = true - } + // Attach tree once complete + handleContainerEffects(parent, child) - if (!added) parentInstance.__r3f?.objects.push(child) - if (!child.__r3f) prepare(child, {}) - child.__r3f.parent = parentInstance - invalidateInstance(child) - } - } + // Tree was updated, request a frame + invalidateInstance(child) +} - function removeRecursive(array: HostConfig['instance'][], parent: HostConfig['instance'], dispose: boolean = false) { - if (array) [...array].forEach((child) => removeChild(parent, child, dispose)) +function removeChild( + parent: HostConfig['instance'], + child: HostConfig['instance'] | HostConfig['textInstance'], + dispose?: boolean, + recursive?: boolean, +) { + if (!child) return + + // Unlink instances + child.parent = null + if (recursive === undefined) { + const childIndex = parent.children.indexOf(child) + if (childIndex !== -1) parent.children.splice(childIndex, 1) } - function removeChild(parentInstance: HostConfig['instance'], child: HostConfig['instance'], dispose?: boolean) { - if (child) { - // Clear the parent reference - if (child.__r3f) child.__r3f.parent = null - // Remove child from the parents objects - if (parentInstance.__r3f?.objects) - parentInstance.__r3f.objects = parentInstance.__r3f.objects.filter((x) => x !== child) - // Remove attachment - if (child.__r3f?.attach) { - detach(parentInstance, child, child.__r3f.attach) - } else if (child.isObject3D && parentInstance.isObject3D) { - parentInstance.remove(child) - // Remove interactivity - if (child.__r3f?.root) { - removeInteractivity(child.__r3f.root, child as unknown as THREE.Object3D) - } - } - - // Allow objects to bail out of recursive dispose altogether by passing dispose={null} - // Never dispose of primitives because their state may be kept outside of React! - // In order for an object to be able to dispose it has to have - // - a dispose method, - // - it cannot be a - // - it cannot be a THREE.Scene, because three has broken it's own api - // - // Since disposal is recursive, we can check the optional dispose arg, which will be undefined - // when the reconciler calls it, but then carry our own check recursively - const isPrimitive = child.__r3f?.primitive - const shouldDispose = dispose === undefined ? child.dispose !== null && !isPrimitive : dispose - - // Remove nested child objects. Primitives should not have objects and children that are - // attached to them declaratively ... - if (!isPrimitive) { - removeRecursive(child.__r3f?.objects, child, shouldDispose) - removeRecursive(child.children, child, shouldDispose) - } + // Eagerly tear down tree + if (child.props.attach) { + detach(parent, child) + } else if (child.object instanceof THREE.Object3D && parent.object instanceof THREE.Object3D) { + parent.object.remove(child.object) + removeInteractivity(child.root, child.object) + } - // Remove references - if (child.__r3f) { - delete ((child as Partial).__r3f as Partial).root - delete ((child as Partial).__r3f as Partial).objects - delete ((child as Partial).__r3f as Partial).handlers - delete ((child as Partial).__r3f as Partial).memoizedProps - if (!isPrimitive) delete (child as Partial).__r3f - } + // Allow objects to bail out of unmount disposal with dispose={null} + const shouldDispose = child.props.dispose !== null && dispose !== false - // Dispose item whenever the reconciler feels like it - if (shouldDispose && child.dispose && child.type !== 'Scene') { - scheduleCallback(idlePriority, () => { - try { - child.dispose() - } catch (e) { - /* ... */ - } - }) - } + // Recursively remove instance children + if (recursive !== false) { + for (const node of child.children) removeChild(child, node, shouldDispose, true) + child.children = [] + } - invalidateInstance(parentInstance) + // Unlink instance object + delete child.object.__r3f + + // Dispose object whenever the reconciler feels like it. + // Never dispose of primitives because their state may be kept outside of React! + // In order for an object to be able to dispose it + // - has a dispose method + // - cannot be a + // - cannot be a THREE.Scene, because three has broken its own API + if (shouldDispose && child.type !== 'primitive' && child.object.type !== 'Scene') { + const dispose = child.object.dispose + if (typeof dispose === 'function') { + scheduleCallback(idlePriority, () => { + try { + dispose() + } catch (e) { + /* ... */ + } + }) } } - function switchInstance( - instance: HostConfig['instance'], - type: HostConfig['type'], - newProps: HostConfig['props'], - fiber: Reconciler.Fiber, - ) { - const parent = instance.__r3f?.parent - if (!parent) return + // Tree was updated, request a frame for top-level instance + if (dispose === undefined) invalidateInstance(child) +} + +function switchInstance( + oldInstance: HostConfig['instance'], + type: HostConfig['type'], + props: HostConfig['props'], + fiber: Reconciler.Fiber, +) { + // Create a new instance + const newInstance = createInstance(type, props, oldInstance.root) + + // Move children to new instance + for (const child of oldInstance.children) { + removeChild(oldInstance, child, false, false) + appendChild(newInstance, child) + } + oldInstance.children = [] - const newInstance = createInstance(type, newProps, instance.__r3f.root) + // Link up new instance + const parent = oldInstance.parent + if (parent) { + insertBefore(parent, newInstance, oldInstance, true) + } - // https://github.com/pmndrs/react-three-fiber/issues/1348 - // When args change the instance has to be re-constructed, which then - // forces r3f to re-parent the children and non-scene objects - if (instance.children) { - for (const child of instance.children) { - if (child.__r3f) appendChild(newInstance, child) + // This evil hack switches the react-internal fiber node + // https://github.com/facebook/react/issues/14983 + // https://github.com/facebook/react/pull/15021 + ;[fiber, fiber.alternate].forEach((fiber) => { + if (fiber !== null) { + fiber.stateNode = newInstance + if (fiber.ref) { + if (typeof fiber.ref === 'function') fiber.ref(newInstance.object) + else fiber.ref.current = newInstance.object } - instance.children = instance.children.filter((child) => !child.__r3f) } + }) - instance.__r3f.objects.forEach((child) => appendChild(newInstance, child)) - instance.__r3f.objects = [] + // Tree was updated, request a frame + invalidateInstance(newInstance) - removeChild(parent, instance) - appendChild(parent, newInstance) + return newInstance +} - // Re-bind event handlers - if (newInstance.raycast && newInstance.__r3f.eventCount) { - const rootState = newInstance.__r3f.root.getState() - rootState.internal.interaction.push(newInstance as unknown as THREE.Object3D) +// Don't handle text instances, warn on undefined behavior +const handleTextInstance = () => + console.warn('R3F: Text is not allowed in JSX! This could be stray whitespace or characters.') + +const reconciler = Reconciler< + HostConfig['type'], + HostConfig['props'], + HostConfig['container'], + HostConfig['instance'], + HostConfig['textInstance'], + HostConfig['suspenseInstance'], + HostConfig['hydratableInstance'], + HostConfig['publicInstance'], + HostConfig['hostContext'], + HostConfig['updatePayload'], + HostConfig['childSet'], + HostConfig['timeoutHandle'], + HostConfig['noTimeout'] +>({ + supportsMutation: true, + isPrimaryRenderer: false, + supportsPersistence: false, + supportsHydration: false, + noTimeout: -1, + createInstance, + removeChild, + appendChild, + appendInitialChild: appendChild, + insertBefore, + appendChildToContainer(container, child) { + const scene = (container.getState().scene as unknown as Instance['object']).__r3f + if (!child || !scene) return + + appendChild(scene, child) + }, + removeChildFromContainer(container, child) { + const scene = (container.getState().scene as unknown as Instance['object']).__r3f + if (!child || !scene) return + + removeChild(scene, child) + }, + insertInContainerBefore(container, child, beforeChild) { + const scene = (container.getState().scene as unknown as Instance['object']).__r3f + if (!child || !beforeChild || !scene) return + + insertBefore(scene, child, beforeChild) + }, + getRootHostContext: () => null, + getChildHostContext: (parentHostContext) => parentHostContext, + prepareUpdate(instance, _type, oldProps, newProps) { + // Reconstruct primitives if object prop changes + if (instance.type === 'primitive' && oldProps.object !== newProps.object) return [true] + + // Throw if an object or literal was passed for args + if (newProps.args !== undefined && !Array.isArray(newProps.args)) + throw new Error('R3F: The args prop must be an array!') + + // Reconstruct instance if args change + if (newProps.args?.length !== oldProps.args?.length) return [true] + if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) return [true] + + // Create a diff-set, flag if there are any changes + const changedProps = diffProps(instance, newProps, true) + if (Object.keys(changedProps).length) return [false, changedProps] + + // Otherwise do not touch the instance + return null + }, + commitUpdate(instance, diff, type, _oldProps, newProps, fiber) { + const [reconstruct, changedProps] = diff! + + // Reconstruct when args or false, + commitMount() {}, + getPublicInstance: (instance) => instance?.object!, + prepareForCommit: () => null, + preparePortalMount: (container) => prepare(container.getState().scene, container, '', {}), + resetAfterCommit: () => {}, + shouldSetTextContent: () => false, + clearContainer: () => false, + hideInstance(instance) { + if (instance.props.attach && instance.parent?.object) { + detach(instance.parent, instance) + } else if (instance.object instanceof THREE.Object3D) { + instance.object.visible = false } - // This evil hack switches the react-internal fiber node - // https://github.com/facebook/react/issues/14983 - // https://github.com/facebook/react/pull/15021 - ;[fiber, fiber.alternate].forEach((fiber) => { - if (fiber !== null) { - fiber.stateNode = newInstance - if (fiber.ref) { - if (typeof fiber.ref === 'function') (fiber as unknown as any).ref(newInstance) - else (fiber.ref as Reconciler.RefObject).current = newInstance - } + instance.isHidden = true + invalidateInstance(instance) + }, + unhideInstance(instance) { + if (instance.isHidden) { + if (instance.props.attach && instance.parent?.object) { + attach(instance.parent, instance) + } else if (instance.object instanceof THREE.Object3D && instance.props.visible !== false) { + instance.object.visible = true } - }) - } - - // Don't handle text instances, warn on undefined behavior - const handleTextInstance = () => - console.warn('Text is not allowed in the R3F tree! This could be stray whitespace or characters.') - - const reconciler = Reconciler< - HostConfig['type'], - HostConfig['props'], - HostConfig['container'], - HostConfig['instance'], - HostConfig['textInstance'], - HostConfig['suspenseInstance'], - HostConfig['hydratableInstance'], - HostConfig['publicInstance'], - HostConfig['hostContext'], - HostConfig['updatePayload'], - HostConfig['childSet'], - HostConfig['timeoutHandle'], - HostConfig['noTimeout'] - >({ - createInstance, - removeChild, - appendChild, - appendInitialChild: appendChild, - insertBefore, - supportsMutation: true, - isPrimaryRenderer: false, - supportsPersistence: false, - supportsHydration: false, - noTimeout: -1, - appendChildToContainer: (container, child) => { - if (!child) return - - // Don't append to unmounted container - const scene = container.getState().scene as unknown as Instance - if (!scene.__r3f) return - - // Link current root to the default scene - scene.__r3f.root = container - appendChild(scene, child) - }, - removeChildFromContainer: (container, child) => { - if (!child) return - removeChild(container.getState().scene as unknown as Instance, child) - }, - insertInContainerBefore: (container, child, beforeChild) => { - if (!child || !beforeChild) return - - // Don't append to unmounted container - const scene = container.getState().scene as unknown as Instance - if (!scene.__r3f) return - - insertBefore(scene, child, beforeChild) - }, - getRootHostContext: () => null, - getChildHostContext: (parentHostContext) => parentHostContext, - finalizeInitialChildren(instance) { - const localState = instance?.__r3f ?? {} - // https://github.com/facebook/react/issues/20271 - // Returning true will trigger commitMount - return Boolean(localState.handlers) - }, - prepareUpdate(instance, _type, oldProps, newProps) { - // Create diff-sets - if (instance.__r3f.primitive && newProps.object && newProps.object !== instance) { - return [true] - } else { - // This is a data object, let's extract critical information about it - const { args: argsNew = [], children: cN, ...restNew } = newProps - const { args: argsOld = [], children: cO, ...restOld } = oldProps - - // Throw if an object or literal was passed for args - if (!Array.isArray(argsNew)) throw new Error('R3F: the args prop must be an array!') - - // If it has new props or arguments, then it needs to be re-instantiated - if (argsNew.some((value, index) => value !== argsOld[index])) return [true] - // Create a diff-set, flag if there are any changes - const diff = diffProps(instance, restNew, restOld, true) - if (diff.changes.length) return [false, diff] - - // Otherwise do not touch the instance - return null - } - }, - commitUpdate(instance, [reconstruct, diff]: [boolean, DiffSet], type, _oldProps, newProps, fiber) { - // Reconstruct when args or instance!, - prepareForCommit: () => null, - preparePortalMount: (container) => prepare(container.getState().scene), - resetAfterCommit: () => {}, - shouldSetTextContent: () => false, - clearContainer: () => false, - hideInstance(instance) { - // Detach while the instance is hidden - const { attach: type, parent } = instance.__r3f ?? {} - if (type && parent) detach(parent, instance, type) - if (instance.isObject3D) instance.visible = false - invalidateInstance(instance) - }, - unhideInstance(instance, props) { - // Re-attach when the instance is unhidden - const { attach: type, parent } = instance.__r3f ?? {} - if (type && parent) attach(parent, instance, type) - if ((instance.isObject3D && props.visible == null) || props.visible) instance.visible = true - invalidateInstance(instance) - }, - createTextInstance: handleTextInstance, - hideTextInstance: handleTextInstance, - unhideTextInstance: handleTextInstance, - // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r916356874 - // @ts-ignore - getCurrentEventPriority: () => (_getEventPriority ? _getEventPriority() : DefaultEventPriority), - beforeActiveInstanceBlur: () => {}, - afterActiveInstanceBlur: () => {}, - detachDeletedInstance: () => {}, - now: - typeof performance !== 'undefined' && is.fun(performance.now) - ? performance.now - : is.fun(Date.now) - ? Date.now - : () => 0, - // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r920883503 - scheduleTimeout: (is.fun(setTimeout) ? setTimeout : undefined) as any, - cancelTimeout: (is.fun(clearTimeout) ? clearTimeout : undefined) as any, - }) - - return { reconciler, applyProps } -} + } -export { prepare, createRenderer, extend } + instance.isHidden = false + invalidateInstance(instance) + }, + createTextInstance: handleTextInstance, + hideTextInstance: handleTextInstance, + unhideTextInstance: handleTextInstance, + // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r916356874 + // @ts-ignore + getCurrentEventPriority: () => getEventPriority(), + beforeActiveInstanceBlur: () => {}, + afterActiveInstanceBlur: () => {}, + detachDeletedInstance: () => {}, + now: + typeof performance !== 'undefined' && is.fun(performance.now) + ? performance.now + : is.fun(Date.now) + ? Date.now + : () => 0, + // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r920883503 + scheduleTimeout: (is.fun(setTimeout) ? setTimeout : undefined) as any, + cancelTimeout: (is.fun(clearTimeout) ? clearTimeout : undefined) as any, +}) + +export { extend, reconciler } diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 79df281c64..042313cb38 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -1,9 +1,8 @@ import * as THREE from 'three' import * as React from 'react' import create, { GetState, SetState, StoreApi, UseBoundStore } from 'zustand' -import { prepare } from './renderer' import { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' -import { calculateDpr, Camera, isOrthographicCamera, updateCamera } from './utils' +import { calculateDpr, Camera, isOrthographicCamera, prepare, updateCamera } from './utils' import { FixedStage, Stage } from './stages' // Keys that shouldn't be copied between R3F stores @@ -168,7 +167,7 @@ const createStore = ( invalidate: (state?: RootState, frames?: number) => void, advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: XRFrame) => void, ): UseBoundStore => { - const rootState = create((set, get) => { + const rootStore = create((set, get) => { const position = new THREE.Vector3() const defaultTarget = new THREE.Vector3() const tempTarget = new THREE.Vector3() @@ -215,7 +214,7 @@ const createStore = ( legacy: false, linear: false, flat: false, - scene: prepare(new THREE.Scene()), + scene: new THREE.Scene(), controls: null, clock: new THREE.Clock(), @@ -351,13 +350,15 @@ const createStore = ( return rootState }) - const state = rootState.getState() + const state = rootStore.getState() + + prepare(state.scene, rootStore, '', {}) let oldSize = state.size let oldDpr = state.viewport.dpr let oldCamera = state.camera - rootState.subscribe(() => { - const { camera, size, viewport, gl, set } = rootState.getState() + rootStore.subscribe(() => { + const { camera, size, viewport, gl, set } = rootStore.getState() // Resize camera and renderer on changes to size and pixelratio if (size !== oldSize || viewport.dpr !== oldDpr) { @@ -380,10 +381,10 @@ const createStore = ( }) // Invalidate on any change - rootState.subscribe((state) => invalidate(state)) + rootStore.subscribe((state) => invalidate(state)) // Return root state - return rootState + return rootStore } export { createStore, context } diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index 90d7ec0ef0..71d8e38b71 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -1,9 +1,10 @@ import * as THREE from 'three' import * as React from 'react' -import { UseBoundStore } from 'zustand' -import { EventHandlers } from './events' -import { AttachType, Instance, InstanceProps, LocalState } from './renderer' -import { Dpr, RootState, Size } from './store' +import type { Fiber } from 'react-reconciler' +import type { UseBoundStore } from 'zustand' +import type { EventHandlers } from './events' +import type { Dpr, RootState, Size } from './store' +import type { ConstructorRepresentation, Instance } from './renderer' export type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera export const isOrthographicCamera = (def: Camera): def is THREE.OrthographicCamera => @@ -24,7 +25,7 @@ export const useIsomorphicLayoutEffect = ? React.useLayoutEffect : React.useEffect -export function useMutableCallback(fn: T) { +export function useMutableCallback(fn: T): React.MutableRefObject { const ref = React.useRef(fn) useIsomorphicLayoutEffect(() => void (ref.current = fn), [fn]) return ref @@ -55,22 +56,12 @@ export class ErrorBoundary extends React.Component< } } -export const DEFAULT = '__default' - -export type DiffSet = { - memoized: { [key: string]: any } - changes: [key: string, value: unknown, isEvent: boolean, keys: string[]][] -} - -export const isDiffSet = (def: any): def is DiffSet => def && !!(def as DiffSet).memoized && !!(def as DiffSet).changes -export type ClassConstructor = { new (): void } - -export type ObjectMap = { +export interface ObjectMap { nodes: { [name: string]: THREE.Object3D } materials: { [name: string]: THREE.Material } } -export function calculateDpr(dpr: Dpr) { +export function calculateDpr(dpr: Dpr): number { const target = typeof window !== 'undefined' ? window.devicePixelRatio : 1 return Array.isArray(dpr) ? Math.min(Math.max(dpr[0], target), dpr[1]) : dpr } @@ -78,10 +69,10 @@ export function calculateDpr(dpr: Dpr) { /** * Returns instance root state */ -export const getRootState = (obj: THREE.Object3D): RootState | undefined => - (obj as unknown as Instance).__r3f?.root.getState() +export const getRootState = (obj: T): RootState | undefined => + (obj as Instance['object']).__r3f?.root.getState() -export type EquConfig = { +export interface EquConfig { /** Compare arrays by reference equality a === b (default), or by shallow equality */ arrays?: 'reference' | 'shallow' /** Compare objects by reference equality a === b (default), or by shallow equality */ @@ -124,7 +115,7 @@ export const is = { } // Collects nodes and materials from a THREE.Object3D -export function buildGraph(object: THREE.Object3D) { +export function buildGraph(object: THREE.Object3D): ObjectMap { const data: ObjectMap = { nodes: {}, materials: {} } if (object) { object.traverse((obj: any) => { @@ -135,225 +126,251 @@ export function buildGraph(object: THREE.Object3D) { return data } +export interface Disposable { + type?: string + dispose?: () => void +} + // Disposes an object and all its properties -export function dispose void; type?: string; [key: string]: any }>(obj: TObj) { - if (obj.dispose && obj.type !== 'Scene') obj.dispose() +export function dispose(obj: T): void { + if (obj.type !== 'Scene') obj.dispose?.() for (const p in obj) { - ;(p as any).dispose?.() - delete obj[p] + const prop = obj[p] as Disposable | undefined + if (prop?.type !== 'Scene') prop?.dispose?.() + } +} + +export const REACT_INTERNAL_PROPS = ['children', 'key', 'ref'] + +// Gets only instance props from reconciler fibers +export function getInstanceProps(queue: Fiber['pendingProps']): Instance['props'] { + const props: Instance['props'] = {} + + for (const key in queue) { + if (!REACT_INTERNAL_PROPS.includes(key)) props[key] = queue[key] } + + return props } // Each object in the scene carries a small LocalState descriptor -export function prepare(object: T, state?: Partial) { - const instance = object as unknown as Instance - if (state?.primitive || !instance.__r3f) { - instance.__r3f = { - type: '', - root: null as unknown as UseBoundStore, - previousAttach: null, - memoizedProps: {}, +export function prepare( + target: T, + root: UseBoundStore, + type: string, + props: Instance['props'], +): Instance { + const object = target as unknown as Instance['object'] + + // Create instance descriptor + let instance = object.__r3f + if (!instance) { + instance = { + root, + type, + parent: null, + children: [], + props: getInstanceProps(props), + object, eventCount: 0, handlers: {}, - objects: [], - parent: null, - ...state, + isHidden: false, } + object.__r3f = instance } - return object + + return instance } -function resolve(instance: Instance, key: string) { - let target = instance - if (key.includes('-')) { - const entries = key.split('-') - const last = entries.pop() as string - target = entries.reduce((acc, key) => acc[key], instance) - return { target, key: last } - } else return { target, key } +export function resolve(root: any, key: string): { root: any; key: string; target: any } { + let target = root[key] + if (!key.includes('-')) return { root, key, target } + + // Resolve pierced target + const chain = key.split('-') + target = chain.reduce((acc, key) => acc[key], root) + key = chain.pop()! + + // Switch root if atomic + if (!target?.set) root = chain.reduce((acc, key) => acc[key], root) + + return { root, key, target } } // Checks if a dash-cased string ends with an integer const INDEX_REGEX = /-\d+$/ -export function attach(parent: Instance, child: Instance, type: AttachType) { - if (is.str(type)) { +export function attach(parent: Instance, child: Instance): void { + if (is.str(child.props.attach)) { // If attaching into an array (foo-0), create one - if (INDEX_REGEX.test(type)) { - const root = type.replace(INDEX_REGEX, '') - const { target, key } = resolve(parent, root) - if (!Array.isArray(target[key])) target[key] = [] + if (INDEX_REGEX.test(child.props.attach)) { + const index = child.props.attach.replace(INDEX_REGEX, '') + const { root, key } = resolve(parent.object, index) + if (!Array.isArray(root[key])) root[key] = [] } - const { target, key } = resolve(parent, type) - child.__r3f.previousAttach = target[key] - target[key] = child - } else child.__r3f.previousAttach = type(parent, child) + const { root, key } = resolve(parent.object, child.props.attach) + child.previousAttach = root[key] + root[key] = child.object + } else if (is.fun(child.props.attach)) { + child.previousAttach = child.props.attach(parent.object, child.object) + } } -export function detach(parent: Instance, child: Instance, type: AttachType) { - if (is.str(type)) { - const { target, key } = resolve(parent, type) - const previous = child.__r3f.previousAttach +export function detach(parent: Instance, child: Instance): void { + if (is.str(child.props.attach)) { + const { root, key } = resolve(parent.object, child.props.attach) + const previous = child.previousAttach // When the previous value was undefined, it means the value was never set to begin with - if (previous === undefined) delete target[key] + if (previous === undefined) delete root[key] // Otherwise set the previous value - else target[key] = previous - } else child.__r3f?.previousAttach?.(parent, child) - delete child.__r3f?.previousAttach + else root[key] = previous + } else { + child.previousAttach?.(parent.object, child.object) + } + + delete child.previousAttach } +export const RESERVED_PROPS = [ + ...REACT_INTERNAL_PROPS, + // Instance props + 'args', + 'dispose', + 'attach', + 'object', + // Behavior flags + 'dispose', +] + // This function prepares a set of changes to be applied to the instance -export function diffProps( - instance: Instance, - { children: cN, key: kN, ref: rN, ...props }: InstanceProps, - { children: cP, key: kP, ref: rP, ...previous }: InstanceProps = {}, - remove = false, -): DiffSet { - const localState = (instance?.__r3f ?? {}) as LocalState - const entries = Object.entries(props) - const changes: [key: string, value: unknown, isEvent: boolean, keys: string[]][] = [] - - // Catch removed props, prepend them so they can be reset or removed - if (remove) { - const previousKeys = Object.keys(previous) - for (let i = 0; i < previousKeys.length; i++) { - if (!props.hasOwnProperty(previousKeys[i])) entries.unshift([previousKeys[i], DEFAULT + 'remove']) - } +export function diffProps( + instance: Instance, + newProps: Instance['props'], + resetRemoved = false, +): Instance['props'] { + const changedProps: Instance['props'] = {} + + // Sort through props + for (const prop in newProps) { + // Skip reserved keys + if (RESERVED_PROPS.includes(prop)) continue + // Skip if props match + if (is.equ(newProps[prop], instance.props[prop])) continue + + // Props changed, add them + changedProps[prop] = newProps[prop] } - entries.forEach(([key, value]) => { - // Bail out on primitive object - if (instance.__r3f?.primitive && key === 'object') return - // When props match bail out - if (is.equ(value, previous[key])) return - // Collect handlers and bail out - if (/^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(key)) return changes.push([key, value, true, []]) - // Split dashed props - let entries: string[] = [] - if (key.includes('-')) entries = key.split('-') - changes.push([key, value, false, entries]) - }) - - const memoized: { [key: string]: any } = { ...props } - if (localState.memoizedProps && localState.memoizedProps.args) memoized.args = localState.memoizedProps.args - if (localState.memoizedProps && localState.memoizedProps.attach) memoized.attach = localState.memoizedProps.attach - - return { memoized, changes } -} + // Reset removed props for HMR + if (resetRemoved) { + for (const prop in instance.props) { + if (RESERVED_PROPS.includes(prop) || newProps.hasOwnProperty(prop)) continue -// This function applies a set of changes to the instance -export function applyProps(instance: Instance, data: InstanceProps | DiffSet) { - // Filter equals, events and reserved props - const localState = (instance.__r3f ?? {}) as LocalState - const root = localState.root - const rootState = root?.getState?.() ?? {} - const { memoized, changes } = isDiffSet(data) ? data : diffProps(instance, data) - const prevHandlers = localState.eventCount - - // Prepare memoized props - if (instance.__r3f) instance.__r3f.memoizedProps = memoized - - changes.forEach(([key, value, isEvent, keys]) => { - let currentInstance = instance - let targetProp = currentInstance[key] - - // Revolve dashed props - if (keys.length) { - targetProp = keys.reduce((acc, key) => acc[key], instance) - // If the target is atomic, it forces us to switch the root - if (!(targetProp && targetProp.set)) { - const [name, ...reverseEntries] = keys.reverse() - currentInstance = reverseEntries.reverse().reduce((acc, key) => acc[key], instance) - key = name - } - } + const { root, key } = resolve(instance.object, prop) - // https://github.com/mrdoob/three.js/issues/21209 - // HMR/fast-refresh relies on the ability to cancel out props, but threejs - // has no means to do this. Hence we curate a small collection of value-classes - // with their respective constructor/set arguments - // For removed props, try to set default values, if possible - if (value === DEFAULT + 'remove') { - if (targetProp && targetProp.constructor) { - // use the prop constructor to find the default it should be - value = new targetProp.constructor(...(memoized.args ?? [])) - } else if (currentInstance.constructor) { + // https://github.com/mrdoob/three.js/issues/21209 + // HMR/fast-refresh relies on the ability to cancel out props, but threejs + // has no means to do this. Hence we curate a small collection of value-classes + // with their respective constructor/set arguments + // For removed props, try to set default values, if possible + if (root.constructor) { // create a blank slate of the instance and copy the particular parameter. // @ts-ignore - const defaultClassCall = new currentInstance.constructor(...(currentInstance.__r3f.memoizedProps.args ?? [])) - value = defaultClassCall[targetProp] - // destory the instance + const defaultClassCall = new root.constructor(...(root.__r3f?.props.args ?? [])) + changedProps[key] = defaultClassCall[key] + // destroy the instance if (defaultClassCall.dispose) defaultClassCall.dispose() - // instance does not have constructor, just set it to 0 } else { - value = 0 + // instance does not have constructor, just set it to 0 + changedProps[key] = 0 } } + } + + return changedProps +} + +// This function applies a set of changes to the instance +export function applyProps(object: Instance['object'], props: Instance['props']): Instance['object'] { + const instance = object.__r3f + const rootState = instance?.root.getState() + const prevHandlers = instance?.eventCount + + for (const prop in props) { + let value = props[prop] + + // Don't mutate reserved keys + if (RESERVED_PROPS.includes(prop)) continue // Deal with pointer events ... - if (isEvent) { - if (value) localState.handlers[key as keyof EventHandlers] = value as any - else delete localState.handlers[key as keyof EventHandlers] - localState.eventCount = Object.keys(localState.handlers).length + if (instance && /^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(prop)) { + if (typeof value === 'function') instance.handlers[prop as keyof EventHandlers] = value as any + else delete instance.handlers[prop as keyof EventHandlers] + instance.eventCount = Object.keys(instance.handlers).length } - // Special treatment for objects with support for set/copy, and layers - else if (targetProp && targetProp.set && (targetProp.copy || targetProp instanceof THREE.Layers)) { - // If value is an array - if (Array.isArray(value)) { - if (targetProp.fromArray) targetProp.fromArray(value) - else targetProp.set(...value) - } - // Test again target.copy(class) next ... - else if ( - targetProp.copy && - value && - (value as ClassConstructor).constructor && - targetProp.constructor.name === (value as ClassConstructor).constructor.name - ) { - targetProp.copy(value) - } - // If nothing else fits, just set the single value, ignore undefined - // https://github.com/pmndrs/react-three-fiber/issues/274 - else if (value !== undefined) { - const isColor = targetProp instanceof THREE.Color - // Allow setting array scalars - if (!isColor && targetProp.setScalar) targetProp.setScalar(value) - // Layers have no copy function, we must therefore copy the mask property - else if (targetProp instanceof THREE.Layers && value instanceof THREE.Layers) targetProp.mask = value.mask - // Otherwise just set ... - else targetProp.set(value) - } - // Else, just overwrite the value - } else { - currentInstance[key] = value + + const { root, key, target } = resolve(object, prop) + + // Copy if properties match signatures + if (target?.copy && target?.constructor === (value as ConstructorRepresentation)?.constructor) { + target.copy(value) + } + // Layers have no copy function, we must therefore copy the mask property + else if (target instanceof THREE.Layers && value instanceof THREE.Layers) { + target.mask = value.mask + } + // Set array types + else if (target?.set && Array.isArray(value)) { + if (target.fromArray) target.fromArray(value) + else target.set(...value) + } + // Set literal types, ignore undefined + // https://github.com/pmndrs/react-three-fiber/issues/274 + else if (target?.set && typeof value !== 'object') { + const isColor = target instanceof THREE.Color + // Allow setting array scalars + if (!isColor && target.setScalar && typeof value === 'number') target.setScalar(value) + // Otherwise just set ... + else if (value !== undefined) target.set(value) + } + // Else, just overwrite the value + else { + root[key] = value // Auto-convert sRGB textures, for now ... // https://github.com/pmndrs/react-three-fiber/issues/344 - if (!rootState.linear && currentInstance[key] instanceof THREE.Texture) { - currentInstance[key].encoding = THREE.sRGBEncoding + if (!rootState?.linear && root[key] instanceof THREE.Texture) { + root[key].encoding = THREE.sRGBEncoding } } + } - invalidateInstance(instance) - }) - - if (localState.parent && rootState.internal && instance.raycast && prevHandlers !== localState.eventCount) { + if ( + instance?.parent && + rootState?.internal && + instance.object instanceof THREE.Object3D && + prevHandlers !== instance.eventCount + ) { // Pre-emptively remove the instance from the interaction manager - const index = rootState.internal.interaction.indexOf(instance as unknown as THREE.Object3D) + const index = rootState.internal.interaction.indexOf(instance.object) if (index > -1) rootState.internal.interaction.splice(index, 1) // Add the instance to the interaction manager only when it has handlers - if (localState.eventCount) rootState.internal.interaction.push(instance as unknown as THREE.Object3D) + if (instance.eventCount && instance.object.raycast !== null && instance.object instanceof THREE.Object3D) { + rootState.internal.interaction.push(instance.object) + } } - return instance + if (instance) invalidateInstance(instance) + + return object } -export function invalidateInstance(instance: Instance) { - const state = instance.__r3f?.root?.getState?.() +export function invalidateInstance(instance: Instance): void { + const state = instance.root?.getState?.() if (state && state.internal.frames === 0) state.invalidate() } -export function updateCamera(camera: Camera & { manual?: boolean }, size: Size) { +export function updateCamera(camera: Camera & { manual?: boolean }, size: Size): void { // https://github.com/pmndrs/react-three-fiber/issues/92 // Do not mess with the camera if it belongs to the user if (!camera.manual) { diff --git a/packages/fiber/src/index.tsx b/packages/fiber/src/index.tsx index 9e0894fb4d..25ee1afad1 100644 --- a/packages/fiber/src/index.tsx +++ b/packages/fiber/src/index.tsx @@ -1,7 +1,13 @@ export * from './three-types' -import * as ReactThreeFiber from './three-types' -export { ReactThreeFiber } -export type { BaseInstance, LocalState } from './core/renderer' +export type { + AttachFnType, + AttachType, + ConstructorRepresentation, + Catalogue, + Args, + InstanceProps, + Instance, +} from './core/renderer' export type { Intersection, Subscription, diff --git a/packages/fiber/src/native.tsx b/packages/fiber/src/native.tsx index 667a0596e5..851eb278dd 100644 --- a/packages/fiber/src/native.tsx +++ b/packages/fiber/src/native.tsx @@ -1,7 +1,13 @@ export * from './three-types' -import * as ReactThreeFiber from './three-types' -export { ReactThreeFiber } -export type { BaseInstance, LocalState } from './core/renderer' +export type { + AttachFnType, + AttachType, + ConstructorRepresentation, + Catalogue, + Args, + InstanceProps, + Instance, +} from './core/renderer' export type { Intersection, Subscription, diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index 62685a010f..8a7d26100a 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -43,7 +43,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef( // Create a known catalogue of Threejs-native elements // This will include the entire THREE namespace by default, users can extend // their own elements by using the createRoot API instead - React.useMemo(() => extend(THREE), []) + React.useMemo(() => extend(THREE as any), []) const [{ width, height, top, left }, setSize] = React.useState({ width: 0, height: 0, top: 0, left: 0 }) const [canvas, setCanvas] = React.useState(null) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index ec393b4920..e5cfa5a9ae 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -1,399 +1,57 @@ -import * as THREE from 'three' -import { EventHandlers } from './core/events' -import { AttachType } from './core/renderer' +import type * as THREE from 'three' +import type { EventHandlers } from './core/events' +import type { InstanceProps, ConstructorRepresentation } from './core/renderer' -export type NonFunctionKeys = { [K in keyof T]-?: T[K] extends Function ? never : K }[keyof T] -export type Overwrite = Omit> & O +type Mutable

= { [K in keyof P]: P[K] | Readonly } +type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] +type Overwrite = Omit> & O -/** - * If **T** contains a constructor, @see ConstructorParameters must be used, otherwise **T**. - */ -type Args = T extends new (...args: any) => any ? ConstructorParameters : T - -export type Euler = THREE.Euler | Parameters -export type Matrix4 = THREE.Matrix4 | Parameters | Readonly - -/** - * Turn an implementation of THREE.Vector in to the type that an r3f component would accept as a prop. - */ -type VectorLike = - | VectorClass - | Parameters - | Readonly> - | Parameters[0] - -export type Vector2 = VectorLike -export type Vector3 = VectorLike -export type Vector4 = VectorLike -export type Color = ConstructorParameters | THREE.Color | number | string // Parameters will not work here because of multiple function signatures in three.js types -export type ColorArray = typeof THREE.Color | Parameters -export type Layers = THREE.Layers | Parameters[0] -export type Quaternion = THREE.Quaternion | Parameters +interface MathRepresentation { + set(...args: any[]): any +} +interface VectorRepresentation extends MathRepresentation { + setScalar(s: number): any +} +type MathProps

= { + [K in keyof P]: P[K] extends infer M + ? M extends THREE.Color + ? ConstructorParameters | THREE.ColorRepresentation + : M extends MathRepresentation + ? M extends VectorRepresentation + ? M | Parameters | Parameters[0] + : M | Parameters + : {} + : {} +} -export type AttachCallback = string | ((child: any, parentInstance: any) => void) +interface RaycastableRepresentation { + raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void +} +type EventProps

= P extends RaycastableRepresentation ? Partial : {} -export interface NodeProps { - attach?: AttachType - /** Constructor arguments */ - args?: Args

+interface ReactProps

{ children?: React.ReactNode - ref?: React.Ref + ref?: React.Ref

key?: React.Key } -export type ExtendedColors = { [K in keyof T]: T[K] extends THREE.Color | undefined ? Color : T[K] } -export type Node = ExtendedColors, NodeProps>> - -export type Object3DNode = Overwrite< - Node, - { - position?: Vector3 - up?: Vector3 - scale?: Vector3 - rotation?: Euler - matrix?: Matrix4 - quaternion?: Quaternion - layers?: Layers - dispose?: (() => void) | null - } -> & - EventHandlers - -export type BufferGeometryNode = Node -export type MaterialNode = Node -export type LightNode = Object3DNode - -export type Object3DProps = Object3DNode -// export type AudioProps = Object3DNode -export type AudioListenerProps = Object3DNode -export type PositionalAudioProps = Object3DNode - -export type MeshProps = Object3DNode -export type InstancedMeshProps = Object3DNode -export type SceneProps = Object3DNode -export type SpriteProps = Object3DNode -export type LODProps = Object3DNode -export type SkinnedMeshProps = Object3DNode - -export type SkeletonProps = Object3DNode -export type BoneProps = Object3DNode -export type LineSegmentsProps = Object3DNode -export type LineLoopProps = Object3DNode -// export type LineProps = Object3DNode -export type PointsProps = Object3DNode -export type GroupProps = Object3DNode - -export type CameraProps = Object3DNode -export type PerspectiveCameraProps = Object3DNode -export type OrthographicCameraProps = Object3DNode -export type CubeCameraProps = Object3DNode -export type ArrayCameraProps = Object3DNode - -export type InstancedBufferGeometryProps = BufferGeometryNode< - THREE.InstancedBufferGeometry, - typeof THREE.InstancedBufferGeometry -> -export type BufferGeometryProps = BufferGeometryNode -export type BoxBufferGeometryProps = BufferGeometryNode -export type CircleBufferGeometryProps = BufferGeometryNode< - THREE.CircleBufferGeometry, - typeof THREE.CircleBufferGeometry -> -export type ConeBufferGeometryProps = BufferGeometryNode -export type CylinderBufferGeometryProps = BufferGeometryNode< - THREE.CylinderBufferGeometry, - typeof THREE.CylinderBufferGeometry -> -export type DodecahedronBufferGeometryProps = BufferGeometryNode< - THREE.DodecahedronBufferGeometry, - typeof THREE.DodecahedronBufferGeometry -> -export type ExtrudeBufferGeometryProps = BufferGeometryNode< - THREE.ExtrudeBufferGeometry, - typeof THREE.ExtrudeBufferGeometry -> -export type IcosahedronBufferGeometryProps = BufferGeometryNode< - THREE.IcosahedronBufferGeometry, - typeof THREE.IcosahedronBufferGeometry -> -export type LatheBufferGeometryProps = BufferGeometryNode -export type OctahedronBufferGeometryProps = BufferGeometryNode< - THREE.OctahedronBufferGeometry, - typeof THREE.OctahedronBufferGeometry +type ElementProps> = Partial< + Overwrite & MathProps

& EventProps

> > -export type PlaneBufferGeometryProps = BufferGeometryNode -export type PolyhedronBufferGeometryProps = BufferGeometryNode< - THREE.PolyhedronBufferGeometry, - typeof THREE.PolyhedronBufferGeometry -> -export type RingBufferGeometryProps = BufferGeometryNode -export type ShapeBufferGeometryProps = BufferGeometryNode -export type SphereBufferGeometryProps = BufferGeometryNode< - THREE.SphereBufferGeometry, - typeof THREE.SphereBufferGeometry -> -export type TetrahedronBufferGeometryProps = BufferGeometryNode< - THREE.TetrahedronBufferGeometry, - typeof THREE.TetrahedronBufferGeometry -> -export type TorusBufferGeometryProps = BufferGeometryNode -export type TorusKnotBufferGeometryProps = BufferGeometryNode< - THREE.TorusKnotBufferGeometry, - typeof THREE.TorusKnotBufferGeometry -> -export type TubeBufferGeometryProps = BufferGeometryNode -export type WireframeGeometryProps = BufferGeometryNode -export type TetrahedronGeometryProps = BufferGeometryNode -export type OctahedronGeometryProps = BufferGeometryNode -export type IcosahedronGeometryProps = BufferGeometryNode -export type DodecahedronGeometryProps = BufferGeometryNode< - THREE.DodecahedronGeometry, - typeof THREE.DodecahedronGeometry -> -export type PolyhedronGeometryProps = BufferGeometryNode -export type TubeGeometryProps = BufferGeometryNode -export type TorusKnotGeometryProps = BufferGeometryNode -export type TorusGeometryProps = BufferGeometryNode -export type SphereGeometryProps = BufferGeometryNode -export type RingGeometryProps = BufferGeometryNode -export type PlaneGeometryProps = BufferGeometryNode -export type LatheGeometryProps = BufferGeometryNode -export type ShapeGeometryProps = BufferGeometryNode -export type ExtrudeGeometryProps = BufferGeometryNode -export type EdgesGeometryProps = BufferGeometryNode -export type ConeGeometryProps = BufferGeometryNode -export type CylinderGeometryProps = BufferGeometryNode -export type CircleGeometryProps = BufferGeometryNode -export type BoxGeometryProps = BufferGeometryNode -export type CapsuleGeometryProps = BufferGeometryNode -export type MaterialProps = MaterialNode -export type ShadowMaterialProps = MaterialNode -export type SpriteMaterialProps = MaterialNode -export type RawShaderMaterialProps = MaterialNode -export type ShaderMaterialProps = MaterialNode -export type PointsMaterialProps = MaterialNode -export type MeshPhysicalMaterialProps = MaterialNode -export type MeshStandardMaterialProps = MaterialNode -export type MeshPhongMaterialProps = MaterialNode -export type MeshToonMaterialProps = MaterialNode -export type MeshNormalMaterialProps = MaterialNode -export type MeshLambertMaterialProps = MaterialNode -export type MeshDepthMaterialProps = MaterialNode -export type MeshDistanceMaterialProps = MaterialNode -export type MeshBasicMaterialProps = MaterialNode -export type MeshMatcapMaterialProps = MaterialNode -export type LineDashedMaterialProps = MaterialNode -export type LineBasicMaterialProps = MaterialNode - -export type PrimitiveProps = { object: any } & { [properties: string]: any } - -export type LightProps = LightNode -export type SpotLightShadowProps = Node -export type SpotLightProps = LightNode -export type PointLightProps = LightNode -export type RectAreaLightProps = LightNode -export type HemisphereLightProps = LightNode -export type DirectionalLightShadowProps = Node -export type DirectionalLightProps = LightNode -export type AmbientLightProps = LightNode -export type LightShadowProps = Node -export type AmbientLightProbeProps = LightNode -export type HemisphereLightProbeProps = LightNode -export type LightProbeProps = LightNode - -export type SpotLightHelperProps = Object3DNode -export type SkeletonHelperProps = Object3DNode -export type PointLightHelperProps = Object3DNode -export type HemisphereLightHelperProps = Object3DNode -export type GridHelperProps = Object3DNode -export type PolarGridHelperProps = Object3DNode -export type DirectionalLightHelperProps = Object3DNode< - THREE.DirectionalLightHelper, - typeof THREE.DirectionalLightHelper +export type ThreeElement = Mutable< + Overwrite, Omit>, 'object'>> > -export type CameraHelperProps = Object3DNode -export type BoxHelperProps = Object3DNode -export type Box3HelperProps = Object3DNode -export type PlaneHelperProps = Object3DNode -export type ArrowHelperProps = Object3DNode -export type AxesHelperProps = Object3DNode - -export type TextureProps = Node -export type VideoTextureProps = Node -export type DataTextureProps = Node -export type DataTexture3DProps = Node -export type CompressedTextureProps = Node -export type CubeTextureProps = Node -export type CanvasTextureProps = Node -export type DepthTextureProps = Node - -export type RaycasterProps = Node -export type Vector2Props = Node -export type Vector3Props = Node -export type Vector4Props = Node -export type EulerProps = Node -export type Matrix3Props = Node -export type Matrix4Props = Node -export type QuaternionProps = Node -export type BufferAttributeProps = Node -export type Float16BufferAttributeProps = Node -export type Float32BufferAttributeProps = Node -export type Float64BufferAttributeProps = Node -export type Int8BufferAttributeProps = Node -export type Int16BufferAttributeProps = Node -export type Int32BufferAttributeProps = Node -export type Uint8BufferAttributeProps = Node -export type Uint16BufferAttributeProps = Node -export type Uint32BufferAttributeProps = Node -export type InstancedBufferAttributeProps = Node -export type ColorProps = Node -export type FogProps = Node -export type FogExp2Props = Node -export type ShapeProps = Node -export interface ThreeElements { - object3D: Object3DProps - - // `audio` works but conflicts with @types/react. Try using PositionalAudio from @react-three/drei instead - // audio: AudioProps - audioListener: AudioListenerProps - positionalAudio: PositionalAudioProps - - mesh: MeshProps - instancedMesh: InstancedMeshProps - scene: SceneProps - sprite: SpriteProps - lOD: LODProps - skinnedMesh: SkinnedMeshProps - skeleton: SkeletonProps - bone: BoneProps - lineSegments: LineSegmentsProps - lineLoop: LineLoopProps - // see `audio` - // line: LineProps - points: PointsProps - group: GroupProps - - // cameras - camera: CameraProps - perspectiveCamera: PerspectiveCameraProps - orthographicCamera: OrthographicCameraProps - cubeCamera: CubeCameraProps - arrayCamera: ArrayCameraProps - - // geometry - instancedBufferGeometry: InstancedBufferGeometryProps - bufferGeometry: BufferGeometryProps - wireframeGeometry: WireframeGeometryProps - tetrahedronGeometry: TetrahedronGeometryProps - octahedronGeometry: OctahedronGeometryProps - icosahedronGeometry: IcosahedronGeometryProps - dodecahedronGeometry: DodecahedronGeometryProps - polyhedronGeometry: PolyhedronGeometryProps - tubeGeometry: TubeGeometryProps - torusKnotGeometry: TorusKnotGeometryProps - torusGeometry: TorusGeometryProps - sphereGeometry: SphereGeometryProps - ringGeometry: RingGeometryProps - planeGeometry: PlaneGeometryProps - latheGeometry: LatheGeometryProps - shapeGeometry: ShapeGeometryProps - extrudeGeometry: ExtrudeGeometryProps - edgesGeometry: EdgesGeometryProps - coneGeometry: ConeGeometryProps - cylinderGeometry: CylinderGeometryProps - circleGeometry: CircleGeometryProps - boxGeometry: BoxGeometryProps - capsuleGeometry: CapsuleGeometryProps - - // materials - material: MaterialProps - shadowMaterial: ShadowMaterialProps - spriteMaterial: SpriteMaterialProps - rawShaderMaterial: RawShaderMaterialProps - shaderMaterial: ShaderMaterialProps - pointsMaterial: PointsMaterialProps - meshPhysicalMaterial: MeshPhysicalMaterialProps - meshStandardMaterial: MeshStandardMaterialProps - meshPhongMaterial: MeshPhongMaterialProps - meshToonMaterial: MeshToonMaterialProps - meshNormalMaterial: MeshNormalMaterialProps - meshLambertMaterial: MeshLambertMaterialProps - meshDepthMaterial: MeshDepthMaterialProps - meshDistanceMaterial: MeshDistanceMaterialProps - meshBasicMaterial: MeshBasicMaterialProps - meshMatcapMaterial: MeshMatcapMaterialProps - lineDashedMaterial: LineDashedMaterialProps - lineBasicMaterial: LineBasicMaterialProps - - // primitive - primitive: PrimitiveProps - - // lights and other - light: LightProps - spotLightShadow: SpotLightShadowProps - spotLight: SpotLightProps - pointLight: PointLightProps - rectAreaLight: RectAreaLightProps - hemisphereLight: HemisphereLightProps - directionalLightShadow: DirectionalLightShadowProps - directionalLight: DirectionalLightProps - ambientLight: AmbientLightProps - lightShadow: LightShadowProps - ambientLightProbe: AmbientLightProbeProps - hemisphereLightProbe: HemisphereLightProbeProps - lightProbe: LightProbeProps - - // helpers - spotLightHelper: SpotLightHelperProps - skeletonHelper: SkeletonHelperProps - pointLightHelper: PointLightHelperProps - hemisphereLightHelper: HemisphereLightHelperProps - gridHelper: GridHelperProps - polarGridHelper: PolarGridHelperProps - directionalLightHelper: DirectionalLightHelperProps - cameraHelper: CameraHelperProps - boxHelper: BoxHelperProps - box3Helper: Box3HelperProps - planeHelper: PlaneHelperProps - arrowHelper: ArrowHelperProps - axesHelper: AxesHelperProps - - // textures - texture: TextureProps - videoTexture: VideoTextureProps - dataTexture: DataTextureProps - dataTexture3D: DataTexture3DProps - compressedTexture: CompressedTextureProps - cubeTexture: CubeTextureProps - canvasTexture: CanvasTextureProps - depthTexture: DepthTextureProps +type ThreeExports = typeof THREE +type ThreeElementsImpl = { + [K in keyof ThreeExports as Uncapitalize]: ThreeExports[K] extends ConstructorRepresentation + ? ThreeElement + : never +} - // misc - raycaster: RaycasterProps - vector2: Vector2Props - vector3: Vector3Props - vector4: Vector4Props - euler: EulerProps - matrix3: Matrix3Props - matrix4: Matrix4Props - quaternion: QuaternionProps - bufferAttribute: BufferAttributeProps - float16BufferAttribute: Float16BufferAttributeProps - float32BufferAttribute: Float32BufferAttributeProps - float64BufferAttribute: Float64BufferAttributeProps - int8BufferAttribute: Int8BufferAttributeProps - int16BufferAttribute: Int16BufferAttributeProps - int32BufferAttribute: Int32BufferAttributeProps - uint8BufferAttribute: Uint8BufferAttributeProps - uint16BufferAttribute: Uint16BufferAttributeProps - uint32BufferAttribute: Uint32BufferAttributeProps - instancedBufferAttribute: InstancedBufferAttributeProps - color: ColorProps - fog: FogProps - fogExp2: FogExp2Props - shape: ShapeProps +export interface ThreeElements extends ThreeElementsImpl { + primitive: Omit, 'args'> & { object: object } } declare global { diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 5d82f906ab..c88f23903a 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -58,7 +58,7 @@ export const Canvas = /*#__PURE__*/ React.forwardRef extend(THREE), []) + React.useMemo(() => extend(THREE as any), []) const [containerRef, containerRect] = useMeasure({ scroll: true, debounce: { scroll: 50, resize: 0 }, ...resize }) const canvasRef = React.useRef(null!) diff --git a/packages/fiber/tests/__snapshots__/utils.test.ts.snap b/packages/fiber/tests/__snapshots__/utils.test.ts.snap new file mode 100644 index 0000000000..f9204e847e --- /dev/null +++ b/packages/fiber/tests/__snapshots__/utils.test.ts.snap @@ -0,0 +1,85 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`updateCamera updates camera matrices 1`] = ` +Array [ + 2.1445069205095586, + 0, + 0, + 0, + 0, + 2.1445069205095586, + 0, + 0, + 0, + 0, + -1.00010000500025, + -1, + 0, + 0, + -0.200010000500025, + 0, +] +`; + +exports[`updateCamera updates camera matrices 2`] = ` +Array [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, +] +`; + +exports[`updateCamera updates camera matrices 3`] = ` +Array [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + -0.001000050002500125, + 0, + -0, + -0, + -1.00010000500025, + 1, +] +`; + +exports[`updateCamera updates camera matrices 4`] = ` +Array [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, +] +`; diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index c6f4e23d14..236f10280b 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -1,8 +1,18 @@ import * as React from 'react' import * as THREE from 'three' import * as Stdlib from 'three-stdlib' -import { createRoot, advance, useLoader, act, useThree, useGraph, useFrame, ObjectMap, useInstanceHandle } from '../src' -import { Instance, LocalState } from '../src/core/renderer' +import { + createRoot, + advance, + useLoader, + act, + useThree, + useGraph, + useFrame, + ObjectMap, + useInstanceHandle, + Instance, +} from '../src' const root = createRoot(document.createElement('canvas')) @@ -188,7 +198,7 @@ describe('hooks', () => { it('can handle useInstanceHandle hook', async () => { const ref = React.createRef() - let instance!: React.MutableRefObject + let instance!: React.MutableRefObject const Component = () => { instance = useInstanceHandle(ref) @@ -196,6 +206,6 @@ describe('hooks', () => { } await act(async () => root.render()) - expect(instance.current).toBe((ref.current as unknown as Instance).__r3f) + expect(instance.current).toBe((ref.current as unknown as Instance['object']).__r3f) }) }) diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx new file mode 100644 index 0000000000..016702a758 --- /dev/null +++ b/packages/fiber/tests/index.test.tsx @@ -0,0 +1,220 @@ +import * as React from 'react' +import * as THREE from 'three' +import { ReconcilerRoot, createRoot, act, useFrame, useThree, createPortal, RootState } from '../src/index' +import { UseBoundStore } from 'zustand' +import { privateKeys } from '../src/core/store' + +let root: ReconcilerRoot = null! + +beforeEach(() => (root = createRoot(document.createElement('canvas')))) +afterEach(async () => act(async () => root.unmount())) + +describe('createRoot', () => { + it('should return a Zustand store', async () => { + const store = await act(async () => root.render(null)) + expect(() => store.getState()).not.toThrow() + }) + + it('will make an Orthographic Camera & set the position', async () => { + const store = await act(async () => + root.configure({ orthographic: true, camera: { position: [0, 0, 5] } }).render(), + ) + const { camera } = store.getState() + + expect(camera).toBeInstanceOf(THREE.OrthographicCamera) + expect(camera.position.z).toEqual(5) + }) + + it('should handle an performance changing functions', async () => { + let state: UseBoundStore = null! + await act(async () => { + state = root.configure({ dpr: [1, 2], performance: { min: 0.2 } }).render() + }) + + expect(state.getState().viewport.initialDpr).toEqual(window.devicePixelRatio) + expect(state.getState().performance.min).toEqual(0.2) + expect(state.getState().performance.current).toEqual(1) + + await act(async () => { + state.getState().setDpr(0.1) + }) + + expect(state.getState().viewport.dpr).toEqual(0.1) + + jest.useFakeTimers() + + await act(async () => { + state.getState().performance.regress() + jest.advanceTimersByTime(100) + }) + + expect(state.getState().performance.current).toEqual(0.2) + + await act(async () => { + jest.advanceTimersByTime(200) + }) + + expect(state.getState().performance.current).toEqual(1) + + jest.useRealTimers() + }) + + it('should set PCFSoftShadowMap as the default shadow map', async () => { + const store = await act(async () => root.configure({ shadows: true }).render()) + const { gl } = store.getState() + + expect(gl.shadowMap.type).toBe(THREE.PCFSoftShadowMap) + }) + + it('should set tonemapping to ACESFilmicToneMapping and outputEncoding to sRGBEncoding if linear is false', async () => { + const store = await act(async () => root.configure({ linear: false }).render()) + const { gl } = store.getState() + + expect(gl.toneMapping).toBe(THREE.ACESFilmicToneMapping) + expect(gl.outputEncoding).toBe(THREE.sRGBEncoding) + }) + + it('should toggle render mode in xr', async () => { + let state: RootState = null! + + await act(async () => { + state = root.render().getState() + state.gl.xr.isPresenting = true + state.gl.xr.dispatchEvent({ type: 'sessionstart' }) + }) + + expect(state.gl.xr.enabled).toEqual(true) + + await act(async () => { + state.gl.xr.isPresenting = false + state.gl.xr.dispatchEvent({ type: 'sessionend' }) + }) + + expect(state.gl.xr.enabled).toEqual(false) + }) + + it('should respect frameloop="never" in xr', async () => { + let respected = true + + const Test = () => useFrame(() => (respected = false)) + + await act(async () => { + const state = root + .configure({ frameloop: 'never' }) + .render() + .getState() + state.gl.xr.isPresenting = true + state.gl.xr.dispatchEvent({ type: 'sessionstart' }) + }) + + expect(respected).toEqual(true) + }) + + it('should set renderer props via gl prop', async () => { + const store = await act(async () => root.configure({ gl: { physicallyCorrectLights: true } }).render()) + const { gl } = store.getState() + + expect(gl.physicallyCorrectLights).toBe(true) + }) + + it('should set a renderer via gl callback', async () => { + class Renderer extends THREE.WebGLRenderer {} + + const store = await act(async () => root.configure({ gl: (canvas) => new Renderer({ canvas }) }).render()) + const { gl } = store.getState() + + expect(gl instanceof Renderer).toBe(true) + }) + + it('should respect color management preferences via gl', async () => { + const store = await act(async () => + root + .configure({ gl: { outputEncoding: THREE.LinearEncoding, toneMapping: THREE.NoToneMapping } }) + .render(), + ) + const { gl } = store.getState() + + expect(gl.outputEncoding).toBe(THREE.LinearEncoding) + expect(gl.toneMapping).toBe(THREE.NoToneMapping) + + await act(async () => root.configure({ flat: true, linear: true }).render()) + expect(gl.outputEncoding).toBe(THREE.LinearEncoding) + expect(gl.toneMapping).toBe(THREE.NoToneMapping) + }) + + it('should respect legacy prop', async () => { + await act(async () => root.configure({ legacy: true }).render()) + expect((THREE as any).ColorManagement.legacyMode).toBe(true) + + await act(async () => root.configure({ legacy: false }).render()) + expect((THREE as any).ColorManagement.legacyMode).toBe(false) + }) +}) + +describe('createPortal', () => { + it('should create a state enclave', async () => { + const scene = new THREE.Scene() + + let state: RootState = null! + let portalState: RootState = null! + + const Normal = () => { + const three = useThree() + state = three + + return + } + + const Portal = () => { + const three = useThree() + portalState = three + + return + } + + await act(async () => { + root.render( + <> + + {createPortal(, scene, { scene })} + , + ) + }) + + // Renders into portal target + expect(scene.children.length).not.toBe(0) + + // Creates an isolated state enclave + expect(state.scene).not.toBe(scene) + expect(portalState.scene).toBe(scene) + + // Preserves internal keys + const overwrittenKeys = ['get', 'set', 'events', 'size', 'viewport'] + const respectedKeys = privateKeys.filter((key) => overwrittenKeys.includes(key) || state[key] === portalState[key]) + expect(respectedKeys).toStrictEqual(privateKeys) + }) + + it('should handle unmounted containers', async () => { + let groupHandle!: THREE.Group | null + function Test(props: any) { + const [group, setGroup] = React.useState(null) + groupHandle = group + + return ( + + {group && createPortal(, group)} + + ) + } + + await act(async () => root.render()) + + expect(groupHandle).toBeDefined() + const prevUUID = groupHandle!.uuid + + await act(async () => root.render()) + + expect(groupHandle).toBeDefined() + expect(prevUUID).not.toBe(groupHandle!.uuid) + }) +}) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 821b027405..e6aec2d8a1 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -1,202 +1,96 @@ import * as React from 'react' import * as THREE from 'three' -import { - ReconcilerRoot, - createRoot, - act, - useFrame, - extend, - ReactThreeFiber, - useThree, - createPortal, -} from '../src/index' -import { UseBoundStore } from 'zustand' -import { privateKeys, RootState } from '../src/core/store' +import { ReconcilerRoot, createRoot, act, extend, ThreeElement } from '../src/index' import { suspend } from 'suspend-react' -type ComponentMesh = THREE.Mesh - -interface ObjectWithBackground extends THREE.Object3D { - background: THREE.Color -} +class CustomElement extends THREE.Object3D {} -/* This class is used for one of the tests */ -class HasObject3dMember extends THREE.Object3D { - public attachment?: THREE.Object3D = undefined +declare module '@react-three/fiber' { + interface ThreeElements { + customElement: ThreeElement + } } -/* This class is used for one of the tests */ -class HasObject3dMethods extends THREE.Object3D { - attachedObj3d?: THREE.Object3D - detachedObj3d?: THREE.Object3D +extend({ CustomElement }) - customAttach(obj3d: THREE.Object3D) { - this.attachedObj3d = obj3d - } +type ComponentMesh = THREE.Mesh - detach(obj3d: THREE.Object3D) { - this.detachedObj3d = obj3d - } -} +const expectToThrow = async (callback: () => any) => { + const error = console.error + console.error = jest.fn() -class MyColor extends THREE.Color { - constructor(col: number) { - super(col) + let thrown = false + try { + await callback() + } catch (_) { + thrown = true } -} - -extend({ HasObject3dMember, HasObject3dMethods }) -declare module '@react-three/fiber' { - interface ThreeElements { - hasObject3dMember: ReactThreeFiber.Node - hasObject3dMethods: ReactThreeFiber.Node - myColor: ReactThreeFiber.Node - } + expect(thrown).toBe(true) + expect(console.error).toBeCalled() + console.error = error } -beforeAll(() => { - Object.defineProperty(window, 'devicePixelRatio', { - configurable: true, - value: 2, - }) -}) - describe('renderer', () => { let root: ReconcilerRoot = null! beforeEach(() => (root = createRoot(document.createElement('canvas')))) afterEach(async () => act(async () => root.unmount())) - it('renders a simple component', async () => { - const Mesh = () => ( - - - - - ) - const store = await act(async () => root.render()) + it('should render empty JSX', async () => { + const store = await act(async () => root.render(null)) const { scene } = store.getState() - expect(scene.children[0].type).toEqual('Mesh') - expect((scene.children[0] as ComponentMesh).geometry.type).toEqual('BoxGeometry') - expect((scene.children[0] as ComponentMesh).material.type).toEqual('MeshBasicMaterial') - expect((scene.children[0] as THREE.Mesh).material.type).toEqual( - 'MeshBasicMaterial', - ) + expect(scene.children.length).toBe(0) }) - it('renders an empty scene', async () => { - const Empty = () => null - - const store = await act(async () => root.render()) + it('should render native elements', async () => { + const store = await act(async () => root.render()) const { scene } = store.getState() - expect(scene.type).toEqual('Scene') - expect(scene.children).toEqual([]) + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBeInstanceOf(THREE.Group) }) - it('can render a composite component', async () => { - const Child = () => ( - - - - - ) - - class Parent extends React.Component { - render() { - return ( - - - - - ) - } - } - - const store = await act(async () => root.render()) + it('should render extended elements', async () => { + const store = await act(async () => root.render()) const { scene } = store.getState() - const parent = scene.children[0] as ObjectWithBackground - expect(parent).toBeInstanceOf(THREE.Group) - expect(parent.background.getStyle()).toEqual('rgb(0,0,0)') - - const child = parent.children[0] as ComponentMesh - expect(child).toBeInstanceOf(THREE.Mesh) - expect(child.geometry).toBeInstanceOf(THREE.BoxGeometry) - expect(child.material).toBeInstanceOf(THREE.MeshBasicMaterial) + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBeInstanceOf(CustomElement) }) - it('renders some basics with an update', async () => { - let renders = 0 - - class Component extends React.PureComponent { - state = { pos: 3 } - - componentDidMount() { - this.setState({ pos: 7 }) - } - - render() { - renders++ - return ( - - - - - ) - } - } - - const Child = () => { - renders++ - return - } - - const Null = () => { - renders++ - return null - } + it('should render primitives', async () => { + const object = new THREE.Object3D() - const store = await act(async () => root.render()) + const store = await act(async () => root.render()) const { scene } = store.getState() - expect(scene.children[0].position.x).toEqual(7) - expect(renders).toBe(6) + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBe(object) }) - it('updates types & names', async () => { - const store = await act(async () => - root.render( - - - - - , - ), - ) - const { scene } = store.getState() - - const basic = scene.children[0] as ComponentMesh - expect(basic.material).toBeInstanceOf(THREE.MeshBasicMaterial) - expect(basic.material.name).toBe('basicMat') - expect(basic.material.color.toArray()).toStrictEqual([0, 0, 0]) + it('should go through lifecycle', async () => { + const lifecycle: string[] = [] - await act(async () => - root.render( - - - - - , - ), - ) + function Test() { + React.useInsertionEffect(() => void lifecycle.push('useInsertionEffect'), []) + React.useImperativeHandle(React.useRef(), () => void lifecycle.push('refCallback')) + React.useLayoutEffect(() => void lifecycle.push('useLayoutEffect'), []) + React.useEffect(() => void lifecycle.push('useEffect'), []) + lifecycle.push('render') + return void lifecycle.push('ref')} /> + } + await act(async () => root.render()) - const standard = scene.children[0] as ComponentMesh - expect(standard.material).toBeInstanceOf(THREE.MeshStandardMaterial) - expect(standard.material.name).toBe('standardMat') - expect(standard.material.color.toArray()).toStrictEqual([255, 255, 255]) + expect(lifecycle).toStrictEqual([ + 'render', + 'useInsertionEffect', + 'ref', + 'refCallback', + 'useLayoutEffect', + 'useEffect', + ]) }) it('should forward ref three object', async () => { @@ -226,387 +120,277 @@ describe('renderer', () => { expect(mutableRefSpecific.current).toBeInstanceOf(THREE.Mesh) }) - it('attaches children that use attach', async () => { - const store = await act(async () => - root.render( - - - , - ), + it('should handle children', async () => { + const Test = () => ( + + + ) + const store = await act(async () => root.render()) const { scene } = store.getState() - const object = scene.children[0] as HasObject3dMember - expect(object.attachment).toBeInstanceOf(THREE.Mesh) - expect(object.children.length).toBe(0) + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBeInstanceOf(THREE.Group) + expect(scene.children[0].children.length).toBe(1) + expect(scene.children[0].children[0]).toBeInstanceOf(THREE.Mesh) }) - describe('attaches children that use attachFns', () => { - it('attachFns with cleanup', async () => { - const store = await act(async () => - root.render( - - (parent.customAttach(self), () => parent.detach(self))} /> - , - ), - ) - const { scene } = store.getState() - - // Attach - const object = scene.children[0] as HasObject3dMethods - expect(object.attachedObj3d).toBeInstanceOf(THREE.Mesh) - expect(object.children.length).toBe(0) - - // Detach - expect(object.detachedObj3d).toBeUndefined() - await act(async () => root.render()) - expect(object.detachedObj3d).toBeInstanceOf(THREE.Mesh) - }) - }) + it('should handle attach', async () => { + const lifecycle: string[] = [] - it('does the full lifecycle', async () => { - const log: string[] = [] - class Log extends React.Component<{ name: string }> { - render() { - log.push('render ' + this.props.name) - return - } - componentDidMount() { - log.push('mount ' + this.props.name) - } - componentWillUnmount() { - log.push('unmount ' + this.props.name) - } + const Test = () => { + return ( + + + + + void lifecycle.push('mount')} + attach={() => (lifecycle.push('attach'), () => lifecycle.push('detach'))} + /> + + ) } - - await act(async () => root.render()) - await act(async () => root.unmount()) - - expect(log).toEqual(['render Foo', 'mount Foo', 'unmount Foo']) - }) - - it('will mount/unmount event handlers correctly', async () => { - let state: RootState = null! - let mounted = false - let attachEvents = false - - const EventfulComponent = () => (mounted ? void 0 : undefined} /> : null) - - // Test initial mount without events - mounted = true - await act(async () => { - state = root.render().getState() - }) - expect(state.internal.interaction.length).toBe(0) - - // Test initial mount with events - attachEvents = true - await act(async () => { - state = root.render().getState() - }) - expect(state.internal.interaction.length).not.toBe(0) - - // Test events update - attachEvents = false - await act(async () => { - state = root.render().getState() - }) - expect(state.internal.interaction.length).toBe(0) - - attachEvents = true - await act(async () => { - state = root.render().getState() - }) - expect(state.internal.interaction.length).not.toBe(0) - - // Test unmount with events - mounted = false - await act(async () => { - state = root.render().getState() - }) - expect(state.internal.interaction.length).toBe(0) - }) - - it('will create an identical instance when reconstructing', async () => { - const instances: { uuid: string; parentUUID?: string; childUUID?: string }[] = [] - - const object1 = new THREE.Group() - const object2 = new THREE.Group() - - const Test = ({ first }: { first?: boolean }) => ( - null}> - - - ) - - const store = await act(async () => root.render()) - const { scene, internal } = store.getState() - - instances.push({ - uuid: scene.children[0].uuid, - parentUUID: scene.children[0].parent?.uuid, - childUUID: scene.children[0].children[0]?.uuid, - }) - expect(scene.children[0]).toBe(object1) - - await act(async () => root.render()) - - instances.push({ - uuid: scene.children[0].uuid, - parentUUID: scene.children[0].parent?.uuid, - childUUID: scene.children[0].children[0]?.uuid, - }) - - const [oldInstance, newInstance] = instances - - // Swapped to new instance - expect(scene.children[0]).toBe(object2) - - // Preserves scene hierarchy - expect(oldInstance.parentUUID).toBe(newInstance.parentUUID) - expect(oldInstance.childUUID).toBe(newInstance.childUUID) - - // Rebinds events - expect(internal.interaction.length).not.toBe(0) - }) - - it('can swap primitives', async () => { - const o1 = new THREE.Group() - o1.add(new THREE.Group()) - const o2 = new THREE.Group() - - const Test = ({ n }: { n: number }) => ( - - - - ) - - const store = await act(async () => root.render()) + const store = await act(async () => root.render()) const { scene } = store.getState() - // Initial object is added with children and attachments - expect(scene.children[0]).toBe(o1) - expect(scene.children[0].children.length).toBe(1) - expect((scene.children[0] as any).test).toBeInstanceOf(THREE.Group) - - await act(async () => root.render()) - - // Swapped to object 2, does not copy old children, copies attachments - expect(scene.children[0]).toBe(o2) + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBeInstanceOf(THREE.Mesh) + // Handles geometry & material attach + expect((scene.children[0] as ComponentMesh).geometry).toBeInstanceOf(THREE.BoxGeometry) + expect((scene.children[0] as ComponentMesh).material).toBeInstanceOf(THREE.MeshStandardMaterial) + // Handles nested attach + expect(scene.children[0].userData.group).toBeInstanceOf(THREE.Group) + // attach bypasses scene-graph expect(scene.children[0].children.length).toBe(0) - expect((scene.children[0] as any).test).toBeInstanceOf(THREE.Group) + // attaches before presenting + expect(lifecycle).toStrictEqual(['attach', 'mount']) }) - it('will make an Orthographic Camera & set the position', async () => { - const store = await act(async () => - root.configure({ orthographic: true, camera: { position: [0, 0, 5] } }).render(), - ) - const { camera } = store.getState() - - expect(camera).toBeInstanceOf(THREE.OrthographicCamera) - expect(camera.position.z).toEqual(5) - }) - - it('should handle an performance changing functions', async () => { - let state: UseBoundStore = null! - await act(async () => { - state = root.configure({ dpr: [1, 2], performance: { min: 0.2 } }).render() - }) - - expect(state.getState().viewport.initialDpr).toEqual(2) - expect(state.getState().performance.min).toEqual(0.2) - expect(state.getState().performance.current).toEqual(1) - - await act(async () => { - state.getState().setDpr(0.1) - }) - - expect(state.getState().viewport.dpr).toEqual(0.1) - - jest.useFakeTimers() - - await act(async () => { - state.getState().performance.regress() - jest.advanceTimersByTime(100) - }) - - expect(state.getState().performance.current).toEqual(0.2) - - await act(async () => { - jest.advanceTimersByTime(200) - }) - - expect(state.getState().performance.current).toEqual(1) - - jest.useRealTimers() - }) - - it('should set PCFSoftShadowMap as the default shadow map', async () => { - const store = await act(async () => root.configure({ shadows: true }).render()) - const { gl } = store.getState() - - expect(gl.shadowMap.type).toBe(THREE.PCFSoftShadowMap) - }) - - it('should set tonemapping to ACESFilmicToneMapping and outputEncoding to sRGBEncoding if linear is false', async () => { - const store = await act(async () => root.configure({ linear: false }).render()) - const { gl } = store.getState() - - expect(gl.toneMapping).toBe(THREE.ACESFilmicToneMapping) - expect(gl.outputEncoding).toBe(THREE.sRGBEncoding) - }) - - it('should toggle render mode in xr', async () => { - let state: RootState = null! - - await act(async () => { - state = root.render().getState() - state.gl.xr.isPresenting = true - state.gl.xr.dispatchEvent({ type: 'sessionstart' }) - }) - - expect(state.gl.xr.enabled).toEqual(true) - - await act(async () => { - state.gl.xr.isPresenting = false - state.gl.xr.dispatchEvent({ type: 'sessionend' }) - }) - - expect(state.gl.xr.enabled).toEqual(false) - }) + it('should update props reactively', async () => { + const store = await act(async () => root.render()) + const { scene } = store.getState() + const group = scene.children[0] as THREE.Group - it('should respect frameloop="never" in xr', async () => { - let respected = true + // Initial + expect(group.name).toBe(new THREE.Group().name) - const Test = () => useFrame(() => (respected = false)) + // Set + await act(async () => root.render()) + expect(group.name).toBe('one') - await act(async () => { - const state = root - .configure({ frameloop: 'never' }) - .render() - .getState() - state.gl.xr.isPresenting = true - state.gl.xr.dispatchEvent({ type: 'sessionstart' }) - }) + // Update + await act(async () => root.render()) + expect(group.name).toBe('two') - expect(respected).toEqual(true) + // Unset + await act(async () => root.render()) + expect(group.name).toBe(new THREE.Group().name) }) - it('will render components that are extended', async () => { - extend({ MyColor }) + it('should handle event props reactively', async () => { + const store = await act(async () => root.render()) + const { scene, internal } = store.getState() + const mesh = scene.children[0] as ComponentMesh + mesh.name = 'current' - const store = await act(async () => root.render()) - const { scene } = store.getState() + // Initial + expect(internal.interaction.length).toBe(0) - const { myColor } = scene as THREE.Scene & { myColor: MyColor } - expect(myColor).toBeInstanceOf(MyColor) - expect(myColor.toArray()).toStrictEqual([0, 0, 1]) - }) + // Set + await act(async () => root.render( void 0} />)) + expect(internal.interaction.length).toBe(1) + expect(internal.interaction).toStrictEqual([mesh]) - it('should set renderer props via gl prop', async () => { - const store = await act(async () => root.configure({ gl: { physicallyCorrectLights: true } }).render()) - const { gl } = store.getState() + // Update + await act(async () => root.render( void 0} />)) + expect(internal.interaction.length).toBe(1) + expect(internal.interaction).toStrictEqual([mesh]) - expect(gl.physicallyCorrectLights).toBe(true) + // Unset + await act(async () => root.render()) + expect(internal.interaction.length).toBe(0) }) - it('should set a renderer via gl callback', async () => { - class Renderer extends THREE.WebGLRenderer {} - - const store = await act(async () => root.configure({ gl: (canvas) => new Renderer({ canvas }) }).render()) - const { gl } = store.getState() + it('should handle the args prop reactively', async () => { + const ref = React.createRef() + const child = React.createRef() + const attachedChild = React.createRef() - expect(gl instanceof Renderer).toBe(true) - }) - - it('should respect color management preferences via gl', async () => { - const store = await act(async () => - root - .configure({ gl: { outputEncoding: THREE.LinearEncoding, toneMapping: THREE.NoToneMapping } }) - .render(), + const Test = (props: JSX.IntrinsicElements['mesh']) => ( + + + + ) - const { gl } = store.getState() - expect(gl.outputEncoding).toBe(THREE.LinearEncoding) - expect(gl.toneMapping).toBe(THREE.NoToneMapping) - - await act(async () => root.configure({ flat: true, linear: true }).render()) - expect(gl.outputEncoding).toBe(THREE.LinearEncoding) - expect(gl.toneMapping).toBe(THREE.NoToneMapping) - }) + // Initial + await act(async () => root.render()) + expect(ref.current!.geometry).toBeInstanceOf(THREE.BufferGeometry) + expect(ref.current!.geometry).not.toBeInstanceOf(THREE.BoxGeometry) + expect(ref.current!.material).toBeInstanceOf(THREE.Material) + expect(ref.current!.material).not.toBeInstanceOf(THREE.MeshStandardMaterial) + expect(ref.current!.children[0]).toBe(child.current) + expect(ref.current!.userData.attach).toBe(attachedChild.current) + + // Throw on non-array value + await expectToThrow( + // @ts-expect-error + async () => await act(async () => root.render()), + ) - it('should respect legacy prop', async () => { - await act(async () => root.configure({ legacy: true }).render()) - expect((THREE as any).ColorManagement.legacyMode).toBe(true) + // Set + const geometry1 = new THREE.BoxGeometry() + const material1 = new THREE.MeshStandardMaterial() + await act(async () => root.render()) + expect(ref.current!.geometry).toBe(geometry1) + expect(ref.current!.material).toBe(material1) + expect(ref.current!.children[0]).toBe(child.current) + expect(ref.current!.userData.attach).toBe(attachedChild.current) - await act(async () => root.configure({ legacy: false }).render()) - expect((THREE as any).ColorManagement.legacyMode).toBe(false) + // Update + const geometry2 = new THREE.BoxGeometry() + const material2 = new THREE.MeshStandardMaterial() + await act(async () => root.render()) + expect(ref.current!.geometry).toBe(geometry2) + expect(ref.current!.material).toBe(material2) + expect(ref.current!.children[0]).toBe(child.current) + expect(ref.current!.userData.attach).toBe(attachedChild.current) + + // Unset + await act(async () => root.render()) + expect(ref.current!.geometry).toBeInstanceOf(THREE.BufferGeometry) + expect(ref.current!.geometry).not.toBeInstanceOf(THREE.BoxGeometry) + expect(ref.current!.material).toBeInstanceOf(THREE.Material) + expect(ref.current!.material).not.toBeInstanceOf(THREE.MeshStandardMaterial) + expect(ref.current!.children[0]).toBe(child.current) + expect(ref.current!.userData.attach).toBe(attachedChild.current) }) - it('can handle createPortal', async () => { - const scene = new THREE.Scene() + it('should handle the object prop reactively', async () => { + const ref = React.createRef() + const child = React.createRef() + const attachedChild = React.createRef() - let state: RootState = null! - let portalState: RootState = null! - - const Normal = () => { - const three = useThree() - state = three - - return - } - - const Portal = () => { - const three = useThree() - portalState = three + const Test = (props: JSX.IntrinsicElements['primitive']) => ( + + + + + ) - return - } + const object1 = new THREE.Object3D() + const child1 = new THREE.Object3D() + object1.add(child1) - await act(async () => { - root.render( - <> - - {createPortal(, scene, { scene })} - , - ) - }) + const object2 = new THREE.Object3D() + const child2 = new THREE.Object3D() + object2.add(child2) - // Renders into portal target - expect(scene.children.length).not.toBe(0) + // Initial + await act(async () => root.render()) + expect(ref.current).toBe(object1) + expect(ref.current!.children).toStrictEqual([child1, child.current]) + expect(ref.current!.userData.attach).toBe(attachedChild.current) - // Creates an isolated state enclave - expect(state.scene).not.toBe(scene) - expect(portalState.scene).toBe(scene) + // Throw on undefined + await expectToThrow( + // @ts-expect-error + async () => await act(async () => root.render()), + ) - // Preserves internal keys - const overwrittenKeys = ['get', 'set', 'events', 'size', 'viewport'] - const respectedKeys = privateKeys.filter((key) => overwrittenKeys.includes(key) || state[key] === portalState[key]) - expect(respectedKeys).toStrictEqual(privateKeys) + // Update + await act(async () => root.render()) + expect(ref.current).toBe(object2) + expect(ref.current!.children).toStrictEqual([child2, child.current]) + expect(ref.current!.userData.attach).toBe(attachedChild.current) + + // Revert + await act(async () => root.render()) + expect(ref.current).toBe(object1) + expect(ref.current!.children).toStrictEqual([child1, child.current]) + expect(ref.current!.userData.attach).toBe(attachedChild.current) }) - it('can handle createPortal on unmounted container', async () => { - let groupHandle!: THREE.Group | null - function Test(props: any) { - const [group, setGroup] = React.useState(null) - groupHandle = group - - return ( - - {group && createPortal(, group)} - - ) - } - - await act(async () => root.render()) + it('should handle unmount', async () => { + const dispose = jest.fn() + const childDispose = jest.fn() + const attachDispose = jest.fn() + const flagDispose = jest.fn() + + const attach = jest.fn() + const detach = jest.fn() + + const object = Object.assign(new THREE.Object3D(), { dispose: jest.fn() }) + const objectExternal = Object.assign(new THREE.Object3D(), { dispose: jest.fn() }) + object.add(objectExternal) + + const disposeDeclarativePrimitive = jest.fn() + + const Test = (props: JSX.IntrinsicElements['mesh']) => ( + { + if (!self) return + self.dispose = dispose + }} + onClick={() => void 0}> + { + if (!self) return + self.dispose = childDispose + }} + /> + { + if (!self) return + self.dispose = attachDispose + }} + attach={() => (attach(), detach)} + /> + { + if (!self) return + self.dispose = flagDispose + }} + /> + + { + if (!self) return + self.dispose = disposeDeclarativePrimitive + }} + /> + + + ) - expect(groupHandle).toBeDefined() - const prevUUID = groupHandle!.uuid + const store = await act(async () => root.render()) + await act(async () => root.render(null)) - await act(async () => root.render()) + const { scene, internal } = store.getState() - expect(groupHandle).toBeDefined() - expect(prevUUID).not.toBe(groupHandle!.uuid) + // Cleans up scene-graph + expect(scene.children.length).toBe(0) + // Removes events + expect(internal.interaction.length).toBe(0) + // Calls dispose on top-level instance + expect(dispose).toBeCalled() + // Also disposes of children + expect(childDispose).toBeCalled() + // Disposes of attached children + expect(attachDispose).toBeCalled() + // Properly detaches attached children + expect(attach).toBeCalledTimes(1) + expect(detach).toBeCalledTimes(1) + // Respects dispose={null} + expect(flagDispose).not.toBeCalled() + // Does not dispose of primitives + expect(object.dispose).not.toBeCalled() + // Only disposes of declarative primitive children + expect(objectExternal.dispose).not.toBeCalled() + expect(disposeDeclarativePrimitive).toBeCalled() }) it('should gracefully handle text', async () => { @@ -626,4 +410,49 @@ describe('renderer', () => { expect(console.warn).toHaveBeenCalled() console.warn = warn }) + + it('should gracefully interrupt when building up the tree', async () => { + const calls: string[] = [] + let lastAttached!: string | undefined + let lastMounted!: string | undefined + + function SuspenseComponent({ reconstruct = false }: { reconstruct?: boolean }) { + suspend(async (reconstruct) => reconstruct, [reconstruct]) + + return ( + + void (lastMounted = self?.uuid)} + attach={(_, self) => { + calls.push('attach') + lastAttached = self.uuid + return () => calls.push('detach') + }} + /> + + ) + } + + function Test(props: { reconstruct?: boolean }) { + React.useLayoutEffect(() => void calls.push('useLayoutEffect'), []) + + return ( + + + + ) + } + + await act(async () => root.render()) + + // Should complete tree before layout-effects fire + expect(calls).toStrictEqual(['attach', 'useLayoutEffect']) + expect(lastAttached).toBe(lastMounted) + + await act(async () => root.render()) + + expect(calls).toStrictEqual(['attach', 'useLayoutEffect', 'detach', 'attach']) + expect(lastAttached).toBe(lastMounted) + }) }) diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 0e82a123cc..2a10d8744c 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -1,4 +1,28 @@ -import { is } from '../src/core/utils' +import * as THREE from 'three' +import { UseBoundStore } from 'zustand' +import { RootState, Instance } from '../src' +import { + is, + dispose, + REACT_INTERNAL_PROPS, + getInstanceProps, + prepare, + resolve, + attach, + detach, + RESERVED_PROPS, + diffProps, + applyProps, + updateCamera, +} from '../src/core/utils' + +// Mocks a Zustand store +const storeMock: UseBoundStore = Object.assign(() => null!, { + getState: () => null!, + setState() {}, + subscribe: () => () => {}, + destroy() {}, +}) describe('is', () => { const myFunc = () => null @@ -97,3 +121,317 @@ describe('is', () => { expect(is.equ([1, 2], [1, 2, 3], { strict: false })).toBe(true) }) }) + +describe('dispose', () => { + it('should dispose of objects and their properties', () => { + const mesh = Object.assign(new THREE.Mesh(), { dispose: jest.fn() }) + mesh.material.dispose = jest.fn() + mesh.geometry.dispose = jest.fn() + + dispose(mesh) + expect(mesh.dispose).toBeCalled() + expect(mesh.material.dispose).toBeCalled() + expect(mesh.geometry.dispose).toBeCalled() + }) + + it('should not dispose of a THREE.Scene', () => { + const scene = Object.assign(new THREE.Scene(), { dispose: jest.fn() }) + + dispose(scene) + expect(scene.dispose).not.toBeCalled() + + const disposable = { dispose: jest.fn(), scene } + dispose(disposable) + expect(disposable.dispose).toBeCalled() + expect(disposable.scene.dispose).not.toBeCalled() + }) +}) + +describe('getInstanceProps', () => { + it('should filter internal props without accessing them', () => { + const get = jest.fn() + const set = jest.fn() + + const props = { foo: true } + const filtered = getInstanceProps( + REACT_INTERNAL_PROPS.reduce((acc, key) => ({ ...acc, [key]: { get, set } }), props), + ) + + expect(filtered).toStrictEqual(props) + expect(get).not.toBeCalled() + expect(set).not.toBeCalled() + }) +}) + +describe('prepare', () => { + it('should create an instance descriptor', () => { + const object = new THREE.Object3D() + const instance = prepare(object, storeMock, 'object3D', { name: 'object' }) + + expect(instance.root).toBe(storeMock) + expect(instance.type).toBe('object3D') + expect(instance.props.name).toBe('object') + expect(instance.object).toBe(object) + expect((object as Instance['object']).__r3f).toBe(instance) + }) + + it('should not overwrite descriptors', () => { + const containerDesc = {} + const container = { __r3f: containerDesc } + + const instance = prepare(container, storeMock, 'container', {}) + expect(container.__r3f).toBe(containerDesc) + expect(instance).toBe(containerDesc) + }) +}) + +describe('resolve', () => { + it('should resolve pierced props', () => { + const object = { foo: { bar: 1 } } + const { root, key, target } = resolve(object, 'foo-bar') + + expect(root).toBe(object['foo']) + expect(key).toBe('bar') + expect(target).toBe(root[key]) + }) + + it('should switch roots for atomic targets', () => { + const bar = new THREE.Vector3() + const object = { foo: { bar } } + const { root, key, target } = resolve(object, 'foo-bar') + + expect(root).toBe(object) + expect(key).toBe('bar') + expect(target).toBe(bar) + }) +}) + +describe('attach / detach', () => { + it('should attach & detach using string values', () => { + const parent = prepare({ prop: null }, storeMock, '', {}) + const child = prepare({}, storeMock, '', { attach: 'prop' }) + + attach(parent, child) + expect(parent.object.prop).toBe(child.object) + expect(child.previousAttach).toBe(null) + + detach(parent, child) + expect(parent.object.prop).toBe(null) + expect(child.previousAttach).toBe(undefined) + }) + + it('should attach & detach using attachFns', () => { + const mount = jest.fn() + const unmount = jest.fn() + + const parent = prepare({}, storeMock, '', {}) + const child = prepare({}, storeMock, '', { attach: () => (mount(), unmount) }) + + attach(parent, child) + expect(mount).toBeCalledTimes(1) + expect(unmount).toBeCalledTimes(0) + expect(child.previousAttach).toBe(unmount) + + detach(parent, child) + expect(mount).toBeCalledTimes(1) + expect(unmount).toBeCalledTimes(1) + expect(child.previousAttach).toBe(undefined) + }) + + it('should create array when using array-index syntax', () => { + const parent = prepare({ prop: null }, storeMock, '', {}) + const child = prepare({}, storeMock, '', { attach: 'prop-0' }) + + attach(parent, child) + expect(parent.object.prop).toStrictEqual([child.object]) + expect(child.previousAttach).toBe(undefined) + + detach(parent, child) + expect((parent.object.prop as unknown as Array).length).toBe(1) + expect((parent.object.prop as unknown as Array)[0]).toBe(undefined) + expect(child.previousAttach).toBe(undefined) + }) +}) + +describe('diffProps', () => { + it('should filter changed props', () => { + const instance = prepare({}, storeMock, '', { foo: true }) + const newProps = { foo: true, bar: false } + + const filtered = diffProps(instance, newProps) + expect(filtered).toStrictEqual({ bar: false }) + }) + + it('should pick removed props for HMR', () => { + const instance = prepare(new THREE.Object3D(), storeMock, '', { position: [0, 0, 1] }) + const newProps = {} + + const filtered = diffProps(instance, newProps, true) + expect(filtered).toStrictEqual({ position: new THREE.Object3D().position }) + }) + + it('should reset removed props for HMR', () => { + class Target extends THREE.Object3D { + constructor(x = 0, y = 0, z = 0) { + super() + this.position.set(x, y, z) + } + } + + const target = new Target() + const instance = prepare(target, storeMock, '', { position: 10 }) + + // Recreate from scratch + let filtered = diffProps(instance, {}, true) + expect((filtered.position as THREE.Vector3).toArray()).toStrictEqual([0, 0, 0]) + + // Recreate from instance args + instance.props = { args: [1, 2, 3], position: 10 } + filtered = diffProps(instance, {}, true) + expect((filtered.position as THREE.Vector3).toArray()).toStrictEqual([1, 2, 3]) + }) + + it('should filter reserved props without accessing them', () => { + const get = jest.fn() + const set = jest.fn() + + const props = { foo: true } + const filtered = diffProps( + prepare({}, storeMock, '', {}), + RESERVED_PROPS.reduce((acc, key) => ({ ...acc, [key]: { get, set } }), props), + ) + + expect(filtered).toStrictEqual(props) + expect(get).not.toBeCalled() + expect(set).not.toBeCalled() + }) +}) + +describe('applyProps', () => { + it('should apply props to foreign objects', () => { + const target = new THREE.Object3D() + expect(() => applyProps(target, {})).not.toThrow() + }) + + it('should filter reserved props without accessing them', () => { + const get = jest.fn() + const set = jest.fn() + + const props = { foo: true } + const target = {} + applyProps( + target, + RESERVED_PROPS.reduce((acc, key) => ({ ...acc, [key]: { get, set } }), props), + ) + + expect(target).toStrictEqual(props) + expect(get).not.toBeCalled() + expect(set).not.toBeCalled() + }) + + it('should overwrite non-atomic properties', () => { + const foo = { value: true } + const target = { foo } + applyProps(target, { foo: { value: false } }) + + expect(target.foo).not.toBe(foo) + expect(target.foo.value).toBe(false) + }) + + it('should prefer to copy from external props', async () => { + const color = new THREE.Color() + color.copy = jest.fn() + + const target = { color, layer: new THREE.Layers() } + + // Same constructor, copy + applyProps(target, { color: new THREE.Color() }) + expect(target.color).toBeInstanceOf(THREE.Color) + expect(color.copy).toHaveBeenCalledTimes(1) + + // Same constructor, Layers + const layer = new THREE.Layers() + layer.mask = 5 + applyProps(target, { layer }) + expect(target.layer).toBeInstanceOf(THREE.Layers) + expect(target.layer.mask).toBe(layer.mask) + + // Different constructor, overwrite + applyProps(target, { color: new THREE.Vector3() }) + expect(target.color).toBeInstanceOf(THREE.Vector3) + expect(color.copy).toHaveBeenCalledTimes(1) + }) + + it('should prefer to set when props are an array', async () => { + const target = new THREE.Object3D() + applyProps(target, { position: [1, 2, 3] }) + + expect(target.position.toArray()).toStrictEqual([1, 2, 3]) + }) + + it('should set with scalar shorthand where applicable', async () => { + // Vector3#setScalar + const target = new THREE.Object3D() + applyProps(target, { scale: 5 }) + expect(target.scale.toArray()).toStrictEqual([5, 5, 5]) + + // Color#set + const material = new THREE.MeshBasicMaterial() + applyProps(material, { color: 0x000000 }) + expect(material.color.getHex()).toBe(0x000000) + + // No-op on undefined + const mesh = new THREE.Mesh() + applyProps(mesh, { position: undefined }) + expect(mesh.position.toArray()).toStrictEqual([0, 0, 0]) + }) + + it('should pierce into nested properties', () => { + const target = new THREE.Mesh() + applyProps(target, { 'material-color': 0x000000 }) + + expect(target.material.color.getHex()).toBe(0x000000) + }) +}) + +describe('updateCamera', () => { + it('updates camera matrices', () => { + const size = { width: 1280, height: 800, left: 0, top: 0 } + + const perspective = new THREE.PerspectiveCamera() + perspective.updateProjectionMatrix = jest.fn() + perspective.updateMatrixWorld = jest.fn() + updateCamera(perspective, size) + expect(perspective.updateProjectionMatrix).toBeCalled() + expect(perspective.updateMatrixWorld).toBeCalled() + expect(perspective.projectionMatrix.toArray()).toMatchSnapshot() + expect(perspective.matrixWorld.toArray()).toMatchSnapshot() + + const orthographic = new THREE.OrthographicCamera() + orthographic.updateProjectionMatrix = jest.fn() + orthographic.updateMatrixWorld = jest.fn() + updateCamera(orthographic, size) + expect(orthographic.updateProjectionMatrix).toBeCalled() + expect(orthographic.updateMatrixWorld).toBeCalled() + expect(orthographic.projectionMatrix.toArray()).toMatchSnapshot() + expect(orthographic.matrixWorld.toArray()).toMatchSnapshot() + }) + + it('respects camera.manual', () => { + const size = { width: 0, height: 0, left: 0, top: 0 } + + const perspective = Object.assign(new THREE.PerspectiveCamera(), { manual: true }) + perspective.updateProjectionMatrix = jest.fn() + perspective.updateMatrixWorld = jest.fn() + updateCamera(perspective, size) + expect(perspective.updateProjectionMatrix).not.toBeCalled() + expect(perspective.updateMatrixWorld).not.toBeCalled() + + const orthographic = Object.assign(new THREE.OrthographicCamera(), { manual: true }) + orthographic.updateProjectionMatrix = jest.fn() + orthographic.updateMatrixWorld = jest.fn() + updateCamera(orthographic, size) + expect(orthographic.updateProjectionMatrix).not.toBeCalled() + expect(orthographic.updateMatrixWorld).not.toBeCalled() + }) +}) diff --git a/packages/shared/setupTests.ts b/packages/shared/setupTests.ts index 6c1d564107..f42e611323 100644 --- a/packages/shared/setupTests.ts +++ b/packages/shared/setupTests.ts @@ -11,7 +11,10 @@ declare global { global.IS_REACT_ACT_ENVIRONMENT = true // Mock scheduler to test React features -jest.mock('scheduler', () => require('scheduler/unstable_mock')) +jest.mock('scheduler', () => ({ + ...jest.requireActual('scheduler/unstable_mock'), + unstable_scheduleCallback: (_: any, callback: () => void) => callback(), +})) // PointerEvent is not in JSDOM // https://github.com/jsdom/jsdom/pull/2666#issuecomment-691216178 @@ -57,4 +60,4 @@ function getContext(contextId: string): RenderingContext | null { HTMLCanvasElement.prototype.getContext = getContext // Extend catalogue for render API in tests -extend(THREE) +extend(THREE as any) diff --git a/packages/test-renderer/src/__tests__/RTTR.core.test.tsx b/packages/test-renderer/src/__tests__/RTTR.core.test.tsx index f8354422d7..012b50b376 100644 --- a/packages/test-renderer/src/__tests__/RTTR.core.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.core.test.tsx @@ -29,7 +29,7 @@ describe('ReactThreeTestRenderer Core', () => { const [name, setName] = React.useState() React.useLayoutEffect(() => { - ;(React as any).startTransition(() => void setName('mesh')) + React.startTransition(() => void setName('mesh')) }) return ( @@ -82,19 +82,7 @@ describe('ReactThreeTestRenderer Core', () => { const renderer = await ReactThreeTestRenderer.create() - expect(renderer.toGraph()).toEqual([ - { - type: 'Group', - name: '', - children: [ - { - type: 'Mesh', - name: '', - children: [], - }, - ], - }, - ]) + expect(renderer.toGraph()).toMatchSnapshot() }) it('renders some basics with an update', async () => { @@ -167,7 +155,7 @@ describe('ReactThreeTestRenderer Core', () => { }) it('exposes the instance', async () => { - class Mesh extends React.PureComponent { + class Instance extends React.PureComponent { state = { standardMat: false } handleStandard() { @@ -184,51 +172,17 @@ describe('ReactThreeTestRenderer Core', () => { } } - const renderer = await ReactThreeTestRenderer.create() - - expect(renderer.toTree()).toEqual([ - { - type: 'mesh', - props: { - args: [], - }, - children: [ - { type: 'boxGeometry', props: { args: [2, 2] }, children: [] }, - { - type: 'meshBasicMaterial', - props: { - args: [], - }, - children: [], - }, - ], - }, - ]) + const renderer = await ReactThreeTestRenderer.create() + + expect(renderer.toTree()).toMatchSnapshot() - const instance = renderer.getInstance() as Mesh + const instance = renderer.getInstance() as Instance await ReactThreeTestRenderer.act(async () => { instance.handleStandard() }) - expect(renderer.toTree()).toEqual([ - { - type: 'mesh', - props: { - args: [], - }, - children: [ - { type: 'boxGeometry', props: { args: [2, 2] }, children: [] }, - { - type: 'meshStandardMaterial', - props: { - args: [], - }, - children: [], - }, - ], - }, - ]) + expect(renderer.toTree()).toMatchSnapshot() }) it('updates children', async () => { @@ -316,15 +270,7 @@ describe('ReactThreeTestRenderer Core', () => { ) const renderer = await ReactThreeTestRenderer.create() - expect(renderer.toTree()).toEqual([ - { - type: 'group', - props: { - args: [], - }, - children: [], - }, - ]) + expect(renderer.toTree()).toMatchSnapshot() }) it('correctly builds a tree', async () => { diff --git a/packages/test-renderer/src/__tests__/RTTR.events.test.tsx b/packages/test-renderer/src/__tests__/RTTR.events.test.tsx index 01b31b9bc6..c2254c799a 100644 --- a/packages/test-renderer/src/__tests__/RTTR.events.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.events.test.tsx @@ -50,8 +50,13 @@ describe('ReactThreeTestRenderer Events', () => { const { scene, fireEvent } = await ReactThreeTestRenderer.create() - expect(async () => await fireEvent(scene.children[0], 'onPointerUp')).not.toThrow() + const warn = console.warn.bind(console) + console.warn = jest.fn() + expect(async () => await fireEvent(scene.children[0], 'onPointerUp')).not.toThrow() + expect(console.warn).toBeCalled() expect(handlePointerDown).not.toHaveBeenCalled() + + console.warn = warn }) }) diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index bc4b647a4b..6832a2d939 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -1,9 +1,53 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`ReactThreeTestRenderer Core can render a composite component & correctly build simple graph 1`] = ` +Array [ + Object { + "children": Array [ + Object { + "children": Array [], + "name": "", + "type": undefined, + }, + Object { + "children": Array [ + Object { + "children": Array [], + "name": "", + "type": "BoxGeometry", + }, + Object { + "children": Array [], + "name": "", + "type": "MeshBasicMaterial", + }, + ], + "name": "", + "type": "Mesh", + }, + ], + "name": "", + "type": "Group", + }, +] +`; + exports[`ReactThreeTestRenderer Core correctly builds a tree 1`] = ` Array [ Object { "children": Array [ + Object { + "children": Array [], + "props": Object { + "args": Array [ + 0, + 0, + 255, + ], + "attach": "background", + }, + "type": "color", + }, Object { "children": Array [ Object { @@ -11,7 +55,6 @@ Array [ Object { "children": Array [], "props": Object { - "args": Array [], "array": Float32Array [ -1, -1, @@ -32,6 +75,7 @@ Array [ -1, 1, ], + "attach": "attributes-position", "count": 6, "itemSize": 3, }, @@ -39,38 +83,24 @@ Array [ }, ], "props": Object { - "args": Array [], + "attach": "geometry", }, "type": "bufferGeometry", }, Object { "children": Array [], "props": Object { - "args": Array [], + "attach": "material", "color": "hotpink", }, "type": "meshBasicMaterial", }, ], - "props": Object { - "args": Array [], - }, + "props": Object {}, "type": "mesh", }, - Object { - "children": Array [], - "props": Object { - "args": Array [ - 0, - 0, - 255, - ], - }, - "type": "color", - }, ], "props": Object { - "args": Array [], "position": Array [ 1, 2, @@ -82,6 +112,64 @@ Array [ ] `; +exports[`ReactThreeTestRenderer Core exposes the instance 1`] = ` +Array [ + Object { + "children": Array [ + Object { + "children": Array [], + "props": Object { + "args": Array [ + 2, + 2, + ], + "attach": "geometry", + }, + "type": "boxGeometry", + }, + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshBasicMaterial", + }, + ], + "props": Object {}, + "type": "mesh", + }, +] +`; + +exports[`ReactThreeTestRenderer Core exposes the instance 2`] = ` +Array [ + Object { + "children": Array [ + Object { + "children": Array [], + "props": Object { + "args": Array [ + 2, + 2, + ], + "attach": "geometry", + }, + "type": "boxGeometry", + }, + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshStandardMaterial", + }, + ], + "props": Object {}, + "type": "mesh", + }, +] +`; + exports[`ReactThreeTestRenderer Core toTree() handles complicated tree of fragments 1`] = ` Array [ Object { @@ -94,13 +182,12 @@ Array [ 0, 0, ], + "attach": "background", }, "type": "color", }, ], - "props": Object { - "args": Array [], - }, + "props": Object {}, "type": "group", }, Object { @@ -113,13 +200,12 @@ Array [ 0, 255, ], + "attach": "background", }, "type": "color", }, ], - "props": Object { - "args": Array [], - }, + "props": Object {}, "type": "group", }, Object { @@ -132,13 +218,22 @@ Array [ 0, 0, ], + "attach": "background", }, "type": "color", }, ], - "props": Object { - "args": Array [], - }, + "props": Object {}, + "type": "group", + }, +] +`; + +exports[`ReactThreeTestRenderer Core toTree() handles nested Fragments 1`] = ` +Array [ + Object { + "children": Array [], + "props": Object {}, "type": "group", }, ] @@ -157,19 +252,19 @@ Array [ 2, 2, ], + "attach": "geometry", }, "type": "boxGeometry", }, Object { "children": Array [], "props": Object { - "args": Array [], + "attach": "material", }, "type": "meshBasicMaterial", }, ], "props": Object { - "args": Array [], "position-z": 12, }, "type": "mesh", @@ -183,19 +278,19 @@ Array [ 4, 4, ], + "attach": "geometry", }, "type": "boxGeometry", }, Object { "children": Array [], "props": Object { - "args": Array [], + "attach": "material", }, "type": "meshBasicMaterial", }, ], "props": Object { - "args": Array [], "position-y": 12, }, "type": "mesh", @@ -209,27 +304,25 @@ Array [ 6, 6, ], + "attach": "geometry", }, "type": "boxGeometry", }, Object { "children": Array [], "props": Object { - "args": Array [], + "attach": "material", }, "type": "meshBasicMaterial", }, ], "props": Object { - "args": Array [], "position-x": 12, }, "type": "mesh", }, ], - "props": Object { - "args": Array [], - }, + "props": Object {}, "type": "group", }, ] @@ -248,19 +341,19 @@ Array [ 6, 6, ], + "attach": "geometry", }, "type": "boxGeometry", }, Object { "children": Array [], "props": Object { - "args": Array [], + "attach": "material", }, "type": "meshBasicMaterial", }, ], "props": Object { - "args": Array [], "rotation-x": 1, }, "type": "mesh", @@ -274,19 +367,19 @@ Array [ 4, 4, ], + "attach": "geometry", }, "type": "boxGeometry", }, Object { "children": Array [], "props": Object { - "args": Array [], + "attach": "material", }, "type": "meshBasicMaterial", }, ], "props": Object { - "args": Array [], "position-y": 12, }, "type": "mesh", @@ -300,27 +393,25 @@ Array [ 2, 2, ], + "attach": "geometry", }, "type": "boxGeometry", }, Object { "children": Array [], "props": Object { - "args": Array [], + "attach": "material", }, "type": "meshBasicMaterial", }, ], "props": Object { - "args": Array [], "position-x": 12, }, "type": "mesh", }, ], - "props": Object { - "args": Array [], - }, + "props": Object {}, "type": "group", }, ] diff --git a/packages/test-renderer/src/__tests__/is.test.ts b/packages/test-renderer/src/__tests__/is.test.ts deleted file mode 100644 index ce3ea3f0ba..0000000000 --- a/packages/test-renderer/src/__tests__/is.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { is } from '../helpers/is' - -describe('is', () => { - const myFunc = () => { - return null - } - const myObj = { - myProp: 'test-prop', - } - const myStr = 'test-string' - const myNum = 1 - const myUnd = undefined - const myArr = [1, 2, 3] - - it('should tell me if something IS a function', () => { - expect(is.fun(myFunc)).toBe(true) - - expect(is.fun(myObj)).toBe(false) - expect(is.fun(myStr)).toBe(false) - expect(is.fun(myNum)).toBe(false) - expect(is.fun(myUnd)).toBe(false) - expect(is.fun(myArr)).toBe(false) - }) - it('should tell me if something IS an object', () => { - expect(is.obj(myFunc)).toBe(false) - - expect(is.obj(myObj)).toBe(true) - - expect(is.obj(myStr)).toBe(false) - expect(is.obj(myNum)).toBe(false) - expect(is.obj(myUnd)).toBe(false) - expect(is.obj(myArr)).toBe(false) - }) - it('should tell me if something IS a string', () => { - expect(is.str(myFunc)).toBe(false) - expect(is.str(myObj)).toBe(false) - - expect(is.str(myStr)).toBe(true) - - expect(is.str(myNum)).toBe(false) - expect(is.str(myUnd)).toBe(false) - expect(is.str(myArr)).toBe(false) - }) - it('should tell me if something IS a number', () => { - expect(is.num(myFunc)).toBe(false) - expect(is.num(myObj)).toBe(false) - expect(is.num(myStr)).toBe(false) - - expect(is.num(myNum)).toBe(true) - - expect(is.num(myUnd)).toBe(false) - expect(is.num(myArr)).toBe(false) - }) - it('should tell me if something IS undefined', () => { - expect(is.und(myFunc)).toBe(false) - expect(is.und(myObj)).toBe(false) - expect(is.und(myStr)).toBe(false) - expect(is.und(myNum)).toBe(false) - - expect(is.und(myUnd)).toBe(true) - - expect(is.und(myArr)).toBe(false) - }) - it('should tell me if something is an array', () => { - expect(is.arr(myFunc)).toBe(false) - expect(is.arr(myObj)).toBe(false) - expect(is.arr(myStr)).toBe(false) - expect(is.arr(myNum)).toBe(false) - expect(is.arr(myUnd)).toBe(false) - - expect(is.arr(myArr)).toBe(true) - }) - it('should tell me if something is equal', () => { - expect(is.equ([], '')).toBe(false) - - expect(is.equ('hello', 'hello')).toBe(true) - expect(is.equ(1, 1)).toBe(true) - expect(is.equ(myObj, myObj)).toBe(true) - expect(is.equ(myArr, myArr)).toBe(true) - expect(is.equ([1, 2, 3], [1, 2, 3])).toBe(true) - }) -}) diff --git a/packages/test-renderer/src/createTestInstance.ts b/packages/test-renderer/src/createTestInstance.ts index 69a4b3b28c..d47cdf6d09 100644 --- a/packages/test-renderer/src/createTestInstance.ts +++ b/packages/test-renderer/src/createTestInstance.ts @@ -1,30 +1,35 @@ -import { Object3D } from 'three' +import type * as THREE from 'three' +import type { Instance } from '@react-three/fiber' -import type { MockInstance, MockScene, Obj, TestInstanceChildOpts } from './types/internal' +import type { Obj, TestInstanceChildOpts } from './types/internal' import { expectOne, matchProps, findAll } from './helpers/testInstance' -export class ReactThreeTestInstance { - _fiber: MockInstance +export class ReactThreeTestInstance { + _fiber: Instance - constructor(fiber: MockInstance | MockScene) { - this._fiber = fiber as MockInstance + constructor(fiber: Instance) { + this._fiber = fiber } - public get instance(): Object3D { - return this._fiber as unknown as TInstance + public get fiber(): Instance { + return this._fiber + } + + public get instance(): TObject { + return this._fiber.object } public get type(): string { - return this._fiber.type + return this._fiber.object.type } public get props(): Obj { - return this._fiber.__r3f.memoizedProps + return this._fiber.props } public get parent(): ReactThreeTestInstance | null { - const parent = this._fiber.__r3f.parent + const parent = this._fiber.parent if (parent !== null) { return wrapFiber(parent) } @@ -40,47 +45,35 @@ export class ReactThreeTestInstance { } private getChildren = ( - fiber: MockInstance, + fiber: Instance, opts: TestInstanceChildOpts = { exhaustive: false }, - ): ReactThreeTestInstance[] => { - if (opts.exhaustive) { - /** - * this will return objects like - * color or effects etc. - */ - return [ - ...(fiber.children || []).map((fib) => wrapFiber(fib as MockInstance)), - ...fiber.__r3f.objects.map((fib) => wrapFiber(fib as MockInstance)), - ] - } else { - return (fiber.children || []).map((fib) => wrapFiber(fib as MockInstance)) - } - } - - public find = (decider: (node: ReactThreeTestInstance) => boolean): ReactThreeTestInstance => - expectOne(findAll(this, decider), `matching custom checker: ${decider.toString()}`) + ): ReactThreeTestInstance[] => + fiber.children.filter((child) => !child.props.attach || opts.exhaustive).map((fib) => wrapFiber(fib as Instance)) public findAll = (decider: (node: ReactThreeTestInstance) => boolean): ReactThreeTestInstance[] => - findAll(this, decider) + findAll(this as unknown as ReactThreeTestInstance, decider) + + public find = (decider: (node: ReactThreeTestInstance) => boolean): ReactThreeTestInstance => + expectOne(this.findAll(decider), `matching custom checker: ${decider.toString()}`) public findByType = (type: string): ReactThreeTestInstance => expectOne( - findAll(this, (node) => Boolean(node.type && node.type === type)), + this.findAll((node) => Boolean(node.type && node.type === type)), `with node type: "${type || 'Unknown'}"`, ) public findAllByType = (type: string): ReactThreeTestInstance[] => - findAll(this, (node) => Boolean(node.type && node.type === type)) + this.findAll((node) => Boolean(node.type && node.type === type)) public findByProps = (props: Obj): ReactThreeTestInstance => expectOne(this.findAllByProps(props), `with props: ${JSON.stringify(props)}`) public findAllByProps = (props: Obj): ReactThreeTestInstance[] => - findAll(this, (node: ReactThreeTestInstance) => Boolean(node.props && matchProps(node.props, props))) + this.findAll((node: ReactThreeTestInstance) => Boolean(node.props && matchProps(node.props, props))) } -const fiberToWrapper = new WeakMap() -export const wrapFiber = (fiber: MockInstance | MockScene): ReactThreeTestInstance => { +const fiberToWrapper = new WeakMap() +export const wrapFiber = (fiber: Instance): ReactThreeTestInstance => { let wrapper = fiberToWrapper.get(fiber) if (wrapper === undefined) { wrapper = new ReactThreeTestInstance(fiber) diff --git a/packages/test-renderer/src/fireEvent.ts b/packages/test-renderer/src/fireEvent.ts index 8f0fd3dd27..df192b1d0e 100644 --- a/packages/test-renderer/src/fireEvent.ts +++ b/packages/test-renderer/src/fireEvent.ts @@ -1,16 +1,14 @@ -import ReactReconciler from 'react-reconciler' +import type { UseBoundStore } from 'zustand' +import type { RootState } from '@react-three/fiber' import { toEventHandlerName } from './helpers/strings' import { ReactThreeTestInstance } from './createTestInstance' -import type { MockSyntheticEvent } from './types/public' -import type { MockUseStoreState, MockEventData } from './types/internal' +import type { Act, MockSyntheticEvent } from './types/public' +import type { MockEventData } from './types/internal' -export const createEventFirer = ( - act: ReactReconciler.Reconciler['act'], - store: MockUseStoreState, -) => { +export const createEventFirer = (act: Act, store: UseBoundStore) => { const findEventHandler = ( element: ReactThreeTestInstance, eventName: string, diff --git a/packages/test-renderer/src/helpers/graph.ts b/packages/test-renderer/src/helpers/graph.ts index 0266dbaa11..36359ebec5 100644 --- a/packages/test-renderer/src/helpers/graph.ts +++ b/packages/test-renderer/src/helpers/graph.ts @@ -1,4 +1,4 @@ -import type { MockScene, MockSceneChild } from '../types/internal' +import type { Instance } from '@react-three/fiber' import type { SceneGraphItem } from '../types/public' const graphObjectFactory = ( @@ -11,5 +11,5 @@ const graphObjectFactory = ( children, }) -export const toGraph = (object: MockScene | MockSceneChild): SceneGraphItem[] => - object.children.map((child) => graphObjectFactory(child.type, child.name || '', toGraph(child))) +export const toGraph = (object: Instance): SceneGraphItem[] => + object.children.map((child) => graphObjectFactory(child.object.type, child.object.name ?? '', toGraph(child))) diff --git a/packages/test-renderer/src/helpers/is.ts b/packages/test-renderer/src/helpers/is.ts deleted file mode 100644 index 4733da0c59..0000000000 --- a/packages/test-renderer/src/helpers/is.ts +++ /dev/null @@ -1,21 +0,0 @@ -export const is = { - obj: (a: any) => a === Object(a) && !is.arr(a) && typeof a !== 'function', - fun: (a: any) => typeof a === 'function', - str: (a: any) => typeof a === 'string', - num: (a: any) => typeof a === 'number', - und: (a: any) => a === void 0, - arr: (a: any) => Array.isArray(a), - equ(a: any, b: any) { - // Wrong type or one of the two undefined, doesn't match - if (typeof a !== typeof b || !!a !== !!b) return false - // Atomic, just compare a against b - if (is.str(a) || is.num(a) || is.obj(a)) return a === b - // Array, shallow compare first to see if it's a match - if (is.arr(a) && a == b) return true - // Last resort, go through keys - let i - for (i in a) if (!(i in b)) return false - for (i in b) if (a[i] !== b[i]) return false - return is.und(i) ? a === b : true - }, -} diff --git a/packages/test-renderer/src/helpers/testInstance.ts b/packages/test-renderer/src/helpers/testInstance.ts index 0b7ba964ed..cb75990666 100644 --- a/packages/test-renderer/src/helpers/testInstance.ts +++ b/packages/test-renderer/src/helpers/testInstance.ts @@ -1,4 +1,4 @@ -import { ReactThreeTestInstance } from '../createTestInstance' +import type { ReactThreeTestInstance } from '../createTestInstance' import type { Obj } from '../types/internal' export const expectOne = (items: TItem[], msg: string) => { diff --git a/packages/test-renderer/src/helpers/tree.ts b/packages/test-renderer/src/helpers/tree.ts index d69f20f2f8..46095bda3f 100644 --- a/packages/test-renderer/src/helpers/tree.ts +++ b/packages/test-renderer/src/helpers/tree.ts @@ -1,5 +1,5 @@ +import type { Instance } from '@react-three/fiber' import type { TreeNode, Tree } from '../types/public' -import type { MockSceneChild, MockScene } from '../types/internal' import { lowerCaseFirstLetter } from './strings' const treeObjectFactory = ( @@ -12,20 +12,13 @@ const treeObjectFactory = ( children, }) -const toTreeBranch = (obj: MockSceneChild[]): TreeNode[] => - obj.map((child) => { +const toTreeBranch = (children: Instance[]): TreeNode[] => + children.map((child) => { return treeObjectFactory( - lowerCaseFirstLetter(child.type || child.constructor.name), - { ...child.__r3f.memoizedProps }, - toTreeBranch([...(child.children || []), ...child.__r3f.objects]), + lowerCaseFirstLetter(child.object.type || child.object.constructor.name), + child.props, + toTreeBranch(child.children), ) }) -export const toTree = (root: MockScene): Tree => - root.children.map((obj) => - treeObjectFactory( - lowerCaseFirstLetter(obj.type), - { ...obj.__r3f.memoizedProps }, - toTreeBranch([...(obj.children as MockSceneChild[]), ...(obj.__r3f.objects as MockSceneChild[])]), - ), - ) +export const toTree = (root: Instance): Tree => toTreeBranch(root.children) diff --git a/packages/test-renderer/src/index.tsx b/packages/test-renderer/src/index.tsx index 97a95b0082..97d329e155 100644 --- a/packages/test-renderer/src/index.tsx +++ b/packages/test-renderer/src/index.tsx @@ -1,22 +1,20 @@ import * as React from 'react' import * as THREE from 'three' -import { extend, _roots as mockRoots, createRoot, reconciler, act } from '@react-three/fiber' +import { extend, _roots as mockRoots, createRoot, reconciler, act, Instance } from '@react-three/fiber' import { toTree } from './helpers/tree' import { toGraph } from './helpers/graph' -import { is } from './helpers/is' import { createCanvas } from './createTestCanvas' import { createWebGLContext } from './createWebGLContext' import { createEventFirer } from './fireEvent' -import type { MockScene } from './types/internal' import type { CreateOptions, Renderer } from './types/public' import { wrapFiber } from './createTestInstance' // Extend catalogue for render API in tests. -extend(THREE) +extend(THREE as any) type X = | ((contextId: 'webgl', options?: WebGLContextAttributes) => WebGLRenderingContext | null) @@ -44,67 +42,45 @@ const create = async (element: React.ReactNode, options?: Partial }, }) - const _fiber = canvas + const _root = createRoot(canvas).configure({ frameloop: 'never', ...options, events: undefined }) + const _store = mockRoots.get(canvas)!.store - const _root = createRoot(_fiber).configure({ frameloop: 'never', ...options, events: undefined }) - - let scene: MockScene = null! - - await act(async () => { - scene = _root.render(element).getState().scene as unknown as MockScene - }) - - const _store = mockRoots.get(_fiber)!.store + await act(async () => _root.render(element)) + const _scene = (_store.getState().scene as Instance['object']).__r3f! return { - scene: wrapFiber(scene), - unmount: async () => { + scene: wrapFiber(_scene), + async unmount() { await act(async () => { _root.unmount() }) }, - getInstance: () => { - // this is our root - const fiber = mockRoots.get(_fiber)?.fiber - const current = fiber?.current.child.child - if (current) { - const root = { - /** - * we wrap our child in a Provider component - * and context.Provider, so do a little - * artificial dive to get round this and - * pass context.Provider as if it was the - * actual react root - */ - current, - } + getInstance() { + // Bail if canvas is unmounted + if (!mockRoots.has(canvas)) return null - /** - * so this actually returns the instance - * the user has passed through as a Fiber - */ - return reconciler.getPublicRootInstance(root) - } else { - return null - } + // Traverse fiber nodes for R3F root + const root = { current: mockRoots.get(canvas)!.fiber.current } + while (!root.current.child?.stateNode) root.current = root.current.child + + // Return R3F instance from root + return reconciler.getPublicRootInstance(root) }, - update: async (newElement: React.ReactNode) => { - const fiber = mockRoots.get(_fiber)?.fiber - if (fiber) { - await act(async () => { - reconciler.updateContainer(newElement, fiber, null, () => null) - }) - } - return + async update(newElement: React.ReactNode) { + if (!mockRoots.has(canvas)) return console.warn('RTTR: attempted to update an unmounted root!') + + await act(async () => { + _root.render(newElement) + }) }, - toTree: () => { - return toTree(scene) + toTree() { + return toTree(_scene) }, - toGraph: () => { - return toGraph(scene) + toGraph() { + return toGraph(_scene) }, fireEvent: createEventFirer(act, _store), - advanceFrames: async (frames: number, delta: number | number[] = 1) => { + async advanceFrames(frames: number, delta: number | number[] = 1) { const state = _store.getState() const storeSubscribers = state.internal.subscribers @@ -112,7 +88,7 @@ const create = async (element: React.ReactNode, options?: Partial storeSubscribers.forEach((subscriber) => { for (let i = 0; i < frames; i++) { - if (is.arr(delta)) { + if (Array.isArray(delta)) { promises.push( new Promise(() => subscriber.ref.current(state, (delta as number[])[i] || (delta as number[])[-1])), ) diff --git a/packages/test-renderer/src/types/internal.ts b/packages/test-renderer/src/types/internal.ts index d4b54d936b..ab1a89a13a 100644 --- a/packages/test-renderer/src/types/internal.ts +++ b/packages/test-renderer/src/types/internal.ts @@ -1,26 +1,3 @@ -import * as THREE from 'three' -import { UseBoundStore } from 'zustand' - -import type { BaseInstance, LocalState, RootState } from '@react-three/fiber' - -export type MockUseStoreState = UseBoundStore - -export interface MockInstance extends Omit { - __r3f: Omit & { - root: MockUseStoreState - objects: MockSceneChild[] - parent: MockInstance - } -} - -export interface MockSceneChild extends Omit { - children: MockSceneChild[] -} - -export interface MockScene extends Omit, Pick { - children: MockSceneChild[] -} - export type CreateCanvasParameters = { beforeReturn?: (canvas: HTMLCanvasElement) => void width?: number From c071328d98d4ebed4c19917e5e2eba9d73e8053b Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Wed, 21 Sep 2022 10:19:49 -0500 Subject: [PATCH 060/252] chore: add integration tests for context bridge --- package.json | 1 + ...utils.test.ts.snap => utils.test.tsx.snap} | 0 packages/fiber/tests/canvas.native.test.tsx | 22 ++++++ packages/fiber/tests/canvas.test.tsx | 22 ++++++ .../tests/{utils.test.ts => utils.test.tsx} | 77 ++++++++++++++++++- 5 files changed, 120 insertions(+), 2 deletions(-) rename packages/fiber/tests/__snapshots__/{utils.test.ts.snap => utils.test.tsx.snap} (100%) rename packages/fiber/tests/{utils.test.ts => utils.test.tsx} (87%) diff --git a/package.json b/package.json index 8fe9ea1a7b..e8bbcdb2f0 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "react": "^18.0.0", "react-dom": "^18.0.0", "react-native": "0.69.3", + "react-nil": "^1.2.0", "react-test-renderer": "^18.0.0", "regenerator-runtime": "^0.13.9", "three": "^0.141.0", diff --git a/packages/fiber/tests/__snapshots__/utils.test.ts.snap b/packages/fiber/tests/__snapshots__/utils.test.tsx.snap similarity index 100% rename from packages/fiber/tests/__snapshots__/utils.test.ts.snap rename to packages/fiber/tests/__snapshots__/utils.test.tsx.snap diff --git a/packages/fiber/tests/canvas.native.test.tsx b/packages/fiber/tests/canvas.native.test.tsx index 39d98181cc..7df8621494 100644 --- a/packages/fiber/tests/canvas.native.test.tsx +++ b/packages/fiber/tests/canvas.native.test.tsx @@ -30,6 +30,28 @@ describe('native Canvas', () => { expect(ref.current).toBeInstanceOf(View) }) + it('should forward context', async () => { + const ParentContext = React.createContext(null!) + let receivedValue!: boolean + + function Test() { + receivedValue = React.useContext(ParentContext) + return null + } + + await act(async () => { + create( + + + + + , + ) + }) + + expect(receivedValue).toBe(true) + }) + it('should correctly unmount', async () => { const renderer = await act(async () => create( diff --git a/packages/fiber/tests/canvas.test.tsx b/packages/fiber/tests/canvas.test.tsx index 297e76e084..ec15d6cfc5 100644 --- a/packages/fiber/tests/canvas.test.tsx +++ b/packages/fiber/tests/canvas.test.tsx @@ -29,6 +29,28 @@ describe('web Canvas', () => { expect(ref.current).toBeInstanceOf(HTMLCanvasElement) }) + it('should forward context', async () => { + const ParentContext = React.createContext(null!) + let receivedValue!: boolean + + function Test() { + receivedValue = React.useContext(ParentContext) + return null + } + + await act(async () => { + render( + + + + + , + ) + }) + + expect(receivedValue).toBe(true) + }) + it('should correctly unmount', async () => { const renderer = await act(async () => render( diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.tsx similarity index 87% rename from packages/fiber/tests/utils.test.ts rename to packages/fiber/tests/utils.test.tsx index 2a10d8744c..58ef4feefe 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.tsx @@ -1,6 +1,9 @@ +import * as React from 'react' import * as THREE from 'three' -import { UseBoundStore } from 'zustand' -import { RootState, Instance } from '../src' +import { act, render } from 'react-nil' +import { create } from 'react-test-renderer' +import type { UseBoundStore } from 'zustand' +import type { RootState, Instance } from '../src' import { is, dispose, @@ -14,6 +17,8 @@ import { diffProps, applyProps, updateCamera, + useContextBridge, + FiberProvider, } from '../src/core/utils' // Mocks a Zustand store @@ -435,3 +440,71 @@ describe('updateCamera', () => { expect(orthographic.updateMatrixWorld).not.toBeCalled() }) }) + +describe('useContextBridge', () => { + it('forwards live context between renderers', async () => { + const Context1 = React.createContext(null!) + const Context2 = React.createContext(null!) + + const values: string[] = [] + + function Test() { + values.push(React.useContext(Context1), React.useContext(Context2)) + + return null + } + + const Canvas = React.memo(() => { + const [fiber, setFiber] = React.useState(null) + const Bridge = useContextBridge(fiber) + render( + + + , + ) + + return ( + + + + ) + }) + + function Providers(props: { values: [value1: string, value2?: string]; children: React.ReactNode }) { + const [value1, value2] = props.values + return ( + + + {value2 ? {props.children} : props.children} + + + ) + } + + await act(async () => + create( + + + , + ), + ) + + await act(async () => + create( + + + , + ), + ) + + await act(async () => + create( + + + , + ), + ) + + expect(values).toStrictEqual(['value1', 'value2', 'value1__new', 'value2__new', 'value1__new2', null]) + }) +}) From 0a0348945ca3a63e4dc99524845d901418c2222a Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Wed, 21 Sep 2022 10:58:25 -0500 Subject: [PATCH 061/252] chore: restore RTTR version --- packages/test-renderer/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 2f8a7c0a98..4a86c84780 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "12.0.0-alpha.0", + "version": "9.0.0-alpha.0", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", From 3f57f0ffb0e33225f25af21cd5b6b9ec839f1644 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Wed, 21 Sep 2022 14:16:07 -0500 Subject: [PATCH 062/252] chore: remove outdated tests with master --- ...utils.test.tsx.snap => utils.test.ts.snap} | 0 .../tests/{utils.test.tsx => utils.test.ts} | 73 ------------------- 2 files changed, 73 deletions(-) rename packages/fiber/tests/__snapshots__/{utils.test.tsx.snap => utils.test.ts.snap} (100%) rename packages/fiber/tests/{utils.test.tsx => utils.test.ts} (88%) diff --git a/packages/fiber/tests/__snapshots__/utils.test.tsx.snap b/packages/fiber/tests/__snapshots__/utils.test.ts.snap similarity index 100% rename from packages/fiber/tests/__snapshots__/utils.test.tsx.snap rename to packages/fiber/tests/__snapshots__/utils.test.ts.snap diff --git a/packages/fiber/tests/utils.test.tsx b/packages/fiber/tests/utils.test.ts similarity index 88% rename from packages/fiber/tests/utils.test.tsx rename to packages/fiber/tests/utils.test.ts index 58ef4feefe..1fa17e8574 100644 --- a/packages/fiber/tests/utils.test.tsx +++ b/packages/fiber/tests/utils.test.ts @@ -1,7 +1,4 @@ -import * as React from 'react' import * as THREE from 'three' -import { act, render } from 'react-nil' -import { create } from 'react-test-renderer' import type { UseBoundStore } from 'zustand' import type { RootState, Instance } from '../src' import { @@ -17,8 +14,6 @@ import { diffProps, applyProps, updateCamera, - useContextBridge, - FiberProvider, } from '../src/core/utils' // Mocks a Zustand store @@ -440,71 +435,3 @@ describe('updateCamera', () => { expect(orthographic.updateMatrixWorld).not.toBeCalled() }) }) - -describe('useContextBridge', () => { - it('forwards live context between renderers', async () => { - const Context1 = React.createContext(null!) - const Context2 = React.createContext(null!) - - const values: string[] = [] - - function Test() { - values.push(React.useContext(Context1), React.useContext(Context2)) - - return null - } - - const Canvas = React.memo(() => { - const [fiber, setFiber] = React.useState(null) - const Bridge = useContextBridge(fiber) - render( - - - , - ) - - return ( - - - - ) - }) - - function Providers(props: { values: [value1: string, value2?: string]; children: React.ReactNode }) { - const [value1, value2] = props.values - return ( - - - {value2 ? {props.children} : props.children} - - - ) - } - - await act(async () => - create( - - - , - ), - ) - - await act(async () => - create( - - - , - ), - ) - - await act(async () => - create( - - - , - ), - ) - - expect(values).toStrictEqual(['value1', 'value2', 'value1__new', 'value2__new', 'value1__new2', null]) - }) -}) From fee303ae3850147403dcc258e4840cec47a7cfe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Fri, 23 Sep 2022 22:39:59 +0200 Subject: [PATCH 063/252] new alpha --- packages/fiber/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 56741f903a..5d1407c7af 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.1", + "version": "9.0.0-alpha.2", "description": "A React renderer for Threejs", "keywords": [ "react", From 3bb9da4b11b41649218e7f18da86885807178909 Mon Sep 17 00:00:00 2001 From: "Alaric.Baraou" Date: Thu, 29 Sep 2022 09:40:31 +0900 Subject: [PATCH 064/252] [v9] fix: prefer named functions, for loops in hot paths (#2540) --- packages/fiber/src/core/events.ts | 71 +++++++++++++++++-------------- packages/fiber/src/core/loop.ts | 10 +++-- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index 74ed4fb74c..39b39c15dc 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -189,36 +189,38 @@ export function createEvents(store: UseBoundStore) { // Allow callers to eliminate event objects const eventsObjects = filter ? filter(state.internal.interaction) : state.internal.interaction // Reset all raycaster cameras to undefined - eventsObjects.forEach((obj) => { - const state = getRootState(obj) + for (let i = 0; i < eventsObjects.length; i++) { + const state = getRootState(eventsObjects[i]) if (state) { state.raycaster.camera = undefined! } - }) + } if (!state.previousRoot) { // Make sure root-level pointer and ray are set up state.events.compute?.(event, state) } + function handleRaycast(obj: THREE.Object3D) { + const state = getRootState(obj) + // Skip event handling when noEvents is set, or when the raycasters camera is null + if (!state || !state.events.enabled || state.raycaster.camera === null) return [] + + // When the camera is undefined we have to call the event layers update function + if (state.raycaster.camera === undefined) { + state.events.compute?.(event, state, state.previousRoot?.getState()) + // If the camera is still undefined we have to skip this layer entirely + if (state.raycaster.camera === undefined) state.raycaster.camera = null! + } + + // Intersect object by object + return state.raycaster.camera ? state.raycaster.intersectObject(obj, true) : [] + } + // Collect events let hits: THREE.Intersection>[] = eventsObjects // Intersect objects - .flatMap((obj) => { - const state = getRootState(obj) - // Skip event handling when noEvents is set, or when the raycasters camera is null - if (!state || !state.events.enabled || state.raycaster.camera === null) return [] - - // When the camera is undefined we have to call the event layers update function - if (state.raycaster.camera === undefined) { - state.events.compute?.(event, state, state.previousRoot?.getState()) - // If the camera is still undefined we have to skip this layer entirely - if (state.raycaster.camera === undefined) state.raycaster.camera = null! - } - - // Intersect object by object - return state.raycaster.camera ? state.raycaster.intersectObject(obj, true) : [] - }) + .flatMap(handleRaycast) // Sort by event priority and distance .sort((a, b) => { const aState = getRootState(a.object) @@ -320,7 +322,7 @@ export function createEvents(store: UseBoundStore) { ray: raycaster.ray, camera: camera, // Hijack stopPropagation, which just sets a flag - stopPropagation: () => { + stopPropagation() { // https://github.com/pmndrs/react-three-fiber/issues/596 // Events are not allowed to stop propagation if the pointer has been captured const capturesForPointer = 'pointerId' in event && internal.capturedMap.get(event.pointerId) @@ -363,7 +365,7 @@ export function createEvents(store: UseBoundStore) { function cancelPointer(intersections: Intersection[]) { const { internal } = store.getState() - Array.from(internal.hovered.values()).forEach((hoveredObj) => { + for (const hoveredObj of internal.hovered.values()) { // When no objects were hit or the the hovered object wasn't found underneath the cursor // we call onPointerOut and delete the object from the hovered-elements map if ( @@ -386,10 +388,17 @@ export function createEvents(store: UseBoundStore) { handlers.onPointerLeave?.(data as ThreeEvent) } } - }) + } } - const handlePointer = (name: string) => { + function pointerMissed(event: MouseEvent, objects: THREE.Object3D[]) { + for (let i = 0; i < objects.length; i++) { + const instance = (objects[i] as Instance['object']).__r3f + instance?.handlers.onPointerMissed?.(event) + } + } + + function handlePointer(name: string) { // Deal with cancelation switch (name) { case 'onPointerLeave': @@ -408,17 +417,17 @@ export function createEvents(store: UseBoundStore) { } // Any other pointer goes here ... - return (event: DomEvent) => { + return function handleEvent(event: DomEvent) { const { onPointerMissed, internal } = store.getState() - //prepareRay(event) + // prepareRay(event) internal.lastEvent.current = event // Get fresh intersects const isPointerMove = name === 'onPointerMove' const isClickEvent = name === 'onClick' || name === 'onContextMenu' || name === 'onDoubleClick' const filter = isPointerMove ? filterPointerEvents : undefined - //const hits = patchIntersects(intersect(filter), event) + // const hits = patchIntersects(intersect(filter), event) const hits = intersect(event, filter) const delta = isClickEvent ? calculateDistance(event) : 0 @@ -439,7 +448,7 @@ export function createEvents(store: UseBoundStore) { // Take care of unhover if (isPointerMove) cancelPointer(hits) - handleIntersects(hits, event, delta, (data: ThreeEvent) => { + function onIntersect(data: ThreeEvent) { const eventObject = data.eventObject const instance = (eventObject as Instance['object']).__r3f @@ -490,14 +499,10 @@ export function createEvents(store: UseBoundStore) { } } } - }) - } - } + } - function pointerMissed(event: MouseEvent, objects: THREE.Object3D[]) { - objects.forEach((object: THREE.Object3D) => - (object as Instance['object']).__r3f?.handlers.onPointerMissed?.(event), - ) + handleIntersects(hits, event, delta, onIntersect) + } } return { handlePointer } diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index f919ed36eb..0d211c4b8c 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -36,7 +36,9 @@ export const addTail = (callback: GlobalRenderCallback) => createSubs(callback, function run(effects: Set, timestamp: number) { if (!effects.size) return - effects.forEach(({ callback }) => callback(timestamp)) + for (const { callback } of effects.values()) { + callback(timestamp) + } } export type GlobalEffectType = 'before' | 'after' | 'tail' @@ -89,7 +91,7 @@ export function createLoop(roots: Map) { flushGlobalEffects('before', timestamp) // Render all roots - roots.forEach((root) => { + for (const root of roots.values()) { state = root.store.getState() // If the frameloop is invalidated, do not run another frame @@ -100,7 +102,7 @@ export function createLoop(roots: Map) { ) { repeat += update(timestamp, state) } - }) + } // Run after-effects flushGlobalEffects('after', timestamp) @@ -130,7 +132,7 @@ export function createLoop(roots: Map) { function advance(timestamp: number, runGlobalEffects: boolean = true, state?: RootState, frame?: XRFrame): void { if (runGlobalEffects) flushGlobalEffects('before', timestamp) - if (!state) roots.forEach((root) => update(timestamp, root.store.getState())) + if (!state) for (const root of roots.values()) update(timestamp, root.store.getState()) else update(timestamp, state, frame) if (runGlobalEffects) flushGlobalEffects('after', timestamp) } From 85c1e053391b1be705477048e875cb3ed4173463 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 2 Oct 2022 06:04:50 -0500 Subject: [PATCH 065/252] fix: don't memoize strict check --- packages/fiber/src/core/utils.tsx | 413 ++++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 packages/fiber/src/core/utils.tsx diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx new file mode 100644 index 0000000000..84ef532121 --- /dev/null +++ b/packages/fiber/src/core/utils.tsx @@ -0,0 +1,413 @@ +import * as THREE from 'three' +import * as React from 'react' +import { useFiber, traverseFiber, useContextBridge } from 'its-fine' +import type { Fiber } from 'react-reconciler' +import type { UseBoundStore } from 'zustand' +import type { EventHandlers } from './events' +import type { Dpr, RootState, Size } from './store' +import type { ConstructorRepresentation, Instance } from './renderer' + +export type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera +export const isOrthographicCamera = (def: Camera): def is THREE.OrthographicCamera => + def && (def as THREE.OrthographicCamera).isOrthographicCamera +export const isRef = (obj: any): obj is React.MutableRefObject => obj && obj.hasOwnProperty('current') + +/** + * An SSR-friendly useLayoutEffect. + * + * React currently throws a warning when using useLayoutEffect on the server. + * To get around it, we can conditionally useEffect on the server (no-op) and + * useLayoutEffect elsewhere. + * + * @see https://github.com/facebook/react/issues/14927 + */ +export const useIsomorphicLayoutEffect = + typeof window !== 'undefined' && (window.document?.createElement || window.navigator?.product === 'ReactNative') + ? React.useLayoutEffect + : React.useEffect + +export function useMutableCallback(fn: T): React.MutableRefObject { + const ref = React.useRef(fn) + useIsomorphicLayoutEffect(() => void (ref.current = fn), [fn]) + return ref +} + +export type Bridge = React.FC<{ children?: React.ReactNode }> + +const STRICT_MODE = Symbol.for('react.strict_mode') + +/** + * Bridges renderer Context and StrictMode from a primary renderer. + */ +export function useBridge(): Bridge { + const fiber = useFiber() + const strict = !!traverseFiber(fiber, true, (node) => node.type === STRICT_MODE) + const ContextBridge = useContextBridge() + + return React.useMemo(() => { + const Root = strict ? React.StrictMode : React.Fragment + return ({ children }) => ( + + {children} + + ) + }, [strict, ContextBridge]) +} + +export type SetBlock = false | Promise | null +export type UnblockProps = { set: React.Dispatch>; children: React.ReactNode } + +export function Block({ set }: Omit) { + useIsomorphicLayoutEffect(() => { + set(new Promise(() => null)) + return () => set(false) + }, [set]) + return null +} + +export class ErrorBoundary extends React.Component< + { set: React.Dispatch; children: React.ReactNode }, + { error: boolean } +> { + state = { error: false } + static getDerivedStateFromError = () => ({ error: true }) + componentDidCatch(err: Error) { + this.props.set(err) + } + render() { + return this.state.error ? null : this.props.children + } +} + +export interface ObjectMap { + nodes: { [name: string]: THREE.Object3D } + materials: { [name: string]: THREE.Material } +} + +export function calculateDpr(dpr: Dpr): number { + const target = typeof window !== 'undefined' ? window.devicePixelRatio : 1 + return Array.isArray(dpr) ? Math.min(Math.max(dpr[0], target), dpr[1]) : dpr +} + +/** + * Returns instance root state + */ +export const getRootState = (obj: T): RootState | undefined => + (obj as Instance['object']).__r3f?.root.getState() + +export interface EquConfig { + /** Compare arrays by reference equality a === b (default), or by shallow equality */ + arrays?: 'reference' | 'shallow' + /** Compare objects by reference equality a === b (default), or by shallow equality */ + objects?: 'reference' | 'shallow' + /** If true the keys in both a and b must match 1:1 (default), if false a's keys must intersect b's */ + strict?: boolean +} + +// A collection of compare functions +export const is = { + obj: (a: any) => a === Object(a) && !is.arr(a) && typeof a !== 'function', + fun: (a: any): a is Function => typeof a === 'function', + str: (a: any): a is string => typeof a === 'string', + num: (a: any): a is number => typeof a === 'number', + boo: (a: any): a is boolean => typeof a === 'boolean', + und: (a: any) => a === void 0, + arr: (a: any) => Array.isArray(a), + equ(a: any, b: any, { arrays = 'shallow', objects = 'reference', strict = true }: EquConfig = {}) { + // Wrong type or one of the two undefined, doesn't match + if (typeof a !== typeof b || !!a !== !!b) return false + // Atomic, just compare a against b + if (is.str(a) || is.num(a)) return a === b + const isObj = is.obj(a) + if (isObj && objects === 'reference') return a === b + const isArr = is.arr(a) + if (isArr && arrays === 'reference') return a === b + // Array or Object, shallow compare first to see if it's a match + if ((isArr || isObj) && a === b) return true + // Last resort, go through keys + let i + for (i in a) if (!(i in b)) return false + for (i in strict ? b : a) if (a[i] !== b[i]) return false + if (is.und(i)) { + if (isArr && a.length === 0 && b.length === 0) return true + if (isObj && Object.keys(a).length === 0 && Object.keys(b).length === 0) return true + if (a !== b) return false + } + return true + }, +} + +// Collects nodes and materials from a THREE.Object3D +export function buildGraph(object: THREE.Object3D): ObjectMap { + const data: ObjectMap = { nodes: {}, materials: {} } + if (object) { + object.traverse((obj: any) => { + if (obj.name) data.nodes[obj.name] = obj + if (obj.material && !data.materials[obj.material.name]) data.materials[obj.material.name] = obj.material + }) + } + return data +} + +export interface Disposable { + type?: string + dispose?: () => void +} + +// Disposes an object and all its properties +export function dispose(obj: T): void { + if (obj.type !== 'Scene') obj.dispose?.() + for (const p in obj) { + const prop = obj[p] as Disposable | undefined + if (prop?.type !== 'Scene') prop?.dispose?.() + } +} + +export const REACT_INTERNAL_PROPS = ['children', 'key', 'ref'] + +// Gets only instance props from reconciler fibers +export function getInstanceProps(queue: Fiber['pendingProps']): Instance['props'] { + const props: Instance['props'] = {} + + for (const key in queue) { + if (!REACT_INTERNAL_PROPS.includes(key)) props[key] = queue[key] + } + + return props +} + +// Each object in the scene carries a small LocalState descriptor +export function prepare( + target: T, + root: UseBoundStore, + type: string, + props: Instance['props'], +): Instance { + const object = target as unknown as Instance['object'] + + // Create instance descriptor + let instance = object.__r3f + if (!instance) { + instance = { + root, + type, + parent: null, + children: [], + props: getInstanceProps(props), + object, + eventCount: 0, + handlers: {}, + isHidden: false, + } + object.__r3f = instance + } + + return instance +} + +export function resolve(root: any, key: string): { root: any; key: string; target: any } { + let target = root[key] + if (!key.includes('-')) return { root, key, target } + + // Resolve pierced target + const chain = key.split('-') + target = chain.reduce((acc, key) => acc[key], root) + key = chain.pop()! + + // Switch root if atomic + if (!target?.set) root = chain.reduce((acc, key) => acc[key], root) + + return { root, key, target } +} + +// Checks if a dash-cased string ends with an integer +const INDEX_REGEX = /-\d+$/ + +export function attach(parent: Instance, child: Instance): void { + if (is.str(child.props.attach)) { + // If attaching into an array (foo-0), create one + if (INDEX_REGEX.test(child.props.attach)) { + const index = child.props.attach.replace(INDEX_REGEX, '') + const { root, key } = resolve(parent.object, index) + if (!Array.isArray(root[key])) root[key] = [] + } + + const { root, key } = resolve(parent.object, child.props.attach) + child.previousAttach = root[key] + root[key] = child.object + } else if (is.fun(child.props.attach)) { + child.previousAttach = child.props.attach(parent.object, child.object) + } +} + +export function detach(parent: Instance, child: Instance): void { + if (is.str(child.props.attach)) { + const { root, key } = resolve(parent.object, child.props.attach) + const previous = child.previousAttach + // When the previous value was undefined, it means the value was never set to begin with + if (previous === undefined) delete root[key] + // Otherwise set the previous value + else root[key] = previous + } else { + child.previousAttach?.(parent.object, child.object) + } + + delete child.previousAttach +} + +export const RESERVED_PROPS = [ + ...REACT_INTERNAL_PROPS, + // Instance props + 'args', + 'dispose', + 'attach', + 'object', + // Behavior flags + 'dispose', +] + +// This function prepares a set of changes to be applied to the instance +export function diffProps( + instance: Instance, + newProps: Instance['props'], + resetRemoved = false, +): Instance['props'] { + const changedProps: Instance['props'] = {} + + // Sort through props + for (const prop in newProps) { + // Skip reserved keys + if (RESERVED_PROPS.includes(prop)) continue + // Skip if props match + if (is.equ(newProps[prop], instance.props[prop])) continue + + // Props changed, add them + changedProps[prop] = newProps[prop] + } + + // Reset removed props for HMR + if (resetRemoved) { + for (const prop in instance.props) { + if (RESERVED_PROPS.includes(prop) || newProps.hasOwnProperty(prop)) continue + + const { root, key } = resolve(instance.object, prop) + + // https://github.com/mrdoob/three.js/issues/21209 + // HMR/fast-refresh relies on the ability to cancel out props, but threejs + // has no means to do this. Hence we curate a small collection of value-classes + // with their respective constructor/set arguments + // For removed props, try to set default values, if possible + if (root.constructor) { + // create a blank slate of the instance and copy the particular parameter. + // @ts-ignore + const defaultClassCall = new root.constructor(...(root.__r3f?.props.args ?? [])) + changedProps[key] = defaultClassCall[key] + // destroy the instance + if (defaultClassCall.dispose) defaultClassCall.dispose() + } else { + // instance does not have constructor, just set it to 0 + changedProps[key] = 0 + } + } + } + + return changedProps +} + +// This function applies a set of changes to the instance +export function applyProps(object: Instance['object'], props: Instance['props']): Instance['object'] { + const instance = object.__r3f + const rootState = instance?.root.getState() + const prevHandlers = instance?.eventCount + + for (const prop in props) { + let value = props[prop] + + // Don't mutate reserved keys + if (RESERVED_PROPS.includes(prop)) continue + + // Deal with pointer events ... + if (instance && /^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(prop)) { + if (typeof value === 'function') instance.handlers[prop as keyof EventHandlers] = value as any + else delete instance.handlers[prop as keyof EventHandlers] + instance.eventCount = Object.keys(instance.handlers).length + } + + const { root, key, target } = resolve(object, prop) + + // Copy if properties match signatures + if (target?.copy && target?.constructor === (value as ConstructorRepresentation)?.constructor) { + target.copy(value) + } + // Layers have no copy function, we must therefore copy the mask property + else if (target instanceof THREE.Layers && value instanceof THREE.Layers) { + target.mask = value.mask + } + // Set array types + else if (target?.set && Array.isArray(value)) { + if (target.fromArray) target.fromArray(value) + else target.set(...value) + } + // Set literal types, ignore undefined + // https://github.com/pmndrs/react-three-fiber/issues/274 + else if (target?.set && typeof value !== 'object') { + const isColor = target instanceof THREE.Color + // Allow setting array scalars + if (!isColor && target.setScalar && typeof value === 'number') target.setScalar(value) + // Otherwise just set ... + else if (value !== undefined) target.set(value) + } + // Else, just overwrite the value + else { + root[key] = value + // Auto-convert sRGB textures, for now ... + // https://github.com/pmndrs/react-three-fiber/issues/344 + if (!rootState?.linear && root[key] instanceof THREE.Texture) { + root[key].encoding = THREE.sRGBEncoding + } + } + } + + if ( + instance?.parent && + rootState?.internal && + instance.object instanceof THREE.Object3D && + prevHandlers !== instance.eventCount + ) { + // Pre-emptively remove the instance from the interaction manager + const index = rootState.internal.interaction.indexOf(instance.object) + if (index > -1) rootState.internal.interaction.splice(index, 1) + // Add the instance to the interaction manager only when it has handlers + if (instance.eventCount && instance.object.raycast !== null && instance.object instanceof THREE.Object3D) { + rootState.internal.interaction.push(instance.object) + } + } + + if (instance) invalidateInstance(instance) + + return object +} + +export function invalidateInstance(instance: Instance): void { + const state = instance.root?.getState?.() + if (state && state.internal.frames === 0) state.invalidate() +} + +export function updateCamera(camera: Camera & { manual?: boolean }, size: Size): void { + // https://github.com/pmndrs/react-three-fiber/issues/92 + // Do not mess with the camera if it belongs to the user + if (!camera.manual) { + if (isOrthographicCamera(camera)) { + camera.left = size.width / -2 + camera.right = size.width / 2 + camera.top = size.height / 2 + camera.bottom = size.height / -2 + } else { + camera.aspect = size.width / size.height + } + camera.updateProjectionMatrix() + // https://github.com/pmndrs/react-three-fiber/issues/178 + // Update matrix world since the renderer is a frame late + camera.updateMatrixWorld() + } +} From 1b2b8ce2d2a692c70e12cd9d867b42ae505e1c21 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 2 Oct 2022 06:05:07 -0500 Subject: [PATCH 066/252] Revert "fix: don't memoize strict check" This reverts commit 85c1e053391b1be705477048e875cb3ed4173463. --- packages/fiber/src/core/utils.tsx | 413 ------------------------------ 1 file changed, 413 deletions(-) delete mode 100644 packages/fiber/src/core/utils.tsx diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx deleted file mode 100644 index 84ef532121..0000000000 --- a/packages/fiber/src/core/utils.tsx +++ /dev/null @@ -1,413 +0,0 @@ -import * as THREE from 'three' -import * as React from 'react' -import { useFiber, traverseFiber, useContextBridge } from 'its-fine' -import type { Fiber } from 'react-reconciler' -import type { UseBoundStore } from 'zustand' -import type { EventHandlers } from './events' -import type { Dpr, RootState, Size } from './store' -import type { ConstructorRepresentation, Instance } from './renderer' - -export type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera -export const isOrthographicCamera = (def: Camera): def is THREE.OrthographicCamera => - def && (def as THREE.OrthographicCamera).isOrthographicCamera -export const isRef = (obj: any): obj is React.MutableRefObject => obj && obj.hasOwnProperty('current') - -/** - * An SSR-friendly useLayoutEffect. - * - * React currently throws a warning when using useLayoutEffect on the server. - * To get around it, we can conditionally useEffect on the server (no-op) and - * useLayoutEffect elsewhere. - * - * @see https://github.com/facebook/react/issues/14927 - */ -export const useIsomorphicLayoutEffect = - typeof window !== 'undefined' && (window.document?.createElement || window.navigator?.product === 'ReactNative') - ? React.useLayoutEffect - : React.useEffect - -export function useMutableCallback(fn: T): React.MutableRefObject { - const ref = React.useRef(fn) - useIsomorphicLayoutEffect(() => void (ref.current = fn), [fn]) - return ref -} - -export type Bridge = React.FC<{ children?: React.ReactNode }> - -const STRICT_MODE = Symbol.for('react.strict_mode') - -/** - * Bridges renderer Context and StrictMode from a primary renderer. - */ -export function useBridge(): Bridge { - const fiber = useFiber() - const strict = !!traverseFiber(fiber, true, (node) => node.type === STRICT_MODE) - const ContextBridge = useContextBridge() - - return React.useMemo(() => { - const Root = strict ? React.StrictMode : React.Fragment - return ({ children }) => ( - - {children} - - ) - }, [strict, ContextBridge]) -} - -export type SetBlock = false | Promise | null -export type UnblockProps = { set: React.Dispatch>; children: React.ReactNode } - -export function Block({ set }: Omit) { - useIsomorphicLayoutEffect(() => { - set(new Promise(() => null)) - return () => set(false) - }, [set]) - return null -} - -export class ErrorBoundary extends React.Component< - { set: React.Dispatch; children: React.ReactNode }, - { error: boolean } -> { - state = { error: false } - static getDerivedStateFromError = () => ({ error: true }) - componentDidCatch(err: Error) { - this.props.set(err) - } - render() { - return this.state.error ? null : this.props.children - } -} - -export interface ObjectMap { - nodes: { [name: string]: THREE.Object3D } - materials: { [name: string]: THREE.Material } -} - -export function calculateDpr(dpr: Dpr): number { - const target = typeof window !== 'undefined' ? window.devicePixelRatio : 1 - return Array.isArray(dpr) ? Math.min(Math.max(dpr[0], target), dpr[1]) : dpr -} - -/** - * Returns instance root state - */ -export const getRootState = (obj: T): RootState | undefined => - (obj as Instance['object']).__r3f?.root.getState() - -export interface EquConfig { - /** Compare arrays by reference equality a === b (default), or by shallow equality */ - arrays?: 'reference' | 'shallow' - /** Compare objects by reference equality a === b (default), or by shallow equality */ - objects?: 'reference' | 'shallow' - /** If true the keys in both a and b must match 1:1 (default), if false a's keys must intersect b's */ - strict?: boolean -} - -// A collection of compare functions -export const is = { - obj: (a: any) => a === Object(a) && !is.arr(a) && typeof a !== 'function', - fun: (a: any): a is Function => typeof a === 'function', - str: (a: any): a is string => typeof a === 'string', - num: (a: any): a is number => typeof a === 'number', - boo: (a: any): a is boolean => typeof a === 'boolean', - und: (a: any) => a === void 0, - arr: (a: any) => Array.isArray(a), - equ(a: any, b: any, { arrays = 'shallow', objects = 'reference', strict = true }: EquConfig = {}) { - // Wrong type or one of the two undefined, doesn't match - if (typeof a !== typeof b || !!a !== !!b) return false - // Atomic, just compare a against b - if (is.str(a) || is.num(a)) return a === b - const isObj = is.obj(a) - if (isObj && objects === 'reference') return a === b - const isArr = is.arr(a) - if (isArr && arrays === 'reference') return a === b - // Array or Object, shallow compare first to see if it's a match - if ((isArr || isObj) && a === b) return true - // Last resort, go through keys - let i - for (i in a) if (!(i in b)) return false - for (i in strict ? b : a) if (a[i] !== b[i]) return false - if (is.und(i)) { - if (isArr && a.length === 0 && b.length === 0) return true - if (isObj && Object.keys(a).length === 0 && Object.keys(b).length === 0) return true - if (a !== b) return false - } - return true - }, -} - -// Collects nodes and materials from a THREE.Object3D -export function buildGraph(object: THREE.Object3D): ObjectMap { - const data: ObjectMap = { nodes: {}, materials: {} } - if (object) { - object.traverse((obj: any) => { - if (obj.name) data.nodes[obj.name] = obj - if (obj.material && !data.materials[obj.material.name]) data.materials[obj.material.name] = obj.material - }) - } - return data -} - -export interface Disposable { - type?: string - dispose?: () => void -} - -// Disposes an object and all its properties -export function dispose(obj: T): void { - if (obj.type !== 'Scene') obj.dispose?.() - for (const p in obj) { - const prop = obj[p] as Disposable | undefined - if (prop?.type !== 'Scene') prop?.dispose?.() - } -} - -export const REACT_INTERNAL_PROPS = ['children', 'key', 'ref'] - -// Gets only instance props from reconciler fibers -export function getInstanceProps(queue: Fiber['pendingProps']): Instance['props'] { - const props: Instance['props'] = {} - - for (const key in queue) { - if (!REACT_INTERNAL_PROPS.includes(key)) props[key] = queue[key] - } - - return props -} - -// Each object in the scene carries a small LocalState descriptor -export function prepare( - target: T, - root: UseBoundStore, - type: string, - props: Instance['props'], -): Instance { - const object = target as unknown as Instance['object'] - - // Create instance descriptor - let instance = object.__r3f - if (!instance) { - instance = { - root, - type, - parent: null, - children: [], - props: getInstanceProps(props), - object, - eventCount: 0, - handlers: {}, - isHidden: false, - } - object.__r3f = instance - } - - return instance -} - -export function resolve(root: any, key: string): { root: any; key: string; target: any } { - let target = root[key] - if (!key.includes('-')) return { root, key, target } - - // Resolve pierced target - const chain = key.split('-') - target = chain.reduce((acc, key) => acc[key], root) - key = chain.pop()! - - // Switch root if atomic - if (!target?.set) root = chain.reduce((acc, key) => acc[key], root) - - return { root, key, target } -} - -// Checks if a dash-cased string ends with an integer -const INDEX_REGEX = /-\d+$/ - -export function attach(parent: Instance, child: Instance): void { - if (is.str(child.props.attach)) { - // If attaching into an array (foo-0), create one - if (INDEX_REGEX.test(child.props.attach)) { - const index = child.props.attach.replace(INDEX_REGEX, '') - const { root, key } = resolve(parent.object, index) - if (!Array.isArray(root[key])) root[key] = [] - } - - const { root, key } = resolve(parent.object, child.props.attach) - child.previousAttach = root[key] - root[key] = child.object - } else if (is.fun(child.props.attach)) { - child.previousAttach = child.props.attach(parent.object, child.object) - } -} - -export function detach(parent: Instance, child: Instance): void { - if (is.str(child.props.attach)) { - const { root, key } = resolve(parent.object, child.props.attach) - const previous = child.previousAttach - // When the previous value was undefined, it means the value was never set to begin with - if (previous === undefined) delete root[key] - // Otherwise set the previous value - else root[key] = previous - } else { - child.previousAttach?.(parent.object, child.object) - } - - delete child.previousAttach -} - -export const RESERVED_PROPS = [ - ...REACT_INTERNAL_PROPS, - // Instance props - 'args', - 'dispose', - 'attach', - 'object', - // Behavior flags - 'dispose', -] - -// This function prepares a set of changes to be applied to the instance -export function diffProps( - instance: Instance, - newProps: Instance['props'], - resetRemoved = false, -): Instance['props'] { - const changedProps: Instance['props'] = {} - - // Sort through props - for (const prop in newProps) { - // Skip reserved keys - if (RESERVED_PROPS.includes(prop)) continue - // Skip if props match - if (is.equ(newProps[prop], instance.props[prop])) continue - - // Props changed, add them - changedProps[prop] = newProps[prop] - } - - // Reset removed props for HMR - if (resetRemoved) { - for (const prop in instance.props) { - if (RESERVED_PROPS.includes(prop) || newProps.hasOwnProperty(prop)) continue - - const { root, key } = resolve(instance.object, prop) - - // https://github.com/mrdoob/three.js/issues/21209 - // HMR/fast-refresh relies on the ability to cancel out props, but threejs - // has no means to do this. Hence we curate a small collection of value-classes - // with their respective constructor/set arguments - // For removed props, try to set default values, if possible - if (root.constructor) { - // create a blank slate of the instance and copy the particular parameter. - // @ts-ignore - const defaultClassCall = new root.constructor(...(root.__r3f?.props.args ?? [])) - changedProps[key] = defaultClassCall[key] - // destroy the instance - if (defaultClassCall.dispose) defaultClassCall.dispose() - } else { - // instance does not have constructor, just set it to 0 - changedProps[key] = 0 - } - } - } - - return changedProps -} - -// This function applies a set of changes to the instance -export function applyProps(object: Instance['object'], props: Instance['props']): Instance['object'] { - const instance = object.__r3f - const rootState = instance?.root.getState() - const prevHandlers = instance?.eventCount - - for (const prop in props) { - let value = props[prop] - - // Don't mutate reserved keys - if (RESERVED_PROPS.includes(prop)) continue - - // Deal with pointer events ... - if (instance && /^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(prop)) { - if (typeof value === 'function') instance.handlers[prop as keyof EventHandlers] = value as any - else delete instance.handlers[prop as keyof EventHandlers] - instance.eventCount = Object.keys(instance.handlers).length - } - - const { root, key, target } = resolve(object, prop) - - // Copy if properties match signatures - if (target?.copy && target?.constructor === (value as ConstructorRepresentation)?.constructor) { - target.copy(value) - } - // Layers have no copy function, we must therefore copy the mask property - else if (target instanceof THREE.Layers && value instanceof THREE.Layers) { - target.mask = value.mask - } - // Set array types - else if (target?.set && Array.isArray(value)) { - if (target.fromArray) target.fromArray(value) - else target.set(...value) - } - // Set literal types, ignore undefined - // https://github.com/pmndrs/react-three-fiber/issues/274 - else if (target?.set && typeof value !== 'object') { - const isColor = target instanceof THREE.Color - // Allow setting array scalars - if (!isColor && target.setScalar && typeof value === 'number') target.setScalar(value) - // Otherwise just set ... - else if (value !== undefined) target.set(value) - } - // Else, just overwrite the value - else { - root[key] = value - // Auto-convert sRGB textures, for now ... - // https://github.com/pmndrs/react-three-fiber/issues/344 - if (!rootState?.linear && root[key] instanceof THREE.Texture) { - root[key].encoding = THREE.sRGBEncoding - } - } - } - - if ( - instance?.parent && - rootState?.internal && - instance.object instanceof THREE.Object3D && - prevHandlers !== instance.eventCount - ) { - // Pre-emptively remove the instance from the interaction manager - const index = rootState.internal.interaction.indexOf(instance.object) - if (index > -1) rootState.internal.interaction.splice(index, 1) - // Add the instance to the interaction manager only when it has handlers - if (instance.eventCount && instance.object.raycast !== null && instance.object instanceof THREE.Object3D) { - rootState.internal.interaction.push(instance.object) - } - } - - if (instance) invalidateInstance(instance) - - return object -} - -export function invalidateInstance(instance: Instance): void { - const state = instance.root?.getState?.() - if (state && state.internal.frames === 0) state.invalidate() -} - -export function updateCamera(camera: Camera & { manual?: boolean }, size: Size): void { - // https://github.com/pmndrs/react-three-fiber/issues/92 - // Do not mess with the camera if it belongs to the user - if (!camera.manual) { - if (isOrthographicCamera(camera)) { - camera.left = size.width / -2 - camera.right = size.width / 2 - camera.top = size.height / 2 - camera.bottom = size.height / -2 - } else { - camera.aspect = size.width / size.height - } - camera.updateProjectionMatrix() - // https://github.com/pmndrs/react-three-fiber/issues/178 - // Update matrix world since the renderer is a frame late - camera.updateMatrixWorld() - } -} From d6963ca301587b87cb79beabd4e57380408f91fa Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 11 Oct 2022 04:53:12 -0500 Subject: [PATCH 067/252] fix: invalidate pierced props (#2563) --- packages/fiber/src/core/utils.ts | 5 +++++ packages/fiber/tests/utils.test.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index 71d8e38b71..efa7caefd2 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -260,6 +260,11 @@ export function diffProps( // Props changed, add them changedProps[prop] = newProps[prop] + + // Reset pierced props + for (const other in newProps) { + if (other.startsWith(`${prop}-`)) changedProps[other] = newProps[other] + } } // Reset removed props for HMR diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 1fa17e8574..442b12fda9 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -262,6 +262,18 @@ describe('diffProps', () => { expect(filtered).toStrictEqual({ bar: false }) }) + it('invalidates pierced props when root is changed', async () => { + const texture1 = { needsUpdate: false, name: '' } as THREE.Texture + const texture2 = { needsUpdate: false, name: '' } as THREE.Texture + + const oldProps = { map: texture1, 'map-needsUpdate': true, 'map-name': 'test' } + const newProps = { map: texture2, 'map-needsUpdate': true, 'map-name': 'test' } + + const instance = prepare({}, storeMock, '', oldProps) + const filtered = diffProps(instance, newProps) + expect(filtered).toStrictEqual(newProps) + }) + it('should pick removed props for HMR', () => { const instance = prepare(new THREE.Object3D(), storeMock, '', { position: [0, 0, 1] }) const newProps = {} From e7804f96888983b639f808f76deb822e89e392cf Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 11 Oct 2022 05:10:34 -0500 Subject: [PATCH 068/252] chore: upgrade lockfile --- packages/fiber/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index b3e90e4294..60de2ac41b 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -44,7 +44,7 @@ "dependencies": { "@babel/runtime": "^7.17.8", "@types/react-reconciler": "^0.26.7", - "its-fine": "^1.0.4", + "its-fine": "^1.0.6", "react-reconciler": "^0.27.0", "react-use-measure": "^2.1.1", "scheduler": "^0.21.0", From 9e10ee7437bf9a073511e9234c39d818d6c8046d Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 20 Oct 2022 02:36:14 -0500 Subject: [PATCH 069/252] refactor(types)!: upgrade Zustand to v4 (#2558) --- packages/fiber/package.json | 2 +- packages/fiber/src/core/events.ts | 7 +++---- packages/fiber/src/core/hooks.tsx | 5 ++--- packages/fiber/src/core/index.tsx | 13 ++++++------ packages/fiber/src/core/renderer.ts | 15 +++++-------- packages/fiber/src/core/stages.ts | 8 +++---- packages/fiber/src/core/store.ts | 28 ++++++++++--------------- packages/fiber/src/core/utils.ts | 10 ++------- packages/fiber/src/index.tsx | 1 + packages/fiber/src/native.tsx | 1 + packages/fiber/src/native/events.ts | 5 ++--- packages/fiber/src/web/events.ts | 5 ++--- packages/fiber/tests/index.test.tsx | 23 ++++++++++---------- packages/fiber/tests/utils.test.ts | 5 ++--- packages/test-renderer/src/fireEvent.ts | 5 ++--- yarn.lock | 9 +++++++- 16 files changed, 63 insertions(+), 79 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 60de2ac41b..3e4cc43131 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -49,7 +49,7 @@ "react-use-measure": "^2.1.1", "scheduler": "^0.21.0", "suspend-react": "^0.0.8", - "zustand": "^3.7.1" + "zustand": "^4.1.2" }, "peerDependencies": { "expo": ">=46.0", diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index 39b39c15dc..e71f6eabf9 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -1,9 +1,8 @@ import * as THREE from 'three' import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' import { getRootState } from './utils' -import type { UseBoundStore } from 'zustand' import type { Instance } from './renderer' -import type { RootState } from './store' +import type { RootState, RootStore } from './store' export interface Intersection extends THREE.Intersection { /** The event source (the object which registered the handler) */ @@ -147,7 +146,7 @@ function releaseInternalPointerCapture( } } -export function removeInteractivity(store: UseBoundStore, object: THREE.Object3D) { +export function removeInteractivity(store: RootStore, object: THREE.Object3D) { const { internal } = store.getState() // Removes every trace of an object from the data store internal.interaction = internal.interaction.filter((o) => o !== object) @@ -163,7 +162,7 @@ export function removeInteractivity(store: UseBoundStore, object: THR }) } -export function createEvents(store: UseBoundStore) { +export function createEvents(store: RootStore) { /** Calculates delta */ function calculateDistance(event: DomEvent) { const { internal } = store.getState() diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index beefc24757..a9c2f26613 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -1,6 +1,5 @@ import * as THREE from 'three' import * as React from 'react' -import { StateSelector, EqualityChecker } from 'zustand' import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' import { suspend, preload, clear } from 'suspend-react' import { context, RootState, RenderCallback, StageTypes } from './store' @@ -49,8 +48,8 @@ export function useStore() { * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usethree */ export function useThree( - selector: StateSelector = (state) => state as unknown as T, - equalityFn?: EqualityChecker, + selector: (state: RootState) => T = (state) => state as unknown as T, + equalityFn?: (state: T, newState: T) => boolean, ) { return useStore()(selector, equalityFn) } diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 60cbc0bd20..f2abd6f2ad 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -1,7 +1,7 @@ import * as THREE from 'three' import * as React from 'react' import { ConcurrentRoot } from 'react-reconciler/constants' -import create, { StoreApi, UseBoundStore } from 'zustand' +import create from 'zustand' import { ThreeElement } from '../three-types' import { @@ -18,6 +18,7 @@ import { Subscription, FrameloopLegacy, Frameloop, + RootStore, } from './store' import { reconciler, extend, Root } from './renderer' import { createLoop, addEffect, addAfterEffect, addTail } from './loop' @@ -97,7 +98,7 @@ export type RenderProps = { manual?: boolean } /** An R3F event manager to manage elements' pointer events */ - events?: (store: UseBoundStore) => EventManager + events?: (store: RootStore) => EventManager /** Callback after the canvas has rendered (but not yet committed) */ onCreated?: (state: RootState) => void /** Response for pointer clicks that have missed any target */ @@ -122,7 +123,7 @@ const createRendererInstance = (gl: GLProps, canvas: T }) } -const createStages = (stages: Stage[] | undefined, store: UseBoundStore>) => { +const createStages = (stages: Stage[] | undefined, store: RootStore) => { const state = store.getState() let subscribers: Subscription[] let subscription: Subscription @@ -157,7 +158,7 @@ const createStages = (stages: Stage[] | undefined, store: UseBoundStore = { configure: (config?: RenderProps) => ReconcilerRoot - render: (element: React.ReactNode) => UseBoundStore + render: (element: React.ReactNode) => RootStore unmount: () => void } @@ -366,7 +367,7 @@ function render( children: React.ReactNode, canvas: TCanvas, config: RenderProps, -): UseBoundStore { +): RootStore { console.warn('R3F.render is no longer supported in React 18. Use createRoot instead!') const root = createRoot(canvas) root.configure(config) @@ -380,7 +381,7 @@ function Provider({ rootElement, }: { onCreated?: (state: RootState) => void - store: UseBoundStore + store: RootStore children: React.ReactNode rootElement: TElement parent?: React.MutableRefObject diff --git a/packages/fiber/src/core/renderer.ts b/packages/fiber/src/core/renderer.ts index b5844453f2..dda68ff80f 100644 --- a/packages/fiber/src/core/renderer.ts +++ b/packages/fiber/src/core/renderer.ts @@ -1,14 +1,13 @@ import * as THREE from 'three' -import { UseBoundStore } from 'zustand' import Reconciler from 'react-reconciler' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' import { is, diffProps, applyProps, invalidateInstance, attach, detach, prepare } from './utils' -import { RootState } from './store' +import { RootState, RootStore } from './store' import { removeInteractivity, getEventPriority, EventHandlers } from './events' export interface Root { fiber: Reconciler.FiberRoot - store: UseBoundStore + store: RootStore } export type AttachFnType = (parent: any, self: O) => () => void @@ -31,7 +30,7 @@ export interface InstanceProps { } export interface Instance { - root: UseBoundStore + root: RootStore type: string parent: Instance | null children: Instance[] @@ -47,7 +46,7 @@ export interface Instance { interface HostConfig { type: string props: Instance['props'] - container: UseBoundStore + container: RootStore instance: Instance textInstance: void suspenseInstance: Instance @@ -63,11 +62,7 @@ interface HostConfig { const catalogue: Catalogue = {} const extend = (objects: Partial): void => void Object.assign(catalogue, objects) -function createInstance( - type: string, - props: HostConfig['props'], - root: UseBoundStore, -): HostConfig['instance'] { +function createInstance(type: string, props: HostConfig['props'], root: RootStore): HostConfig['instance'] { // Get target from catalogue const name = `${type[0].toUpperCase()}${type.slice(1)}` const target = catalogue[name] diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 98a97341b7..7a86b48fea 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -1,14 +1,12 @@ import { MutableRefObject } from 'react' -import { StoreApi, UseBoundStore } from 'zustand' -import { RootState } from './store' +import { RootState, RootStore } from './store' export interface UpdateCallback { (state: RootState, delta: number, frame?: XRFrame): void } export type UpdateCallbackRef = MutableRefObject -type Store = UseBoundStore> -export type UpdateSubscription = { ref: UpdateCallbackRef; store: Store } +export type UpdateSubscription = { ref: UpdateCallbackRef; store: RootStore } export type FixedStageOptions = { fixedStep?: number; maxSubsteps?: number } export type FixedStageProps = { fixedStep: number; maxSubsteps: number; accumulator: number; alpha: number } @@ -48,7 +46,7 @@ export class Stage { * @param store - The store to be used with the callback execution. * @returns A function to remove the subscription. */ - add(ref: UpdateCallbackRef, store: Store) { + add(ref: UpdateCallbackRef, store: RootStore) { this.subscribers.push({ ref, store }) return () => { diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 042313cb38..243a6dcb92 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -1,6 +1,6 @@ import * as THREE from 'three' import * as React from 'react' -import create, { GetState, SetState, StoreApi, UseBoundStore } from 'zustand' +import create, { StoreApi, UseBoundStore } from 'zustand' import { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' import { calculateDpr, Camera, isOrthographicCamera, prepare, updateCamera } from './utils' import { FixedStage, Stage } from './stages' @@ -28,7 +28,7 @@ export interface Intersection extends THREE.Intersection { export type Subscription = { ref: React.MutableRefObject priority: number - store: UseBoundStore> + store: RootStore } export type Dpr = number | [min: number, max: number] @@ -89,18 +89,14 @@ export type InternalState = { render: 'auto' | 'manual' /** The max delta time between two frames. */ maxDelta: number - subscribe: ( - callback: React.MutableRefObject, - priority: number, - store: UseBoundStore>, - ) => () => void + subscribe: (callback: React.MutableRefObject, priority: number, store: RootStore) => () => void } export type RootState = { /** Set current state */ - set: SetState + set: StoreApi['setState'] /** Get current state */ - get: GetState + get: StoreApi['getState'] /** The instance of the renderer */ gl: THREE.WebGLRenderer /** Default camera */ @@ -156,17 +152,19 @@ export type RootState = { /** When the canvas was clicked but nothing was hit */ onPointerMissed?: (event: MouseEvent) => void /** If this state model is layerd (via createPortal) then this contains the previous layer */ - previousRoot?: UseBoundStore> + previousRoot?: RootStore /** Internals */ internal: InternalState } -const context = React.createContext>(null!) +export type RootStore = UseBoundStore> + +const context = React.createContext(null!) const createStore = ( invalidate: (state?: RootState, frames?: number) => void, advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: XRFrame) => void, -): UseBoundStore => { +): RootStore => { const rootStore = create((set, get) => { const position = new THREE.Vector3() const defaultTarget = new THREE.Vector3() @@ -311,11 +309,7 @@ const createStore = ( render: 'auto', maxDelta: 1 / 10, priority: 0, - subscribe: ( - ref: React.MutableRefObject, - priority: number, - store: UseBoundStore>, - ) => { + subscribe: (ref: React.MutableRefObject, priority: number, store: RootStore) => { const state = get() const internal = state.internal // If this subscription was given a priority, it takes rendering into its own hands diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index efa7caefd2..d7b62659e7 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -1,9 +1,8 @@ import * as THREE from 'three' import * as React from 'react' import type { Fiber } from 'react-reconciler' -import type { UseBoundStore } from 'zustand' import type { EventHandlers } from './events' -import type { Dpr, RootState, Size } from './store' +import type { Dpr, RootState, RootStore, Size } from './store' import type { ConstructorRepresentation, Instance } from './renderer' export type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera @@ -154,12 +153,7 @@ export function getInstanceProps(queue: Fiber['pendingProps']): Instanc } // Each object in the scene carries a small LocalState descriptor -export function prepare( - target: T, - root: UseBoundStore, - type: string, - props: Instance['props'], -): Instance { +export function prepare(target: T, root: RootStore, type: string, props: Instance['props']): Instance { const object = target as unknown as Instance['object'] // Create instance descriptor diff --git a/packages/fiber/src/index.tsx b/packages/fiber/src/index.tsx index 25ee1afad1..72c2b173c1 100644 --- a/packages/fiber/src/index.tsx +++ b/packages/fiber/src/index.tsx @@ -17,6 +17,7 @@ export type { RenderCallback, Performance, RootState, + RootStore, } from './core/store' export type { ThreeEvent, Events, EventManager, ComputeFunction } from './core/events' export type { ObjectMap, Camera } from './core/utils' diff --git a/packages/fiber/src/native.tsx b/packages/fiber/src/native.tsx index 851eb278dd..ea2bea48ec 100644 --- a/packages/fiber/src/native.tsx +++ b/packages/fiber/src/native.tsx @@ -17,6 +17,7 @@ export type { RenderCallback, Performance, RootState, + RootStore, } from './core/store' export type { ThreeEvent, Events, EventManager, ComputeFunction } from './core/events' export type { ObjectMap, Camera } from './core/utils' diff --git a/packages/fiber/src/native/events.ts b/packages/fiber/src/native/events.ts index fca21c2f4e..6cdde39926 100644 --- a/packages/fiber/src/native/events.ts +++ b/packages/fiber/src/native/events.ts @@ -1,5 +1,4 @@ -import { UseBoundStore } from 'zustand' -import { RootState } from '../core/store' +import { RootState, RootStore } from '../core/store' import { createEvents, DomEvent, EventManager, Events } from '../core/events' import { GestureResponderEvent } from 'react-native' /* eslint-disable import/default, import/no-named-as-default, import/no-named-as-default-member */ @@ -31,7 +30,7 @@ const DOM_EVENTS = { } /** Default R3F event manager for react-native */ -export function createTouchEvents(store: UseBoundStore): EventManager { +export function createTouchEvents(store: RootStore): EventManager { const { handlePointer } = createEvents(store) const handleTouch = (event: GestureResponderEvent, name: keyof typeof EVENTS) => { diff --git a/packages/fiber/src/web/events.ts b/packages/fiber/src/web/events.ts index 7dbfeb8e8c..63f4a14cf7 100644 --- a/packages/fiber/src/web/events.ts +++ b/packages/fiber/src/web/events.ts @@ -1,5 +1,4 @@ -import { UseBoundStore } from 'zustand' -import { RootState } from '../core/store' +import { RootState, RootStore } from '../core/store' import { EventManager, Events, createEvents, DomEvent } from '../core/events' const DOM_EVENTS = { @@ -16,7 +15,7 @@ const DOM_EVENTS = { } as const /** Default R3F event manager for web */ -export function createPointerEvents(store: UseBoundStore): EventManager { +export function createPointerEvents(store: RootStore): EventManager { const { handlePointer } = createEvents(store) return { diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index 016702a758..3584238bb8 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import * as THREE from 'three' -import { ReconcilerRoot, createRoot, act, useFrame, useThree, createPortal, RootState } from '../src/index' -import { UseBoundStore } from 'zustand' +import { ReconcilerRoot, createRoot, act, useFrame, useThree, createPortal, RootState, RootStore } from '../src/index' import { privateKeys } from '../src/core/store' let root: ReconcilerRoot = null! @@ -26,35 +25,35 @@ describe('createRoot', () => { }) it('should handle an performance changing functions', async () => { - let state: UseBoundStore = null! + let store: RootStore = null! await act(async () => { - state = root.configure({ dpr: [1, 2], performance: { min: 0.2 } }).render() + store = root.configure({ dpr: [1, 2], performance: { min: 0.2 } }).render() }) - expect(state.getState().viewport.initialDpr).toEqual(window.devicePixelRatio) - expect(state.getState().performance.min).toEqual(0.2) - expect(state.getState().performance.current).toEqual(1) + expect(store.getState().viewport.initialDpr).toEqual(window.devicePixelRatio) + expect(store.getState().performance.min).toEqual(0.2) + expect(store.getState().performance.current).toEqual(1) await act(async () => { - state.getState().setDpr(0.1) + store.getState().setDpr(0.1) }) - expect(state.getState().viewport.dpr).toEqual(0.1) + expect(store.getState().viewport.dpr).toEqual(0.1) jest.useFakeTimers() await act(async () => { - state.getState().performance.regress() + store.getState().performance.regress() jest.advanceTimersByTime(100) }) - expect(state.getState().performance.current).toEqual(0.2) + expect(store.getState().performance.current).toEqual(0.2) await act(async () => { jest.advanceTimersByTime(200) }) - expect(state.getState().performance.current).toEqual(1) + expect(store.getState().performance.current).toEqual(1) jest.useRealTimers() }) diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 442b12fda9..91fb45b53c 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -1,6 +1,5 @@ import * as THREE from 'three' -import type { UseBoundStore } from 'zustand' -import type { RootState, Instance } from '../src' +import type { Instance, RootStore } from '../src' import { is, dispose, @@ -17,7 +16,7 @@ import { } from '../src/core/utils' // Mocks a Zustand store -const storeMock: UseBoundStore = Object.assign(() => null!, { +const storeMock: RootStore = Object.assign(() => null!, { getState: () => null!, setState() {}, subscribe: () => () => {}, diff --git a/packages/test-renderer/src/fireEvent.ts b/packages/test-renderer/src/fireEvent.ts index df192b1d0e..a2ebdc3c6f 100644 --- a/packages/test-renderer/src/fireEvent.ts +++ b/packages/test-renderer/src/fireEvent.ts @@ -1,5 +1,4 @@ -import type { UseBoundStore } from 'zustand' -import type { RootState } from '@react-three/fiber' +import type { RootStore } from '@react-three/fiber' import { toEventHandlerName } from './helpers/strings' @@ -8,7 +7,7 @@ import { ReactThreeTestInstance } from './createTestInstance' import type { Act, MockSyntheticEvent } from './types/public' import type { MockEventData } from './types/internal' -export const createEventFirer = (act: Act, store: UseBoundStore) => { +export const createEventFirer = (act: Act, store: RootStore) => { const findEventHandler = ( element: ReactThreeTestInstance, eventName: string, diff --git a/yarn.lock b/yarn.lock index b19c3184e8..f61e3e3f7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9589,7 +9589,7 @@ use-error-boundary@^2.0.6: resolved "https://registry.yarnpkg.com/use-error-boundary/-/use-error-boundary-2.0.6.tgz#10f0cd45f6e53cedca8a567fa2b7bc8c709e4420" integrity sha512-AWCVKSAanLe6R/on/ZkHYtGKfXs8BQX6z/TUGYqtvkajLqQyrGKJJscbahtq8OyN8L3LqTRjJWx4gCOLmfIObw== -use-sync-external-store@^1.0.0: +use-sync-external-store@1.2.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== @@ -9995,3 +9995,10 @@ zustand@^3.5.13, zustand@^3.7.1: version "3.7.2" resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA== + +zustand@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.1.2.tgz#4912b24741662d8a84ed1cb52198471cb369c4b6" + integrity sha512-gcRaKchcxFPbImrBb/BKgujOhHhik9YhVpIeP87ETT7uokEe2Szu7KkuZ9ghjtD+/KKkcrRNktR2AiLXPIbKIQ== + dependencies: + use-sync-external-store "1.2.0" From cb65de185af8e7404862f3c070df155e5359c006 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 20 Oct 2022 02:44:39 -0500 Subject: [PATCH 070/252] [v9] refactor(types): export public types (#2559) --- packages/fiber/src/core/events.ts | 12 ++++----- packages/fiber/src/core/hooks.tsx | 4 +-- packages/fiber/src/core/index.tsx | 42 +++++++++++++++++++++++++++++++ packages/fiber/src/core/loop.ts | 2 +- packages/fiber/src/core/stages.ts | 17 ++++--------- packages/fiber/src/core/store.ts | 39 +++++++++++++++++----------- packages/fiber/src/index.tsx | 26 +------------------ packages/fiber/src/native.tsx | 24 +----------------- 8 files changed, 81 insertions(+), 85 deletions(-) diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index e71f6eabf9..81f208644d 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -1,6 +1,6 @@ import * as THREE from 'three' import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' -import { getRootState } from './utils' +import { Camera, getRootState } from './utils' import type { Instance } from './renderer' import type { RootState, RootStore } from './store' @@ -9,7 +9,7 @@ export interface Intersection extends THREE.Intersection { eventObject: THREE.Object3D } -export interface IntersectionEvent extends Intersection { +export interface ThreeEvent extends Intersection { /** The event source (the object which registered the handler) */ eventObject: THREE.Object3D /** An array of intersections */ @@ -27,16 +27,14 @@ export interface IntersectionEvent extends Intersection { /** stopPropagation will stop underlying handlers from firing */ stopPropagation: () => void /** The original host event */ - nativeEvent: TSourceEvent + nativeEvent: TEvent /** If the event was stopped by calling stopPropagation */ stopped: boolean } -export type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera -export type ThreeEvent = IntersectionEvent export type DomEvent = PointerEvent | MouseEvent | WheelEvent -export type Events = { +export interface Events { onClick: EventListener onContextMenu: EventListener onDoubleClick: EventListener @@ -49,7 +47,7 @@ export type Events = { onLostPointerCapture: EventListener } -export type EventHandlers = { +export interface EventHandlers { onClick?: (event: ThreeEvent) => void onContextMenu?: (event: ThreeEvent) => void onDoubleClick?: (event: ThreeEvent) => void diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index a9c2f26613..e3829f552e 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -2,9 +2,9 @@ import * as THREE from 'three' import * as React from 'react' import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' import { suspend, preload, clear } from 'suspend-react' -import { context, RootState, RenderCallback, StageTypes } from './store' +import { context, RootState, RenderCallback, UpdateCallback, StageTypes } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' -import { Stage, Stages, UpdateCallback } from './stages' +import { Stages } from './stages' import { LoadingManager } from 'three' import { Instance } from './renderer' diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index f2abd6f2ad..fd75c85e30 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -590,3 +590,45 @@ export { act, roots as _roots, } + +export type { + AttachFnType, + AttachType, + ConstructorRepresentation, + Catalogue, + Args, + InstanceProps, + Instance, +} from './renderer' +export type { + Subscription, + Dpr, + Size, + Viewport, + RenderCallback, + UpdateCallback, + LegacyAlways, + FrameloopMode, + FrameloopRender, + FrameloopLegacy, + Frameloop, + Performance, + Renderer, + XRManager, + RootState, + RootStore, +} from './store' +export type { + Intersection, + ThreeEvent, + DomEvent, + Events, + EventHandlers, + FilterFunction, + ComputeFunction, + EventManager, + createEvents, +} from './events' +export type { ObjectMap, Camera } from './utils' +export type { GlobalRenderCallback, GlobalEffectType, flushGlobalEffects } from './loop' +export { Stage, FixedStage, Stages } from './stages' diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 0d211c4b8c..49478a380e 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -2,7 +2,7 @@ import * as THREE from 'three' import { Root } from './renderer' import { RootState, Subscription } from './store' -type GlobalRenderCallback = (timeStamp: number) => void +export type GlobalRenderCallback = (timestamp: number) => void type SubItem = { callback: GlobalRenderCallback } function createSubs(callback: GlobalRenderCallback, subs: Set): () => void { diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 7a86b48fea..4776125e66 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -1,15 +1,8 @@ -import { MutableRefObject } from 'react' -import { RootState, RootStore } from './store' +import { StoreApi, UseBoundStore } from 'zustand' +import { RootState, RootStore, Subscription } from './store' -export interface UpdateCallback { - (state: RootState, delta: number, frame?: XRFrame): void -} - -export type UpdateCallbackRef = MutableRefObject -export type UpdateSubscription = { ref: UpdateCallbackRef; store: RootStore } - -export type FixedStageOptions = { fixedStep?: number; maxSubsteps?: number } -export type FixedStageProps = { fixedStep: number; maxSubsteps: number; accumulator: number; alpha: number } +// TODO: Remove deprecated fields in `Subscription` +export type UpdateSubscription = Omit /** * Class representing a stage that updates every frame. @@ -46,7 +39,7 @@ export class Stage { * @param store - The store to be used with the callback execution. * @returns A function to remove the subscription. */ - add(ref: UpdateCallbackRef, store: RootStore) { + add(ref: UpdateSubscription['ref'], store: RootStore) { this.subscribers.push({ ref, store }) return () => { diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 243a6dcb92..622f829b44 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -21,19 +21,20 @@ export const privateKeys = [ export type PrivateKeys = typeof privateKeys[number] -export interface Intersection extends THREE.Intersection { - eventObject: THREE.Object3D -} - -export type Subscription = { +export interface Subscription { ref: React.MutableRefObject priority: number store: RootStore } export type Dpr = number | [min: number, max: number] -export type Size = { width: number; height: number; top: number; left: number } -export type Viewport = Size & { +export interface Size { + width: number + height: number + top: number + left: number +} +export interface Viewport extends Size { /** The initial pixel ratio */ initialDpr: number /** Current pixel ratio */ @@ -47,14 +48,15 @@ export type Viewport = Size & { } export type RenderCallback = (state: RootState, delta: number, frame?: XRFrame) => void +export type UpdateCallback = RenderCallback -type LegacyAlways = 'always' +export type LegacyAlways = 'always' export type FrameloopMode = LegacyAlways | 'auto' | 'demand' | 'never' -type FrameloopRender = 'auto' | 'manual' +export type FrameloopRender = 'auto' | 'manual' export type FrameloopLegacy = 'always' | 'demand' | 'never' export type Frameloop = FrameloopLegacy | { mode?: FrameloopMode; render?: FrameloopRender; maxDelta?: number } -export type Performance = { +export interface Performance { /** Current performance normal, between min and max */ current: number /** How low the performance can go, between 0 and max */ @@ -67,12 +69,14 @@ export type Performance = { regress: () => void } -export type Renderer = { render: (scene: THREE.Scene, camera: THREE.Camera) => any } +export interface Renderer { + render: (scene: THREE.Scene, camera: THREE.Camera) => any +} export const isRenderer = (def: any) => !!def?.render export type StageTypes = Stage | FixedStage -export type InternalState = { +export interface InternalState { interaction: THREE.Object3D[] hovered: Map> subscribers: Subscription[] @@ -92,7 +96,12 @@ export type InternalState = { subscribe: (callback: React.MutableRefObject, priority: number, store: RootStore) => () => void } -export type RootState = { +export interface XRManager { + connect: () => void + disconnect: () => void +} + +export interface RootState { /** Set current state */ set: StoreApi['setState'] /** Get current state */ @@ -110,7 +119,7 @@ export type RootState = { /** Event layer interface, contains the event handler and the node they're connected to */ events: EventManager /** XR interface */ - xr: { connect: () => void; disconnect: () => void } + xr: XRManager /** Currently used controls */ controls: THREE.EventDispatcher | null /** Normalized event coordinates */ @@ -204,7 +213,7 @@ const createStore = ( camera: null as unknown as Camera, raycaster: null as unknown as THREE.Raycaster, events: { priority: 1, enabled: true, connected: false }, - xr: null as unknown as { connect: () => void; disconnect: () => void }, + xr: null as unknown as XRManager, invalidate: (frames = 1) => invalidate(get(), frames), advance: (timestamp: number, runGlobalEffects?: boolean) => advance(timestamp, runGlobalEffects, get()), diff --git a/packages/fiber/src/index.tsx b/packages/fiber/src/index.tsx index 72c2b173c1..bf2f12ecde 100644 --- a/packages/fiber/src/index.tsx +++ b/packages/fiber/src/index.tsx @@ -1,28 +1,4 @@ +export * from './core' export * from './three-types' -export type { - AttachFnType, - AttachType, - ConstructorRepresentation, - Catalogue, - Args, - InstanceProps, - Instance, -} from './core/renderer' -export type { - Intersection, - Subscription, - Dpr, - Size, - Viewport, - RenderCallback, - Performance, - RootState, - RootStore, -} from './core/store' -export type { ThreeEvent, Events, EventManager, ComputeFunction } from './core/events' -export type { ObjectMap, Camera } from './core/utils' export * from './web/Canvas' -export { createEvents } from './core/events' export { createPointerEvents as events } from './web/events' -export * from './core' -export { Stage, FixedStage, Stages } from './core/stages' diff --git a/packages/fiber/src/native.tsx b/packages/fiber/src/native.tsx index ea2bea48ec..4b2a158ac0 100644 --- a/packages/fiber/src/native.tsx +++ b/packages/fiber/src/native.tsx @@ -1,26 +1,4 @@ export * from './three-types' -export type { - AttachFnType, - AttachType, - ConstructorRepresentation, - Catalogue, - Args, - InstanceProps, - Instance, -} from './core/renderer' -export type { - Intersection, - Subscription, - Dpr, - Size, - Viewport, - RenderCallback, - Performance, - RootState, - RootStore, -} from './core/store' -export type { ThreeEvent, Events, EventManager, ComputeFunction } from './core/events' -export type { ObjectMap, Camera } from './core/utils' +export * from './core' export * from './native/Canvas' export { createTouchEvents as events } from './native/events' -export * from './core' From b4c52ee5b134ef58e7eb097c86dce0bef40da4b6 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sat, 29 Oct 2022 06:44:41 -0500 Subject: [PATCH 071/252] chore: unmangle merge --- packages/fiber/tests/hooks.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index 65f6a84159..b97a397256 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -157,7 +157,7 @@ describe('hooks', () => { function Test() { return useLoader(Loader, '', (loader) => (proto = loader)) } - await act(async () => createRoot(canvas).render()) + await act(async () => root.render()) expect(proto).toBeInstanceOf(Loader) }) From 7c85caa9e596d54590f415805141255409479533 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sat, 29 Oct 2022 06:53:24 -0500 Subject: [PATCH 072/252] fix: separate type and js exports --- packages/fiber/src/core/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 9242e23bdf..0edb363290 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -585,6 +585,7 @@ export { addEffect, addAfterEffect, addTail, + createEvents, flushGlobalEffects, getRootState, Act, @@ -628,8 +629,7 @@ export type { FilterFunction, ComputeFunction, EventManager, - createEvents, } from './events' export type { ObjectMap, Camera } from './utils' -export type { GlobalRenderCallback, GlobalEffectType, flushGlobalEffects } from './loop' +export type { GlobalRenderCallback, GlobalEffectType } from './loop' export { Stage, FixedStage, Stages } from './stages' From 36685639ae4f0f2fefc8415505b413bbb62583f9 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sat, 29 Oct 2022 06:54:48 -0500 Subject: [PATCH 073/252] fix: unmangle export --- packages/fiber/src/core/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 0edb363290..b242186f8e 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -22,7 +22,7 @@ import { } from './store' import { reconciler, extend, Root } from './renderer' import { createLoop, addEffect, addAfterEffect, addTail, flushGlobalEffects } from './loop' -import { EventManager, ComputeFunction } from './events' +import { EventManager, ComputeFunction, createEvents } from './events' import { is, dispose, From ce90b8f0d315f633617ed805bd3119e2587f6474 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 1 Nov 2022 15:12:04 -0500 Subject: [PATCH 074/252] [v9] chore(tests): add exports snapshots for targets (#2606) --- .../tests/__snapshots__/index.test.tsx.snap | 86 +++++++++++++++++++ packages/fiber/tests/index.test.tsx | 27 ++++++ 2 files changed, 113 insertions(+) create mode 100644 packages/fiber/tests/__snapshots__/index.test.tsx.snap diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000..3241ce66ce --- /dev/null +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -0,0 +1,86 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`exports matches public API 1`] = ` +Array [ + "Act", + "Args", + "AttachFnType", + "AttachType", + "BranchingReturn", + "Camera", + "Canvas", + "CanvasProps", + "Catalogue", + "ComputeFunction", + "ConditionalType", + "ConstructorRepresentation", + "DomEvent", + "Dpr", + "EventHandlers", + "EventManager", + "Events", + "Extensions", + "FilterFunction", + "FixedStage", + "Frameloop", + "FrameloopLegacy", + "FrameloopMode", + "FrameloopRender", + "GlobalEffectType", + "GlobalRenderCallback", + "InjectState", + "Instance", + "InstanceProps", + "Intersection", + "LegacyAlways", + "Loader", + "LoaderProto", + "LoaderResult", + "LoaderReturnType", + "ObjectMap", + "Performance", + "ReconcilerRoot", + "RenderCallback", + "RenderProps", + "Renderer", + "RootState", + "RootStore", + "Size", + "Stage", + "Stages", + "Subscription", + "ThreeElement", + "ThreeElements", + "ThreeEvent", + "UpdateCallback", + "Viewport", + "XRManager", + "_roots", + "act", + "addAfterEffect", + "addEffect", + "addTail", + "advance", + "applyProps", + "context", + "createEvents", + "createPortal", + "createRoot", + "dispose", + "events", + "extend", + "flushGlobalEffects", + "getRootState", + "invalidate", + "reconciler", + "render", + "unmountComponentAtNode", + "useFrame", + "useGraph", + "useInstanceHandle", + "useLoader", + "useStore", + "useThree", + "useUpdate", +] +`; diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index 3584238bb8..c0f648abae 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -1,5 +1,7 @@ import * as React from 'react' import * as THREE from 'three' +import * as ts from 'typescript' +import * as path from 'path' import { ReconcilerRoot, createRoot, act, useFrame, useThree, createPortal, RootState, RootStore } from '../src/index' import { privateKeys } from '../src/core/store' @@ -217,3 +219,28 @@ describe('createPortal', () => { expect(prevUUID).not.toBe(groupHandle!.uuid) }) }) + +function getExports(source: string): string[] { + const program = ts.createProgram([source], { jsx: ts.JsxEmit.React }) + const checker = program.getTypeChecker() + const sourceFile = program.getSourceFile(source)! + + const sourceFileSymbol = checker.getSymbolAtLocation(sourceFile)! + const moduleExports = checker.getExportsOfModule(sourceFileSymbol) + + return moduleExports.map(({ escapedName }) => escapedName).sort() as unknown as string[] +} + +describe('exports', () => { + it('matches public API', () => { + const webExports = getExports(path.resolve(__dirname, '../src/index.tsx')) + expect(webExports).toMatchSnapshot() + }) + + it('are consistent between targets', () => { + const webExports = getExports(path.resolve(__dirname, '../src/index.tsx')) + const nativeExports = getExports(path.resolve(__dirname, '../src/native.tsx')) + + expect(webExports).toStrictEqual(nativeExports) + }) +}) From 0b753e4c73068009f03e8e75a733106fa9c0fc2b Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 1 Nov 2022 15:32:24 -0500 Subject: [PATCH 075/252] [v9] refactor: streamline core, harden exports (#2583) --- packages/fiber/src/core/events.ts | 34 +- packages/fiber/src/core/hooks.tsx | 4 +- packages/fiber/src/core/index.tsx | 631 +----------------- packages/fiber/src/core/loop.ts | 142 ++-- .../src/core/{renderer.ts => reconciler.ts} | 55 +- packages/fiber/src/core/renderer.tsx | 567 ++++++++++++++++ packages/fiber/src/core/stages.ts | 15 +- packages/fiber/src/core/store.ts | 16 +- packages/fiber/src/core/utils.ts | 32 +- packages/fiber/src/three-types.ts | 3 +- .../tests/__snapshots__/index.test.tsx.snap | 5 + 11 files changed, 746 insertions(+), 758 deletions(-) rename packages/fiber/src/core/{renderer.ts => reconciler.ts} (90%) create mode 100644 packages/fiber/src/core/renderer.tsx diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index c541550c98..7fb93377ca 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -1,7 +1,6 @@ import * as THREE from 'three' -import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' -import { Camera, getRootState } from './utils' -import type { Instance } from './renderer' +import { type Camera, getRootState } from './utils' +import type { Instance } from './reconciler' import type { RootState, RootStore } from './store' export interface Intersection extends THREE.Intersection { @@ -94,35 +93,6 @@ function makeId(event: Intersection) { return (event.eventObject || event.object).uuid + '/' + event.index + event.instanceId } -// https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority -// Gives React a clue as to how import the current interaction is -export function getEventPriority() { - // Get a handle to the current global scope in window and worker contexts if able - // https://github.com/pmndrs/react-three-fiber/pull/2493 - const globalScope = (typeof self !== 'undefined' && self) || (typeof window !== 'undefined' && window) - if (!globalScope) return DefaultEventPriority - - const name = globalScope.event?.type - switch (name) { - 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 - } -} - /** * Release pointer captures. * This is called by releasePointerCapture in the API, and when an object is removed. diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index a072f09a92..10ab308bff 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -1,11 +1,11 @@ import * as THREE from 'three' import * as React from 'react' -import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' +import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' import { suspend, preload, clear } from 'suspend-react' import { context, RootState, RenderCallback, UpdateCallback, StageTypes } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' import { Stages } from './stages' -import { Instance } from './renderer' +import type { Instance } from './reconciler' export interface Loader extends THREE.Loader { load( diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index b242186f8e..52bba06dbe 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -1,598 +1,17 @@ -import * as THREE from 'three' -import * as React from 'react' -import { ConcurrentRoot } from 'react-reconciler/constants' -import create from 'zustand' - -import { ThreeElement } from '../three-types' -import { - Renderer, - createStore, - isRenderer, - context, - RootState, - Size, - Dpr, - Performance, - PrivateKeys, - privateKeys, - Subscription, - FrameloopLegacy, - Frameloop, - RootStore, -} from './store' -import { reconciler, extend, Root } from './renderer' -import { createLoop, addEffect, addAfterEffect, addTail, flushGlobalEffects } from './loop' -import { EventManager, ComputeFunction, createEvents } from './events' -import { - is, - dispose, - calculateDpr, - EquConfig, - getRootState, - useIsomorphicLayoutEffect, - Camera, - updateCamera, - applyProps, -} from './utils' -import { useStore } from './hooks' -import { Stage, Lifecycle, Stages } from './stages' -import { OffscreenCanvas } from 'three' - -const roots = new Map() -const { invalidate, advance } = createLoop(roots) -const shallowLoose = { objects: 'shallow', strict: false } as EquConfig - -type Properties = Pick any ? never : K }[keyof T]> - -type GLProps = - | Renderer - | ((canvas: HTMLCanvasElement) => Renderer) - | Partial | THREE.WebGLRendererParameters> - | undefined - -export type RenderProps = { - /** A threejs renderer instance or props that go into the default renderer */ - gl?: GLProps - /** Dimensions to fit the renderer to. Will measure canvas dimensions if omitted */ - size?: Size - /** - * Enables PCFsoft shadows. Can accept `gl.shadowMap` options for fine-tuning. - * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap - */ - shadows?: boolean | Partial - /** - * Disables three r139 color management. - * @see https://threejs.org/docs/#manual/en/introduction/Color-management - */ - legacy?: boolean - /** Switch off automatic sRGB encoding and gamma correction */ - linear?: boolean - /** Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` */ - flat?: boolean - /** Creates an orthographic camera */ - orthographic?: boolean - /** - * R3F's render mode. Set to `demand` to only render on state change or `never` to take control. - * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#on-demand-rendering - */ - frameloop?: Frameloop - /** - * R3F performance options for adaptive performance. - * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#movement-regression - */ - performance?: Partial> - /** Target pixel ratio. Can clamp between a range: `[min, max]` */ - dpr?: Dpr - /** Props that go into the default raycaster */ - raycaster?: Partial - /** A `THREE.Camera` instance or props that go into the default camera */ - camera?: ( - | Camera - | Partial< - ThreeElement & - ThreeElement & - ThreeElement - > - ) & { - /** Flags the camera as manual, putting projection into your own hands */ - manual?: boolean - } - /** An R3F event manager to manage elements' pointer events */ - events?: (store: RootStore) => EventManager - /** Callback after the canvas has rendered (but not yet committed) */ - onCreated?: (state: RootState) => void - /** Response for pointer clicks that have missed any target */ - onPointerMissed?: (event: MouseEvent) => void - /** Create a custom lifecycle of stages */ - stages?: Stage[] - render?: 'auto' | 'manual' -} - -const createRendererInstance = (gl: GLProps, canvas: TElement): THREE.WebGLRenderer => { - const customRenderer = ( - typeof gl === 'function' ? gl(canvas as unknown as HTMLCanvasElement) : gl - ) as THREE.WebGLRenderer - if (isRenderer(customRenderer)) return customRenderer - else - return new THREE.WebGLRenderer({ - powerPreference: 'high-performance', - canvas: canvas, - antialias: true, - alpha: true, - ...gl, - }) -} - -const createStages = (stages: Stage[] | undefined, store: RootStore) => { - const state = store.getState() - let subscribers: Subscription[] - let subscription: Subscription - - const _stages = stages ?? Lifecycle - - if (!_stages.includes(Stages.Update)) throw 'The Stages.Update stage is required for R3F.' - if (!_stages.includes(Stages.Render)) throw 'The Stages.Render stage is required for R3F.' - - state.set(({ internal }) => ({ internal: { ...internal, stages: _stages } })) - - // Add useFrame loop to update stage - const frameCallback = { - current: (state: RootState, delta: number, frame?: XRFrame | undefined) => { - subscribers = state.internal.subscribers - for (let i = 0; i < subscribers.length; i++) { - subscription = subscribers[i] - subscription.ref.current(subscription.store.getState(), delta, frame) - } - }, - } - Stages.Update.add(frameCallback, store) - - // Add render callback to render stage - const renderCallback = { - current: (state: RootState) => { - if (state.internal.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) - }, - } - Stages.Render.add(renderCallback, store) -} - -export type ReconcilerRoot = { - configure: (config?: RenderProps) => ReconcilerRoot - render: (element: React.ReactNode) => RootStore - unmount: () => void -} - -function computeInitialSize(canvas: HTMLCanvasElement | OffscreenCanvas, size?: Size): Size { - if (!size && canvas instanceof HTMLCanvasElement && canvas.parentElement) { - const { width, height, top, left } = canvas.parentElement.getBoundingClientRect() - return { width, height, top, left } - } - - return { width: 0, height: 0, top: 0, left: 0, ...size } -} - -function createRoot(canvas: TCanvas): ReconcilerRoot { - // Check against mistaken use of createRoot - const prevRoot = roots.get(canvas) - const prevFiber = prevRoot?.fiber - const prevStore = prevRoot?.store - - if (prevRoot) console.warn('R3F.createRoot should only be called once!') - - // Report when an error was detected in a previous render - // https://github.com/pmndrs/react-three-fiber/pull/2261 - const logRecoverableError = - typeof reportError === 'function' - ? // In modern browsers, reportError will dispatch an error event, - // emulating an uncaught JavaScript error. - reportError - : // In older browsers and test environments, fallback to console.error. - console.error - - // Create store - const store = prevStore || createStore(invalidate, advance) - // Create renderer - const fiber = - prevFiber || reconciler.createContainer(store, ConcurrentRoot, null, false, null, '', logRecoverableError, null) - // Map it - if (!prevRoot) roots.set(canvas, { fiber, store }) - - // Locals - let onCreated: ((state: RootState) => void) | undefined - let configured = false - - return { - configure(props: RenderProps = {}) { - let { - gl: glConfig, - size: propsSize, - events, - onCreated: onCreatedCallback, - shadows = false, - linear = false, - flat = false, - legacy = false, - orthographic = false, - frameloop = 'always', - dpr = [1, 2], - performance, - raycaster: raycastOptions, - camera: cameraOptions, - onPointerMissed, - stages, - } = props - - let state = store.getState() - - // Set up renderer (one time only!) - let gl = state.gl - if (!state.gl) state.set({ gl: (gl = createRendererInstance(glConfig, canvas)) }) - - // Set up raycaster (one time only!) - let raycaster = state.raycaster - if (!raycaster) state.set({ raycaster: (raycaster = new THREE.Raycaster()) }) - - // Set raycaster options - const { params, ...options } = raycastOptions || {} - if (!is.equ(options, raycaster, shallowLoose)) applyProps(raycaster, { ...options } as any) - if (!is.equ(params, raycaster.params, shallowLoose)) - applyProps(raycaster, { params: { ...raycaster.params, ...params } } as any) - - // Create default camera (one time only!) - if (!state.camera) { - const isCamera = cameraOptions instanceof THREE.Camera - const camera = isCamera - ? (cameraOptions as Camera) - : orthographic - ? new THREE.OrthographicCamera(0, 0, 0, 0, 0.1, 1000) - : new THREE.PerspectiveCamera(75, 0, 0.1, 1000) - if (!isCamera) { - camera.position.z = 5 - if (cameraOptions) applyProps(camera, cameraOptions as any) - // Always look at center by default - if (!cameraOptions?.rotation) camera.lookAt(0, 0, 0) - } - state.set({ camera }) - } - - // Set up XR (one time only!) - if (!state.xr) { - // Handle frame behavior in WebXR - const handleXRFrame: XRFrameRequestCallback = (timestamp: number, frame?: XRFrame) => { - const state = store.getState() - if (state.frameloop === 'never') return - advance(timestamp, true, state, frame) - } - - // Toggle render switching on session - const handleSessionChange = () => { - const state = store.getState() - state.gl.xr.enabled = state.gl.xr.isPresenting - - state.gl.xr.setAnimationLoop(state.gl.xr.isPresenting ? handleXRFrame : null) - if (!state.gl.xr.isPresenting) invalidate(state) - } - - // WebXR session manager - const xr = { - connect() { - const gl = store.getState().gl - gl.xr.addEventListener('sessionstart', handleSessionChange) - gl.xr.addEventListener('sessionend', handleSessionChange) - }, - disconnect() { - const gl = store.getState().gl - gl.xr.removeEventListener('sessionstart', handleSessionChange) - gl.xr.removeEventListener('sessionend', handleSessionChange) - }, - } - - // Subscribe to WebXR session events - if (gl.xr) xr.connect() - state.set({ xr }) - } - - // Set shadowmap - if (gl.shadowMap) { - const isBoolean = is.boo(shadows) - if ((isBoolean && gl.shadowMap.enabled !== shadows) || !is.equ(shadows, gl.shadowMap, shallowLoose)) { - const old = gl.shadowMap.enabled - gl.shadowMap.enabled = !!shadows - if (!isBoolean) Object.assign(gl.shadowMap, shadows) - else gl.shadowMap.type = THREE.PCFSoftShadowMap - if (old !== gl.shadowMap.enabled) gl.shadowMap.needsUpdate = true - } - } - - // Set color management - ;(THREE as any).ColorManagement.legacyMode = legacy - const outputEncoding = linear ? THREE.LinearEncoding : THREE.sRGBEncoding - const toneMapping = flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping - if (gl.outputEncoding !== outputEncoding) gl.outputEncoding = outputEncoding - if (gl.toneMapping !== toneMapping) gl.toneMapping = toneMapping - - // Update color management state - if (state.legacy !== legacy) state.set(() => ({ legacy })) - if (state.linear !== linear) state.set(() => ({ linear })) - if (state.flat !== flat) state.set(() => ({ flat })) - - // Set gl props - if (glConfig && !is.fun(glConfig) && !isRenderer(glConfig) && !is.equ(glConfig, gl, shallowLoose)) - applyProps(gl, glConfig as any) - // Store events internally - if (events && !state.events.handlers) state.set({ events: events(store) }) - // Check pixelratio - if (dpr && state.viewport.dpr !== calculateDpr(dpr)) state.setDpr(dpr) - // Check size, allow it to take on container bounds initially - const size = computeInitialSize(canvas, propsSize) - if (!is.equ(size, state.size, shallowLoose)) { - state.setSize(size.width, size.height, size.top, size.left) - } - // Check frameloop - if (state.frameloop !== frameloop) state.setFrameloop(frameloop) - // Check pointer missed - if (!state.onPointerMissed) state.set({ onPointerMissed }) - // Check performance - if (performance && !is.equ(performance, state.performance, shallowLoose)) - state.set((state) => ({ performance: { ...state.performance, ...performance } })) - - // Create update stages. Only do this once on init - if (state.internal.stages.length === 0) createStages(stages, store) - - // Set locals - onCreated = onCreatedCallback - configured = true - - return this - }, - render(children: React.ReactNode) { - // The root has to be configured before it can be rendered - if (!configured) this.configure() - - reconciler.updateContainer( - , - fiber, - null, - () => undefined, - ) - return store - }, - unmount() { - unmountComponentAtNode(canvas) - }, - } -} - -function render( - children: React.ReactNode, - canvas: TCanvas, - config: RenderProps, -): RootStore { - console.warn('R3F.render is no longer supported in React 18. Use createRoot instead!') - const root = createRoot(canvas) - root.configure(config) - return root.render(children) -} - -function Provider({ - store, - children, - onCreated, - rootElement, -}: { - onCreated?: (state: RootState) => void - store: RootStore - children: React.ReactNode - rootElement: TElement - parent?: React.MutableRefObject -}) { - useIsomorphicLayoutEffect(() => { - const state = store.getState() - // Flag the canvas active, rendering will now begin - state.set((state) => ({ internal: { ...state.internal, active: true } })) - // Notifiy that init is completed, the scene graph exists, but nothing has yet rendered - if (onCreated) onCreated(state) - // Connect events to the targets parent, this is done to ensure events are registered on - // a shared target, and not on the canvas itself - if (!store.getState().events.connected) state.events.connect?.(rootElement) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - return {children} -} - -function unmountComponentAtNode(canvas: TElement, callback?: (canvas: TElement) => void) { - const root = roots.get(canvas) - const fiber = root?.fiber - if (fiber) { - const state = root?.store.getState() - if (state) state.internal.active = false - reconciler.updateContainer(null, fiber, null, () => { - if (state) { - setTimeout(() => { - try { - state.events.disconnect?.() - state.gl?.renderLists?.dispose?.() - state.gl?.forceContextLoss?.() - if (state.gl?.xr) state.xr.disconnect() - dispose(state.scene) - roots.delete(canvas) - if (callback) callback(canvas) - } catch (e) { - /* ... */ - } - }, 500) - } - }) - } -} - -export type InjectState = Partial< - Omit & { - events?: { - enabled?: boolean - priority?: number - compute?: ComputeFunction - connected?: any - } - size?: Size - } -> - -function createPortal(children: React.ReactNode, container: THREE.Object3D, state?: InjectState): JSX.Element { - return -} - -function Portal({ - state = {}, - children, - container, -}: { - children: React.ReactNode - state?: InjectState - container: THREE.Object3D -}): JSX.Element { - /** This has to be a component because it would not be able to call useThree/useStore otherwise since - * if this is our environment, then we are not in r3f's renderer but in react-dom, it would trigger - * the "R3F hooks can only be used within the Canvas component!" warning: - * - * {createPortal(...)} */ - - const { events, size, ...rest } = state - const previousRoot = useStore() - const [raycaster] = React.useState(() => new THREE.Raycaster()) - const [pointer] = React.useState(() => new THREE.Vector2()) - - const inject = React.useCallback( - (rootState: RootState, injectState: RootState) => { - const intersect: Partial = { ...rootState } // all prev state props - - // Only the fields of "rootState" that do not differ from injectState - // Some props should be off-limits - // Otherwise filter out the props that are different and let the inject layer take precedence - Object.keys(rootState).forEach((key) => { - if ( - // Some props should be off-limits - privateKeys.includes(key as PrivateKeys) || - // Otherwise filter out the props that are different and let the inject layer take precedence - rootState[key as keyof RootState] !== injectState[key as keyof RootState] - ) { - delete intersect[key as keyof RootState] - } - }) - - let viewport = undefined - if (injectState && size) { - const camera = injectState.camera - // Calculate the override viewport, if present - viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), size) - // Update the portal camera, if it differs from the previous layer - if (camera !== rootState.camera) updateCamera(camera, size) - } - - return { - // The intersect consists of the previous root state - ...intersect, - // Portals have their own scene, which forms the root, a raycaster and a pointer - scene: container as THREE.Scene, - raycaster, - pointer, - mouse: pointer, - // Their previous root is the layer before it - previousRoot, - // Events, size and viewport can be overridden by the inject layer - events: { ...rootState.events, ...injectState?.events, ...events }, - size: { ...rootState.size, ...size }, - viewport: { ...rootState.viewport, ...viewport }, - ...rest, - } as RootState - }, - [state], - ) - - const [usePortalStore] = React.useState(() => { - // Create a mirrored store, based on the previous root with a few overrides ... - const previousState = previousRoot.getState() - const store = create((set, get) => ({ - ...previousState, - scene: container as THREE.Scene, - raycaster, - pointer, - mouse: pointer, - previousRoot, - events: { ...previousState.events, ...events }, - size: { ...previousState.size, ...size }, - ...rest, - // Set and get refer to this root-state - set, - get, - // Layers are allowed to override events - setEvents: (events: Partial>) => - set((state) => ({ ...state, events: { ...state.events, ...events } })), - })) - return store - }) - - React.useEffect(() => { - // Subscribe to previous root-state and copy changes over to the mirrored portal-state - const unsub = previousRoot.subscribe((prev) => usePortalStore.setState((state) => inject(prev, state))) - return () => { - unsub() - usePortalStore.destroy() - } - }, []) - - React.useEffect(() => { - usePortalStore.setState((injectState) => inject(previousRoot.getState(), injectState)) - }, [inject]) - - return ( - <> - {reconciler.createPortal( - {children}, - usePortalStore, - null, - )} - - ) -} - -reconciler.injectIntoDevTools({ - bundleType: process.env.NODE_ENV === 'production' ? 0 : 1, - rendererPackageName: '@react-three/fiber', - version: React.version, -}) - -type Act = (cb: () => Promise) => Promise - -/** - * Safely flush async effects when testing, simulating a legacy root. - */ -const act: Act = (React as any).unstable_act - +export type { + Intersection, + ThreeEvent, + DomEvent, + Events, + EventHandlers, + FilterFunction, + ComputeFunction, + EventManager, +} from './events' +export { createEvents } from './events' export * from './hooks' -export { - context, - render, - createRoot, - unmountComponentAtNode, - createPortal, - reconciler, - applyProps, - dispose, - invalidate, - advance, - extend, - addEffect, - addAfterEffect, - addTail, - createEvents, - flushGlobalEffects, - getRootState, - Act, - act, - roots as _roots, -} - +export type { GlobalRenderCallback, GlobalEffectType } from './loop' +export { flushGlobalEffects, addEffect, addAfterEffect, addTail, invalidate, advance } from './loop' export type { AttachFnType, AttachType, @@ -601,7 +20,12 @@ export type { Args, InstanceProps, Instance, -} from './renderer' +} from './reconciler' +export { extend, reconciler } from './reconciler' +export type { ReconcilerRoot, GLProps, CameraProps, RenderProps, InjectState } from './renderer' +export { _roots, render, createRoot, unmountComponentAtNode, createPortal } from './renderer' +export type { UpdateSubscription } from './stages' +export { Stage, FixedStage, Stages } from './stages' export type { Subscription, Dpr, @@ -616,20 +40,11 @@ export type { Frameloop, Performance, Renderer, + StageTypes, XRManager, RootState, RootStore, } from './store' -export type { - Intersection, - ThreeEvent, - DomEvent, - Events, - EventHandlers, - FilterFunction, - ComputeFunction, - EventManager, -} from './events' -export type { ObjectMap, Camera } from './utils' -export type { GlobalRenderCallback, GlobalEffectType } from './loop' -export { Stage, FixedStage, Stages } from './stages' +export { context } from './store' +export type { ObjectMap, Camera, Disposable, Act } from './utils' +export { applyProps, getRootState, dispose, act } from './utils' diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 49478a380e..1f71cb2fa4 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -1,9 +1,10 @@ -import * as THREE from 'three' -import { Root } from './renderer' -import { RootState, Subscription } from './store' +import { _roots } from './renderer' +import type { RootState } from './store' export type GlobalRenderCallback = (timestamp: number) => void -type SubItem = { callback: GlobalRenderCallback } +interface SubItem { + callback: GlobalRenderCallback +} function createSubs(callback: GlobalRenderCallback, subs: Set): () => void { const sub = { callback } @@ -11,10 +12,9 @@ function createSubs(callback: GlobalRenderCallback, subs: Set): () => v return () => void subs.delete(sub) } -let i -let globalEffects: Set = new Set() -let globalAfterEffects: Set = new Set() -let globalTailEffects: Set = new Set() +const globalEffects = new Set() +const globalAfterEffects = new Set() +const globalTailEffects = new Set() /** * Adds a global render callback which is called each frame. @@ -54,8 +54,6 @@ export function flushGlobalEffects(type: GlobalEffectType, timestamp: number): v } } -let subscribers: Subscription[] -let subscription: Subscription function update(timestamp: number, state: RootState, frame?: XRFrame) { // Run local effects let delta = state.clock.getDelta() @@ -76,78 +74,70 @@ function update(timestamp: number, state: RootState, frame?: XRFrame) { return state.frameloop === 'always' ? 1 : state.internal.frames } -export function createLoop(roots: Map) { - let running = false - let repeat: number - let frame: number - let state: RootState - - function loop(timestamp: number): void { - frame = requestAnimationFrame(loop) - running = true - repeat = 0 - - // Run effects - flushGlobalEffects('before', timestamp) - - // Render all roots - for (const root of roots.values()) { - state = root.store.getState() - - // If the frameloop is invalidated, do not run another frame - if ( - state.internal.active && - (state.frameloop === 'always' || state.internal.frames > 0) && - !state.gl.xr?.isPresenting - ) { - repeat += update(timestamp, state) - } +let running = false +let repeat: number +let frame: number +let state: RootState + +export function loop(timestamp: number): void { + frame = requestAnimationFrame(loop) + running = true + repeat = 0 + + // Run effects + flushGlobalEffects('before', timestamp) + + // Render all roots + for (const root of _roots.values()) { + state = root.store.getState() + + // If the frameloop is invalidated, do not run another frame + if ( + state.internal.active && + (state.frameloop === 'always' || state.internal.frames > 0) && + !state.gl.xr?.isPresenting + ) { + repeat += update(timestamp, state) } + } - // Run after-effects - flushGlobalEffects('after', timestamp) - - // Stop the loop if nothing invalidates it - if (repeat === 0) { - // Tail call effects, they are called when rendering stops - flushGlobalEffects('tail', timestamp) + // Run after-effects + flushGlobalEffects('after', timestamp) - // Flag end of operation - running = false - return cancelAnimationFrame(frame) - } - } + // Stop the loop if nothing invalidates it + if (repeat === 0) { + // Tail call effects, they are called when rendering stops + flushGlobalEffects('tail', timestamp) - function invalidate(state?: RootState, frames = 1): void { - if (!state) return roots.forEach((root) => invalidate(root.store.getState()), frames) - if (state.gl.xr?.isPresenting || !state.internal.active || state.frameloop === 'never') return - // Increase frames, do not go higher than 60 - state.internal.frames = Math.min(60, state.internal.frames + frames) - // If the render-loop isn't active, start it - if (!running) { - running = true - requestAnimationFrame(loop) - } + // Flag end of operation + running = false + return cancelAnimationFrame(frame) } +} - function advance(timestamp: number, runGlobalEffects: boolean = true, state?: RootState, frame?: XRFrame): void { - if (runGlobalEffects) flushGlobalEffects('before', timestamp) - if (!state) for (const root of roots.values()) update(timestamp, root.store.getState()) - else update(timestamp, state, frame) - if (runGlobalEffects) flushGlobalEffects('after', timestamp) +/** + * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state. + * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate + */ +export function invalidate(state?: RootState, frames = 1): void { + if (!state) return _roots.forEach((root) => invalidate(root.store.getState()), frames) + if (state.gl.xr?.isPresenting || !state.internal.active || state.frameloop === 'never') return + // Increase frames, do not go higher than 60 + state.internal.frames = Math.min(60, state.internal.frames + frames) + // If the render-loop isn't active, start it + if (!running) { + running = true + requestAnimationFrame(loop) } +} - return { - loop, - /** - * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state. - * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate - */ - invalidate, - /** - * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`. - * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance - */ - advance, - } +/** + * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`. + * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance + */ +export function advance(timestamp: number, runGlobalEffects: boolean = true, state?: RootState, frame?: XRFrame): void { + if (runGlobalEffects) flushGlobalEffects('before', timestamp) + if (!state) for (const root of _roots.values()) update(timestamp, root.store.getState()) + else update(timestamp, state, frame) + if (runGlobalEffects) flushGlobalEffects('after', timestamp) } diff --git a/packages/fiber/src/core/renderer.ts b/packages/fiber/src/core/reconciler.ts similarity index 90% rename from packages/fiber/src/core/renderer.ts rename to packages/fiber/src/core/reconciler.ts index dda68ff80f..69be3ed9c6 100644 --- a/packages/fiber/src/core/renderer.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -1,9 +1,10 @@ import * as THREE from 'three' import Reconciler from 'react-reconciler' +import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' -import { is, diffProps, applyProps, invalidateInstance, attach, detach, prepare } from './utils' -import { RootState, RootStore } from './store' -import { removeInteractivity, getEventPriority, EventHandlers } from './events' +import { is, diffProps, applyProps, invalidateInstance, attach, detach, prepare, globalScope, now } from './utils' +import type { RootStore } from './store' +import { removeInteractivity, type EventHandlers } from './events' export interface Root { fiber: Reconciler.FiberRoot @@ -60,7 +61,7 @@ interface HostConfig { } const catalogue: Catalogue = {} -const extend = (objects: Partial): void => void Object.assign(catalogue, objects) +export const extend = (objects: Partial): void => void Object.assign(catalogue, objects) function createInstance(type: string, props: HostConfig['props'], root: RootStore): HostConfig['instance'] { // Get target from catalogue @@ -268,7 +269,7 @@ function switchInstance( const handleTextInstance = () => console.warn('R3F: Text is not allowed in JSX! This could be stray whitespace or characters.') -const reconciler = Reconciler< +export const reconciler = Reconciler< HostConfig['type'], HostConfig['props'], HostConfig['container'], @@ -375,21 +376,39 @@ const reconciler = Reconciler< createTextInstance: handleTextInstance, hideTextInstance: handleTextInstance, unhideTextInstance: handleTextInstance, + // SSR fallbacks + now, + scheduleTimeout: (is.fun(setTimeout) ? setTimeout : undefined) as any, + cancelTimeout: (is.fun(clearTimeout) ? clearTimeout : undefined) as any, + // @ts-ignore Deprecated experimental APIs + // https://github.com/facebook/react/blob/main/packages/shared/ReactFeatureFlags.js // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r916356874 - // @ts-ignore - getCurrentEventPriority: () => getEventPriority(), beforeActiveInstanceBlur: () => {}, afterActiveInstanceBlur: () => {}, detachDeletedInstance: () => {}, - now: - typeof performance !== 'undefined' && is.fun(performance.now) - ? performance.now - : is.fun(Date.now) - ? Date.now - : () => 0, - // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r920883503 - scheduleTimeout: (is.fun(setTimeout) ? setTimeout : undefined) as any, - cancelTimeout: (is.fun(clearTimeout) ? clearTimeout : undefined) as any, + // Gives React a clue as to how import the current interaction is + // https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority + getCurrentEventPriority() { + if (!globalScope) return DefaultEventPriority + + const name = globalScope.event?.type + switch (name) { + 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 + } + }, }) - -export { extend, reconciler } diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx new file mode 100644 index 0000000000..de1f01384d --- /dev/null +++ b/packages/fiber/src/core/renderer.tsx @@ -0,0 +1,567 @@ +import * as THREE from 'three' +import * as React from 'react' +import { ConcurrentRoot } from 'react-reconciler/constants' +import create from 'zustand' + +import { ThreeElement } from '../three-types' +import { + Renderer, + createStore, + isRenderer, + context, + RootState, + Size, + Dpr, + Performance, + PrivateKeys, + privateKeys, + Subscription, + Frameloop, + RootStore, +} from './store' +import { reconciler, Root } from './reconciler' +import { invalidate, advance } from './loop' +import { EventManager, ComputeFunction } from './events' +import { + is, + dispose, + calculateDpr, + EquConfig, + useIsomorphicLayoutEffect, + Camera, + updateCamera, + applyProps, +} from './utils' +import { useStore } from './hooks' +import { Stage, Lifecycle, Stages } from './stages' +import { OffscreenCanvas } from 'three' + +export const _roots = new Map() + +const shallowLoose = { objects: 'shallow', strict: false } as EquConfig + +type Properties = Pick any ? never : K }[keyof T]> + +export type GLProps = + | Renderer + | ((canvas: HTMLCanvasElement) => Renderer) + | Partial | THREE.WebGLRendererParameters> + +export type CameraProps = ( + | Camera + | Partial< + ThreeElement & + ThreeElement & + ThreeElement + > +) & { + /** Flags the camera as manual, putting projection into your own hands */ + manual?: boolean +} + +export interface RenderProps { + /** A threejs renderer instance or props that go into the default renderer */ + gl?: GLProps + /** Dimensions to fit the renderer to. Will measure canvas dimensions if omitted */ + size?: Size + /** + * Enables PCFsoft shadows. Can accept `gl.shadowMap` options for fine-tuning. + * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap + */ + shadows?: boolean | Partial + /** + * Disables three r139 color management. + * @see https://threejs.org/docs/#manual/en/introduction/Color-management + */ + legacy?: boolean + /** Switch off automatic sRGB encoding and gamma correction */ + linear?: boolean + /** Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` */ + flat?: boolean + /** Creates an orthographic camera */ + orthographic?: boolean + /** + * R3F's render mode. Set to `demand` to only render on state change or `never` to take control. + * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#on-demand-rendering + */ + frameloop?: Frameloop + /** + * R3F performance options for adaptive performance. + * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#movement-regression + */ + performance?: Partial> + /** Target pixel ratio. Can clamp between a range: `[min, max]` */ + dpr?: Dpr + /** Props that go into the default raycaster */ + raycaster?: Partial + /** A `THREE.Camera` instance or props that go into the default camera */ + camera?: CameraProps + /** An R3F event manager to manage elements' pointer events */ + events?: (store: RootStore) => EventManager + /** Callback after the canvas has rendered (but not yet committed) */ + onCreated?: (state: RootState) => void + /** Response for pointer clicks that have missed any target */ + onPointerMissed?: (event: MouseEvent) => void + /** Create a custom lifecycle of stages */ + stages?: Stage[] + render?: 'auto' | 'manual' +} + +const createRendererInstance = ( + gl: GLProps | undefined, + canvas: TElement, +): THREE.WebGLRenderer => { + const customRenderer = ( + typeof gl === 'function' ? gl(canvas as unknown as HTMLCanvasElement) : gl + ) as THREE.WebGLRenderer + if (isRenderer(customRenderer)) return customRenderer + + return new THREE.WebGLRenderer({ + powerPreference: 'high-performance', + canvas: canvas, + antialias: true, + alpha: true, + ...gl, + }) +} + +const createStages = (stages: Stage[] | undefined, store: RootStore) => { + const state = store.getState() + let subscribers: Subscription[] + let subscription: Subscription + + const _stages = stages ?? Lifecycle + + if (!_stages.includes(Stages.Update)) throw 'The Stages.Update stage is required for R3F.' + if (!_stages.includes(Stages.Render)) throw 'The Stages.Render stage is required for R3F.' + + state.set(({ internal }) => ({ internal: { ...internal, stages: _stages } })) + + // Add useFrame loop to update stage + const frameCallback = { + current(state: RootState, delta: number, frame?: XRFrame | undefined) { + subscribers = state.internal.subscribers + for (let i = 0; i < subscribers.length; i++) { + subscription = subscribers[i] + subscription.ref.current(subscription.store.getState(), delta, frame) + } + }, + } + Stages.Update.add(frameCallback, store) + + // Add render callback to render stage + const renderCallback = { + current(state: RootState) { + if (state.internal.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) + }, + } + Stages.Render.add(renderCallback, store) +} + +export interface ReconcilerRoot { + configure: (config?: RenderProps) => ReconcilerRoot + render: (element: React.ReactNode) => RootStore + unmount: () => void +} + +function computeInitialSize(canvas: HTMLCanvasElement | OffscreenCanvas, size?: Size): Size { + if (!size && canvas instanceof HTMLCanvasElement && canvas.parentElement) { + const { width, height, top, left } = canvas.parentElement.getBoundingClientRect() + return { width, height, top, left } + } + + return { width: 0, height: 0, top: 0, left: 0, ...size } +} + +export function createRoot(canvas: TCanvas): ReconcilerRoot { + // Check against mistaken use of createRoot + const prevRoot = _roots.get(canvas) + const prevFiber = prevRoot?.fiber + const prevStore = prevRoot?.store + + if (prevRoot) console.warn('R3F.createRoot should only be called once!') + + // Report when an error was detected in a previous render + // https://github.com/pmndrs/react-three-fiber/pull/2261 + const logRecoverableError = + typeof reportError === 'function' + ? // In modern browsers, reportError will dispatch an error event, + // emulating an uncaught JavaScript error. + reportError + : // In older browsers and test environments, fallback to console.error. + console.error + + // Create store + const store = prevStore || createStore(invalidate, advance) + // Create renderer + const fiber = + prevFiber || reconciler.createContainer(store, ConcurrentRoot, null, false, null, '', logRecoverableError, null) + // Map it + if (!prevRoot) _roots.set(canvas, { fiber, store }) + + // Locals + let onCreated: ((state: RootState) => void) | undefined + let configured = false + + return { + configure(props: RenderProps = {}): ReconcilerRoot { + let { + gl: glConfig, + size: propsSize, + events, + onCreated: onCreatedCallback, + shadows = false, + linear = false, + flat = false, + legacy = false, + orthographic = false, + frameloop = 'always', + dpr = [1, 2], + performance, + raycaster: raycastOptions, + camera: cameraOptions, + onPointerMissed, + stages, + } = props + + let state = store.getState() + + // Set up renderer (one time only!) + let gl = state.gl + if (!state.gl) state.set({ gl: (gl = createRendererInstance(glConfig, canvas)) }) + + // Set up raycaster (one time only!) + let raycaster = state.raycaster + if (!raycaster) state.set({ raycaster: (raycaster = new THREE.Raycaster()) }) + + // Set raycaster options + const { params, ...options } = raycastOptions || {} + if (!is.equ(options, raycaster, shallowLoose)) applyProps(raycaster, { ...options } as any) + if (!is.equ(params, raycaster.params, shallowLoose)) + applyProps(raycaster, { params: { ...raycaster.params, ...params } } as any) + + // Create default camera (one time only!) + if (!state.camera) { + const isCamera = cameraOptions instanceof THREE.Camera + const camera = isCamera + ? (cameraOptions as Camera) + : orthographic + ? new THREE.OrthographicCamera(0, 0, 0, 0, 0.1, 1000) + : new THREE.PerspectiveCamera(75, 0, 0.1, 1000) + if (!isCamera) { + camera.position.z = 5 + if (cameraOptions) applyProps(camera, cameraOptions as any) + // Always look at center by default + if (!cameraOptions?.rotation) camera.lookAt(0, 0, 0) + } + state.set({ camera }) + } + + // Set up XR (one time only!) + if (!state.xr) { + // Handle frame behavior in WebXR + const handleXRFrame: XRFrameRequestCallback = (timestamp: number, frame?: XRFrame) => { + const state = store.getState() + if (state.frameloop === 'never') return + advance(timestamp, true, state, frame) + } + + // Toggle render switching on session + const handleSessionChange = () => { + const state = store.getState() + state.gl.xr.enabled = state.gl.xr.isPresenting + + state.gl.xr.setAnimationLoop(state.gl.xr.isPresenting ? handleXRFrame : null) + if (!state.gl.xr.isPresenting) invalidate(state) + } + + // WebXR session manager + const xr = { + connect() { + const gl = store.getState().gl + gl.xr.addEventListener('sessionstart', handleSessionChange) + gl.xr.addEventListener('sessionend', handleSessionChange) + }, + disconnect() { + const gl = store.getState().gl + gl.xr.removeEventListener('sessionstart', handleSessionChange) + gl.xr.removeEventListener('sessionend', handleSessionChange) + }, + } + + // Subscribe to WebXR session events + if (gl.xr) xr.connect() + state.set({ xr }) + } + + // Set shadowmap + if (gl.shadowMap) { + const isBoolean = is.boo(shadows) + if ((isBoolean && gl.shadowMap.enabled !== shadows) || !is.equ(shadows, gl.shadowMap, shallowLoose)) { + const old = gl.shadowMap.enabled + gl.shadowMap.enabled = !!shadows + if (!isBoolean) Object.assign(gl.shadowMap, shadows) + else gl.shadowMap.type = THREE.PCFSoftShadowMap + if (old !== gl.shadowMap.enabled) gl.shadowMap.needsUpdate = true + } + } + + // Set color management + ;(THREE as any).ColorManagement.legacyMode = legacy + const outputEncoding = linear ? THREE.LinearEncoding : THREE.sRGBEncoding + const toneMapping = flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping + if (gl.outputEncoding !== outputEncoding) gl.outputEncoding = outputEncoding + if (gl.toneMapping !== toneMapping) gl.toneMapping = toneMapping + + // Update color management state + if (state.legacy !== legacy) state.set(() => ({ legacy })) + if (state.linear !== linear) state.set(() => ({ linear })) + if (state.flat !== flat) state.set(() => ({ flat })) + + // Set gl props + if (glConfig && !is.fun(glConfig) && !isRenderer(glConfig) && !is.equ(glConfig, gl, shallowLoose)) + applyProps(gl, glConfig as any) + // Store events internally + if (events && !state.events.handlers) state.set({ events: events(store) }) + // Check pixelratio + if (dpr && state.viewport.dpr !== calculateDpr(dpr)) state.setDpr(dpr) + // Check size, allow it to take on container bounds initially + const size = computeInitialSize(canvas, propsSize) + if (!is.equ(size, state.size, shallowLoose)) { + state.setSize(size.width, size.height, size.top, size.left) + } + // Check frameloop + if (state.frameloop !== frameloop) state.setFrameloop(frameloop) + // Check pointer missed + if (!state.onPointerMissed) state.set({ onPointerMissed }) + // Check performance + if (performance && !is.equ(performance, state.performance, shallowLoose)) + state.set((state) => ({ performance: { ...state.performance, ...performance } })) + + // Create update stages. Only do this once on init + if (state.internal.stages.length === 0) createStages(stages, store) + + // Set locals + onCreated = onCreatedCallback + configured = true + + return this + }, + render(children: React.ReactNode): RootStore { + // The root has to be configured before it can be rendered + if (!configured) this.configure() + + reconciler.updateContainer( + , + fiber, + null, + () => undefined, + ) + return store + }, + unmount(): void { + unmountComponentAtNode(canvas) + }, + } +} + +export function render( + children: React.ReactNode, + canvas: TCanvas, + config: RenderProps, +): RootStore { + console.warn('R3F.render is no longer supported in React 18. Use createRoot instead!') + const root = createRoot(canvas) + root.configure(config) + return root.render(children) +} + +interface ProviderProps { + onCreated?: (state: RootState) => void + store: RootStore + children: React.ReactNode + rootElement: TElement + parent?: React.MutableRefObject +} + +function Provider({ + store, + children, + onCreated, + rootElement, +}: ProviderProps): JSX.Element { + useIsomorphicLayoutEffect(() => { + const state = store.getState() + // Flag the canvas active, rendering will now begin + state.set((state) => ({ internal: { ...state.internal, active: true } })) + // Notifiy that init is completed, the scene graph exists, but nothing has yet rendered + if (onCreated) onCreated(state) + // Connect events to the targets parent, this is done to ensure events are registered on + // a shared target, and not on the canvas itself + if (!store.getState().events.connected) state.events.connect?.(rootElement) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + return {children} +} + +export function unmountComponentAtNode( + canvas: TElement, + callback?: (canvas: TElement) => void, +): void { + const root = _roots.get(canvas) + const fiber = root?.fiber + if (fiber) { + const state = root?.store.getState() + if (state) state.internal.active = false + reconciler.updateContainer(null, fiber, null, () => { + if (state) { + setTimeout(() => { + try { + state.events.disconnect?.() + state.gl?.renderLists?.dispose?.() + state.gl?.forceContextLoss?.() + if (state.gl?.xr) state.xr.disconnect() + dispose(state.scene) + _roots.delete(canvas) + if (callback) callback(canvas) + } catch (e) { + /* ... */ + } + }, 500) + } + }) + } +} + +export type InjectState = Partial< + Omit & { + events?: { + enabled?: boolean + priority?: number + compute?: ComputeFunction + connected?: any + } + size?: Size + } +> + +export function createPortal(children: React.ReactNode, container: THREE.Object3D, state?: InjectState): JSX.Element { + return +} + +interface PortalProps { + children: React.ReactNode + state?: InjectState + container: THREE.Object3D +} + +function Portal({ state = {}, children, container }: PortalProps): JSX.Element { + /** This has to be a component because it would not be able to call useThree/useStore otherwise since + * if this is our environment, then we are not in r3f's renderer but in react-dom, it would trigger + * the "R3F hooks can only be used within the Canvas component!" warning: + * + * {createPortal(...)} */ + + const previousRoot = useStore() + const [raycaster] = React.useState(() => new THREE.Raycaster()) + const [pointer] = React.useState(() => new THREE.Vector2()) + + const inject = React.useCallback( + (rootState: RootState, injectState: RootState) => { + const intersect: Partial = { ...rootState } // all prev state props + + // Only the fields of "rootState" that do not differ from injectState + // Some props should be off-limits + // Otherwise filter out the props that are different and let the inject layer take precedence + Object.keys(rootState).forEach((key) => { + if ( + // Some props should be off-limits + privateKeys.includes(key as PrivateKeys) || + // Otherwise filter out the props that are different and let the inject layer take precedence + rootState[key as keyof RootState] !== injectState[key as keyof RootState] + ) { + delete intersect[key as keyof RootState] + } + }) + + let viewport = undefined + if (injectState && state.size) { + const camera = injectState.camera + // Calculate the override viewport, if present + viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), state.size) + // Update the portal camera, if it differs from the previous layer + if (camera !== rootState.camera) updateCamera(camera, state.size) + } + + return { + // The intersect consists of the previous root state + ...intersect, + // Portals have their own scene, which forms the root, a raycaster and a pointer + scene: container as THREE.Scene, + raycaster, + pointer, + mouse: pointer, + // Their previous root is the layer before it + previousRoot, + // Events, size and viewport can be overridden by the inject layer + events: { ...rootState.events, ...injectState?.events, ...state.events }, + size: { ...rootState.size, ...state.size }, + viewport: { ...rootState.viewport, ...viewport }, + ...state, + } as RootState + }, + [container, pointer, previousRoot, raycaster, state], + ) + + const [usePortalStore] = React.useState(() => { + // Create a mirrored store, based on the previous root with a few overrides ... + const previousState = previousRoot.getState() + const store = create((set, get) => ({ + ...previousState, + scene: container as THREE.Scene, + raycaster, + pointer, + mouse: pointer, + previousRoot, + ...state, + events: { ...previousState.events, ...state.events }, + size: { ...previousState.size, ...state.size }, + // Set and get refer to this root-state + set, + get, + // Layers are allowed to override events + setEvents: (events: Partial>) => + set((state) => ({ ...state, events: { ...state.events, ...events } })), + })) + return store + }) + + React.useEffect(() => { + // Subscribe to previous root-state and copy changes over to the mirrored portal-state + const unsub = previousRoot.subscribe((prev) => usePortalStore.setState((state) => inject(prev, state))) + return () => { + unsub() + usePortalStore.destroy() + } + }, [previousRoot, usePortalStore, inject]) + + React.useEffect(() => { + usePortalStore.setState((injectState) => inject(previousRoot.getState(), injectState)) + }, [usePortalStore, inject, previousRoot]) + + return ( + <> + {reconciler.createPortal( + {children}, + usePortalStore, + null, + )} + + ) +} + +reconciler.injectIntoDevTools({ + bundleType: process.env.NODE_ENV === 'production' ? 0 : 1, + rendererPackageName: '@react-three/fiber', + version: React.version, +}) diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts index 4776125e66..cb8d812d13 100644 --- a/packages/fiber/src/core/stages.ts +++ b/packages/fiber/src/core/stages.ts @@ -1,5 +1,4 @@ -import { StoreApi, UseBoundStore } from 'zustand' -import { RootState, RootStore, Subscription } from './store' +import type { Subscription, RootStore } from './store' // TODO: Remove deprecated fields in `Subscription` export type UpdateSubscription = Omit @@ -144,12 +143,12 @@ export class FixedStage extends Stage { } } -const Early = new Stage() -const Fixed = new FixedStage() -const Update = new Stage() -const Late = new Stage() -const Render = new Stage() -const After = new Stage() +const Early = /*#__PURE__*/ new Stage() +const Fixed = /*#__PURE__*/ new FixedStage() +const Update = /*#__PURE__*/ new Stage() +const Late = /*#__PURE__*/ new Stage() +const Render = /*#__PURE__*/ new Stage() +const After = /*#__PURE__*/ new Stage() export const Stages = { Early, Fixed, Update, Late, Render, After } export const Lifecycle = [Early, Fixed, Update, Late, Render, After] diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 622f829b44..fe375b97a9 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -1,9 +1,9 @@ import * as THREE from 'three' import * as React from 'react' -import create, { StoreApi, UseBoundStore } from 'zustand' -import { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' -import { calculateDpr, Camera, isOrthographicCamera, prepare, updateCamera } from './utils' -import { FixedStage, Stage } from './stages' +import create, { type StoreApi, type UseBoundStore } from 'zustand' +import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' +import { calculateDpr, type Camera, isOrthographicCamera, prepare, updateCamera } from './utils' +import type { FixedStage, Stage } from './stages' // Keys that shouldn't be copied between R3F stores export const privateKeys = [ @@ -109,7 +109,7 @@ export interface RootState { /** The instance of the renderer */ gl: THREE.WebGLRenderer /** Default camera */ - camera: Camera & { manual?: boolean } + camera: Camera /** Default scene */ scene: THREE.Scene /** Default raycaster */ @@ -168,9 +168,9 @@ export interface RootState { export type RootStore = UseBoundStore> -const context = React.createContext(null!) +export const context = React.createContext(null!) -const createStore = ( +export const createStore = ( invalidate: (state?: RootState, frames?: number) => void, advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: XRFrame) => void, ): RootStore => { @@ -389,5 +389,3 @@ const createStore = ( // Return root state return rootStore } - -export { createStore, context } diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index d7b62659e7..4b9a65df83 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -3,9 +3,16 @@ import * as React from 'react' import type { Fiber } from 'react-reconciler' import type { EventHandlers } from './events' import type { Dpr, RootState, RootStore, Size } from './store' -import type { ConstructorRepresentation, Instance } from './renderer' +import type { ConstructorRepresentation, Instance } from './reconciler' -export type Camera = THREE.OrthographicCamera | THREE.PerspectiveCamera +export type Act = (cb: () => Promise) => Promise + +/** + * Safely flush async effects when testing, simulating a legacy root. + */ +export const act: Act = (React as any).unstable_act + +export type Camera = (THREE.OrthographicCamera | THREE.PerspectiveCamera) & { manual?: boolean } export const isOrthographicCamera = (def: Camera): def is THREE.OrthographicCamera => def && (def as THREE.OrthographicCamera).isOrthographicCamera export const isRef = (obj: any): obj is React.MutableRefObject => obj && obj.hasOwnProperty('current') @@ -369,7 +376,7 @@ export function invalidateInstance(instance: Instance): void { if (state && state.internal.frames === 0) state.invalidate() } -export function updateCamera(camera: Camera & { manual?: boolean }, size: Size): void { +export function updateCamera(camera: Camera, size: Size): void { // https://github.com/pmndrs/react-three-fiber/issues/92 // Do not mess with the camera if it belongs to the user if (!camera.manual) { @@ -387,3 +394,22 @@ export function updateCamera(camera: Camera & { manual?: boolean }, size: Size): camera.updateMatrixWorld() } } + +/** + * Get a handle to the supported `now` function for react-internal performance profiling. + */ +export const now = + typeof performance !== 'undefined' && is.fun(performance.now) + ? performance.now + : is.fun(Date.now) + ? Date.now + : () => 0 + +/** + * Get a handle to the current global scope in window and worker contexts if able + * https://github.com/pmndrs/react-three-fiber/pull/2493 + */ +export const globalScope = + (typeof global !== 'undefined' && global) || + (typeof self !== 'undefined' && self) || + (typeof window !== 'undefined' && window) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index e5cfa5a9ae..287060329c 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -1,6 +1,5 @@ import type * as THREE from 'three' -import type { EventHandlers } from './core/events' -import type { InstanceProps, ConstructorRepresentation } from './core/renderer' +import type { EventHandlers, InstanceProps, ConstructorRepresentation } from './core' type Mutable

= { [K in keyof P]: P[K] | Readonly } type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 3241ce66ce..2d12a48601 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -8,12 +8,14 @@ Array [ "AttachType", "BranchingReturn", "Camera", + "CameraProps", "Canvas", "CanvasProps", "Catalogue", "ComputeFunction", "ConditionalType", "ConstructorRepresentation", + "Disposable", "DomEvent", "Dpr", "EventHandlers", @@ -26,6 +28,7 @@ Array [ "FrameloopLegacy", "FrameloopMode", "FrameloopRender", + "GLProps", "GlobalEffectType", "GlobalRenderCallback", "InjectState", @@ -47,12 +50,14 @@ Array [ "RootStore", "Size", "Stage", + "StageTypes", "Stages", "Subscription", "ThreeElement", "ThreeElements", "ThreeEvent", "UpdateCallback", + "UpdateSubscription", "Viewport", "XRManager", "_roots", From 27295a7902943e75561e436a75ada3563702d471 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Wed, 2 Nov 2022 03:03:18 -0500 Subject: [PATCH 076/252] experiment: create objects with container effects --- packages/fiber/src/core/reconciler.ts | 43 ++++++++++++++++----------- packages/fiber/src/core/utils.ts | 4 +-- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 69be3ed9c6..8e2ba2a20a 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -81,17 +81,7 @@ function createInstance(type: string, props: HostConfig['props'], root: RootStor if (props.args !== undefined && !Array.isArray(props.args)) throw new Error('R3F: The args prop must be an array!') // Create instance - const object = props.object ?? new target(...(props.args ?? [])) - const instance = prepare(object, root, type, props) - - // Auto-attach geometries and materials - if (instance.props.attach === undefined) { - if (instance.object instanceof THREE.BufferGeometry) instance.props.attach = 'geometry' - else if (instance.object instanceof THREE.Material) instance.props.attach = 'material' - } - - // Set initial props - applyProps(instance.object, props) + const instance = prepare(props.object, root, type, props) return instance } @@ -104,6 +94,25 @@ function handleContainerEffects(parent: Instance, child: Instance) { const state = child.root.getState() if (!parent.parent && parent.object !== state.scene) return + if (!child.object) { + // Get target from catalogue + const name = `${child.type[0].toUpperCase()}${child.type.slice(1)}` + const target = catalogue[name] + + // Create object + child.object = child.props.object ?? new target(...(child.props.args ?? [])) + child.object.__r3f = child + } + + // Auto-attach geometries and materials + if (child.props.attach === undefined) { + if (child.object instanceof THREE.BufferGeometry) child.props.attach = 'geometry' + else if (child.object instanceof THREE.Material) child.props.attach = 'material' + } + + // Set initial props + applyProps(child.object, child.props) + // Handle interactivity if (child.eventCount > 0 && child.object.raycast !== null && child.object instanceof THREE.Object3D) { state.internal.interaction.push(child.object) @@ -121,14 +130,14 @@ function appendChild(parent: HostConfig['instance'], child: HostConfig['instance child.parent = parent parent.children.push(child) + // Attach tree once complete + handleContainerEffects(parent, child) + // Add Object3Ds if able if (!child.props.attach && parent.object instanceof THREE.Object3D && child.object instanceof THREE.Object3D) { parent.object.add(child.object) } - // Attach tree once complete - handleContainerEffects(parent, child) - // Tree was updated, request a frame invalidateInstance(child) } @@ -147,6 +156,9 @@ function insertBefore( if (childIndex !== -1) parent.children.splice(childIndex, replace ? 1 : 0, child) if (replace) beforeChild.parent = null + // Attach tree once complete + handleContainerEffects(parent, child) + // Manually splice Object3Ds if ( !child.props.attach && @@ -159,9 +171,6 @@ function insertBefore( child.object.dispatchEvent({ type: 'added' }) } - // Attach tree once complete - handleContainerEffects(parent, child) - // Tree was updated, request a frame invalidateInstance(child) } diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index 4b9a65df83..04ebfdfb14 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -164,7 +164,7 @@ export function prepare(target: T, root: RootStore, type: string, props const object = target as unknown as Instance['object'] // Create instance descriptor - let instance = object.__r3f + let instance = object?.__r3f if (!instance) { instance = { root, @@ -177,7 +177,7 @@ export function prepare(target: T, root: RootStore, type: string, props handlers: {}, isHidden: false, } - object.__r3f = instance + if (object) object.__r3f = instance } return instance From cec4297ff4bda29076497b2fde2ea58933bd025e Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 18 Dec 2022 12:16:49 -0600 Subject: [PATCH 077/252] fix(types): don't overwrite types of infer fallback (#2669) --- packages/fiber/src/core/reconciler.ts | 4 ++-- packages/fiber/src/three-types.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 69be3ed9c6..82914fecab 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -22,8 +22,8 @@ export interface Catalogue { export type Args = T extends ConstructorRepresentation ? ConstructorParameters : any[] -export interface InstanceProps { - args?: Args +export interface InstanceProps { + args?: Args

object?: T visible?: boolean dispose?: null diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 287060329c..d97d746195 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -11,7 +11,7 @@ interface MathRepresentation { interface VectorRepresentation extends MathRepresentation { setScalar(s: number): any } -type MathProps

= { +type WithMathProps

= { [K in keyof P]: P[K] extends infer M ? M extends THREE.Color ? ConstructorParameters | THREE.ColorRepresentation @@ -19,8 +19,8 @@ type MathProps

= { ? M extends VectorRepresentation ? M | Parameters | Parameters[0] : M | Parameters - : {} - : {} + : M + : P[K] } interface RaycastableRepresentation { @@ -35,11 +35,11 @@ interface ReactProps

{ } type ElementProps> = Partial< - Overwrite & MathProps

& EventProps

> + Overwrite, ReactProps

& EventProps

> > export type ThreeElement = Mutable< - Overwrite, Omit>, 'object'>> + Overwrite, Omit, T>, 'object'>> > type ThreeExports = typeof THREE From 0df10bbed3f85a8dd8acecbfda45344dc9508d56 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 31 Dec 2022 12:52:20 -0600 Subject: [PATCH 078/252] chore(types): add back ReactThreeFiber namespace, math types (#2674) --- packages/fiber/src/index.tsx | 4 ++- packages/fiber/src/native.tsx | 2 ++ packages/fiber/src/three-types.ts | 28 +++++++++++-------- .../tests/__snapshots__/index.test.tsx.snap | 8 ++++++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/packages/fiber/src/index.tsx b/packages/fiber/src/index.tsx index bf2f12ecde..f1b06cdb69 100644 --- a/packages/fiber/src/index.tsx +++ b/packages/fiber/src/index.tsx @@ -1,4 +1,6 @@ -export * from './core' +import * as ReactThreeFiber from './three-types' +export { ReactThreeFiber } export * from './three-types' +export * from './core' export * from './web/Canvas' export { createPointerEvents as events } from './web/events' diff --git a/packages/fiber/src/native.tsx b/packages/fiber/src/native.tsx index 4b2a158ac0..a4c0fdd166 100644 --- a/packages/fiber/src/native.tsx +++ b/packages/fiber/src/native.tsx @@ -1,3 +1,5 @@ +import * as ReactThreeFiber from './three-types' +export { ReactThreeFiber } export * from './three-types' export * from './core' export * from './native/Canvas' diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index d97d746195..0184ff05d1 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -6,22 +6,26 @@ type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K type Overwrite = Omit> & O interface MathRepresentation { - set(...args: any[]): any + set(...args: number[]): any } interface VectorRepresentation extends MathRepresentation { setScalar(s: number): any } -type WithMathProps

= { - [K in keyof P]: P[K] extends infer M - ? M extends THREE.Color - ? ConstructorParameters | THREE.ColorRepresentation - : M extends MathRepresentation - ? M extends VectorRepresentation - ? M | Parameters | Parameters[0] - : M | Parameters - : M - : P[K] -} + +export type MathType = T extends THREE.Color + ? ConstructorParameters | THREE.ColorRepresentation + : T extends VectorRepresentation | THREE.Layers + ? T | Parameters | number + : T | Parameters + +export type Vector2 = MathType +export type Vector3 = MathType +export type Vector4 = MathType +export type Color = MathType +export type Layers = MathType +export type Quaternion = MathType + +type WithMathProps

= { [K in keyof P]: P[K] extends MathRepresentation ? MathType : P[K] } interface RaycastableRepresentation { raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 2d12a48601..97a11839d0 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -12,6 +12,7 @@ Array [ "Canvas", "CanvasProps", "Catalogue", + "Color", "ComputeFunction", "ConditionalType", "ConstructorRepresentation", @@ -35,13 +36,17 @@ Array [ "Instance", "InstanceProps", "Intersection", + "Layers", "LegacyAlways", "Loader", "LoaderProto", "LoaderResult", "LoaderReturnType", + "MathType", "ObjectMap", "Performance", + "Quaternion", + "ReactThreeFiber", "ReconcilerRoot", "RenderCallback", "RenderProps", @@ -58,6 +63,9 @@ Array [ "ThreeEvent", "UpdateCallback", "UpdateSubscription", + "Vector2", + "Vector3", + "Vector4", "Viewport", "XRManager", "_roots", From d82d9ad2d129e02fd065df41650f2b078ec7870d Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sat, 31 Dec 2022 13:09:31 -0600 Subject: [PATCH 079/252] fix(events): unmangle types --- packages/fiber/src/core/events.ts | 7 +++---- packages/fiber/src/core/utils.ts | 5 +++++ packages/fiber/src/three-types.ts | 5 +---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index 9e2142d6b5..7d7cfeb5d9 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -1,15 +1,14 @@ import * as THREE from 'three' -import { getRootState } from './utils' +import { getRootState, type Properties } from './utils' import type { Instance } from './reconciler' import type { RootState, RootStore } from './store' -import type { Properties } from '../three-types' export interface Intersection extends THREE.Intersection { /** The event source (the object which registered the handler) */ eventObject: THREE.Object3D } -export interface ThreeEvent extends Intersection { +export interface IntersectionEvent extends Intersection { /** The event source (the object which registered the handler) */ eventObject: THREE.Object3D /** An array of intersections */ @@ -27,7 +26,7 @@ export interface ThreeEvent extends Intersection { /** stopPropagation will stop underlying handlers from firing */ stopPropagation: () => void /** The original host event */ - nativeEvent: TEvent + nativeEvent: TSourceEvent /** If the event was stopped by calling stopPropagation */ stopped: boolean } diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index 4b9a65df83..a66637f829 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -5,6 +5,11 @@ import type { EventHandlers } from './events' import type { Dpr, RootState, RootStore, Size } from './store' import type { ConstructorRepresentation, Instance } from './reconciler' +export type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] +export type Overwrite = Omit> & O +export type Properties = Pick> +export type Mutable

= { [K in keyof P]: P[K] | Readonly } + export type Act = (cb: () => Promise) => Promise /** diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 0184ff05d1..91e415d97c 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -1,9 +1,6 @@ import type * as THREE from 'three' import type { EventHandlers, InstanceProps, ConstructorRepresentation } from './core' - -type Mutable

= { [K in keyof P]: P[K] | Readonly } -type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] -type Overwrite = Omit> & O +import type { Mutable, Overwrite } from './core/utils' interface MathRepresentation { set(...args: number[]): any From dd1ffe8fb96dabbe7cdf7bb920f77347b9b5ca52 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 31 Dec 2022 14:06:52 -0600 Subject: [PATCH 080/252] [v9] fix(core): correctly swap map elements on invalidate (#2690) --- packages/fiber/src/core/reconciler.ts | 10 +++++-- packages/fiber/tests/renderer.test.tsx | 29 +++++++++++++++++++ .../__snapshots__/RTTR.core.test.tsx.snap | 14 ++++----- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 82914fecab..5b890d7499 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -42,6 +42,7 @@ export interface Instance { attach?: AttachType previousAttach?: any isHidden: boolean + autoRemovedBeforeAppend?: boolean } interface HostConfig { @@ -155,7 +156,7 @@ function insertBefore( beforeChild.object instanceof THREE.Object3D ) { child.object.parent = parent.object - parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), 0, child.object) + parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), replace ? 1 : 0, child.object) child.object.dispatchEvent({ type: 'added' }) } @@ -243,7 +244,12 @@ function switchInstance( // Link up new instance const parent = oldInstance.parent if (parent) { - insertBefore(parent, newInstance, oldInstance, true) + // Manually handle replace https://github.com/pmndrs/react-three-fiber/pull/2680 + // insertBefore(parent, newInstance, oldInstance, true) + + if (!oldInstance.autoRemovedBeforeAppend) removeChild(parent, oldInstance) + if (newInstance.parent) newInstance.autoRemovedBeforeAppend = true + appendChild(parent, newInstance) } // This evil hack switches the react-internal fiber node diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index e6aec2d8a1..270b6af3ef 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -393,6 +393,35 @@ describe('renderer', () => { expect(disposeDeclarativePrimitive).toBeCalled() }) + it('can swap 4 array primitives', async () => { + const a = new THREE.Group() + const b = new THREE.Group() + const c = new THREE.Group() + const d = new THREE.Group() + + const Test = ({ array }: { array: THREE.Group[] }) => ( + <> + {array.map((group, i) => ( + + ))} + + ) + + const array = [a, b, c, d] + const store = await act(async () => root.render()) + const { scene } = store.getState() + + expect(scene.children).toStrictEqual(array) + + const reversedArray = [d, c, b, a] + await act(async () => root.render()) + expect(scene.children).toStrictEqual(reversedArray) + + const mixedArray = [b, a, d, c] + await act(async () => root.render()) + expect(scene.children).toStrictEqual(mixedArray) + }) + it('should gracefully handle text', async () => { const warn = console.warn console.warn = jest.fn() diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index 6832a2d939..6d7b8f81dc 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -386,6 +386,13 @@ Array [ }, Object { "children": Array [ + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshBasicMaterial", + }, Object { "children": Array [], "props": Object { @@ -397,13 +404,6 @@ Array [ }, "type": "boxGeometry", }, - Object { - "children": Array [], - "props": Object { - "attach": "material", - }, - "type": "meshBasicMaterial", - }, ], "props": Object { "position-x": 12, From 817052707fe54406b229716cfd28430d6eba6ec2 Mon Sep 17 00:00:00 2001 From: Kris Date: Fri, 13 Jan 2023 11:17:11 -0800 Subject: [PATCH 081/252] fix: Euler types and ReactProps (#2705) --- packages/fiber/src/three-types.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 91e415d97c..1cc856165b 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -9,9 +9,9 @@ interface VectorRepresentation extends MathRepresentation { setScalar(s: number): any } -export type MathType = T extends THREE.Color +export type MathType = T extends THREE.Color ? ConstructorParameters | THREE.ColorRepresentation - : T extends VectorRepresentation | THREE.Layers + : T extends VectorRepresentation | THREE.Layers | THREE.Euler ? T | Parameters | number : T | Parameters @@ -21,15 +21,16 @@ export type Vector4 = MathType export type Color = MathType export type Layers = MathType export type Quaternion = MathType +export type Euler = MathType -type WithMathProps

= { [K in keyof P]: P[K] extends MathRepresentation ? MathType : P[K] } +type WithMathProps

= { [K in keyof P]: P[K] extends MathRepresentation | THREE.Euler ? MathType : P[K] } interface RaycastableRepresentation { raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void } type EventProps

= P extends RaycastableRepresentation ? Partial : {} -interface ReactProps

{ +export interface ReactProps

{ children?: React.ReactNode ref?: React.Ref

key?: React.Key From a47e48d868625ac55b8303ff71133d9e184577ad Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sat, 14 Jan 2023 03:20:34 -0600 Subject: [PATCH 082/252] chore(tests): update snapshot --- packages/fiber/tests/__snapshots__/index.test.tsx.snap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 97a11839d0..9e3b07a8e3 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -19,6 +19,7 @@ Array [ "Disposable", "DomEvent", "Dpr", + "Euler", "EventHandlers", "EventManager", "Events", @@ -46,6 +47,7 @@ Array [ "ObjectMap", "Performance", "Quaternion", + "ReactProps", "ReactThreeFiber", "ReconcilerRoot", "RenderCallback", From a660cd1969a0c4c4095f1f2343055eead273d48b Mon Sep 17 00:00:00 2001 From: Kris Date: Thu, 19 Jan 2023 14:52:25 -0800 Subject: [PATCH 083/252] fix: applyProps ignores undefined props (#2709) --- packages/fiber/src/core/utils.ts | 5 ++++- packages/fiber/tests/utils.test.ts | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index a66637f829..e18ef94bba 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -314,13 +314,16 @@ export function applyProps(object: Instance['object'], props: Instan // Don't mutate reserved keys if (RESERVED_PROPS.includes(prop)) continue - // Deal with pointer events ... + // Deal with pointer events, including removing them if undefined if (instance && /^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(prop)) { if (typeof value === 'function') instance.handlers[prop as keyof EventHandlers] = value as any else delete instance.handlers[prop as keyof EventHandlers] instance.eventCount = Object.keys(instance.handlers).length } + // Ignore setting undefined props + if (value === undefined) continue + const { root, key, target } = resolve(object, prop) // Copy if properties match signatures diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 91fb45b53c..c734b400c4 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -1,5 +1,5 @@ import * as THREE from 'three' -import type { Instance, RootStore } from '../src' +import { extend, Instance, RootStore, ThreeElement } from '../src' import { is, dispose, @@ -15,6 +15,21 @@ import { updateCamera, } from '../src/core/utils' +class TestElement { + public value: string + constructor() { + this.value = 'initial' + } +} + +declare module '@react-three/fiber' { + interface ThreeElements { + testElement: ThreeElement + } +} + +extend({ TestElement }) + // Mocks a Zustand store const storeMock: RootStore = Object.assign(() => null!, { getState: () => null!, @@ -403,6 +418,13 @@ describe('applyProps', () => { expect(target.material.color.getHex()).toBe(0x000000) }) + + it('should not apply a prop if it is undefined', async () => { + const target = new TestElement() + applyProps(target, { value: undefined }) + + expect(target.value).toBe('initial') + }) }) describe('updateCamera', () => { From 111b4a54768ae635c7499a83a12fed5fc4427397 Mon Sep 17 00:00:00 2001 From: Kris Date: Thu, 19 Jan 2023 15:26:16 -0800 Subject: [PATCH 084/252] chore: export Overwrite (#2721) --- packages/fiber/src/three-types.ts | 2 ++ packages/fiber/tests/__snapshots__/index.test.tsx.snap | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 1cc856165b..3e63321205 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -2,6 +2,8 @@ import type * as THREE from 'three' import type { EventHandlers, InstanceProps, ConstructorRepresentation } from './core' import type { Mutable, Overwrite } from './core/utils' +export { Overwrite } + interface MathRepresentation { set(...args: number[]): any } diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 9e3b07a8e3..ae8cad7a77 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -45,6 +45,7 @@ Array [ "LoaderReturnType", "MathType", "ObjectMap", + "Overwrite", "Performance", "Quaternion", "ReactProps", From 1b602d4f6218a89b53cd078aec74cc291dd9df29 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Thu, 19 Jan 2023 17:47:31 -0600 Subject: [PATCH 085/252] fix(types): loosen Loader type --- packages/fiber/src/core/hooks.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 10ab308bff..29717135bf 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -9,8 +9,8 @@ import type { Instance } from './reconciler' export interface Loader extends THREE.Loader { load( - url: string, - onLoad?: (result: T) => void, + url: string | string[], + onLoad?: (result: T, ...args: any[]) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, ): unknown From ff8dff57c12f83357a7efd1059a9fab4db8962ac Mon Sep 17 00:00:00 2001 From: Kris Date: Wed, 25 Jan 2023 13:57:06 -0800 Subject: [PATCH 086/252] chore: endOfLine auto for crossplatform dev (#2737) --- .prettierrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierrc b/.prettierrc index 5553e1cf25..754aefb5df 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,6 @@ "singleQuote": true, "tabWidth": 2, "printWidth": 120, - "jsxBracketSameLine": true + "jsxBracketSameLine": true, + "endOfLine": "auto" } From 39b2cfd4a51a66897cae547308369206fb6ab031 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 26 Feb 2023 03:28:51 -0600 Subject: [PATCH 087/252] fix: offscreencanvas fixes --- packages/fiber/src/core/renderer.tsx | 57 +- packages/fiber/src/core/store.ts | 3 +- yarn.lock | 1071 +++++++++++++++++++++++++- 3 files changed, 1077 insertions(+), 54 deletions(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index de1f01384d..8630485fdd 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -34,9 +34,14 @@ import { } from './utils' import { useStore } from './hooks' import { Stage, Lifecycle, Stages } from './stages' -import { OffscreenCanvas } from 'three' -export const _roots = new Map() +// TODO: fix type resolve +declare var OffscreenCanvas: any +type OffscreenCanvas = any + +type Canvas = HTMLCanvasElement | OffscreenCanvas + +export const _roots = new Map() const shallowLoose = { objects: 'shallow', strict: false } as EquConfig @@ -44,7 +49,7 @@ type Properties = Pick any ? ne export type GLProps = | Renderer - | ((canvas: HTMLCanvasElement) => Renderer) + | ((canvas: Canvas) => Renderer) | Partial | THREE.WebGLRendererParameters> export type CameraProps = ( @@ -59,7 +64,7 @@ export type CameraProps = ( manual?: boolean } -export interface RenderProps { +export interface RenderProps { /** A threejs renderer instance or props that go into the default renderer */ gl?: GLProps /** Dimensions to fit the renderer to. Will measure canvas dimensions if omitted */ @@ -107,18 +112,16 @@ export interface RenderProps { render?: 'auto' | 'manual' } -const createRendererInstance = ( +const createRendererInstance = ( gl: GLProps | undefined, - canvas: TElement, + canvas: TCanvas, ): THREE.WebGLRenderer => { - const customRenderer = ( - typeof gl === 'function' ? gl(canvas as unknown as HTMLCanvasElement) : gl - ) as THREE.WebGLRenderer + const customRenderer = (typeof gl === 'function' ? gl(canvas) : gl) as THREE.WebGLRenderer if (isRenderer(customRenderer)) return customRenderer return new THREE.WebGLRenderer({ powerPreference: 'high-performance', - canvas: canvas, + canvas: canvas as HTMLCanvasElement, antialias: true, alpha: true, ...gl, @@ -158,22 +161,29 @@ const createStages = (stages: Stage[] | undefined, store: RootStore) => { Stages.Render.add(renderCallback, store) } -export interface ReconcilerRoot { +export interface ReconcilerRoot { configure: (config?: RenderProps) => ReconcilerRoot render: (element: React.ReactNode) => RootStore unmount: () => void } -function computeInitialSize(canvas: HTMLCanvasElement | OffscreenCanvas, size?: Size): Size { +function computeInitialSize(canvas: Canvas, size?: Size): Size { if (!size && canvas instanceof HTMLCanvasElement && canvas.parentElement) { const { width, height, top, left } = canvas.parentElement.getBoundingClientRect() return { width, height, top, left } + } else if (!size && typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) { + return { + width: canvas.width, + height: canvas.height, + top: 0, + left: 0, + } } return { width: 0, height: 0, top: 0, left: 0, ...size } } -export function createRoot(canvas: TCanvas): ReconcilerRoot { +export function createRoot(canvas: TCanvas): ReconcilerRoot { // Check against mistaken use of createRoot const prevRoot = _roots.get(canvas) const prevFiber = prevRoot?.fiber @@ -323,13 +333,13 @@ export function createRoot(canvas: TCanvas): Reconciler applyProps(gl, glConfig as any) // Store events internally if (events && !state.events.handlers) state.set({ events: events(store) }) - // Check pixelratio - if (dpr && state.viewport.dpr !== calculateDpr(dpr)) state.setDpr(dpr) // Check size, allow it to take on container bounds initially const size = computeInitialSize(canvas, propsSize) if (!is.equ(size, state.size, shallowLoose)) { state.setSize(size.width, size.height, size.top, size.left) } + // Check pixelratio + if (dpr && state.viewport.dpr !== calculateDpr(dpr)) state.setDpr(dpr) // Check frameloop if (state.frameloop !== frameloop) state.setFrameloop(frameloop) // Check pointer missed @@ -365,7 +375,7 @@ export function createRoot(canvas: TCanvas): Reconciler } } -export function render( +export function render( children: React.ReactNode, canvas: TCanvas, config: RenderProps, @@ -376,20 +386,19 @@ export function render( return root.render(children) } -interface ProviderProps { +interface ProviderProps { onCreated?: (state: RootState) => void store: RootStore children: React.ReactNode - rootElement: TElement - parent?: React.MutableRefObject + rootElement: TCanvas } -function Provider({ +function Provider({ store, children, onCreated, rootElement, -}: ProviderProps): JSX.Element { +}: ProviderProps): JSX.Element { useIsomorphicLayoutEffect(() => { const state = store.getState() // Flag the canvas active, rendering will now begin @@ -404,9 +413,9 @@ function Provider({ return {children} } -export function unmountComponentAtNode( - canvas: TElement, - callback?: (canvas: TElement) => void, +export function unmountComponentAtNode( + canvas: TCanvas, + callback?: (canvas: TCanvas) => void, ): void { const root = _roots.get(canvas) const fiber = root?.fiber diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 766ffaed1a..211547e10a 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -371,8 +371,7 @@ export const createStore = ( updateCamera(camera, size) gl.setPixelRatio(viewport.dpr) - const updateStyle = - size.updateStyle ?? (typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement) + const updateStyle = typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement gl.setSize(size.width, size.height, updateStyle) } diff --git a/yarn.lock b/yarn.lock index f61e3e3f7b..4e4f889b57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,14 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" @@ -40,6 +48,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + "@babel/core@7.17.8": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" @@ -82,6 +95,27 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/core@^7.11.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + "@babel/core@^7.13.16", "@babel/core@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" @@ -121,6 +155,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" @@ -163,6 +207,17 @@ browserslist "^4.20.2" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" @@ -254,6 +309,14 @@ "@babel/template" "^7.18.6" "@babel/types" "^7.18.9" +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" @@ -324,6 +387,20 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" @@ -403,6 +480,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" @@ -436,6 +520,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" @@ -446,6 +535,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" @@ -494,6 +588,15 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -522,6 +625,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.10.tgz#94b5f8522356e69e8277276adf67ed280c90ecc1" integrity sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg== +"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" @@ -793,7 +901,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-syntax-jsx@^7.18.6": +"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -1436,6 +1544,15 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" +"@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" @@ -1468,6 +1585,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" @@ -1485,6 +1618,15 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" +"@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1715,6 +1857,13 @@ resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-10.1.2.tgz#d2fb7b968141139e5c2419553e5295382c265e7d" integrity sha512-bbZIpW6fdyf7FMaeDmw3cBbkTqsecxEkwlVKgVfqqXWBPLH6azxhPA2V9F7OhoZSVrsnMYw7QuyK6qutXPjEew== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@emotion/is-prop-valid@^1.1.0": version "1.1.2" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" @@ -1877,6 +2026,18 @@ jest-util "^27.5.1" slash "^3.0.0" +"@jest/console@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.3.tgz#1f25a99f7f860e4c46423b5b1038262466fadde1" + integrity sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A== + dependencies: + "@jest/types" "^29.4.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.4.3" + jest-util "^29.4.3" + slash "^3.0.0" + "@jest/core@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" @@ -1911,6 +2072,40 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/core@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.3.tgz#829dd65bffdb490de5b0f69e97de8e3b5eadd94b" + integrity sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ== + dependencies: + "@jest/console" "^29.4.3" + "@jest/reporters" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.4.3" + jest-config "^29.4.3" + jest-haste-map "^29.4.3" + jest-message-util "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.4.3" + jest-resolve-dependencies "^29.4.3" + jest-runner "^29.4.3" + jest-runtime "^29.4.3" + jest-snapshot "^29.4.3" + jest-util "^29.4.3" + jest-validate "^29.4.3" + jest-watcher "^29.4.3" + micromatch "^4.0.4" + pretty-format "^29.4.3" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/create-cache-key-function@^27.0.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" @@ -1928,6 +2123,31 @@ "@types/node" "*" jest-mock "^27.5.1" +"@jest/environment@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.3.tgz#9fe2f3169c3b33815dc4bd3960a064a83eba6548" + integrity sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA== + dependencies: + "@jest/fake-timers" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + jest-mock "^29.4.3" + +"@jest/expect-utils@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.3.tgz#95ce4df62952f071bcd618225ac7c47eaa81431e" + integrity sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.3.tgz#d31a28492e45a6bcd0f204a81f783fe717045c6e" + integrity sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ== + dependencies: + expect "^29.4.3" + jest-snapshot "^29.4.3" + "@jest/fake-timers@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" @@ -1940,6 +2160,18 @@ jest-mock "^27.5.1" jest-util "^27.5.1" +"@jest/fake-timers@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.3.tgz#31e982638c60fa657d310d4b9d24e023064027b0" + integrity sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw== + dependencies: + "@jest/types" "^29.4.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.4.3" + jest-mock "^29.4.3" + jest-util "^29.4.3" + "@jest/globals@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" @@ -1949,6 +2181,16 @@ "@jest/types" "^27.5.1" expect "^27.5.1" +"@jest/globals@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.3.tgz#63a2c4200d11bc6d46f12bbe25b07f771fce9279" + integrity sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/expect" "^29.4.3" + "@jest/types" "^29.4.3" + jest-mock "^29.4.3" + "@jest/reporters@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" @@ -1980,6 +2222,43 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" +"@jest/reporters@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.3.tgz#0a68a0c0f20554760cc2e5443177a0018969e353" + integrity sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.4.3" + jest-util "^29.4.3" + jest-worker "^29.4.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + "@jest/source-map@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" @@ -1989,6 +2268,15 @@ graceful-fs "^4.2.9" source-map "^0.6.0" +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + "@jest/test-result@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" @@ -1999,6 +2287,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.3.tgz#e13d973d16c8c7cc0c597082d5f3b9e7f796ccb8" + integrity sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA== + dependencies: + "@jest/console" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" @@ -2009,6 +2307,16 @@ jest-haste-map "^27.5.1" jest-runtime "^27.5.1" +"@jest/test-sequencer@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz#0862e876a22993385a0f3e7ea1cc126f208a2898" + integrity sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw== + dependencies: + "@jest/test-result" "^29.4.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" + slash "^3.0.0" + "@jest/transform@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" @@ -2030,6 +2338,27 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.3.tgz#f7d17eac9cb5bb2e1222ea199c7c7e0835e0c037" + integrity sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.4.3" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" + jest-regex-util "^29.4.3" + jest-util "^29.4.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -2052,6 +2381,26 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.3.tgz#9069145f4ef09adf10cec1b2901b2d390031431f" + integrity sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -2061,21 +2410,39 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "@jridgewell/resolve-uri@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== -"@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.0": version "0.3.4" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" @@ -2084,6 +2451,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.14" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" @@ -2515,6 +2890,11 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -2522,6 +2902,20 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers@^8.0.1": version "8.1.0" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" @@ -2557,6 +2951,26 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -2595,6 +3009,14 @@ dependencies: "@babel/types" "^7.3.0" +"@types/eslint@^8.4.10": + version "8.21.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" + integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + "@types/estree@*": version "0.0.51" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" @@ -2612,6 +3034,13 @@ dependencies: "@types/node" "*" +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + "@types/hoist-non-react-statics@*": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" @@ -2646,15 +3075,15 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^27.4.1": - version "27.4.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" - integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== +"@types/jest@^29.2.5": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" -"@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -2664,6 +3093,11 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/lodash@^4.14.191": + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + "@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" @@ -2823,6 +3257,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^17.0.8": + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@^5.17.0": version "5.19.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz#9608a4b6d0427104bccf132f058cba629a6553c0" @@ -2981,6 +3422,11 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" @@ -2991,6 +3437,11 @@ acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3099,6 +3550,11 @@ appdirsjs@^1.2.4: resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.6.tgz#fccf9ee543315492867cacfcfd4a2b32257d30ac" integrity sha512-D8wJNkqMCeQs3kLasatELsddox/Xqkhp+J07iXGyL54fVN7oc+nmNfYzGuCs1IEP6uBw+TfpuO3JKwc+lECy4w== +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3258,6 +3714,19 @@ babel-jest@^27.5.1: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.3.tgz#478b84d430972b277ad67dd631be94abea676792" + integrity sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw== + dependencies: + "@jest/transform" "^29.4.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.4.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" @@ -3286,6 +3755,16 @@ babel-plugin-jest-hoist@^27.5.1: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz#ad1dfb5d31940957e00410ef7d9b2aa94b216101" + integrity sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-polyfill-corejs2@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" @@ -3390,6 +3869,14 @@ babel-preset-jest@^27.5.1: babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz#bb926b66ae253b69c6e3ef87511b8bb5c53c5b52" + integrity sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw== + dependencies: + babel-plugin-jest-hoist "^29.4.3" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3514,6 +4001,16 @@ browserslist@^4.17.5, browserslist@^4.20.2: node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -3645,6 +4142,11 @@ caniuse-lite@^1.0.30001317: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== +caniuse-lite@^1.0.30001449: + version "1.0.30001458" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" + integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== + chalk@^2.0.0, chalk@^2.1.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3768,6 +4270,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -3918,6 +4429,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -3946,6 +4462,11 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -4203,6 +4724,16 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4251,11 +4782,21 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.4.284: + version "1.4.311" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz#953bc9a4767f5ce8ec125f9a1ad8e00e8f67e479" + integrity sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw== + electron-to-chromium@^1.4.84: version "1.4.110" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.110.tgz#269208d7cf7e32123b1d87bf4e6e1fd9ac7ff51d" integrity sha512-TvHZrkj9anfWkxgblHlNr4IMQdm2N6D0o8Wu1BDpSL/RKT4DHyUt/tvDFtApgZ+LGFL3U9EO4LRZ1eSlQ8xMYA== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -4568,10 +5109,10 @@ eslint-plugin-import@^2.25.4: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-plugin-jest@^26.1.3: - version "26.1.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.1.4.tgz#8e3410093ff4439d0c3a371add5bf9e05623a57a" - integrity sha512-wgqxujmqc2qpvZqMFWCh6Cniqc8lWpapvXt9j/19DmBDqeDaYhJrSRezYR1SKyemvjx+9e9kny/dgRahraHImA== +eslint-plugin-jest@^27.2.1: + version "27.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz#b85b4adf41c682ea29f1f01c8b11ccc39b5c672c" + integrity sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg== dependencies: "@typescript-eslint/utils" "^5.10.0" @@ -4815,6 +5356,17 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" +expect@^29.0.0, expect@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.3.tgz#5e47757316df744fe3b8926c3ae8a3ebdafff7fe" + integrity sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg== + dependencies: + "@jest/expect-utils" "^29.4.3" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.4.3" + jest-message-util "^29.4.3" + jest-util "^29.4.3" + expo-asset@~8.6.0: version "8.6.1" resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-8.6.1.tgz#86355b3e231e8aa6cf68a456ce9746dff1478b48" @@ -4926,7 +5478,7 @@ fast-glob@^3.2.4, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5961,6 +6513,14 @@ jest-changed-files@^27.5.1: execa "^5.0.0" throat "^6.0.1" +jest-changed-files@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.3.tgz#7961fe32536b9b6d5c28dfa0abcfab31abcf50a7" + integrity sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + jest-circus@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" @@ -5986,6 +6546,31 @@ jest-circus@^27.5.1: stack-utils "^2.0.3" throat "^6.0.1" +jest-circus@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.3.tgz#fff7be1cf5f06224dd36a857d52a9efeb005ba04" + integrity sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/expect" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.4.3" + jest-matcher-utils "^29.4.3" + jest-message-util "^29.4.3" + jest-runtime "^29.4.3" + jest-snapshot "^29.4.3" + jest-util "^29.4.3" + p-limit "^3.1.0" + pretty-format "^29.4.3" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-cli@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" @@ -6004,6 +6589,24 @@ jest-cli@^27.5.1: prompts "^2.0.1" yargs "^16.2.0" +jest-cli@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.3.tgz#fe31fdd0c90c765f392b8b7c97e4845071cd2163" + integrity sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg== + dependencies: + "@jest/core" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/types" "^29.4.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.4.3" + jest-util "^29.4.3" + jest-validate "^29.4.3" + prompts "^2.0.1" + yargs "^17.3.1" + jest-config@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" @@ -6034,6 +6637,34 @@ jest-config@^27.5.1: slash "^3.0.0" strip-json-comments "^3.1.1" +jest-config@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.3.tgz#fca9cdfe6298ae6d04beef1624064d455347c978" + integrity sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.4.3" + "@jest/types" "^29.4.3" + babel-jest "^29.4.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.4.3" + jest-environment-node "^29.4.3" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.4.3" + jest-runner "^29.4.3" + jest-util "^29.4.3" + jest-validate "^29.4.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.4.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + jest-diff@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" @@ -6044,6 +6675,16 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" +jest-diff@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.3.tgz#42f4eb34d0bf8c0fb08b0501069b87e8e84df347" + integrity sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.4.3" + jest-docblock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" @@ -6051,6 +6692,13 @@ jest-docblock@^27.5.1: dependencies: detect-newline "^3.0.0" +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + jest-each@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" @@ -6062,6 +6710,17 @@ jest-each@^27.5.1: jest-util "^27.5.1" pretty-format "^27.5.1" +jest-each@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.3.tgz#a434c199a2f6151c5e3dc80b2d54586bdaa72819" + integrity sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q== + dependencies: + "@jest/types" "^29.4.3" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.4.3" + pretty-format "^29.4.3" + jest-environment-jsdom@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" @@ -6087,6 +6746,18 @@ jest-environment-node@^27.5.1: jest-mock "^27.5.1" jest-util "^27.5.1" +jest-environment-node@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.3.tgz#579c4132af478befc1889ddc43c2413a9cdbe014" + integrity sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/fake-timers" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + jest-mock "^29.4.3" + jest-util "^29.4.3" + jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" @@ -6097,6 +6768,11 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + jest-haste-map@^27.3.1, jest-haste-map@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" @@ -6117,6 +6793,25 @@ jest-haste-map@^27.3.1, jest-haste-map@^27.5.1: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.3.tgz#085a44283269e7ace0645c63a57af0d2af6942e2" + integrity sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ== + dependencies: + "@jest/types" "^29.4.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.4.3" + jest-worker "^29.4.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-jasmine2@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" @@ -6148,7 +6843,15 @@ jest-leak-detector@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: +jest-leak-detector@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz#2b35191d6b35aa0256e63a9b79b0f949249cf23a" + integrity sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.4.3" + +jest-matcher-utils@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== @@ -6158,6 +6861,16 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" +jest-matcher-utils@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz#ea68ebc0568aebea4c4213b99f169ff786df96a0" + integrity sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg== + dependencies: + chalk "^4.0.0" + jest-diff "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.4.3" + jest-message-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" @@ -6173,6 +6886,21 @@ jest-message-util@^27.5.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.3.tgz#65b5280c0fdc9419503b49d4f48d4999d481cb5b" + integrity sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.4.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.4.3" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" @@ -6181,6 +6909,15 @@ jest-mock@^27.5.1: "@jest/types" "^27.5.1" "@types/node" "*" +jest-mock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.3.tgz#23d84a20a74cdfff0510fdbeefb841ed57b0fe7e" + integrity sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg== + dependencies: + "@jest/types" "^29.4.3" + "@types/node" "*" + jest-util "^29.4.3" + jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" @@ -6191,6 +6928,11 @@ jest-regex-util@^27.5.1: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + jest-resolve-dependencies@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" @@ -6200,6 +6942,14 @@ jest-resolve-dependencies@^27.5.1: jest-regex-util "^27.5.1" jest-snapshot "^27.5.1" +jest-resolve-dependencies@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz#9ad7f23839a6d88cef91416bda9393a6e9fd1da5" + integrity sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.4.3" + jest-resolve@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" @@ -6216,6 +6966,21 @@ jest-resolve@^27.5.1: resolve.exports "^1.1.0" slash "^3.0.0" +jest-resolve@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.3.tgz#3c5b5c984fa8a763edf9b3639700e1c7900538e2" + integrity sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" + jest-pnp-resolver "^1.2.2" + jest-util "^29.4.3" + jest-validate "^29.4.3" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + jest-runner@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" @@ -6243,6 +7008,33 @@ jest-runner@^27.5.1: source-map-support "^0.5.6" throat "^6.0.1" +jest-runner@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.3.tgz#68dc82c68645eda12bea42b5beece6527d7c1e5e" + integrity sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA== + dependencies: + "@jest/console" "^29.4.3" + "@jest/environment" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.4.3" + jest-haste-map "^29.4.3" + jest-leak-detector "^29.4.3" + jest-message-util "^29.4.3" + jest-resolve "^29.4.3" + jest-runtime "^29.4.3" + jest-util "^29.4.3" + jest-watcher "^29.4.3" + jest-worker "^29.4.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + jest-runtime@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" @@ -6271,6 +7063,34 @@ jest-runtime@^27.5.1: slash "^3.0.0" strip-bom "^4.0.0" +jest-runtime@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.3.tgz#f25db9874dcf35a3ab27fdaabca426666cc745bf" + integrity sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q== + dependencies: + "@jest/environment" "^29.4.3" + "@jest/fake-timers" "^29.4.3" + "@jest/globals" "^29.4.3" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.3" + jest-message-util "^29.4.3" + jest-mock "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.4.3" + jest-snapshot "^29.4.3" + jest-util "^29.4.3" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-serializer@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" @@ -6307,6 +7127,36 @@ jest-snapshot@^27.5.1: pretty-format "^27.5.1" semver "^7.3.2" +jest-snapshot@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.3.tgz#183d309371450d9c4a3de7567ed2151eb0e91145" + integrity sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.4.3" + "@jest/transform" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.4.3" + graceful-fs "^4.2.9" + jest-diff "^29.4.3" + jest-get-type "^29.4.3" + jest-haste-map "^29.4.3" + jest-matcher-utils "^29.4.3" + jest-message-util "^29.4.3" + jest-util "^29.4.3" + natural-compare "^1.4.0" + pretty-format "^29.4.3" + semver "^7.3.5" + jest-util@^27.0.0, jest-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" @@ -6319,6 +7169,18 @@ jest-util@^27.0.0, jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" + integrity sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q== + dependencies: + "@jest/types" "^29.4.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^26.5.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" @@ -6343,6 +7205,18 @@ jest-validate@^27.5.1: leven "^3.1.0" pretty-format "^27.5.1" +jest-validate@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.3.tgz#a13849dec4f9e95446a7080ad5758f58fa88642f" + integrity sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw== + dependencies: + "@jest/types" "^29.4.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.4.3" + jest-watcher@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" @@ -6356,6 +7230,20 @@ jest-watcher@^27.5.1: jest-util "^27.5.1" string-length "^4.0.1" +jest-watcher@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.3.tgz#e503baa774f0c2f8f3c8db98a22ebf885f19c384" + integrity sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA== + dependencies: + "@jest/test-result" "^29.4.3" + "@jest/types" "^29.4.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.4.3" + string-length "^4.0.1" + jest-worker@^26.3.0: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -6374,14 +7262,25 @@ jest-worker@^27.2.0, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== +jest-worker@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" + integrity sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA== dependencies: - "@jest/core" "^27.5.1" + "@types/node" "*" + jest-util "^29.4.3" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.3.1: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.3.tgz#1b8be541666c6feb99990fd98adac4737e6e6386" + integrity sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA== + dependencies: + "@jest/core" "^29.4.3" + "@jest/types" "^29.4.3" import-local "^3.0.2" - jest-cli "^27.5.1" + jest-cli "^29.4.3" jetifier@^1.6.2: version "1.6.8" @@ -6524,6 +7423,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -6736,7 +7640,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6783,6 +7687,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -6824,7 +7735,7 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -make-error@1.x: +make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -7385,6 +8296,11 @@ node-releases@^2.0.2: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + node-stream-zip@^1.9.1: version "1.15.0" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" @@ -7662,7 +8578,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -7935,7 +8851,7 @@ pretty-format@^26.5.2, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: +pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -7944,6 +8860,15 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^29.0.0, pretty-format@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" + integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-quick@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" @@ -8407,6 +9332,11 @@ 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.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== + resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" @@ -8682,7 +9612,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -8803,6 +9733,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -8949,7 +9887,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.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== @@ -9390,6 +10328,25 @@ ts-jest@^27.1.4: semver "7.x" yargs-parser "20.x" +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -9564,6 +10521,14 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -9624,6 +10589,11 @@ uuid@^7.0.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -9638,6 +10608,15 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -9682,7 +10661,7 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -walker@^1.0.7: +walker@^1.0.7, walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -9845,6 +10824,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@^6.1.4: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -9928,6 +10915,11 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -9951,6 +10943,11 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^15.1.0, yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -9981,6 +10978,24 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.3.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 7e5d45032a06baa7c02d099b50cea767434e7bca Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 26 Feb 2023 03:32:59 -0600 Subject: [PATCH 088/252] fix: progressive color management --- packages/fiber/src/core/renderer.tsx | 6 +++++- packages/fiber/src/core/utils.ts | 18 ++++++++++++++++++ packages/fiber/tests/index.test.tsx | 13 +++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 8630485fdd..8d8d6cf499 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -31,6 +31,7 @@ import { Camera, updateCamera, applyProps, + ColorManagement, } from './utils' import { useStore } from './hooks' import { Stage, Lifecycle, Stages } from './stages' @@ -317,7 +318,10 @@ export function createRoot(canvas: TCanvas): ReconcilerR } // Set color management - ;(THREE as any).ColorManagement.legacyMode = legacy + if (ColorManagement) { + if ('enabled' in ColorManagement) ColorManagement.enabled = !legacy + else if ('legacyMode' in ColorManagement) ColorManagement.legacyMode = legacy + } const outputEncoding = linear ? THREE.LinearEncoding : THREE.sRGBEncoding const toneMapping = flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping if (gl.outputEncoding !== outputEncoding) gl.outputEncoding = outputEncoding diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index e18ef94bba..32ff340551 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -5,6 +5,19 @@ import type { EventHandlers } from './events' import type { Dpr, RootState, RootStore, Size } from './store' import type { ConstructorRepresentation, Instance } from './reconciler' +/** + * Safely accesses a deeply-nested value on an object to get around static bundler analysis. + */ +const getDeep = (obj: any, ...keys: string[]): any => keys.reduce((acc, key) => acc?.[key], obj) + +export type ColorManagementRepresentation = { enabled: boolean | never } | { legacyMode: boolean | never } + +/** + * The current THREE.ColorManagement instance, if present. + */ +export const ColorManagement: ColorManagementRepresentation | null = + ('ColorManagement' in THREE && getDeep(THREE, 'ColorManagement')) || null + export type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] export type Overwrite = Omit> & O export type Properties = Pick> @@ -347,6 +360,11 @@ export function applyProps(object: Instance['object'], props: Instan if (!isColor && target.setScalar && typeof value === 'number') target.setScalar(value) // Otherwise just set ... else if (value !== undefined) target.set(value) + + // For versions of three which don't support THREE.ColorManagement, + // Auto-convert sRGB colors + // https://github.com/pmndrs/react-three-fiber/issues/344 + if (!ColorManagement && !rootState?.linear && isColor) target.convertSRGBToLinear() } // Else, just overwrite the value else { diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index c0f648abae..0d5a52bf7a 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -149,6 +149,19 @@ describe('createRoot', () => { await act(async () => root.configure({ legacy: false }).render()) expect((THREE as any).ColorManagement.legacyMode).toBe(false) + + // r150 !enabled + ;(THREE as any).ColorManagement.enabled = true + + await act(async () => { + root.configure({ legacy: true }).render() + }) + expect((THREE as any).ColorManagement.enabled).toBe(false) + + await act(async () => { + root.configure({ legacy: false }).render() + }) + expect((THREE as any).ColorManagement.enabled).toBe(true) }) }) From ee510a4d13b1f03daafd2413be6da57b828d1d5e Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 26 Feb 2023 03:33:43 -0600 Subject: [PATCH 089/252] fix: valid sRGB encode --- packages/fiber/src/core/utils.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index 32ff340551..517005bde8 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -371,7 +371,13 @@ export function applyProps(object: Instance['object'], props: Instan root[key] = value // Auto-convert sRGB textures, for now ... // https://github.com/pmndrs/react-three-fiber/issues/344 - if (!rootState?.linear && root[key] instanceof THREE.Texture) { + if ( + !rootState?.linear && + root[key] instanceof THREE.Texture && + // sRGB textures must be RGBA8 since r137 https://github.com/mrdoob/three.js/pull/23129 + root[key].format === THREE.RGBAFormat && + root[key].type === THREE.UnsignedByteType + ) { root[key].encoding = THREE.sRGBEncoding } } From e67482e2ad4b520a2f6d9385a2083fd6c138a9a8 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 26 Feb 2023 03:36:26 -0600 Subject: [PATCH 090/252] fix: memoize HMR defaults --- packages/fiber/src/core/utils.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index 517005bde8..069d8852d4 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -262,6 +262,8 @@ export const RESERVED_PROPS = [ 'dispose', ] +export const DEFAULTS = new Map() + // This function prepares a set of changes to be applied to the instance export function diffProps( instance: Instance, @@ -300,11 +302,12 @@ export function diffProps( // For removed props, try to set default values, if possible if (root.constructor) { // create a blank slate of the instance and copy the particular parameter. - // @ts-ignore - const defaultClassCall = new root.constructor(...(root.__r3f?.props.args ?? [])) - changedProps[key] = defaultClassCall[key] - // destroy the instance - if (defaultClassCall.dispose) defaultClassCall.dispose() + let ctor = DEFAULTS.get(root.constructor) + if (!ctor) { + ctor = new root.constructor() + DEFAULTS.set(root.constructor, ctor) + } + changedProps[key] = ctor[key] } else { // instance does not have constructor, just set it to 0 changedProps[key] = 0 From b38c18f391ceedc1ab397c29ff9459c22f1f71bf Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 26 Feb 2023 03:37:44 -0600 Subject: [PATCH 091/252] fix: portal injects https://github.com/pmndrs/react-three-fiber/commit/0c288ba6b962d861a90878bfa064f4ca9eaf0d03 --- packages/fiber/src/core/renderer.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 8d8d6cf499..4da9e3fcce 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -491,7 +491,9 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { // Some props should be off-limits privateKeys.includes(key as PrivateKeys) || // Otherwise filter out the props that are different and let the inject layer take precedence - rootState[key as keyof RootState] !== injectState[key as keyof RootState] + // Unless the inject layer props is undefined, then we keep the root layer + (rootState[key as keyof RootState] !== injectState[key as keyof RootState] && + injectState[key as keyof RootState]) ) { delete intersect[key as keyof RootState] } From e508a79a196dc5b4dc25fbbebee42cd861411ce8 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 26 Feb 2023 03:39:49 -0600 Subject: [PATCH 092/252] feat: short cut for shadow type https://github.com/pmndrs/react-three-fiber/commit/2cd6e5341c23575acfe2f0e93c01898af9acfda0 --- packages/fiber/src/core/renderer.tsx | 30 +++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 4da9e3fcce..b534270942 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -71,10 +71,11 @@ export interface RenderProps { /** Dimensions to fit the renderer to. Will measure canvas dimensions if omitted */ size?: Size /** - * Enables PCFsoft shadows. Can accept `gl.shadowMap` options for fine-tuning. + * Enables shadows (by default PCFsoft). Can accept `gl.shadowMap` options for fine-tuning, + * but also strings: 'basic' | 'percentage' | 'soft' | 'variance'. * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap */ - shadows?: boolean | Partial + shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial /** * Disables three r139 color management. * @see https://threejs.org/docs/#manual/en/introduction/Color-management @@ -307,14 +308,25 @@ export function createRoot(canvas: TCanvas): ReconcilerR // Set shadowmap if (gl.shadowMap) { - const isBoolean = is.boo(shadows) - if ((isBoolean && gl.shadowMap.enabled !== shadows) || !is.equ(shadows, gl.shadowMap, shallowLoose)) { - const old = gl.shadowMap.enabled - gl.shadowMap.enabled = !!shadows - if (!isBoolean) Object.assign(gl.shadowMap, shadows) - else gl.shadowMap.type = THREE.PCFSoftShadowMap - if (old !== gl.shadowMap.enabled) gl.shadowMap.needsUpdate = true + const oldEnabled = gl.shadowMap.enabled + const oldType = gl.shadowMap.type + gl.shadowMap.enabled = !!shadows + + if (is.boo(shadows)) { + gl.shadowMap.type = THREE.PCFSoftShadowMap + } else if (is.str(shadows)) { + const types = { + basic: THREE.BasicShadowMap, + percentage: THREE.PCFShadowMap, + soft: THREE.PCFSoftShadowMap, + variance: THREE.VSMShadowMap, + } + gl.shadowMap.type = types[shadows] ?? THREE.PCFSoftShadowMap + } else if (is.obj(shadows)) { + Object.assign(gl.shadowMap, shadows) } + + if (oldEnabled !== gl.shadowMap.enabled || oldType !== gl.shadowMap.type) gl.shadowMap.needsUpdate = true } // Set color management From 6c4e52f8a023a5c883377cc0f31c47e12f92e8af Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sun, 26 Feb 2023 03:44:46 -0600 Subject: [PATCH 093/252] chore: update HMR identity test --- packages/fiber/tests/utils.test.ts | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index c734b400c4..1225920efc 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -297,24 +297,9 @@ describe('diffProps', () => { }) it('should reset removed props for HMR', () => { - class Target extends THREE.Object3D { - constructor(x = 0, y = 0, z = 0) { - super() - this.position.set(x, y, z) - } - } - - const target = new Target() - const instance = prepare(target, storeMock, '', { position: 10 }) - - // Recreate from scratch - let filtered = diffProps(instance, {}, true) - expect((filtered.position as THREE.Vector3).toArray()).toStrictEqual([0, 0, 0]) - - // Recreate from instance args - instance.props = { args: [1, 2, 3], position: 10 } - filtered = diffProps(instance, {}, true) - expect((filtered.position as THREE.Vector3).toArray()).toStrictEqual([1, 2, 3]) + const instance = prepare(new THREE.Object3D(), storeMock, '', { scale: 10 }) + const filtered = diffProps(instance, {}, true) + expect((filtered.scale as THREE.Vector3).toArray()).toStrictEqual([1, 1, 1]) }) it('should filter reserved props without accessing them', () => { From 7edff25f30b6c4aa4418ec0593bef7cbe68c13da Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 13:59:41 -0600 Subject: [PATCH 094/252] fix(types): accept string[][] in useLoader --- packages/fiber/src/core/hooks.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 29717135bf..611b59e6ea 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -9,7 +9,7 @@ import type { Instance } from './reconciler' export interface Loader extends THREE.Loader { load( - url: string | string[], + url: string | string[] | string[][], onLoad?: (result: T, ...args: any[]) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, @@ -130,7 +130,12 @@ function loadingFn>( * Note: this hook's caller must be wrapped with `React.Suspense` * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#useloader */ -export function useLoader, R = LoaderReturnType>( +export function useLoader< + T, + U extends string | string[] | string[][], + L extends LoaderProto, + R = LoaderReturnType, +>( Proto: L, input: U, extensions?: Extensions, @@ -148,7 +153,7 @@ export function useLoader>( +useLoader.preload = function >( Proto: L, input: U, extensions?: Extensions, @@ -160,7 +165,7 @@ useLoader.preload = function >(Proto: L, input: U) { +useLoader.clear = function >(Proto: L, input: U) { const keys = (Array.isArray(input) ? input : [input]) as string[] return clear([Proto, ...keys]) } From b255c2af34a3aaa7c46492db79117c00961ea5a9 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 15:08:26 -0600 Subject: [PATCH 095/252] fix(types): remove excess useLoader generics --- packages/fiber/src/core/hooks.tsx | 59 +++++++++++++++---------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 2ea3d33bf9..a334540a93 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -2,7 +2,7 @@ import * as THREE from 'three' import * as React from 'react' import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' import { suspend, preload, clear } from 'suspend-react' -import { context, RootState, RenderCallback, UpdateCallback, StageTypes } from './store' +import { context, RootState, RenderCallback, UpdateCallback, StageTypes, RootStore } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' import { Stages } from './stages' import type { Instance } from './reconciler' @@ -13,8 +13,8 @@ export interface Loader extends THREE.Loader { onLoad?: (result: T, ...args: any[]) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, - ): unknown - loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise + ): T + loadAsync(url: string | string[] | string[][], onProgress?: (event: ProgressEvent) => void): Promise } export type LoaderProto = new (...args: any) => Loader @@ -42,7 +42,7 @@ export function useInstanceHandle(ref: React.MutableRefObject): React.Muta return instance } -export function useStore() { +export function useStore(): RootStore { const store = React.useContext(context) if (!store) throw new Error('R3F: Hooks can only be used within the Canvas component!') return store @@ -55,7 +55,7 @@ export function useStore() { export function useThree( selector: (state: RootState) => T = (state) => state as unknown as T, equalityFn?: (state: T, newState: T) => boolean, -) { +): T { return useStore()(selector, equalityFn) } @@ -78,7 +78,7 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): * Executes a callback in a given update stage. * Uses the stage instance to indetify which stage to target in the lifecycle. */ -export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.Update) { +export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.Update): void { const store = useStore() const stages = store.getState().internal.stages // Memoize ref @@ -93,15 +93,17 @@ export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.U * Returns a node graph of an object with named nodes & materials. * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usegraph */ -export function useGraph(object: THREE.Object3D) { +export function useGraph(object: THREE.Object3D): ObjectMap { return React.useMemo(() => buildGraph(object), [object]) } -function loadingFn>( +const isGLTF = (data: unknown): data is GLTF => (data as any)?.scene instanceof THREE.Object3D + +function loadingFn>( extensions?: Extensions, onProgress?: (event: ProgressEvent) => void, ) { - return function (Proto: L, ...input: string[]) { + return function (Proto: L, ...input: string[]): Promise[]> { // Construct new loader and run extensions const loader = new Proto() if (extensions) extensions(loader) @@ -109,11 +111,11 @@ function loadingFn>( return Promise.all( input.map( (input) => - new Promise((res, reject) => + new Promise>((res, reject) => loader.load( input, - (data: any) => { - if (data.scene) Object.assign(data, buildGraph(data.scene)) + (data: LoaderReturnType) => { + if (isGLTF(data)) Object.assign(data, buildGraph(data.scene)) res(data) }, onProgress, @@ -131,42 +133,39 @@ function loadingFn>( * Note: this hook's caller must be wrapped with `React.Suspense` * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#useloader */ -export function useLoader< - T, - U extends string | string[] | string[][], - L extends LoaderProto, - R = LoaderReturnType, ->( - Proto: L, +export function useLoader( + Proto: LoaderProto, input: U, - extensions?: Extensions, + extensions?: Extensions, onProgress?: (event: ProgressEvent) => void, -): U extends any[] ? BranchingReturn[] : BranchingReturn { +): U extends any[] + ? BranchingReturn, GLTF, GLTF & ObjectMap>[] + : BranchingReturn, GLTF, GLTF & ObjectMap> { // Use suspense to load async assets const keys = (Array.isArray(input) ? input : [input]) as string[] - const results = suspend(loadingFn(extensions, onProgress), [Proto, ...keys], { equal: is.equ }) + const results = suspend(loadingFn(extensions, onProgress), [Proto, ...keys], { equal: is.equ }) // Return the object/s return (Array.isArray(input) ? results : results[0]) as U extends any[] - ? BranchingReturn[] - : BranchingReturn + ? BranchingReturn, GLTF, GLTF & ObjectMap>[] + : BranchingReturn, GLTF, GLTF & ObjectMap> } /** * Preloads an asset into cache as a side-effect. */ -useLoader.preload = function >( - Proto: L, +useLoader.preload = function ( + Proto: LoaderProto, input: U, - extensions?: Extensions, -) { + extensions?: Extensions, +): void { const keys = (Array.isArray(input) ? input : [input]) as string[] - return preload(loadingFn(extensions), [Proto, ...keys]) + return preload(loadingFn(extensions), [Proto, ...keys]) } /** * Removes a loaded asset from cache. */ -useLoader.clear = function >(Proto: L, input: U) { +useLoader.clear = function (Proto: LoaderProto, input: U): void { const keys = (Array.isArray(input) ? input : [input]) as string[] return clear([Proto, ...keys]) } From f750f3acd4b15d2b494e91ca1d6160c2b4e0ee8d Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 15:23:00 -0600 Subject: [PATCH 096/252] chore(hooks): cleanup --- packages/fiber/src/core/hooks.tsx | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index a334540a93..4ee88bf2a5 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -18,14 +18,8 @@ export interface Loader extends THREE.Loader { } export type LoaderProto = new (...args: any) => Loader -export type LoaderReturnType> = T extends unknown - ? Awaited['loadAsync']>> - : T -// TODO: this isn't used anywhere, remove in v9 -export type LoaderResult = T extends any[] ? Loader : Loader export type Extensions }> = (loader: T['prototype']) => void -export type ConditionalType = Child extends Parent ? Truthy : Falsy -export type BranchingReturn = ConditionalType +export type BranchingReturn = T extends Parent ? Coerced : T /** * Exposes an object's {@link Instance}. @@ -103,7 +97,7 @@ function loadingFn>( extensions?: Extensions, onProgress?: (event: ProgressEvent) => void, ) { - return function (Proto: L, ...input: string[]): Promise[]> { + return function (Proto: L, ...input: string[]): Promise { // Construct new loader and run extensions const loader = new Proto() if (extensions) extensions(loader) @@ -111,10 +105,10 @@ function loadingFn>( return Promise.all( input.map( (input) => - new Promise>((res, reject) => + new Promise((res, reject) => loader.load( input, - (data: LoaderReturnType) => { + (data: T) => { if (isGLTF(data)) Object.assign(data, buildGraph(data.scene)) res(data) }, @@ -138,16 +132,14 @@ export function useLoader( input: U, extensions?: Extensions, onProgress?: (event: ProgressEvent) => void, -): U extends any[] - ? BranchingReturn, GLTF, GLTF & ObjectMap>[] - : BranchingReturn, GLTF, GLTF & ObjectMap> { +): U extends any[] ? BranchingReturn[] : BranchingReturn { // Use suspense to load async assets const keys = (Array.isArray(input) ? input : [input]) as string[] const results = suspend(loadingFn(extensions, onProgress), [Proto, ...keys], { equal: is.equ }) // Return the object/s return (Array.isArray(input) ? results : results[0]) as U extends any[] - ? BranchingReturn, GLTF, GLTF & ObjectMap>[] - : BranchingReturn, GLTF, GLTF & ObjectMap> + ? BranchingReturn[] + : BranchingReturn } /** From 0340acd9059fc14655f57647ede2122a539abfe8 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 15:35:59 -0600 Subject: [PATCH 097/252] chore(types): more cleanup, update snapshot --- packages/fiber/src/core/hooks.tsx | 17 +++++++---------- .../tests/__snapshots__/index.test.tsx.snap | 3 --- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 4ee88bf2a5..970bd5f052 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -17,8 +17,8 @@ export interface Loader extends THREE.Loader { loadAsync(url: string | string[] | string[][], onProgress?: (event: ProgressEvent) => void): Promise } -export type LoaderProto = new (...args: any) => Loader -export type Extensions }> = (loader: T['prototype']) => void +export type LoaderProto = new (...args: any[]) => Loader +export type Extensions = (loader: Loader) => void export type BranchingReturn = T extends Parent ? Coerced : T /** @@ -93,11 +93,8 @@ export function useGraph(object: THREE.Object3D): ObjectMap { const isGLTF = (data: unknown): data is GLTF => (data as any)?.scene instanceof THREE.Object3D -function loadingFn>( - extensions?: Extensions, - onProgress?: (event: ProgressEvent) => void, -) { - return function (Proto: L, ...input: string[]): Promise { +function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressEvent) => void) { + return function (Proto: LoaderProto, ...input: string[]): Promise { // Construct new loader and run extensions const loader = new Proto() if (extensions) extensions(loader) @@ -130,8 +127,8 @@ function loadingFn>( export function useLoader( Proto: LoaderProto, input: U, - extensions?: Extensions, - onProgress?: (event: ProgressEvent) => void, + extensions?: Extensions, + onProgress?: (event: ProgressEvent) => void, ): U extends any[] ? BranchingReturn[] : BranchingReturn { // Use suspense to load async assets const keys = (Array.isArray(input) ? input : [input]) as string[] @@ -148,7 +145,7 @@ export function useLoader( useLoader.preload = function ( Proto: LoaderProto, input: U, - extensions?: Extensions, + extensions?: Extensions, ): void { const keys = (Array.isArray(input) ? input : [input]) as string[] return preload(loadingFn(extensions), [Proto, ...keys]) diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index ae8cad7a77..a2eb90ad01 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -14,7 +14,6 @@ Array [ "Catalogue", "Color", "ComputeFunction", - "ConditionalType", "ConstructorRepresentation", "Disposable", "DomEvent", @@ -41,8 +40,6 @@ Array [ "LegacyAlways", "Loader", "LoaderProto", - "LoaderResult", - "LoaderReturnType", "MathType", "ObjectMap", "Overwrite", From 0fc6afc366010633792bd13ecdd1c6369a22b968 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:10:30 -0600 Subject: [PATCH 098/252] refactor(hooks): try to infer useLoader type --- packages/fiber/src/core/hooks.tsx | 26 ++++++++----------- .../tests/__snapshots__/index.test.tsx.snap | 1 + 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 970bd5f052..2932d63e68 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -1,6 +1,5 @@ import * as THREE from 'three' import * as React from 'react' -import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' import { suspend, preload, clear } from 'suspend-react' import { context, RootState, RenderCallback, UpdateCallback, StageTypes, RootStore } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' @@ -13,11 +12,12 @@ export interface Loader extends THREE.Loader { onLoad?: (result: T, ...args: any[]) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, - ): T + ): unknown loadAsync(url: string | string[] | string[][], onProgress?: (event: ProgressEvent) => void): Promise } export type LoaderProto = new (...args: any[]) => Loader +export type LoaderResult = T extends { scene: THREE.Object3D } ? T & ObjectMap : T export type Extensions = (loader: Loader) => void export type BranchingReturn = T extends Parent ? Coerced : T @@ -91,10 +91,8 @@ export function useGraph(object: THREE.Object3D): ObjectMap { return React.useMemo(() => buildGraph(object), [object]) } -const isGLTF = (data: unknown): data is GLTF => (data as any)?.scene instanceof THREE.Object3D - function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressEvent) => void) { - return function (Proto: LoaderProto, ...input: string[]): Promise { + return function (Proto: LoaderProto, ...input: string[]) { // Construct new loader and run extensions const loader = new Proto() if (extensions) extensions(loader) @@ -102,13 +100,11 @@ function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressE return Promise.all( input.map( (input) => - new Promise((res, reject) => + new Promise>((res, reject) => loader.load( input, - (data: T) => { - if (isGLTF(data)) Object.assign(data, buildGraph(data.scene)) - res(data) - }, + (data: any) => + res(data?.scene instanceof THREE.Object3D ? Object.assign(data, buildGraph(data.scene)) : data), onProgress, (error) => reject(new Error(`Could not load ${input}: ${error.message})`)), ), @@ -129,14 +125,14 @@ export function useLoader( input: U, extensions?: Extensions, onProgress?: (event: ProgressEvent) => void, -): U extends any[] ? BranchingReturn[] : BranchingReturn { +) { // Use suspense to load async assets const keys = (Array.isArray(input) ? input : [input]) as string[] const results = suspend(loadingFn(extensions, onProgress), [Proto, ...keys], { equal: is.equ }) - // Return the object/s - return (Array.isArray(input) ? results : results[0]) as U extends any[] - ? BranchingReturn[] - : BranchingReturn + // Return the object(s) + return (Array.isArray(input) ? results : results[0]) as unknown as U extends any[] + ? LoaderResult[] + : LoaderResult } /** diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index a2eb90ad01..254eaf00ad 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -40,6 +40,7 @@ Array [ "LegacyAlways", "Loader", "LoaderProto", + "LoaderResult", "MathType", "ObjectMap", "Overwrite", From 9c5d23a2853e4b1b3c98f3db79da8bff935634fb Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:25:30 -0600 Subject: [PATCH 099/252] chore(hooks): prune unused types --- packages/fiber/src/core/hooks.tsx | 29 +++++++++---------- .../tests/__snapshots__/index.test.tsx.snap | 1 - 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 2932d63e68..e1f2868976 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -6,21 +6,6 @@ import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffec import { Stages } from './stages' import type { Instance } from './reconciler' -export interface Loader extends THREE.Loader { - load( - url: string | string[] | string[][], - onLoad?: (result: T, ...args: any[]) => void, - onProgress?: (event: ProgressEvent) => void, - onError?: (event: ErrorEvent) => void, - ): unknown - loadAsync(url: string | string[] | string[][], onProgress?: (event: ProgressEvent) => void): Promise -} - -export type LoaderProto = new (...args: any[]) => Loader -export type LoaderResult = T extends { scene: THREE.Object3D } ? T & ObjectMap : T -export type Extensions = (loader: Loader) => void -export type BranchingReturn = T extends Parent ? Coerced : T - /** * Exposes an object's {@link Instance}. * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#useInstanceHandle @@ -91,6 +76,20 @@ export function useGraph(object: THREE.Object3D): ObjectMap { return React.useMemo(() => buildGraph(object), [object]) } +export interface Loader extends THREE.Loader { + load( + url: string | string[] | string[][], + onLoad?: (result: T, ...args: any[]) => void, + onProgress?: (event: ProgressEvent) => void, + onError?: (event: ErrorEvent) => void, + ): unknown + loadAsync(url: string | string[] | string[][], onProgress?: (event: ProgressEvent) => void): Promise +} + +export type LoaderProto = new (...args: any[]) => Loader +export type LoaderResult = T extends { scene: THREE.Object3D } ? T & ObjectMap : T +export type Extensions = (loader: Loader) => void + function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressEvent) => void) { return function (Proto: LoaderProto, ...input: string[]) { // Construct new loader and run extensions diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 254eaf00ad..a175c102c8 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -6,7 +6,6 @@ Array [ "Args", "AttachFnType", "AttachType", - "BranchingReturn", "Camera", "CameraProps", "Canvas", From 9969c6c056597b01886860a31205b82c884b7a37 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 17:07:55 -0600 Subject: [PATCH 100/252] chore: disable ESLint in tests ESLint is broken atm -- TypeError: The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received 'http://localhost/eslintrc.cjs' --- packages/shared/setupTests.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/shared/setupTests.ts b/packages/shared/setupTests.ts index f42e611323..f75e639a62 100644 --- a/packages/shared/setupTests.ts +++ b/packages/shared/setupTests.ts @@ -16,6 +16,19 @@ jest.mock('scheduler', () => ({ unstable_scheduleCallback: (_: any, callback: () => void) => callback(), })) +// ESLint is broken atm -- TypeError: The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received 'http://localhost/eslintrc.cjs' +jest.mock('eslint', () => ({ + RuleTester: class { + run() { + it.skip('RuleTester.run', () => {}) + } + static only() { + it.skip('RuleTester.only', () => {}) + return {} + } + }, +})) + // PointerEvent is not in JSDOM // https://github.com/jsdom/jsdom/pull/2666#issuecomment-691216178 // https://w3c.github.io/pointerevents/#pointerevent-interface From 0d53ce90d845cb53bdf5497a4691e529362183e0 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 17:11:45 -0600 Subject: [PATCH 101/252] fix(hooks): Loader#load signature returns any --- packages/fiber/src/core/hooks.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index e1f2868976..e4dcd69970 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -82,7 +82,7 @@ export interface Loader extends THREE.Loader { onLoad?: (result: T, ...args: any[]) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, - ): unknown + ): any loadAsync(url: string | string[] | string[][], onProgress?: (event: ProgressEvent) => void): Promise } From 2847837dea4d3f09cfbedb9159aed3848e425ee2 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 17:12:55 -0600 Subject: [PATCH 102/252] fix(hooks): remove Loader#loadAsync https://github.com/pmndrs/react-three-fiber/pull/2742 --- packages/fiber/src/core/hooks.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index e4dcd69970..fb413178d5 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -83,7 +83,6 @@ export interface Loader extends THREE.Loader { onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, ): any - loadAsync(url: string | string[] | string[][], onProgress?: (event: ProgressEvent) => void): Promise } export type LoaderProto = new (...args: any[]) => Loader From c25f9904d31e3952c6d1841164cc28915253e468 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 27 Feb 2023 17:14:16 -0600 Subject: [PATCH 103/252] [v9] fix: forward StrictMode (#2547) --- .../fiber/src/core/{utils.ts => utils.tsx} | 28 ++++++++++++++++++- packages/fiber/src/native/Canvas.tsx | 6 ++-- packages/fiber/src/web/Canvas.tsx | 14 ++++++++-- 3 files changed, 41 insertions(+), 7 deletions(-) rename packages/fiber/src/core/{utils.ts => utils.tsx} (95%) diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.tsx similarity index 95% rename from packages/fiber/src/core/utils.ts rename to packages/fiber/src/core/utils.tsx index 069d8852d4..aed863a471 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.tsx @@ -1,5 +1,6 @@ import * as THREE from 'three' import * as React from 'react' +import { useFiber, traverseFiber, useContextBridge } from 'its-fine' import type { Fiber } from 'react-reconciler' import type { EventHandlers } from './events' import type { Dpr, RootState, RootStore, Size } from './store' @@ -55,6 +56,31 @@ export function useMutableCallback(fn: T): React.MutableRefObject { return ref } +export type Bridge = React.FC<{ children?: React.ReactNode }> + +/** + * Bridges renderer Context and StrictMode from a primary renderer. + */ +export function useBridge(): Bridge { + const fiber = useFiber() + const ContextBridge = useContextBridge() + + return React.useMemo( + () => + ({ children }) => { + const strict = !!traverseFiber(fiber, true, (node) => node.type === React.StrictMode) + const Root = strict ? React.StrictMode : React.Fragment + + return ( + + {children} + + ) + }, + [fiber, ContextBridge], + ) +} + export type SetBlock = false | Promise | null export type UnblockProps = { set: React.Dispatch>; children: React.ReactNode } @@ -93,7 +119,7 @@ export function calculateDpr(dpr: Dpr): number { /** * Returns instance root state */ -export const getRootState = (obj: T): RootState | undefined => +export const getRootState = (obj: T): RootState | undefined => (obj as Instance['object']).__r3f?.root.getState() export interface EquConfig { diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index a58f3fd9bf..b0cc4b77c3 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -2,8 +2,8 @@ import * as React from 'react' import * as THREE from 'three' import { View, ViewProps, ViewStyle, LayoutChangeEvent, StyleSheet, PixelRatio } from 'react-native' import { ExpoWebGLRenderingContext, GLView } from 'expo-gl' -import { useContextBridge, FiberProvider } from 'its-fine' -import { SetBlock, Block, ErrorBoundary, useMutableCallback } from '../core/utils' +import { FiberProvider } from 'its-fine' +import { SetBlock, Block, ErrorBoundary, useMutableCallback, useBridge } from '../core/utils' import { extend, createRoot, unmountComponentAtNode, RenderProps, ReconcilerRoot } from '../core' import { createTouchEvents } from './events' import { RootState, Size } from '../core/store' @@ -42,7 +42,7 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( // their own elements by using the createRoot API instead React.useMemo(() => extend(THREE as any), []) - const Bridge = useContextBridge() + const Bridge = useBridge() const [{ width, height, top, left }, setSize] = React.useState({ width: 0, height: 0, top: 0, left: 0 }) const [canvas, setCanvas] = React.useState(null) diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 14539ddb84..ce64a3b374 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -2,8 +2,16 @@ import * as React from 'react' import * as THREE from 'three' import useMeasure from 'react-use-measure' import type { Options as ResizeOptions } from 'react-use-measure' -import { useContextBridge, FiberProvider } from 'its-fine' -import { isRef, SetBlock, Block, ErrorBoundary, useMutableCallback, useIsomorphicLayoutEffect } from '../core/utils' +import { FiberProvider } from 'its-fine' +import { + isRef, + SetBlock, + Block, + ErrorBoundary, + useMutableCallback, + useIsomorphicLayoutEffect, + useBridge, +} from '../core/utils' import { ReconcilerRoot, extend, createRoot, unmountComponentAtNode, RenderProps } from '../core' import { createPointerEvents } from './events' import { DomEvent } from '../core/events' @@ -57,7 +65,7 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef extend(THREE as any), []) - const Bridge = useContextBridge() + const Bridge = useBridge() const [containerRef, containerRect] = useMeasure({ scroll: true, debounce: { scroll: 50, resize: 0 }, ...resize }) const canvasRef = React.useRef(null!) From b22c406292e0101b02020fa7b48048d03020c123 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 17:19:02 -0600 Subject: [PATCH 104/252] fix: harden hooks tests --- packages/fiber/src/core/hooks.tsx | 2 +- packages/fiber/tests/hooks.test.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index fb413178d5..be2f1f7e41 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -82,7 +82,7 @@ export interface Loader extends THREE.Loader { onLoad?: (result: T, ...args: any[]) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, - ): any + ): unknown } export type LoaderProto = new (...args: any[]) => Loader diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index b97a397256..844020f311 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -149,12 +149,14 @@ describe('hooks', () => { it('can handle useLoader with a loader extension', async () => { class Loader extends THREE.Loader { - load = (_url: string) => null + load(_url: string, onLoad: (result: null) => void): void { + onLoad(null) + } } let proto!: Loader - function Test() { + function Test(): null { return useLoader(Loader, '', (loader) => (proto = loader)) } await act(async () => root.render()) From d1069825a0a46062d6125e75b8c12641016ed005 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 21:41:23 -0600 Subject: [PATCH 105/252] fix(reconciler): handle append as container effect --- packages/fiber/src/core/reconciler.ts | 46 +++++++++++---------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 46b01b8d34..3eb04d1e9d 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -89,7 +89,7 @@ function createInstance(type: string, props: HostConfig['props'], root: RootStor // https://github.com/facebook/react/issues/20271 // This will make sure events and attach are only handled once when trees are complete -function handleContainerEffects(parent: Instance, child: Instance) { +function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: Instance, replace: boolean = false) { // Bail if tree isn't mounted or parent is not a container. // This ensures that the tree is finalized and React won't discard results to Suspense const state = child.root.getState() @@ -119,9 +119,24 @@ function handleContainerEffects(parent: Instance, child: Instance) { state.internal.interaction.push(child.object) } - // Handle attach - if (child.props.attach) attach(parent, child) + // Append instance + if (child.props.attach) { + attach(parent, child) + } else if (child.object instanceof THREE.Object3D && parent.object instanceof THREE.Object3D) { + if (beforeChild) { + child.object.parent = parent.object + parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), replace ? 1 : 0, child.object) + child.object.dispatchEvent({ type: 'added' }) + } else { + parent.object.add(child.object) + } + } + + // Link subtree for (const childInstance of child.children) handleContainerEffects(child, childInstance) + + // Tree was updated, request a frame + invalidateInstance(child) } function appendChild(parent: HostConfig['instance'], child: HostConfig['instance'] | HostConfig['textInstance']) { @@ -133,14 +148,6 @@ function appendChild(parent: HostConfig['instance'], child: HostConfig['instance // Attach tree once complete handleContainerEffects(parent, child) - - // Add Object3Ds if able - if (!child.props.attach && parent.object instanceof THREE.Object3D && child.object instanceof THREE.Object3D) { - parent.object.add(child.object) - } - - // Tree was updated, request a frame - invalidateInstance(child) } function insertBefore( @@ -158,22 +165,7 @@ function insertBefore( if (replace) beforeChild.parent = null // Attach tree once complete - handleContainerEffects(parent, child) - - // Manually splice Object3Ds - if ( - !child.props.attach && - parent.object instanceof THREE.Object3D && - child.object instanceof THREE.Object3D && - beforeChild.object instanceof THREE.Object3D - ) { - child.object.parent = parent.object - parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), replace ? 1 : 0, child.object) - child.object.dispatchEvent({ type: 'added' }) - } - - // Tree was updated, request a frame - invalidateInstance(child) + handleContainerEffects(parent, child, beforeChild, replace) } function removeChild( From 06234ade3daa48806b1eab46245d63094bd3548f Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 21:50:34 -0600 Subject: [PATCH 106/252] chore: cleanup instance init --- packages/fiber/src/core/reconciler.ts | 32 ++++++++++----------------- packages/fiber/src/core/utils.tsx | 6 +++++ 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 3eb04d1e9d..5eefc5e5da 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -95,28 +95,20 @@ function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: const state = child.root.getState() if (!parent.parent && parent.object !== state.scene) return - if (!child.object) { - // Get target from catalogue - const name = `${child.type[0].toUpperCase()}${child.type.slice(1)}` - const target = catalogue[name] - - // Create object - child.object = child.props.object ?? new target(...(child.props.args ?? [])) + // Create & link object on first run + if (!child.object?.__r3f) { + if (!child.object) { + // Get target from catalogue + const name = `${child.type[0].toUpperCase()}${child.type.slice(1)}` + const target = catalogue[name] + + // Create object + child.object = child.props.object ?? new target(...(child.props.args ?? [])) + } child.object.__r3f = child - } - - // Auto-attach geometries and materials - if (child.props.attach === undefined) { - if (child.object instanceof THREE.BufferGeometry) child.props.attach = 'geometry' - else if (child.object instanceof THREE.Material) child.props.attach = 'material' - } - - // Set initial props - applyProps(child.object, child.props) - // Handle interactivity - if (child.eventCount > 0 && child.object.raycast !== null && child.object instanceof THREE.Object3D) { - state.internal.interaction.push(child.object) + // Set initial props + applyProps(child.object, child.props) } // Append instance diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 5cd78ac539..08d524a861 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -427,6 +427,12 @@ export function applyProps(object: Instance['object'], props: Instan } } + // Auto-attach geometries and materials + if (instance && instance.props.attach === undefined) { + if (instance.object instanceof THREE.BufferGeometry) instance.props.attach = 'geometry' + else if (instance.object instanceof THREE.Material) instance.props.attach = 'material' + } + if (instance) invalidateInstance(instance) return object From 5d61585a2841c71c4db8d79a3a76d9312d3b10d4 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 22:47:09 -0600 Subject: [PATCH 107/252] chore(tests): harden suspense lifecycle tests --- packages/fiber/tests/renderer.test.tsx | 28 +++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 270b6af3ef..5bbb6366f7 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -5,13 +5,23 @@ import { suspend } from 'suspend-react' class CustomElement extends THREE.Object3D {} +class Mock extends THREE.Group { + static instances: string[] = [] + constructor(name: string) { + super() + this.name = name + Mock.instances.push(name) + } +} + declare module '@react-three/fiber' { interface ThreeElements { customElement: ThreeElement + mock: ThreeElement } } -extend({ CustomElement }) +extend({ CustomElement, Mock }) type ComponentMesh = THREE.Mesh @@ -449,9 +459,9 @@ describe('renderer', () => { suspend(async (reconstruct) => reconstruct, [reconstruct]) return ( - - + void (lastMounted = self?.uuid)} attach={(_, self) => { calls.push('attach') @@ -459,7 +469,7 @@ describe('renderer', () => { return () => calls.push('detach') }} /> - + ) } @@ -467,9 +477,9 @@ describe('renderer', () => { React.useLayoutEffect(() => void calls.push('useLayoutEffect'), []) return ( - + - + ) } @@ -478,10 +488,14 @@ describe('renderer', () => { // Should complete tree before layout-effects fire expect(calls).toStrictEqual(['attach', 'useLayoutEffect']) expect(lastAttached).toBe(lastMounted) + expect(Mock.instances).toStrictEqual(['suspense', 'parent', 'child']) await act(async () => root.render()) expect(calls).toStrictEqual(['attach', 'useLayoutEffect', 'detach', 'attach']) expect(lastAttached).toBe(lastMounted) + expect(Mock.instances).toStrictEqual(['suspense', 'parent', 'child', 'parent', 'child']) + + extend({ Group: THREE.Group }) }) }) From dc994acc668e47a831a4d1c026b0e978c2bea432 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 27 Feb 2023 22:47:51 -0600 Subject: [PATCH 108/252] chore: cleanup --- packages/fiber/tests/renderer.test.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 5bbb6366f7..d08bff88bc 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -495,7 +495,5 @@ describe('renderer', () => { expect(calls).toStrictEqual(['attach', 'useLayoutEffect', 'detach', 'attach']) expect(lastAttached).toBe(lastMounted) expect(Mock.instances).toStrictEqual(['suspense', 'parent', 'child', 'parent', 'child']) - - extend({ Group: THREE.Group }) }) }) From 090e497ba13b9720ff6fa29f751de3cab868338a Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 28 Feb 2023 00:17:10 -0600 Subject: [PATCH 109/252] chore: cleanup element mock --- packages/fiber/tests/renderer.test.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index d08bff88bc..979dcd5426 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -3,10 +3,8 @@ import * as THREE from 'three' import { ReconcilerRoot, createRoot, act, extend, ThreeElement } from '../src/index' import { suspend } from 'suspend-react' -class CustomElement extends THREE.Object3D {} - class Mock extends THREE.Group { - static instances: string[] = [] + static instances: string[] constructor(name: string) { super() this.name = name @@ -16,12 +14,11 @@ class Mock extends THREE.Group { declare module '@react-three/fiber' { interface ThreeElements { - customElement: ThreeElement mock: ThreeElement } } -extend({ CustomElement, Mock }) +extend({ Mock }) type ComponentMesh = THREE.Mesh @@ -44,7 +41,10 @@ const expectToThrow = async (callback: () => any) => { describe('renderer', () => { let root: ReconcilerRoot = null! - beforeEach(() => (root = createRoot(document.createElement('canvas')))) + beforeEach(() => { + root = createRoot(document.createElement('canvas')) + Mock.instances = [] + }) afterEach(async () => act(async () => root.unmount())) it('should render empty JSX', async () => { @@ -63,11 +63,11 @@ describe('renderer', () => { }) it('should render extended elements', async () => { - const store = await act(async () => root.render()) + const store = await act(async () => root.render()) const { scene } = store.getState() expect(scene.children.length).toBe(1) - expect(scene.children[0]).toBeInstanceOf(CustomElement) + expect(scene.children[0]).toBeInstanceOf(Mock) }) it('should render primitives', async () => { From 254a7158e3559a8b031a05023a10407cc786cbcf Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 28 Feb 2023 01:33:34 -0600 Subject: [PATCH 110/252] fix: don't no-op primitive prepare --- packages/fiber/src/core/reconciler.ts | 16 +++++++--------- packages/fiber/src/core/utils.tsx | 5 ++++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 5eefc5e5da..0b710a3ca6 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -96,15 +96,13 @@ function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: if (!parent.parent && parent.object !== state.scene) return // Create & link object on first run - if (!child.object?.__r3f) { - if (!child.object) { - // Get target from catalogue - const name = `${child.type[0].toUpperCase()}${child.type.slice(1)}` - const target = catalogue[name] - - // Create object - child.object = child.props.object ?? new target(...(child.props.args ?? [])) - } + if (!child.object) { + // Get target from catalogue + const name = `${child.type[0].toUpperCase()}${child.type.slice(1)}` + const target = catalogue[name] + + // Create object + child.object = child.props.object ?? new target(...(child.props.args ?? [])) child.object.__r3f = child // Set initial props diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 08d524a861..2cfdd4f01d 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -221,7 +221,10 @@ export function prepare(target: T, root: RootStore, type: string, props handlers: {}, isHidden: false, } - if (object) object.__r3f = instance + if (object) { + object.__r3f = instance + if (type) applyProps(object, instance.props) + } } return instance From cea29e6f17b50796d694c05e712fad8361e68465 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 28 Feb 2023 01:37:47 -0600 Subject: [PATCH 111/252] chore: harden render tests --- packages/fiber/tests/renderer.test.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 979dcd5426..c9ffc7d1b7 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -5,7 +5,7 @@ import { suspend } from 'suspend-react' class Mock extends THREE.Group { static instances: string[] - constructor(name: string) { + constructor(name: string = '') { super() this.name = name Mock.instances.push(name) @@ -55,29 +55,32 @@ describe('renderer', () => { }) it('should render native elements', async () => { - const store = await act(async () => root.render()) + const store = await act(async () => root.render()) const { scene } = store.getState() expect(scene.children.length).toBe(1) expect(scene.children[0]).toBeInstanceOf(THREE.Group) + expect(scene.children[0].name).toBe('native') }) it('should render extended elements', async () => { - const store = await act(async () => root.render()) + const store = await act(async () => root.render()) const { scene } = store.getState() expect(scene.children.length).toBe(1) expect(scene.children[0]).toBeInstanceOf(Mock) + expect(scene.children[0].name).toBe('mock') }) it('should render primitives', async () => { const object = new THREE.Object3D() - const store = await act(async () => root.render()) + const store = await act(async () => root.render()) const { scene } = store.getState() expect(scene.children.length).toBe(1) expect(scene.children[0]).toBe(object) + expect(object.name).toBe('primitive') }) it('should go through lifecycle', async () => { From c195d113f24e7c4bb832c70e1be9248e17e01554 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 28 Feb 2023 08:30:24 -0600 Subject: [PATCH 112/252] fix(reconciler): handle insert on out-of-order reconstruct --- packages/fiber/src/core/reconciler.ts | 24 ++++++++----------- .../__snapshots__/RTTR.core.test.tsx.snap | 14 +++++------ 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 0b710a3ca6..6adf874945 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -170,7 +170,7 @@ function removeChild( child.parent = null if (recursive === undefined) { const childIndex = parent.children.indexOf(child) - if (childIndex !== -1) parent.children.splice(childIndex, 1) + parent.children.splice(childIndex === -1 ? 0 : childIndex, 1) } // Eagerly tear down tree @@ -235,26 +235,22 @@ function switchInstance( // Link up new instance const parent = oldInstance.parent if (parent) { - // Manually handle replace https://github.com/pmndrs/react-three-fiber/pull/2680 - // insertBefore(parent, newInstance, oldInstance, true) - - if (!oldInstance.autoRemovedBeforeAppend) removeChild(parent, oldInstance) - if (newInstance.parent) newInstance.autoRemovedBeforeAppend = true - appendChild(parent, newInstance) + removeChild(parent, oldInstance, true, false) + insertBefore(parent, newInstance, oldInstance, true) } // This evil hack switches the react-internal fiber node // https://github.com/facebook/react/issues/14983 // https://github.com/facebook/react/pull/15021 - ;[fiber, fiber.alternate].forEach((fiber) => { - if (fiber !== null) { - fiber.stateNode = newInstance - if (fiber.ref) { - if (typeof fiber.ref === 'function') fiber.ref(newInstance.object) - else fiber.ref.current = newInstance.object + for (const _fiber of [fiber, fiber.alternate]) { + if (_fiber != null) { + _fiber.stateNode = newInstance + if (_fiber.ref) { + if (typeof _fiber.ref === 'function') _fiber.ref(newInstance.object) + else _fiber.ref.current = newInstance.object } } - }) + } // Tree was updated, request a frame invalidateInstance(newInstance) diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index 6d7b8f81dc..6832a2d939 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -386,13 +386,6 @@ Array [ }, Object { "children": Array [ - Object { - "children": Array [], - "props": Object { - "attach": "material", - }, - "type": "meshBasicMaterial", - }, Object { "children": Array [], "props": Object { @@ -404,6 +397,13 @@ Array [ }, "type": "boxGeometry", }, + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshBasicMaterial", + }, ], "props": Object { "position-x": 12, From 4fb41a001e999cdf532d0fcf8e04c27de0587f2d Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 28 Feb 2023 08:36:15 -0600 Subject: [PATCH 113/252] experiment: don't dispose on swap --- packages/fiber/src/core/reconciler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 6adf874945..b48ad65271 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -235,7 +235,7 @@ function switchInstance( // Link up new instance const parent = oldInstance.parent if (parent) { - removeChild(parent, oldInstance, true, false) + removeChild(parent, oldInstance, false, false) insertBefore(parent, newInstance, oldInstance, true) } From cf9bfc603af8f4f8fded9fe8ac80d943692a7dae Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 28 Feb 2023 08:41:23 -0600 Subject: [PATCH 114/252] chore: revert swap --- packages/fiber/src/core/reconciler.ts | 12 ++++++++---- .../__snapshots__/RTTR.core.test.tsx.snap | 14 +++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index b48ad65271..ded3830137 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -170,7 +170,7 @@ function removeChild( child.parent = null if (recursive === undefined) { const childIndex = parent.children.indexOf(child) - parent.children.splice(childIndex === -1 ? 0 : childIndex, 1) + if (childIndex !== -1) parent.children.splice(childIndex, 1) } // Eagerly tear down tree @@ -235,15 +235,19 @@ function switchInstance( // Link up new instance const parent = oldInstance.parent if (parent) { - removeChild(parent, oldInstance, false, false) - insertBefore(parent, newInstance, oldInstance, true) + // Manually handle replace https://github.com/pmndrs/react-three-fiber/pull/2680 + // insertBefore(parent, newInstance, oldInstance, true) + + if (!oldInstance.autoRemovedBeforeAppend) removeChild(parent, oldInstance) + if (newInstance.parent) newInstance.autoRemovedBeforeAppend = true + appendChild(parent, newInstance) } // This evil hack switches the react-internal fiber node // https://github.com/facebook/react/issues/14983 // https://github.com/facebook/react/pull/15021 for (const _fiber of [fiber, fiber.alternate]) { - if (_fiber != null) { + if (_fiber !== null) { _fiber.stateNode = newInstance if (_fiber.ref) { if (typeof _fiber.ref === 'function') _fiber.ref(newInstance.object) diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index 6832a2d939..6d7b8f81dc 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -386,6 +386,13 @@ Array [ }, Object { "children": Array [ + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshBasicMaterial", + }, Object { "children": Array [], "props": Object { @@ -397,13 +404,6 @@ Array [ }, "type": "boxGeometry", }, - Object { - "children": Array [], - "props": Object { - "attach": "material", - }, - "type": "meshBasicMaterial", - }, ], "props": Object { "position-x": 12, From 5f376ce33d39512f00ff0b0f3388c9dcb6107511 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Fri, 3 Mar 2023 22:55:01 -0600 Subject: [PATCH 115/252] fix(reconciler): remove beforeChild on replace --- packages/fiber/src/core/reconciler.ts | 15 +++++---------- .../__snapshots__/RTTR.core.test.tsx.snap | 14 +++++++------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index ded3830137..b3b7cb93ff 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -42,7 +42,6 @@ export interface Instance { attach?: AttachType previousAttach?: any isHidden: boolean - autoRemovedBeforeAppend?: boolean } interface HostConfig { @@ -152,7 +151,10 @@ function insertBefore( child.parent = parent const childIndex = parent.children.indexOf(beforeChild) if (childIndex !== -1) parent.children.splice(childIndex, replace ? 1 : 0, child) - if (replace) beforeChild.parent = null + if (replace) { + beforeChild.parent = null + removeChild(parent, beforeChild) + } // Attach tree once complete handleContainerEffects(parent, child, beforeChild, replace) @@ -234,14 +236,7 @@ function switchInstance( // Link up new instance const parent = oldInstance.parent - if (parent) { - // Manually handle replace https://github.com/pmndrs/react-three-fiber/pull/2680 - // insertBefore(parent, newInstance, oldInstance, true) - - if (!oldInstance.autoRemovedBeforeAppend) removeChild(parent, oldInstance) - if (newInstance.parent) newInstance.autoRemovedBeforeAppend = true - appendChild(parent, newInstance) - } + if (parent) insertBefore(parent, newInstance, oldInstance, true) // This evil hack switches the react-internal fiber node // https://github.com/facebook/react/issues/14983 diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index 6d7b8f81dc..6832a2d939 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -386,13 +386,6 @@ Array [ }, Object { "children": Array [ - Object { - "children": Array [], - "props": Object { - "attach": "material", - }, - "type": "meshBasicMaterial", - }, Object { "children": Array [], "props": Object { @@ -404,6 +397,13 @@ Array [ }, "type": "boxGeometry", }, + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshBasicMaterial", + }, ], "props": Object { "position-x": 12, From 5883610e7616ee3438a19e3c741c6e03213ae27d Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Fri, 3 Mar 2023 22:59:43 -0600 Subject: [PATCH 116/252] Revert "fix(reconciler): remove beforeChild on replace" This reverts commit 5f376ce33d39512f00ff0b0f3388c9dcb6107511. --- packages/fiber/src/core/reconciler.ts | 15 ++++++++++----- .../__snapshots__/RTTR.core.test.tsx.snap | 14 +++++++------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index b3b7cb93ff..ded3830137 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -42,6 +42,7 @@ export interface Instance { attach?: AttachType previousAttach?: any isHidden: boolean + autoRemovedBeforeAppend?: boolean } interface HostConfig { @@ -151,10 +152,7 @@ function insertBefore( child.parent = parent const childIndex = parent.children.indexOf(beforeChild) if (childIndex !== -1) parent.children.splice(childIndex, replace ? 1 : 0, child) - if (replace) { - beforeChild.parent = null - removeChild(parent, beforeChild) - } + if (replace) beforeChild.parent = null // Attach tree once complete handleContainerEffects(parent, child, beforeChild, replace) @@ -236,7 +234,14 @@ function switchInstance( // Link up new instance const parent = oldInstance.parent - if (parent) insertBefore(parent, newInstance, oldInstance, true) + if (parent) { + // Manually handle replace https://github.com/pmndrs/react-three-fiber/pull/2680 + // insertBefore(parent, newInstance, oldInstance, true) + + if (!oldInstance.autoRemovedBeforeAppend) removeChild(parent, oldInstance) + if (newInstance.parent) newInstance.autoRemovedBeforeAppend = true + appendChild(parent, newInstance) + } // This evil hack switches the react-internal fiber node // https://github.com/facebook/react/issues/14983 diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index 6832a2d939..6d7b8f81dc 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -386,6 +386,13 @@ Array [ }, Object { "children": Array [ + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshBasicMaterial", + }, Object { "children": Array [], "props": Object { @@ -397,13 +404,6 @@ Array [ }, "type": "boxGeometry", }, - Object { - "children": Array [], - "props": Object { - "attach": "material", - }, - "type": "meshBasicMaterial", - }, ], "props": Object { "position-x": 12, From 461561e706c39847ca5dc8e01eadeb1b5071b54e Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Tue, 14 Mar 2023 00:05:19 -0700 Subject: [PATCH 117/252] feat: `scene` render prop for custom THREE.Scene (#2803) --- docs/API/canvas.mdx | 1 + packages/fiber/src/core/renderer.tsx | 20 ++++++++++++++++++++ packages/fiber/src/core/store.ts | 4 +--- packages/fiber/tests/index.test.tsx | 28 ++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/docs/API/canvas.mdx b/docs/API/canvas.mdx index c61954d925..29ff2c1f96 100644 --- a/docs/API/canvas.mdx +++ b/docs/API/canvas.mdx @@ -27,6 +27,7 @@ const App = () => ( | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | | children | three.js JSX elements or regular components | | | gl | Props that go into the default renderer, or your own renderer. Also accepts a synchronous callback like `gl={canvas => new Renderer({ canvas })}` | `{}` | +| scene | Props that go into the default camera, or your own `THREE.Scene` | `{}` | | camera | Props that go into the default camera, or your own `THREE.Camera` | `{ fov: 75, near: 0.1, far: 1000, position: [0, 0, 5] }` | | shadows | Props that go into `gl.shadowMap`, can be set true for `PCFsoft` or one of the following: 'basic', 'percentage', 'soft', 'variance' | `false` | | raycaster | Props that go into the default raycaster | `{}` | diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index b534270942..bbfbab28df 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -32,6 +32,7 @@ import { updateCamera, applyProps, ColorManagement, + prepare, } from './utils' import { useStore } from './hooks' import { Stage, Lifecycle, Stages } from './stages' @@ -101,6 +102,8 @@ export interface RenderProps { dpr?: Dpr /** Props that go into the default raycaster */ raycaster?: Partial + /** A `THREE.Scene` instance or props that go into the default scene */ + scene?: THREE.Scene | Partial> /** A `THREE.Camera` instance or props that go into the default camera */ camera?: CameraProps /** An R3F event manager to manage elements' pointer events */ @@ -220,6 +223,7 @@ export function createRoot(canvas: TCanvas): ReconcilerR let { gl: glConfig, size: propsSize, + scene: sceneOptions, events, onCreated: onCreatedCallback, shadows = false, @@ -269,6 +273,22 @@ export function createRoot(canvas: TCanvas): ReconcilerR state.set({ camera }) } + // Set up scene (one time only!) + if (!state.scene) { + let scene: THREE.Scene + + if (sceneOptions instanceof THREE.Scene) { + scene = sceneOptions + prepare(scene, store, '', {}) + } else { + scene = new THREE.Scene() + prepare(scene, store, '', {}) + if (sceneOptions) applyProps(scene as any, sceneOptions as any) + } + + state.set({ scene }) + } + // Set up XR (one time only!) if (!state.xr) { // Handle frame behavior in WebXR diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 211547e10a..cc37be078d 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -213,6 +213,7 @@ export const createStore = ( camera: null as unknown as Camera, raycaster: null as unknown as THREE.Raycaster, events: { priority: 1, enabled: true, connected: false }, + scene: null as unknown as THREE.Scene, xr: null as unknown as XRManager, invalidate: (frames = 1) => invalidate(get(), frames), @@ -221,7 +222,6 @@ export const createStore = ( legacy: false, linear: false, flat: false, - scene: new THREE.Scene(), controls: null, clock: new THREE.Clock(), @@ -355,8 +355,6 @@ export const createStore = ( const state = rootStore.getState() - prepare(state.scene, rootStore, '', {}) - let oldSize = state.size let oldDpr = state.viewport.dpr let oldCamera = state.camera diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index 0d5a52bf7a..3356b086a3 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -118,6 +118,34 @@ describe('createRoot', () => { expect(gl.physicallyCorrectLights).toBe(true) }) + it('should update scene via scene prop', async () => { + let scene: THREE.Scene = null! + + await act(async () => { + scene = root + .configure({ scene: { name: 'test' } }) + .render() + .getState().scene + }) + + expect(scene.name).toBe('test') + }) + + it('should set a custom scene via scene prop', async () => { + let scene: THREE.Scene = null! + + const prop = new THREE.Scene() + + await act(async () => { + scene = root + .configure({ scene: prop }) + .render() + .getState().scene + }) + + expect(prop).toBe(scene) + }) + it('should set a renderer via gl callback', async () => { class Renderer extends THREE.WebGLRenderer {} From fad83b2294f44282345d0f7af82091b2987d67e7 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Tue, 14 Mar 2023 18:23:05 -0700 Subject: [PATCH 118/252] [fix] Canvas now properly forwards scene --- packages/fiber/src/native/Canvas.tsx | 2 ++ packages/fiber/src/web/Canvas.tsx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index b0cc4b77c3..ab309e0727 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -33,6 +33,7 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( onPointerMissed, onCreated, stages, + scene, ...props }, forwardedRef, @@ -100,6 +101,7 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( raycaster, camera, stages, + scene, // expo-gl can only render at native dpr/resolution // https://github.com/expo/expo-three/issues/39 dpr: PixelRatio.get(), diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index ce64a3b374..7c777a554c 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -56,6 +56,7 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef handlePointerMissed.current?.(...args), From 76276c0678faa3b0dba834060ddc1b0959815df9 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Tue, 14 Mar 2023 19:06:36 -0700 Subject: [PATCH 119/252] [fix] narrow scene options type --- packages/fiber/src/core/renderer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index bbfbab28df..73dd70dc4c 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -103,7 +103,7 @@ export interface RenderProps { /** Props that go into the default raycaster */ raycaster?: Partial /** A `THREE.Scene` instance or props that go into the default scene */ - scene?: THREE.Scene | Partial> + scene?: THREE.Scene | Partial /** A `THREE.Camera` instance or props that go into the default camera */ camera?: CameraProps /** An R3F event manager to manage elements' pointer events */ From 35333c98d9d1570daf40b5f09a007894236ba9a1 Mon Sep 17 00:00:00 2001 From: Kris Date: Mon, 29 May 2023 20:06:35 -0700 Subject: [PATCH 120/252] [feat] relax Object3D checks in the reconciler (#2806) --- packages/fiber/src/core/reconciler.ts | 30 ++++++++++++++++----------- packages/fiber/src/core/utils.tsx | 2 ++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 5b890d7499..2ca5c324d5 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -2,7 +2,18 @@ import * as THREE from 'three' import Reconciler from 'react-reconciler' import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' -import { is, diffProps, applyProps, invalidateInstance, attach, detach, prepare, globalScope, now } from './utils' +import { + is, + diffProps, + applyProps, + invalidateInstance, + attach, + detach, + prepare, + globalScope, + now, + isObject3D, +} from './utils' import type { RootStore } from './store' import { removeInteractivity, type EventHandlers } from './events' @@ -106,7 +117,7 @@ function handleContainerEffects(parent: Instance, child: Instance) { if (!parent.parent && parent.object !== state.scene) return // Handle interactivity - if (child.eventCount > 0 && child.object.raycast !== null && child.object instanceof THREE.Object3D) { + if (child.eventCount > 0 && child.object.raycast !== null && isObject3D(child.object)) { state.internal.interaction.push(child.object) } @@ -123,7 +134,7 @@ function appendChild(parent: HostConfig['instance'], child: HostConfig['instance parent.children.push(child) // Add Object3Ds if able - if (!child.props.attach && parent.object instanceof THREE.Object3D && child.object instanceof THREE.Object3D) { + if (!child.props.attach && isObject3D(parent.object) && isObject3D(child.object)) { parent.object.add(child.object) } @@ -149,12 +160,7 @@ function insertBefore( if (replace) beforeChild.parent = null // Manually splice Object3Ds - if ( - !child.props.attach && - parent.object instanceof THREE.Object3D && - child.object instanceof THREE.Object3D && - beforeChild.object instanceof THREE.Object3D - ) { + if (!child.props.attach && isObject3D(parent.object) && isObject3D(child.object) && isObject3D(beforeChild.object)) { child.object.parent = parent.object parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), replace ? 1 : 0, child.object) child.object.dispatchEvent({ type: 'added' }) @@ -185,7 +191,7 @@ function removeChild( // Eagerly tear down tree if (child.props.attach) { detach(parent, child) - } else if (child.object instanceof THREE.Object3D && parent.object instanceof THREE.Object3D) { + } else if (isObject3D(child.object) && isObject3D(parent.object)) { parent.object.remove(child.object) removeInteractivity(child.root, child.object) } @@ -360,7 +366,7 @@ export const reconciler = Reconciler< hideInstance(instance) { if (instance.props.attach && instance.parent?.object) { detach(instance.parent, instance) - } else if (instance.object instanceof THREE.Object3D) { + } else if (isObject3D(instance.object)) { instance.object.visible = false } @@ -371,7 +377,7 @@ export const reconciler = Reconciler< if (instance.isHidden) { if (instance.props.attach && instance.parent?.object) { attach(instance.parent, instance) - } else if (instance.object instanceof THREE.Object3D && instance.props.visible !== false) { + } else if (isObject3D(instance.object) && instance.props.visible !== false) { instance.object.visible = true } } diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index aed863a471..a300e2edf3 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -474,3 +474,5 @@ export const globalScope = (typeof global !== 'undefined' && global) || (typeof self !== 'undefined' && self) || (typeof window !== 'undefined' && window) + +export const isObject3D = (object: any): object is THREE.Object3D => object?.isObject3D From 4ae810e2c2e5dc78d962ad6be1d6e82ba1a9b8d1 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 5 Jun 2023 14:04:33 -0700 Subject: [PATCH 121/252] fix: dispose properly binds its object --- packages/fiber/src/core/reconciler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 2ca5c324d5..60aaeeb075 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -215,7 +215,7 @@ function removeChild( // - cannot be a // - cannot be a THREE.Scene, because three has broken its own API if (shouldDispose && child.type !== 'primitive' && child.object.type !== 'Scene') { - const dispose = child.object.dispose + const dispose = child.object.dispose.bind(child.object) if (typeof dispose === 'function') { scheduleCallback(idlePriority, () => { try { From ec1d7232e558029aa51c6a50ac5667c7a4650b03 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 5 Jun 2023 14:32:17 -0700 Subject: [PATCH 122/252] fix: call instead of bind --- packages/fiber/src/core/reconciler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 60aaeeb075..75b1a6db15 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -215,11 +215,11 @@ function removeChild( // - cannot be a // - cannot be a THREE.Scene, because three has broken its own API if (shouldDispose && child.type !== 'primitive' && child.object.type !== 'Scene') { - const dispose = child.object.dispose.bind(child.object) + const dispose = child.object.dispose if (typeof dispose === 'function') { scheduleCallback(idlePriority, () => { try { - dispose() + dispose.call(child.object) } catch (e) { /* ... */ } From 9e0b2d10beb12d4010c7402548592ea545bdd4c3 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 5 Jun 2023 16:46:01 -0700 Subject: [PATCH 123/252] Revert to bind --- packages/fiber/src/core/reconciler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 75b1a6db15..ded7fc76f5 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -215,11 +215,11 @@ function removeChild( // - cannot be a // - cannot be a THREE.Scene, because three has broken its own API if (shouldDispose && child.type !== 'primitive' && child.object.type !== 'Scene') { - const dispose = child.object.dispose - if (typeof dispose === 'function') { + if (typeof child.object.dispose === 'function') { + const dispose = child.object.dispose.bind(child.object) scheduleCallback(idlePriority, () => { try { - dispose.call(child.object) + dispose() } catch (e) { /* ... */ } From ad37b2afda0094aeb7b627b3114f996701ece294 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Sat, 10 Jun 2023 10:21:35 -0500 Subject: [PATCH 124/252] chore: update tests, upstream fixes --- packages/fiber/__mocks__/expo-gl.ts | 1 + packages/fiber/src/core/reconciler.ts | 7 +- packages/fiber/src/core/renderer.tsx | 143 ++++----- packages/fiber/src/core/utils.tsx | 58 +++- .../tests/__snapshots__/index.test.tsx.snap | 1 + packages/fiber/tests/index.test.tsx | 85 ++++-- packages/fiber/tests/utils.test.ts | 7 + packages/shared/setupTests.ts | 22 +- packages/test-renderer/src/index.tsx | 2 +- yarn.lock | 287 +++++++++++++----- 10 files changed, 390 insertions(+), 223 deletions(-) diff --git a/packages/fiber/__mocks__/expo-gl.ts b/packages/fiber/__mocks__/expo-gl.ts index f336491ef4..7915694131 100644 --- a/packages/fiber/__mocks__/expo-gl.ts +++ b/packages/fiber/__mocks__/expo-gl.ts @@ -5,6 +5,7 @@ import { WebGL2RenderingContext } from '@react-three/test-renderer/src/WebGL2Ren export function GLView({ onContextCreate }: GLViewProps) { React.useLayoutEffect(() => { const gl = new WebGL2RenderingContext({ width: 1280, height: 800 } as HTMLCanvasElement) + gl.endFrameEXP = () => {} onContextCreate(gl as any) }, []) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index ded7fc76f5..ff9412c4ac 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -3,7 +3,6 @@ import Reconciler from 'react-reconciler' import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' import { - is, diffProps, applyProps, invalidateInstance, @@ -72,7 +71,7 @@ interface HostConfig { noTimeout: -1 } -const catalogue: Catalogue = {} +export const catalogue: Catalogue = {} export const extend = (objects: Partial): void => void Object.assign(catalogue, objects) function createInstance(type: string, props: HostConfig['props'], root: RootStore): HostConfig['instance'] { @@ -390,8 +389,8 @@ export const reconciler = Reconciler< unhideTextInstance: handleTextInstance, // SSR fallbacks now, - scheduleTimeout: (is.fun(setTimeout) ? setTimeout : undefined) as any, - cancelTimeout: (is.fun(clearTimeout) ? clearTimeout : undefined) as any, + scheduleTimeout: (typeof setTimeout === 'function' ? setTimeout : undefined) as any, + cancelTimeout: (typeof clearTimeout === 'function' ? clearTimeout : undefined) as any, // @ts-ignore Deprecated experimental APIs // https://github.com/facebook/react/blob/main/packages/shared/ReactFeatureFlags.js // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r916356874 diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 73dd70dc4c..0844f51a2c 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -13,8 +13,6 @@ import { Size, Dpr, Performance, - PrivateKeys, - privateKeys, Subscription, Frameloop, RootStore, @@ -31,8 +29,9 @@ import { Camera, updateCamera, applyProps, - ColorManagement, prepare, + useMutableCallback, + getColorManagement, } from './utils' import { useStore } from './hooks' import { Stage, Lifecycle, Stages } from './stages' @@ -217,6 +216,7 @@ export function createRoot(canvas: TCanvas): ReconcilerR // Locals let onCreated: ((state: RootState) => void) | undefined let configured = false + let lastCamera: RenderProps['camera'] return { configure(props: RenderProps = {}): ReconcilerRoot { @@ -256,8 +256,9 @@ export function createRoot(canvas: TCanvas): ReconcilerR if (!is.equ(params, raycaster.params, shallowLoose)) applyProps(raycaster, { params: { ...raycaster.params, ...params } } as any) - // Create default camera (one time only!) - if (!state.camera) { + // Create default camera, don't overwrite any user-set state + if (!state.camera || (state.camera === lastCamera && !is.equ(lastCamera, cameraOptions, shallowLoose))) { + lastCamera = cameraOptions const isCamera = cameraOptions instanceof THREE.Camera const camera = isCamera ? (cameraOptions as Camera) @@ -268,7 +269,7 @@ export function createRoot(canvas: TCanvas): ReconcilerR camera.position.z = 5 if (cameraOptions) applyProps(camera, cameraOptions as any) // Always look at center by default - if (!cameraOptions?.rotation) camera.lookAt(0, 0, 0) + if (!state.camera && !cameraOptions?.rotation) camera.lookAt(0, 0, 0) } state.set({ camera }) } @@ -349,15 +350,24 @@ export function createRoot(canvas: TCanvas): ReconcilerR if (oldEnabled !== gl.shadowMap.enabled || oldType !== gl.shadowMap.type) gl.shadowMap.needsUpdate = true } - // Set color management + // Safely set color management if available. + // Avoid accessing THREE.ColorManagement to play nice with older versions + const ColorManagement = getColorManagement() if (ColorManagement) { if ('enabled' in ColorManagement) ColorManagement.enabled = !legacy else if ('legacyMode' in ColorManagement) ColorManagement.legacyMode = legacy } - const outputEncoding = linear ? THREE.LinearEncoding : THREE.sRGBEncoding - const toneMapping = flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping - if (gl.outputEncoding !== outputEncoding) gl.outputEncoding = outputEncoding - if (gl.toneMapping !== toneMapping) gl.toneMapping = toneMapping + + // Set color space and tonemapping preferences + const LinearEncoding = 3000 + const sRGBEncoding = 3001 + applyProps( + gl as any, + { + outputEncoding: linear ? LinearEncoding : sRGBEncoding, + toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping, + } as Partial>, + ) // Update color management state if (state.legacy !== legacy) state.set(() => ({ legacy })) @@ -479,19 +489,18 @@ export function unmountComponentAtNode( } export type InjectState = Partial< - Omit & { + Omit & { events?: { enabled?: boolean priority?: number compute?: ComputeFunction connected?: any } - size?: Size } > export function createPortal(children: React.ReactNode, container: THREE.Object3D, state?: InjectState): JSX.Element { - return + return } interface PortalProps { @@ -506,95 +515,57 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { * the "R3F hooks can only be used within the Canvas component!" warning: * * {createPortal(...)} */ - + const { events, size, ...rest } = state const previousRoot = useStore() const [raycaster] = React.useState(() => new THREE.Raycaster()) const [pointer] = React.useState(() => new THREE.Vector2()) - const inject = React.useCallback( - (rootState: RootState, injectState: RootState) => { - const intersect: Partial = { ...rootState } // all prev state props - - // Only the fields of "rootState" that do not differ from injectState - // Some props should be off-limits - // Otherwise filter out the props that are different and let the inject layer take precedence - Object.keys(rootState).forEach((key) => { - if ( - // Some props should be off-limits - privateKeys.includes(key as PrivateKeys) || - // Otherwise filter out the props that are different and let the inject layer take precedence - // Unless the inject layer props is undefined, then we keep the root layer - (rootState[key as keyof RootState] !== injectState[key as keyof RootState] && - injectState[key as keyof RootState]) - ) { - delete intersect[key as keyof RootState] - } - }) - - let viewport = undefined - if (injectState && state.size) { - const camera = injectState.camera - // Calculate the override viewport, if present - viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), state.size) - // Update the portal camera, if it differs from the previous layer - if (camera !== rootState.camera) updateCamera(camera, state.size) - } - - return { - // The intersect consists of the previous root state - ...intersect, - // Portals have their own scene, which forms the root, a raycaster and a pointer - scene: container as THREE.Scene, - raycaster, - pointer, - mouse: pointer, - // Their previous root is the layer before it - previousRoot, - // Events, size and viewport can be overridden by the inject layer - events: { ...rootState.events, ...injectState?.events, ...state.events }, - size: { ...rootState.size, ...state.size }, - viewport: { ...rootState.viewport, ...viewport }, - ...state, - } as RootState - }, - [container, pointer, previousRoot, raycaster, state], - ) + const inject = useMutableCallback((rootState: RootState, injectState: RootState) => { + let viewport + if (injectState.camera && size) { + const camera = injectState.camera + // Calculate the override viewport, if present + viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), size) + // Update the portal camera, if it differs from the previous layer + if (camera !== rootState.camera) updateCamera(camera, size) + } - const [usePortalStore] = React.useState(() => { - // Create a mirrored store, based on the previous root with a few overrides ... - const previousState = previousRoot.getState() - const store = create((set, get) => ({ - ...previousState, + return { + // The intersect consists of the previous root state + ...rootState, + get: injectState.get, + set: injectState.set, + // Portals have their own scene, which forms the root, a raycaster and a pointer scene: container as THREE.Scene, raycaster, pointer, mouse: pointer, + // Their previous root is the layer before it previousRoot, - ...state, - events: { ...previousState.events, ...state.events }, - size: { ...previousState.size, ...state.size }, - // Set and get refer to this root-state - set, - get, + // Events, size and viewport can be overridden by the inject layer + events: { ...rootState.events, ...injectState.events, ...events }, + size: { ...rootState.size, ...size }, + viewport: { ...rootState.viewport, ...viewport }, // Layers are allowed to override events setEvents: (events: Partial>) => - set((state) => ({ ...state, events: { ...state.events, ...events } })), - })) - return store + injectState.set((state) => ({ ...state, events: { ...state.events, ...events } })), + } as RootState }) - React.useEffect(() => { + const usePortalStore = React.useMemo(() => { + const store = create((set, get) => ({ ...rest, set, get } as RootState)) + // Subscribe to previous root-state and copy changes over to the mirrored portal-state - const unsub = previousRoot.subscribe((prev) => usePortalStore.setState((state) => inject(prev, state))) - return () => { - unsub() - usePortalStore.destroy() - } - }, [previousRoot, usePortalStore, inject]) + const onMutate = (prev: RootState) => store.setState((state) => inject.current(prev, state)) + onMutate(previousRoot.getState()) + previousRoot.subscribe(onMutate) + return store + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [previousRoot, container]) React.useEffect(() => { - usePortalStore.setState((injectState) => inject(previousRoot.getState(), injectState)) - }, [usePortalStore, inject, previousRoot]) + return () => usePortalStore.destroy() + }, [usePortalStore]) return ( <> diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index a300e2edf3..fae7ce72b4 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -1,23 +1,28 @@ import * as THREE from 'three' import * as React from 'react' import { useFiber, traverseFiber, useContextBridge } from 'its-fine' +import { catalogue } from './reconciler' import type { Fiber } from 'react-reconciler' import type { EventHandlers } from './events' -import type { Dpr, RootState, RootStore, Size } from './store' +import type { Dpr, Renderer, RootState, RootStore, Size } from './store' import type { ConstructorRepresentation, Instance } from './reconciler' /** - * Safely accesses a deeply-nested value on an object to get around static bundler analysis. + * Returns `true` with correct TS type inference if an object has a configurable color space (since r152). */ -const getDeep = (obj: any, ...keys: string[]): any => keys.reduce((acc, key) => acc?.[key], obj) +export const hasColorSpace = < + T extends Renderer | THREE.Texture | object, + P = T extends Renderer ? { outputColorSpace: string } : { colorSpace: string }, +>( + object: T, +): object is T & P => 'colorSpace' in object || 'outputColorSpace' in object export type ColorManagementRepresentation = { enabled: boolean | never } | { legacyMode: boolean | never } /** * The current THREE.ColorManagement instance, if present. */ -export const ColorManagement: ColorManagementRepresentation | null = - ('ColorManagement' in THREE && getDeep(THREE, 'ColorManagement')) || null +export const getColorManagement = (): ColorManagementRepresentation | null => (catalogue as any).ColorManagement ?? null export type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] export type Overwrite = Omit> & O @@ -112,7 +117,9 @@ export interface ObjectMap { } export function calculateDpr(dpr: Dpr): number { - const target = typeof window !== 'undefined' ? window.devicePixelRatio : 1 + // Err on the side of progress by assuming 2x dpr if we can't detect it + // This will happen in workers where window is defined but dpr isn't. + const target = typeof window !== 'undefined' ? window.devicePixelRatio ?? 2 : 1 return Array.isArray(dpr) ? Math.min(Math.max(dpr[0], target), dpr[1]) : dpr } @@ -153,11 +160,21 @@ export const is = { if ((isArr || isObj) && a === b) return true // Last resort, go through keys let i + // Check if a has all the keys of b for (i in a) if (!(i in b)) return false - for (i in strict ? b : a) if (a[i] !== b[i]) return false + // Check if values between keys match + if (isObj && arrays === 'shallow' && objects === 'shallow') { + for (i in strict ? b : a) if (!is.equ(a[i], b[i], { strict, objects: 'reference' })) return false + } else { + for (i in strict ? b : a) if (a[i] !== b[i]) return false + } + // If i is undefined if (is.und(i)) { + // If both arrays are empty we consider them equal if (isArr && a.length === 0 && b.length === 0) return true + // If both objects are empty we consider them equal if (isObj && Object.keys(a).length === 0 && Object.keys(b).length === 0) return true + // Otherwise match them by value if (a !== b) return false } return true @@ -366,7 +383,23 @@ export function applyProps(object: Instance['object'], props: Instan // Ignore setting undefined props if (value === undefined) continue - const { root, key, target } = resolve(object, prop) + let { root, key, target } = resolve(object, prop) + + // Alias (output)encoding => (output)colorSpace (since r152) + // https://github.com/pmndrs/react-three-fiber/pull/2829 + if (hasColorSpace(root)) { + const sRGBEncoding = 3001 + const SRGBColorSpace = 'srgb' + const LinearSRGBColorSpace = 'srgb-linear' + + if (key === 'encoding') { + key = 'colorSpace' + value = value === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace + } else if (key === 'outputEncoding') { + key = 'outputColorSpace' + value = value === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace + } + } // Copy if properties match signatures if (target?.copy && target?.constructor === (value as ConstructorRepresentation)?.constructor) { @@ -393,21 +426,24 @@ export function applyProps(object: Instance['object'], props: Instan // For versions of three which don't support THREE.ColorManagement, // Auto-convert sRGB colors // https://github.com/pmndrs/react-three-fiber/issues/344 - if (!ColorManagement && !rootState?.linear && isColor) target.convertSRGBToLinear() + if (!getColorManagement() && !rootState?.linear && isColor) target.convertSRGBToLinear() } // Else, just overwrite the value else { root[key] = value + // Auto-convert sRGB textures, for now ... // https://github.com/pmndrs/react-three-fiber/issues/344 if ( - !rootState?.linear && + rootState && root[key] instanceof THREE.Texture && // sRGB textures must be RGBA8 since r137 https://github.com/mrdoob/three.js/pull/23129 root[key].format === THREE.RGBAFormat && root[key].type === THREE.UnsignedByteType ) { - root[key].encoding = THREE.sRGBEncoding + const texture = root[key] as THREE.Texture + if (hasColorSpace(texture) && hasColorSpace(rootState.gl)) texture.colorSpace = rootState.gl.outputColorSpace + else texture.encoding = rootState.gl.outputEncoding } } } diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index ae8cad7a77..19a5d510f2 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -47,6 +47,7 @@ Array [ "ObjectMap", "Overwrite", "Performance", + "Props", "Quaternion", "ReactProps", "ReactThreeFiber", diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index 3356b086a3..54bc65ce1e 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -2,8 +2,17 @@ import * as React from 'react' import * as THREE from 'three' import * as ts from 'typescript' import * as path from 'path' -import { ReconcilerRoot, createRoot, act, useFrame, useThree, createPortal, RootState, RootStore } from '../src/index' -import { privateKeys } from '../src/core/store' +import { + ReconcilerRoot, + createRoot, + act, + useFrame, + useThree, + createPortal, + RootState, + RootStore, + extend, +} from '../src/index' let root: ReconcilerRoot = null! @@ -149,33 +158,72 @@ describe('createRoot', () => { it('should set a renderer via gl callback', async () => { class Renderer extends THREE.WebGLRenderer {} - const store = await act(async () => root.configure({ gl: (canvas) => new Renderer({ canvas }) }).render()) - const { gl } = store.getState() + let gl: Renderer = null! + await act(async () => { + gl = root + .configure({ gl: (canvas) => new Renderer({ canvas }) }) + .render() + .getState().gl + }) expect(gl instanceof Renderer).toBe(true) }) it('should respect color management preferences via gl', async () => { - const store = await act(async () => - root - .configure({ gl: { outputEncoding: THREE.LinearEncoding, toneMapping: THREE.NoToneMapping } }) - .render(), - ) - const { gl } = store.getState() + const texture = new THREE.Texture() as THREE.Texture & { colorSpace?: string } + let key = 0 + function Test() { + return + } - expect(gl.outputEncoding).toBe(THREE.LinearEncoding) - expect(gl.toneMapping).toBe(THREE.NoToneMapping) + const LinearEncoding = 3000 + const sRGBEncoding = 3001 - await act(async () => root.configure({ flat: true, linear: true }).render()) - expect(gl.outputEncoding).toBe(THREE.LinearEncoding) + let gl: THREE.WebGLRenderer & { outputColorSpace?: string } = null! + await act(async () => (gl = root.render().getState().gl)) + expect(gl.outputEncoding).toBe(sRGBEncoding) + expect(gl.toneMapping).toBe(THREE.ACESFilmicToneMapping) + expect(texture.encoding).toBe(sRGBEncoding) + + await act(async () => root.configure({ linear: true, flat: true }).render()) + expect(gl.outputEncoding).toBe(LinearEncoding) expect(gl.toneMapping).toBe(THREE.NoToneMapping) + expect(texture.encoding).toBe(LinearEncoding) + + // Sets outputColorSpace since r152 + const SRGBColorSpace = 'srgb' + const LinearSRGBColorSpace = 'srgb-linear' + + gl.outputColorSpace ??= '' + texture.colorSpace ??= '' + + await act(async () => root.configure({ linear: true }).render()) + expect(gl.outputColorSpace).toBe(LinearSRGBColorSpace) + expect(texture.colorSpace).toBe(LinearSRGBColorSpace) + + await act(async () => root.configure({ linear: false }).render()) + expect(gl.outputColorSpace).toBe(SRGBColorSpace) + expect(texture.colorSpace).toBe(SRGBColorSpace) }) it('should respect legacy prop', async () => { - await act(async () => root.configure({ legacy: true }).render()) + // <= r138 internal fallback + const material = React.createRef() + extend({ ColorManagement: null! }) + await act(async () => root.render()) + expect((THREE as any).ColorManagement.legacyMode).toBe(false) + expect(material.current!.color.toArray()).toStrictEqual(new THREE.Color('#111111').convertSRGBToLinear().toArray()) + extend({ ColorManagement: (THREE as any).ColorManagement }) + + // r139 legacyMode + await act(async () => { + root.configure({ legacy: true }).render() + }) expect((THREE as any).ColorManagement.legacyMode).toBe(true) - await act(async () => root.configure({ legacy: false }).render()) + await act(async () => { + root.configure({ legacy: false }).render() + }) expect((THREE as any).ColorManagement.legacyMode).toBe(false) // r150 !enabled @@ -229,11 +277,6 @@ describe('createPortal', () => { // Creates an isolated state enclave expect(state.scene).not.toBe(scene) expect(portalState.scene).toBe(scene) - - // Preserves internal keys - const overwrittenKeys = ['get', 'set', 'events', 'size', 'viewport'] - const respectedKeys = privateKeys.filter((key) => overwrittenKeys.includes(key) || state[key] === portalState[key]) - expect(respectedKeys).toStrictEqual(privateKeys) }) it('should handle unmounted containers', async () => { diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 1225920efc..ccab93967f 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -121,6 +121,13 @@ describe('is', () => { expect(is.equ({ a: 1, b: 1 }, { a: 1 }, { objects: 'shallow' })).toBe(false) expect(is.equ({ a: 1 }, { a: 1, b: 1 }, { objects: 'shallow' })).toBe(false) expect(is.equ({ a: 1 }, { a: 1, b: 1 }, { objects: 'shallow', strict: false })).toBe(true) + expect(is.equ({ a: [1, 2, 3] }, { a: [1, 2, 3] }, { arrays: 'reference', objects: 'reference' })).toBe(false) + expect(is.equ({ a: [1, 2, 3] }, { a: [1, 2, 3] }, { objects: 'reference' })).toBe(false) + expect(is.equ({ a: [1, 2, 3] }, { a: [1, 2, 3] }, { objects: 'shallow' })).toBe(true) + expect(is.equ({ a: [1, 2, 3] }, { a: [1, 2, 3, 4] }, { objects: 'shallow' })).toBe(false) + expect(is.equ({ a: [1, 2, 3] }, { a: [1, 2, 3, 4] }, { objects: 'shallow', strict: false })).toBe(true) + expect(is.equ({ a: [1, 2, 3] }, { a: [1, 2, 3], b: 1 }, { objects: 'shallow' })).toBe(false) + expect(is.equ({ a: [1, 2, 3] }, { a: [1, 2, 3], b: 1 }, { objects: 'shallow', strict: false })).toBe(true) const arr = [1, 2, 3] expect(is.equ(arr, arr)).toBe(true) diff --git a/packages/shared/setupTests.ts b/packages/shared/setupTests.ts index f75e639a62..7bfa887704 100644 --- a/packages/shared/setupTests.ts +++ b/packages/shared/setupTests.ts @@ -1,5 +1,5 @@ import * as THREE from 'three' -import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext' +import { WebGL2RenderingContext } from '@react-three/test-renderer/src/WebGL2RenderingContext' import { extend } from '@react-three/fiber' import 'regenerator-runtime/runtime' @@ -55,22 +55,12 @@ if (!global.PointerEvent) { } } -// Polyfills WebGL canvas -function getContext(contextId: '2d', options?: CanvasRenderingContext2DSettings): CanvasRenderingContext2D | null -function getContext( - contextId: 'bitmaprenderer', - options?: ImageBitmapRenderingContextSettings, -): ImageBitmapRenderingContext | null -function getContext(contextId: 'webgl', options?: WebGLContextAttributes): WebGLRenderingContext | null -function getContext(contextId: 'webgl2', options?: WebGLContextAttributes): WebGL2RenderingContext | null -function getContext(contextId: string): RenderingContext | null { - if (contextId === 'webgl' || contextId === 'webgl2') { - return createWebGLContext(this) - } - return null -} +globalThis.WebGL2RenderingContext = WebGL2RenderingContext as any +globalThis.WebGLRenderingContext = class WebGLRenderingContext extends WebGL2RenderingContext {} as any -HTMLCanvasElement.prototype.getContext = getContext +HTMLCanvasElement.prototype.getContext = function (this: HTMLCanvasElement) { + return new WebGL2RenderingContext(this) as any +} // Extend catalogue for render API in tests extend(THREE as any) diff --git a/packages/test-renderer/src/index.tsx b/packages/test-renderer/src/index.tsx index 594ab2ae30..ae5a18af7c 100644 --- a/packages/test-renderer/src/index.tsx +++ b/packages/test-renderer/src/index.tsx @@ -13,7 +13,7 @@ import type { CreateOptions, Renderer } from './types/public' import { wrapFiber } from './createTestInstance' // Extend catalogue for render API in tests. -extend(THREE) +extend(THREE as any) const create = async (element: React.ReactNode, options?: Partial): Promise => { const canvas = createCanvas(options) diff --git a/yarn.lock b/yarn.lock index 4e4f889b57..1ff5b42bc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2489,6 +2489,11 @@ globby "^11.0.0" read-yaml-file "^1.1.0" +"@mediapipe/tasks-vision@^0.10.0": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@mediapipe/tasks-vision/-/tasks-vision-0.10.1.tgz#68047459352019cc141dc9c1d15c05b8ab689423" + integrity sha512-/zIKjOAIABx+KVfqe8hA6X2pxBGsBYlEtvD7/gpXecvzKefo/JQO6XaggmJul7+noaqiPYM0CVGZxmFJ2oTdSQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2748,72 +2753,122 @@ resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== -"@react-spring/animated@~9.4.4": - version "9.4.4" - resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.4.4.tgz#15e21923e55c06ca2bcea432869b91b2f8b07519" - integrity sha512-e9xnuBaUTD+NolKikUmrGWjX8AVCPyj1GcEgjgq9E+0sXKv46UY7cm2EmB6mUDTxWIDVKebARY++xT4nGDraBQ== - dependencies: - "@react-spring/shared" "~9.4.4" - "@react-spring/types" "~9.4.4" - -"@react-spring/core@^9.4.4", "@react-spring/core@~9.4.4": - version "9.4.4" - resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.4.4.tgz#7730988cec7302ba6e0977cf4c08c30249d95622" - integrity sha512-llgb0ljFyjMB0JhWsaFHOi9XFT8n1jBMVs1IFY2ipIBerWIRWrgUmIpakLPHTa4c4jwqTaDSwX90s2a0iN7dxQ== - dependencies: - "@react-spring/animated" "~9.4.4" - "@react-spring/rafz" "~9.4.4" - "@react-spring/shared" "~9.4.4" - "@react-spring/types" "~9.4.4" - -"@react-spring/rafz@~9.4.4": - version "9.4.4" - resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.4.4.tgz#736c9ed1099baebeea20c357b9700b01b83ea9de" - integrity sha512-5ki/sQ06Mdf8AuFstSt5zbNNicRT4LZogiJttDAww1ozhuvemafNWEHxhzcULgCPCDu2s7HsroaISV7+GQWrhw== - -"@react-spring/shared@~9.4.4": - version "9.4.4" - resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.4.4.tgz#e1ae00a77d170d86d77d9a19dc7015bdddc2d26f" - integrity sha512-ySVgScDZlhm/+Iy2smY9i/DDrShArY0j6zjTS/Re1lasKnhq8qigoGiAxe8xMPJNlCaj3uczCqHy3TY9bKRtfQ== - dependencies: - "@react-spring/rafz" "~9.4.4" - "@react-spring/types" "~9.4.4" - -"@react-spring/three@^9.3.1", "@react-spring/three@^9.4.4": - version "9.4.4" - resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.4.4.tgz#a26de44854e166184ddba57313bfc52efce67368" - integrity sha512-z77ohxg8zG0CcZJojzfoJTTrjSbIyefNz2RlId68/4IypnOs1p8kB2Q1p+wX4KyWORpLg8ivsPcjtwBjGwfDtg== - dependencies: - "@react-spring/animated" "~9.4.4" - "@react-spring/core" "~9.4.4" - "@react-spring/shared" "~9.4.4" - "@react-spring/types" "~9.4.4" - -"@react-spring/types@~9.4.4": - version "9.4.4" - resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.4.4.tgz#97c69881788e624d7cc68d4385fdaa9b5fd20642" - integrity sha512-KpxKt/D//q/t/6FBcde/RE36LKp8PpWu7kFEMLwpzMGl9RpcexunmYOQJWwmJWtkQjgE1YRr7DzBMryz6La1cQ== - -"@react-three/drei@^9.21.0": - version "9.21.0" - resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.21.0.tgz#2b04786db97b07c88c4dc3db64a86e953568907b" - integrity sha512-+j0L9+sfIGIwoR0O/UwtBWW0Oo/AWj9nnvKTtRS4e2awHA872lHdOHL+L5e6jKJyV4ZyjOEkQFE8QaJXDPYgBQ== +"@react-spring/animated@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.6.1.tgz#ccc626d847cbe346f5f8815d0928183c647eb425" + integrity sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ== + dependencies: + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/animated@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.2.tgz#0119db8075e91d693ec45c42575541e01b104a70" + integrity sha512-ipvleJ99ipqlnHkz5qhSsgf/ny5aW0ZG8Q+/2Oj9cI7LCc7COdnrSO6V/v8MAX3JOoQNzfz6dye2s5Pt5jGaIA== + dependencies: + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/core@^9.6.1", "@react-spring/core@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.2.tgz#804ebadee45a6adff00886454d6f1c5d97ee219d" + integrity sha512-fF512edZT/gKVCA90ZRxfw1DmELeVwiL4OC2J6bMUlNr707C0h4QRoec6DjzG27uLX2MvS1CEatf9KRjwZR9/w== + dependencies: + "@react-spring/animated" "~9.7.2" + "@react-spring/rafz" "~9.7.2" + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/core@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.6.1.tgz#ebe07c20682b360b06af116ea24e2b609e778c10" + integrity sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/rafz" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/rafz@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.6.1.tgz#d71aafb92b78b24e4ff84639f52745afc285c38d" + integrity sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ== + +"@react-spring/rafz@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.2.tgz#77e7088c215e05cf893851cd87ceb40d89f2a7d7" + integrity sha512-kDWMYDQto3+flkrX3vy6DU/l9pxQ4TVW91DglQEc11iDc7shF4+WVDRJvOVLX+xoMP7zyag1dMvlIgvQ+dvA/A== + +"@react-spring/shared@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.6.1.tgz#4e2e4296910656c02bd9fd54c559702bc836ac4e" + integrity sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw== + dependencies: + "@react-spring/rafz" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/shared@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.2.tgz#b8485617bdcc9f6348b245922051fb534e07c566" + integrity sha512-6U9qkno+9DxlH5nSltnPs+kU6tYKf0bPLURX2te13aGel8YqgcpFYp5Av8DcN2x3sukinAsmzHUS/FRsdZMMBA== + dependencies: + "@react-spring/rafz" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/three@^9.6.1": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.7.2.tgz#2dd23e6e654fc57589cf6f89d6a809bc7f8a96b1" + integrity sha512-u7VAjc+az82PM+WOC2sTbZQLBixuN+0jX/oahzyjEnIds5eUJgaBqZRYAAEMupuzGGl8H3QqL3bFgBEQLq6ADQ== + dependencies: + "@react-spring/animated" "~9.7.2" + "@react-spring/core" "~9.7.2" + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/three@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.6.1.tgz#095fcd1dc6509127c33c14486d88289b89baeb9d" + integrity sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/types@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.6.1.tgz#913d3a68c5cbc1124fdb18eff919432f7b6abdde" + integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q== + +"@react-spring/types@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.2.tgz#e04dd72755d88b0e3163ba143ecd8ba78b68a5b0" + integrity sha512-GEflx2Ex/TKVMHq5g5MxQDNNPNhqg+4Db9m7+vGTm8ttZiyga7YQUF24shgRNebKIjahqCuei16SZga8h1pe4g== + +"@react-three/drei@^9.74.7": + version "9.74.8" + resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.74.8.tgz#31cc37e700c7323452528bc2e217ce1df8811661" + integrity sha512-jdFVa2ANEHOUVcczHgmnuo5WjFh3gqCbGb9JV2tqfk5RTnXzTHNT3i7nzSOGtY0k+cKPQcEfO99Qf7reONYSPA== dependencies: "@babel/runtime" "^7.11.2" - "@react-spring/three" "^9.3.1" - "@use-gesture/react" "^10.2.0" - detect-gpu "^4.0.19" + "@mediapipe/tasks-vision" "^0.10.0" + "@react-spring/three" "~9.6.1" + "@use-gesture/react" "^10.2.24" + camera-controls "^2.3.1" + detect-gpu "^5.0.14" glsl-noise "^0.0.0" + lodash.clamp "^4.0.3" lodash.omit "^4.5.0" lodash.pick "^4.4.0" - meshline "^2.0.4" + maath "^0.5.2" + meshline "^3.1.6" react-composer "^5.0.3" react-merge-refs "^1.1.0" stats.js "^0.17.0" suspend-react "^0.0.8" - three-mesh-bvh "^0.5.10" - three-stdlib "^2.13.0" - troika-three-text "^0.46.4" + three-mesh-bvh "^0.5.23" + three-stdlib "^2.23.5" + troika-three-text "^0.47.1" utility-types "^3.10.0" zustand "^3.5.13" @@ -3009,6 +3064,11 @@ dependencies: "@babel/types" "^7.3.0" +"@types/draco3d@^1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@types/draco3d/-/draco3d-1.4.2.tgz#7faccb809db2a5e19b9efb97c5f2eb9d64d527ea" + integrity sha512-goh23EGr6CLV6aKPwN1p8kBD/7tT5V/bLpToSbarKrwVejqNrspVrv8DhliteYkkhZYrlq/fwKZRRUzH4XN88w== + "@types/eslint@^8.4.10": version "8.21.1" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" @@ -3123,6 +3183,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/offscreencanvas@^2019.6.4": + version "2019.7.0" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz#e4a932069db47bb3eabeb0b305502d01586fa90d" + integrity sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg== + "@types/prettier@^2.1.5": version "2.6.0" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" @@ -3238,6 +3303,11 @@ resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.4.0.tgz#ad06c96a324293e0d5175d13dd5ded5931f90ba3" integrity sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg== +"@types/webxr@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.2.tgz#5d9627b0ffe223aa3b166de7112ac8a9460dc54f" + integrity sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -3349,7 +3419,19 @@ resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.2.11.tgz#914c36f190bcf452500d11a11fc294fe56e5dc2f" integrity sha512-5YeVrT9prf9UeaAO+2fIuiKdZ01uVBvVsjG79berGZPTHVkz01eFX2ODWJG05uQTqmRw6olz1J80yt6qcGPdvA== -"@use-gesture/react@^10.2.0", "@use-gesture/react@latest": +"@use-gesture/core@10.2.27": + version "10.2.27" + resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.2.27.tgz#0f24b17c036cd828ba07e3451ff45e2df959c6f5" + integrity sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA== + +"@use-gesture/react@^10.2.24": + version "10.2.27" + resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.2.27.tgz#7fbd50d14449ec5bc49c9b6cfef8a2845f5e0608" + integrity sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w== + dependencies: + "@use-gesture/core" "10.2.27" + +"@use-gesture/react@latest": version "10.2.11" resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.2.11.tgz#f23776050aeaee3b18f80df9cd2b765229bbfa66" integrity sha512-yATjHv6ZNe9Jar1YtJvcb6KxwpcGGW/X8FEUY6xo2mDxHkP7dCsnhZZm7I+giGlrJKBMvpVBARsbUhwQP6v6nA== @@ -4137,6 +4219,11 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= +camera-controls@^2.3.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-2.4.2.tgz#815aa5d7c4c43054fc55fb8b6cc685a56540fea2" + integrity sha512-blYDPECYFT/4egDMNWqKc2lBrpOfIAjPPRUNVswQELPi8naGBXUvZM3sDJSNuIRaHqid+JKPtlcoZk+Cb+X5qg== + caniuse-lite@^1.0.30001317: version "1.0.30001332" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" @@ -4702,10 +4789,10 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-gpu@^4.0.19: - version "4.0.34" - resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-4.0.34.tgz#c9f9238f2eaa1fb450a989a8429d054a37319db7" - integrity sha512-dDQ5hZDb/MfeJhza+PygGrOAVwf5PgwuXRQOcm2Yf9Qfkg0fD7VeBFMfgXD2GM465JhkDrfEa+vWtiRbC3b3dQ== +detect-gpu@^5.0.14: + version "5.0.27" + resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.27.tgz#821d9331c87e32568c483d85e12a9adee43d7bb2" + integrity sha512-IDjjqTkS+f0xm/ntbD21IPYiF0srzpePC/hhUMmctEsoklZwJwStJiMi/KN0pnH0LjSsgjwbP+QwW7y+Qf4/SQ== dependencies: webgl-constants "^1.1.1" @@ -7500,6 +7587,11 @@ ktx-parse@^0.2.1: resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.2.2.tgz#b037b66044855215b332cb73104590af49e47791" integrity sha512-cFBc1jnGG2WlUf52NbDUXK2obJ+Mo9WUkBRvr6tP6CKxRMvZwDDFNV3JAS4cewETp5KyexByfWm9sm+O8AffiQ== +ktx-parse@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.4.5.tgz#79905e22281a9d3e602b2ff522df1ee7d1813aa6" + integrity sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -7605,6 +7697,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.clamp@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash.clamp/-/lodash.clamp-4.0.3.tgz#5c24bedeeeef0753560dc2b4cb4671f90a6ddfaa" + integrity sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -7706,6 +7803,11 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +maath@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/maath/-/maath-0.5.3.tgz#777a1f9b8463c6ffb199ea43406874a357c0cd58" + integrity sha512-ut63A4zTd9abtpi+sOHW1fPWPtAFrjK0E17eAthx1k93W/T2cWLKV5oaswyotJVDvvW1EXSdokAqhK5KOu0Qdw== + magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -7825,10 +7927,10 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -meshline@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/meshline/-/meshline-2.0.4.tgz#39c7bcf36b503397642f2312e6211f2a8ecf75c5" - integrity sha512-Jh6DJl/zLqA4xsKvGv5950jr2ukyXQE1wgxs8u94cImHrvL6soVIggqjP+2hVHZXGYaKnWszhtjuCbKNeQyYiw== +meshline@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/meshline/-/meshline-3.1.6.tgz#eee67d9b0fd9841652cc1dc2d3833093ae8e68ca" + integrity sha512-8JZJOdaL5oz3PI/upG8JvP/5FfzYUOhrkJ8np/WKvXzl0/PZ2V9pqTvCIjSKv+w9ccg2xb+yyBhXAwt6ier3ug== metro-babel-transformer@0.70.3: version "0.70.3" @@ -10155,10 +10257,10 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -three-mesh-bvh@^0.5.10: - version "0.5.15" - resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.15.tgz#bcf681d784d8988618344a5e11e7ded7e76ee86a" - integrity sha512-jxE5iGjcoEMiyxUs7hMeZL6jBXBz9973ilqhXPhKlA1f7eitjIxRTtu7UWVQy+PhxXTsknmPzWmN5c+uAa/anA== +three-mesh-bvh@^0.5.23: + version "0.5.24" + resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.24.tgz#56dd27ad35bfbafacedaba4a4d567723bbdd686c" + integrity sha512-VTIgfjz8aFoPKTQoMIQQv9jJD4ybFRZuKKE1/kqy78FQcuHQ0+iIWv7C5cSb2inlvs7bNMVY3yRx3RXGZfrvzQ== three-stdlib@^2.13.0: version "2.13.0" @@ -10176,6 +10278,23 @@ three-stdlib@^2.13.0: potpack "^1.0.1" zstddec "^0.0.2" +three-stdlib@^2.23.5: + version "2.23.9" + resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.23.9.tgz#09c74fc6acced3d124e4f9d695156136c587a355" + integrity sha512-fYBClVGQptD7UZcoRZGNlR3sKcUW37hVPoEW1v68E4XuiwD0Ml/VqDUJ0yEMVE2DlooDvqgqv/rIcHC/B4N5pg== + dependencies: + "@types/draco3d" "^1.4.0" + "@types/offscreencanvas" "^2019.6.4" + "@types/webxr" "^0.5.2" + chevrotain "^10.1.2" + draco3d "^1.4.1" + fflate "^0.6.9" + ktx-parse "^0.4.5" + mmd-parser "^1.0.4" + opentype.js "^1.3.3" + potpack "^1.0.1" + zstddec "^0.0.2" + three@^0.141.0: version "0.141.0" resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" @@ -10289,25 +10408,25 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -troika-three-text@^0.46.4: - version "0.46.4" - resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.46.4.tgz#77627ac2ac4765d5248c857a8b42f82c25f2d034" - integrity sha512-Qsv0HhUKTZgSmAJs5wvO7YlBoJSP9TGPLmrg+K9pbQq4lseQdcevbno/WI38bwJBZ/qS56hvfqEzY0zUEFzDIw== +troika-three-text@^0.47.1: + version "0.47.2" + resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.47.2.tgz#fdf89059c010563bb829262b20c41f69ca79b712" + integrity sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng== dependencies: bidi-js "^1.0.2" - troika-three-utils "^0.46.0" - troika-worker-utils "^0.46.0" + troika-three-utils "^0.47.2" + troika-worker-utils "^0.47.2" webgl-sdf-generator "1.1.1" -troika-three-utils@^0.46.0: - version "0.46.0" - resolved "https://registry.yarnpkg.com/troika-three-utils/-/troika-three-utils-0.46.0.tgz#6d97a9bf08f2260285edf2bb0be6328dd3d50eec" - integrity sha512-llHyrXAcwzr0bpg80GxsIp73N7FuImm4WCrKDJkAqcAsWmE5pfP9+Qzw+oMWK1P/AdHQ79eOrOl9NjyW4aOw0w== +troika-three-utils@^0.47.2: + version "0.47.2" + resolved "https://registry.yarnpkg.com/troika-three-utils/-/troika-three-utils-0.47.2.tgz#af49ca694245dce631963d5fefe4e8e1b8af9044" + integrity sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg== -troika-worker-utils@^0.46.0: - version "0.46.0" - resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.46.0.tgz#1b698090af78b51a27e03881c90237a2e648d6c4" - integrity sha512-bzOx5f2ZBxkFhXtIvDJlLn2AI3bzCkGVbCndl/2dL5QZrwHEKl45OEIilCxYQQWJG1rEbOD9O80tMjoYjw19OA== +troika-worker-utils@^0.47.2: + version "0.47.2" + resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz#e7c5de5f37d56c072b13fa8112bb844e048ff46c" + integrity sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA== ts-interface-checker@^0.1.9: version "0.1.13" From 44694ccfab98c0dca30c1570b8516e422445c22e Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:15:06 -0500 Subject: [PATCH 125/252] fix: inline SSR fallbacks --- packages/fiber/src/core/reconciler.ts | 19 +++++++------------ packages/fiber/src/core/utils.tsx | 10 ---------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index ff9412c4ac..ebe763e54d 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -2,17 +2,7 @@ import * as THREE from 'three' import Reconciler from 'react-reconciler' import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' -import { - diffProps, - applyProps, - invalidateInstance, - attach, - detach, - prepare, - globalScope, - now, - isObject3D, -} from './utils' +import { diffProps, applyProps, invalidateInstance, attach, detach, prepare, globalScope, isObject3D } from './utils' import type { RootStore } from './store' import { removeInteractivity, type EventHandlers } from './events' @@ -388,7 +378,12 @@ export const reconciler = Reconciler< hideTextInstance: handleTextInstance, unhideTextInstance: handleTextInstance, // SSR fallbacks - now, + now: + typeof performance !== 'undefined' && typeof performance.now === 'function' + ? performance.now + : typeof Date.now === 'function' + ? Date.now + : () => 0, scheduleTimeout: (typeof setTimeout === 'function' ? setTimeout : undefined) as any, cancelTimeout: (typeof clearTimeout === 'function' ? clearTimeout : undefined) as any, // @ts-ignore Deprecated experimental APIs diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index fae7ce72b4..e18e949afe 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -492,16 +492,6 @@ export function updateCamera(camera: Camera, size: Size): void { } } -/** - * Get a handle to the supported `now` function for react-internal performance profiling. - */ -export const now = - typeof performance !== 'undefined' && is.fun(performance.now) - ? performance.now - : is.fun(Date.now) - ? Date.now - : () => 0 - /** * Get a handle to the current global scope in window and worker contexts if able * https://github.com/pmndrs/react-three-fiber/pull/2493 From 7088dc575bae4ed9f3212bca4ccdb2f34ba2cfb8 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:19:41 -0500 Subject: [PATCH 126/252] chore: prefer imperative loops for tracing --- packages/fiber/src/core/reconciler.ts | 14 +++++++------- packages/fiber/src/web/events.ts | 18 +++++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index ebe763e54d..638d02c26b 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -250,15 +250,15 @@ function switchInstance( // This evil hack switches the react-internal fiber node // https://github.com/facebook/react/issues/14983 // https://github.com/facebook/react/pull/15021 - ;[fiber, fiber.alternate].forEach((fiber) => { - if (fiber !== null) { - fiber.stateNode = newInstance - if (fiber.ref) { - if (typeof fiber.ref === 'function') fiber.ref(newInstance.object) - else fiber.ref.current = newInstance.object + for (const _fiber of [fiber, fiber.alternate]) { + if (_fiber !== null) { + _fiber.stateNode = newInstance + if (_fiber.ref) { + if (typeof _fiber.ref === 'function') _fiber.ref(newInstance.object) + else _fiber.ref.current = newInstance.object } } - }) + } // Tree was updated, request a frame invalidateInstance(newInstance) diff --git a/packages/fiber/src/web/events.ts b/packages/fiber/src/web/events.ts index 789be359f0..d67459c568 100644 --- a/packages/fiber/src/web/events.ts +++ b/packages/fiber/src/web/events.ts @@ -41,20 +41,24 @@ export function createPointerEvents(store: RootStore): EventManager const { set, events } = store.getState() events.disconnect?.() set((state) => ({ events: { ...state.events, connected: target } })) - Object.entries(events.handlers ?? []).forEach(([name, event]) => { - const [eventName, passive] = DOM_EVENTS[name as keyof typeof DOM_EVENTS] - target.addEventListener(eventName, event, { passive }) - }) + if (events.handlers) { + for (const name in events.handlers) { + const event = events.handlers[name as keyof typeof events.handlers] + const [eventName, passive] = DOM_EVENTS[name as keyof typeof DOM_EVENTS] + target.addEventListener(eventName, event, { passive }) + } + } }, disconnect: () => { const { set, events } = store.getState() if (events.connected) { - Object.entries(events.handlers ?? []).forEach(([name, event]) => { - if (events && events.connected instanceof HTMLElement) { + if (events.handlers) { + for (const name in events.handlers) { + const event = events.handlers[name as keyof typeof events.handlers] const [eventName] = DOM_EVENTS[name as keyof typeof DOM_EVENTS] events.connected.removeEventListener(eventName, event) } - }) + } set((state) => ({ events: { ...state.events, connected: undefined } })) } }, From 8449aac8d44d8ab5ca9847a3af7ec80e165435fe Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Thu, 22 Jun 2023 11:27:35 -0700 Subject: [PATCH 127/252] fix: scene prop not being used in web canvas --- packages/fiber/src/web/Canvas.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 5ed3406e04..5c48c7aac0 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -92,6 +92,7 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef(func if (!root.current) root.current = createRoot(canvas) root.current.configure({ gl, + scene, events, shadows, linear, From 2e7d5d6acecfde2a2a91eb5d3bccf4979e321d1d Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Thu, 22 Jun 2023 12:21:39 -0700 Subject: [PATCH 128/252] fix: object3d check in reconciler --- packages/fiber/src/core/reconciler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index 6983ed9581..a3bdc6f1b0 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -112,7 +112,7 @@ function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: // Append instance if (child.props.attach) { attach(parent, child) - } else if (child.object instanceof THREE.Object3D && parent.object instanceof THREE.Object3D) { + } else if (isObject3D(child.object) && isObject3D(parent.object)) { if (beforeChild) { child.object.parent = parent.object parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), replace ? 1 : 0, child.object) From 0e45425dedb0966fe2fdb31a997779b75515dd98 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Wed, 12 Jul 2023 07:33:12 -0500 Subject: [PATCH 129/252] chore: cleanup --- packages/fiber/package.json | 2 +- packages/fiber/src/core/store.ts | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 6e7865b1bc..46cfda2f2e 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -48,7 +48,7 @@ "react-reconciler": "^0.27.0", "react-use-measure": "^2.1.1", "scheduler": "^0.21.0", - "suspend-react": "^0.1.0", + "suspend-react": "^0.1.3", "zustand": "^4.1.2" }, "peerDependencies": { diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index e930417618..400e5aeaff 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -5,22 +5,6 @@ import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from '. import { calculateDpr, type Camera, isOrthographicCamera, prepare, updateCamera } from './utils' import type { FixedStage, Stage } from './stages' -// Keys that shouldn't be copied between R3F stores -export const privateKeys = [ - 'set', - 'get', - 'setSize', - 'setFrameloop', - 'setDpr', - 'events', - 'invalidate', - 'advance', - 'size', - 'viewport', -] as const - -export type PrivateKeys = typeof privateKeys[number] - export interface Intersection extends THREE.Intersection { eventObject: THREE.Object3D } From bca4137d432017a04aea3704a2e1a216408caed5 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 20 Aug 2023 11:44:59 -0500 Subject: [PATCH 130/252] fix(types): r153 colors overload fix (#2932) --- packages/fiber/src/core/reconciler.ts | 9 ++++++++- packages/fiber/src/three-types.ts | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.ts index a3bdc6f1b0..6f92d6e2b1 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.ts @@ -20,7 +20,14 @@ export interface Catalogue { [name: string]: ConstructorRepresentation } -export type Args = T extends ConstructorRepresentation ? ConstructorParameters : any[] +// TODO: handle constructor overloads +// https://github.com/pmndrs/react-three-fiber/pull/2931 +// https://github.com/microsoft/TypeScript/issues/37079 +export type Args = T extends ConstructorRepresentation + ? T extends typeof THREE.Color + ? [r: number, g: number, b: number] | [color: THREE.ColorRepresentation] + : ConstructorParameters + : any[] export interface InstanceProps { args?: Args

diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 3e63321205..86b7ee51b4 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -1,5 +1,5 @@ import type * as THREE from 'three' -import type { EventHandlers, InstanceProps, ConstructorRepresentation } from './core' +import type { Args, EventHandlers, InstanceProps, ConstructorRepresentation } from './core' import type { Mutable, Overwrite } from './core/utils' export { Overwrite } @@ -12,7 +12,7 @@ interface VectorRepresentation extends MathRepresentation { } export type MathType = T extends THREE.Color - ? ConstructorParameters | THREE.ColorRepresentation + ? Args | THREE.ColorRepresentation : T extends VectorRepresentation | THREE.Layers | THREE.Euler ? T | Parameters | number : T | Parameters From f6810761923264051d7317317a39653e36363126 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 4 Sep 2023 04:53:47 -0500 Subject: [PATCH 131/252] chore: resolve conflicts --- packages/fiber/__mocks__/expo-file-system.ts | 1 + packages/fiber/src/native/Canvas.tsx | 1 - packages/fiber/src/web/Canvas.tsx | 2 - packages/fiber/tests/canvas.native.test.tsx | 4 +- yarn.lock | 130 ++++++++++--------- 5 files changed, 72 insertions(+), 66 deletions(-) create mode 100644 packages/fiber/__mocks__/expo-file-system.ts diff --git a/packages/fiber/__mocks__/expo-file-system.ts b/packages/fiber/__mocks__/expo-file-system.ts new file mode 100644 index 0000000000..69229eac07 --- /dev/null +++ b/packages/fiber/__mocks__/expo-file-system.ts @@ -0,0 +1 @@ +export const readAsStringAsync = async () => new Promise((res) => res('')) diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index 7729214a8f..52205aa3e9 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -39,7 +39,6 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( onPointerMissed, onCreated, stages, - scene, ...props }, forwardedRef, diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 93cfda7fe8..3cf09b3cb1 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -59,7 +59,6 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef(func onPointerMissed, onCreated, stages, - scene, ...props }, forwardedRef, @@ -105,7 +104,6 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef(func performance, raycaster, camera, - scene, size: containerRect, // Pass mutable reference to onPointerMissed so it's free to update onPointerMissed: (...args) => handlePointerMissed.current?.(...args), diff --git a/packages/fiber/tests/canvas.native.test.tsx b/packages/fiber/tests/canvas.native.test.tsx index 7df8621494..8ffd1371f3 100644 --- a/packages/fiber/tests/canvas.native.test.tsx +++ b/packages/fiber/tests/canvas.native.test.tsx @@ -16,7 +16,7 @@ describe('native Canvas', () => { expect(renderer.toJSON()).toMatchSnapshot() }) - it('should forward ref', async () => { + it.skip('should forward ref', async () => { const ref = React.createRef() await act(async () => @@ -30,7 +30,7 @@ describe('native Canvas', () => { expect(ref.current).toBeInstanceOf(View) }) - it('should forward context', async () => { + it.skip('should forward context', async () => { const ParentContext = React.createContext(null!) let receivedValue!: boolean diff --git a/yarn.lock b/yarn.lock index c3182c0794..118b3b0457 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1906,14 +1906,14 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@expo/config-plugins@~5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-5.0.0.tgz#19f699aafa5809756b9be055189a14842f8da7ae" - integrity sha512-Bgjgv64f/XqpXXKPAoGhc5dbmuJB8eOBkhV6FMI/RMP06HfL7EQvXgcBBoJThLAZVyd29XikFgaCvABt/NavxQ== - dependencies: - "@expo/config-types" "^46.0.0" - "@expo/json-file" "8.2.36" - "@expo/plist" "0.0.18" +"@expo/config-plugins@~7.2.0": + version "7.2.5" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.2.5.tgz#b15f22878975fdc4ddcfa8cdc971937ddc4c0249" + integrity sha512-w+5ccu1IxBHgyQk9CPFKLZOk8yZQEyTjbJwOzESK1eR7QwosbcsLkN1c1WWUZYiCXwORu3UTwJYll4+X2xxJhQ== + dependencies: + "@expo/config-types" "^49.0.0-alpha.1" + "@expo/json-file" "~8.2.37" + "@expo/plist" "^0.0.20" "@expo/sdk-runtime-versions" "^1.0.0" "@react-native/normalize-color" "^2.0.0" chalk "^4.1.2" @@ -1922,48 +1922,48 @@ getenv "^1.0.0" glob "7.1.6" resolve-from "^5.0.0" - semver "^7.3.5" + semver "^7.5.3" slash "^3.0.0" xcode "^3.0.1" - xml2js "0.4.23" + xml2js "0.6.0" -"@expo/config-types@^46.0.0": - version "46.0.1" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-46.0.1.tgz#ba5d6197222039de13aefdf0171d24b027781cd0" - integrity sha512-LQWGDagQ0YXGSJyLomNDZrYXj/cUP+wczs9y2M8MB9UDoSU6dbLRMiSX0FMhhKKdxBK0p92VQxZyqOzGpIYfSw== +"@expo/config-types@^49.0.0-alpha.1": + version "49.0.0" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-49.0.0.tgz#15ffef715285c06703f6fb7ec0cda853f645cc09" + integrity sha512-8eyREVi+K2acnMBe/rTIu1dOfyR2+AMnTLHlut+YpMV9OZPdeKV0Bs9BxAewGqBA2slslbQ9N39IS2CuTKpXkA== -"@expo/config@~7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-7.0.0.tgz#0289d4cadff48eaed33683384c41ae9a90bb8b00" - integrity sha512-4807iau5gTcCAMUDWxsXfBX4E3embZJREO9c098GiRgAvCBc7PCqdGs9jEAKakCxmPbMGBURL17rKYAsHtZuQw== +"@expo/config@~8.1.0": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.1.2.tgz#7fff28b3acefe39702e9f3ce1c9fd896a52caa80" + integrity sha512-4e7hzPj50mQIlsrzOH6XZ36O094mPfPTIDIH4yv49bWNMc7GFLTofB/lcT+QyxiLaJuC0Wlk9yOLB8DIqmtwug== dependencies: "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "~5.0.0" - "@expo/config-types" "^46.0.0" - "@expo/json-file" "8.2.36" + "@expo/config-plugins" "~7.2.0" + "@expo/config-types" "^49.0.0-alpha.1" + "@expo/json-file" "^8.2.37" getenv "^1.0.0" glob "7.1.6" require-from-string "^2.0.2" resolve-from "^5.0.0" - semver "7.3.2" + semver "7.5.3" slugify "^1.3.4" sucrase "^3.20.0" -"@expo/json-file@8.2.36": - version "8.2.36" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.36.tgz#62a505cb7f30a34d097386476794680a3f7385ff" - integrity sha512-tOZfTiIFA5KmMpdW9KF7bc6CFiGjb0xnbieJhTGlHrLL+ps2G0OkqmuZ3pFEXBOMnJYUVpnSy++52LFxvpa5ZQ== +"@expo/json-file@^8.2.37", "@expo/json-file@~8.2.37": + version "8.2.37" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049" + integrity sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q== dependencies: "@babel/code-frame" "~7.10.4" - json5 "^1.0.1" + json5 "^2.2.2" write-file-atomic "^2.3.0" -"@expo/plist@0.0.18": - version "0.0.18" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.18.tgz#9abcde78df703a88f6d9fa1a557ee2f045d178b0" - integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w== +"@expo/plist@^0.0.20": + version "0.0.20" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.20.tgz#a6b3124438031c02b762bad5a47b70584d3c0072" + integrity sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA== dependencies: - "@xmldom/xmldom" "~0.7.0" + "@xmldom/xmldom" "~0.7.7" base64-js "^1.2.3" xmlbuilder "^14.0.0" @@ -3456,10 +3456,10 @@ resolved "https://registry.yarnpkg.com/@webgpu/glslang/-/glslang-0.0.15.tgz#f5ccaf6015241e6175f4b90906b053f88483d1f2" integrity sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q== -"@xmldom/xmldom@~0.7.0": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d" - integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A== +"@xmldom/xmldom@~0.7.7": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" + integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== abab@^2.0.3, abab@^2.0.5: version "2.0.5" @@ -5454,33 +5454,32 @@ expect@^29.0.0, expect@^29.4.3: jest-message-util "^29.4.3" jest-util "^29.4.3" -expo-asset@~8.6.0: - version "8.6.1" - resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-8.6.1.tgz#86355b3e231e8aa6cf68a456ce9746dff1478b48" - integrity sha512-urbUp1YtwH2J0Qc3inGQJdqTjWKML77SeMNgff+iR9MUE8gDkFqSCDjrBi7i5Oj5DDtq43mmtDg8G8ei6Vchcg== +expo-asset@^8.6.0: + version "8.10.1" + resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-8.10.1.tgz#a7e8cf1c555ab8f844599822cb084fee95a93644" + integrity sha512-5VMTESxgY9GBsspO/esY25SKEa7RyascVkLe/OcL1WgblNFm7xCCEEUIW8VWS1nHJQGYxpMZPr3bEfjMpdWdyA== dependencies: blueimp-md5 "^2.10.0" - expo-constants "~13.2.2" - expo-file-system "~14.1.0" + expo-constants "~14.4.2" + expo-file-system "~15.4.0" invariant "^2.2.4" md5-file "^3.2.3" path-browserify "^1.0.0" url-parse "^1.5.9" -expo-constants@~13.2.2: - version "13.2.3" - resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-13.2.3.tgz#526711851d8ebec1f0b1f06d9b91271b119e4f33" - integrity sha512-2Rrp7GtSTeW7gNz3BsZ+AWMBbBaBnymELuo1ecTQ6fga8F5IRXgj1TW5yFpTmqOTtVfCiQfS0M1QO+JZEatPCQ== +expo-constants@~14.4.2: + version "14.4.2" + resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-14.4.2.tgz#cac5e8b524069545739b8d8595ce96cc5be6578c" + integrity sha512-nOB122DOAjk+KrJT69lFQAoYVQGQjFHSigCPVBzVdko9S1xGsfiOH9+X5dygTsZTIlVLpQJDdmZ7ONiv3i+26w== dependencies: - "@expo/config" "~7.0.0" + "@expo/config" "~8.1.0" uuid "^3.3.2" -expo-file-system@~14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-14.1.0.tgz#4fa410873ef12ac8bec873593f7489f4305a14b8" - integrity sha512-lJcPGQ8yKXVknVkD5TmcJnR/TpQbEL0JP8hknLejfq3FIqPqI/LBFn31YiP37grxW8lITz1al8pq5T6CSUjAzQ== +expo-file-system@^15.4.3, expo-file-system@~15.4.0: + version "15.4.4" + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-15.4.4.tgz#b29e0507b57ee0cc7173cf8844aaf992e411f518" + integrity sha512-F0xS88D85F7qVQ61r0qBnzh6VW/s6iIl+VaQEEi2nAIOQHw1JIEj4yCXPLTtbyn5VmArbe2dSL3KYz1V+BLkKA== dependencies: - "@expo/config-plugins" "~5.0.0" uuid "^3.4.0" expo-gl-cpp@~11.4.0: @@ -5488,7 +5487,7 @@ expo-gl-cpp@~11.4.0: resolved "https://registry.yarnpkg.com/expo-gl-cpp/-/expo-gl-cpp-11.4.0.tgz#62b4b5c61ef065e94aa790a872aad2eee2ae11ea" integrity sha512-vt9QYKX/4TxMaNnbv9ww5KILwyCmg91gqwA/6xuo4MqWxGkZoxy+b8lqsQthuPdn+FHgF0BNcvFW9nbN+JeSRg== -expo-gl@~11.4.0: +expo-gl@^11.4.0: version "11.4.0" resolved "https://registry.yarnpkg.com/expo-gl/-/expo-gl-11.4.0.tgz#0aa6b05908f1a8405f804f3e1a360a215569b9f2" integrity sha512-Q0/4git7mNanxPe4/DMC6dk9F1Xu2ACTmacWdoLjS3NByUzFt25vFtrbf9R3FCgWcBlA9ncfVp1CsYgA4+61Dg== @@ -9593,10 +9592,12 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.7" @@ -9610,6 +9611,13 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -10986,10 +10994,10 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== +xml2js@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" + integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" From 642c0cad369ada9c7ea72438002f20f99d48851c Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 17 Sep 2023 09:04:31 -0500 Subject: [PATCH 132/252] [v9] experiment: extend factory overload (#2785) --- packages/fiber/src/core/events.ts | 3 ++- packages/fiber/src/core/hooks.tsx | 3 +-- .../core/{reconciler.ts => reconciler.tsx} | 22 +++++++++++++++++-- packages/fiber/src/core/renderer.tsx | 4 +--- packages/fiber/src/core/utils.tsx | 5 ----- packages/fiber/src/three-types.ts | 18 ++++++++------- .../tests/__snapshots__/index.test.tsx.snap | 8 +++++++ packages/fiber/tests/renderer.test.tsx | 6 +++++ packages/fiber/tests/utils.test.ts | 19 ++-------------- 9 files changed, 50 insertions(+), 38 deletions(-) rename packages/fiber/src/core/{reconciler.ts => reconciler.tsx} (95%) diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index 7b629655b5..d64a3a4377 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -1,7 +1,8 @@ import * as THREE from 'three' -import { getRootState, type Properties } from './utils' +import { getRootState } from './utils' import type { Instance } from './reconciler' import type { RootState, RootStore } from './store' +import type { Properties } from '../three-types' export interface Intersection extends THREE.Intersection { /** The event source (the object which registered the handler) */ diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index fe77d07e49..ded95df8d6 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -108,8 +108,7 @@ function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressE new Promise>((res, reject) => loader.load( input, - (data) => - res(data?.scene instanceof THREE.Object3D ? Object.assign(data, buildGraph(data.scene)) : data), + (data) => res(data?.scene instanceof THREE.Object3D ? Object.assign(data, buildGraph(data.scene)) : data), onProgress, (error) => reject(new Error(`Could not load ${input}: ${(error as ErrorEvent)?.message}`)), ), diff --git a/packages/fiber/src/core/reconciler.ts b/packages/fiber/src/core/reconciler.tsx similarity index 95% rename from packages/fiber/src/core/reconciler.ts rename to packages/fiber/src/core/reconciler.tsx index 6f92d6e2b1..bffa474edd 100644 --- a/packages/fiber/src/core/reconciler.ts +++ b/packages/fiber/src/core/reconciler.tsx @@ -1,10 +1,12 @@ import * as THREE from 'three' +import * as React from 'react' import Reconciler from 'react-reconciler' import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' import { diffProps, applyProps, invalidateInstance, attach, detach, prepare, globalScope, isObject3D } from './utils' import type { RootStore } from './store' import { removeInteractivity, type EventHandlers } from './events' +import type { ThreeElement } from '../three-types' export interface Root { fiber: Reconciler.FiberRoot @@ -14,7 +16,7 @@ export interface Root { export type AttachFnType = (parent: any, self: O) => () => void export type AttachType = string | AttachFnType -export type ConstructorRepresentation = new (...args: any[]) => any +export type ConstructorRepresentation = new (...args: any[]) => T export interface Catalogue { [name: string]: ConstructorRepresentation @@ -69,7 +71,23 @@ interface HostConfig { } export const catalogue: Catalogue = {} -export const extend = (objects: Partial): void => void Object.assign(catalogue, objects) + +let i = 0 + +export const extend = ( + objects: T, +): T extends ConstructorRepresentation ? React.ExoticComponent> : void => { + if (typeof objects === 'function') { + const Component = `${i++}` + catalogue[Component] = objects + + // Returns a component whose name will be inferred in devtools + // @ts-ignore + return React.forwardRef({ [objects.name]: (props, ref) => }[objects.name]) + } else { + return void Object.assign(catalogue, objects) as any + } +} function createInstance(type: string, props: HostConfig['props'], root: RootStore): HostConfig['instance'] { // Get target from catalogue diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 0844f51a2c..7449240852 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { ConcurrentRoot } from 'react-reconciler/constants' import create from 'zustand' -import { ThreeElement } from '../three-types' +import type { Properties, ThreeElement } from '../three-types' import { Renderer, createStore, @@ -46,8 +46,6 @@ export const _roots = new Map() const shallowLoose = { objects: 'shallow', strict: false } as EquConfig -type Properties = Pick any ? never : K }[keyof T]> - export type GLProps = | Renderer | ((canvas: Canvas) => Renderer) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index e8374f1570..4c44984ae8 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -24,11 +24,6 @@ export type ColorManagementRepresentation = { enabled: boolean | never } | { leg */ export const getColorManagement = (): ColorManagementRepresentation | null => (catalogue as any).ColorManagement ?? null -export type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] -export type Overwrite = Omit> & O -export type Properties = Pick> -export type Mutable

= { [K in keyof P]: P[K] | Readonly } - export type Act = (cb: () => Promise) => Promise /** diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 86b7ee51b4..a276ef1cf3 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -1,13 +1,15 @@ import type * as THREE from 'three' import type { Args, EventHandlers, InstanceProps, ConstructorRepresentation } from './core' -import type { Mutable, Overwrite } from './core/utils' -export { Overwrite } +type NonFunctionKeys

= { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] +export type Overwrite = Omit> & O +export type Properties = Pick> +export type Mutable

= { [K in keyof P]: P[K] | Readonly } -interface MathRepresentation { +export interface MathRepresentation { set(...args: number[]): any } -interface VectorRepresentation extends MathRepresentation { +export interface VectorRepresentation extends MathRepresentation { setScalar(s: number): any } @@ -25,12 +27,12 @@ export type Layers = MathType export type Quaternion = MathType export type Euler = MathType -type WithMathProps

= { [K in keyof P]: P[K] extends MathRepresentation | THREE.Euler ? MathType : P[K] } +export type WithMathProps

= { [K in keyof P]: P[K] extends MathRepresentation | THREE.Euler ? MathType : P[K] } -interface RaycastableRepresentation { +export interface RaycastableRepresentation { raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void } -type EventProps

= P extends RaycastableRepresentation ? Partial : {} +export type EventProps

= P extends RaycastableRepresentation ? Partial : {} export interface ReactProps

{ children?: React.ReactNode @@ -38,7 +40,7 @@ export interface ReactProps

{ key?: React.Key } -type ElementProps> = Partial< +export type ElementProps> = Partial< Overwrite, ReactProps

& EventProps

> > diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 3bd8b54805..ac6e443492 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -17,9 +17,11 @@ Array [ "Disposable", "DomEvent", "Dpr", + "ElementProps", "Euler", "EventHandlers", "EventManager", + "EventProps", "Events", "Extensions", "FilterFunction", @@ -40,12 +42,16 @@ Array [ "Loader", "LoaderProto", "LoaderResult", + "MathRepresentation", "MathType", + "Mutable", "ObjectMap", "Overwrite", "Performance", + "Properties", "Props", "Quaternion", + "RaycastableRepresentation", "ReactProps", "ReactThreeFiber", "ReconcilerRoot", @@ -67,7 +73,9 @@ Array [ "Vector2", "Vector3", "Vector4", + "VectorRepresentation", "Viewport", + "WithMathProps", "XRManager", "_roots", "act", diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index c9ffc7d1b7..c69f55a6ca 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -70,6 +70,12 @@ describe('renderer', () => { expect(scene.children.length).toBe(1) expect(scene.children[0]).toBeInstanceOf(Mock) expect(scene.children[0].name).toBe('mock') + + const Component = extend(THREE.Mesh) + await act(async () => root.render()) + + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBeInstanceOf(THREE.Mesh) }) it('should render primitives', async () => { diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index ccab93967f..d90e23ef2d 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -1,5 +1,5 @@ import * as THREE from 'three' -import { extend, Instance, RootStore, ThreeElement } from '../src' +import { Instance, RootStore } from '../src' import { is, dispose, @@ -15,21 +15,6 @@ import { updateCamera, } from '../src/core/utils' -class TestElement { - public value: string - constructor() { - this.value = 'initial' - } -} - -declare module '@react-three/fiber' { - interface ThreeElements { - testElement: ThreeElement - } -} - -extend({ TestElement }) - // Mocks a Zustand store const storeMock: RootStore = Object.assign(() => null!, { getState: () => null!, @@ -412,7 +397,7 @@ describe('applyProps', () => { }) it('should not apply a prop if it is undefined', async () => { - const target = new TestElement() + const target = { value: 'initial' } applyProps(target, { value: undefined }) expect(target.value).toBe('initial') From 4d59d9cc0635962c799f1b6ed7207b5b6ce73a86 Mon Sep 17 00:00:00 2001 From: Kris Date: Sun, 1 Oct 2023 23:17:26 -0700 Subject: [PATCH 133/252] fix: Function formatting destroying syntax highlighting --- packages/fiber/src/core/utils.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 4c44984ae8..3ff69262fa 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -121,8 +121,9 @@ export function calculateDpr(dpr: Dpr): number { /** * Returns instance root state */ -export const getRootState = (obj: T): RootState | undefined => - (obj as Instance['object']).__r3f?.root.getState() +export function getRootState(obj: T) { + return (obj as Instance['object']).__r3f?.root.getState() +} export interface EquConfig { /** Compare arrays by reference equality a === b (default), or by shallow equality */ From 221ad2da2bbcc303e4ba5b6c448dd636b2ee13bc Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Fri, 6 Oct 2023 05:34:57 -0500 Subject: [PATCH 134/252] fix(applyProps): loosen copy identity in dev Mirrors #3025 --- packages/fiber/src/core/utils.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 3ff69262fa..1330b05741 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -360,6 +360,9 @@ export function diffProps( return changedProps } +type ClassConstructor = { new (): void } +const __DEV__ = typeof process !== 'undefined' && process.env.NODE_ENV !== 'production' + // This function applies a set of changes to the instance export function applyProps(object: Instance['object'], props: Instance['props']): Instance['object'] { const instance = object.__r3f @@ -401,7 +404,16 @@ export function applyProps(object: Instance['object'], props: Instan } // Copy if properties match signatures - if (target?.copy && target?.constructor === (value as ConstructorRepresentation)?.constructor) { + if ( + target?.copy && + // Some environments may break strict identity checks by duplicating versions of three.js. + // Loosen to unminified names, ignoring descendents. + // https://github.com/pmndrs/react-three-fiber/issues/2856 + // TODO: fix upstream and remove in v9 + (__DEV__ + ? target.constructor.name === (value as ClassConstructor).constructor.name + : target.constructor === (value as ClassConstructor).constructor) + ) { target.copy(value) } // Layers have no copy function, we must therefore copy the mask property From 62dec65372eeae21317f3536f758758c9fa05542 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 21 Oct 2023 05:59:00 -0500 Subject: [PATCH 135/252] chore: export buildGraph --- packages/fiber/src/core/index.tsx | 2 +- packages/fiber/tests/__snapshots__/index.test.tsx.snap | 1 + yarn.lock | 10 +++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index 52bba06dbe..e3dc0aeb1f 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -47,4 +47,4 @@ export type { } from './store' export { context } from './store' export type { ObjectMap, Camera, Disposable, Act } from './utils' -export { applyProps, getRootState, dispose, act } from './utils' +export { applyProps, getRootState, dispose, act, buildGraph } from './utils' diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index ac6e443492..3511033bfe 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -84,6 +84,7 @@ Array [ "addTail", "advance", "applyProps", + "buildGraph", "context", "createEvents", "createPortal", diff --git a/yarn.lock b/yarn.lock index 118b3b0457..bb078503e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4138,6 +4138,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" @@ -6121,7 +6129,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== From fccfd06ce7c68ea3ce361330d4af70e22f7ddfc4 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 22 Oct 2023 01:32:51 -0500 Subject: [PATCH 136/252] chore: handle conflicts --- packages/fiber/src/core/renderer.tsx | 4 ++++ packages/fiber/tests/polyfills.test.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 7449240852..628ea67610 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -270,6 +270,10 @@ export function createRoot(canvas: TCanvas): ReconcilerR if (!state.camera && !cameraOptions?.rotation) camera.lookAt(0, 0, 0) } state.set({ camera }) + + // Configure raycaster + // https://github.com/pmndrs/react-xr/issues/300 + raycaster.camera = camera } // Set up scene (one time only!) diff --git a/packages/fiber/tests/polyfills.test.ts b/packages/fiber/tests/polyfills.test.ts index 24c895d343..41921e69dc 100644 --- a/packages/fiber/tests/polyfills.test.ts +++ b/packages/fiber/tests/polyfills.test.ts @@ -1,5 +1,5 @@ import * as THREE from 'three' -import { polyfills } from '../../src/native/polyfills' +import { polyfills } from '../src/native/polyfills' polyfills() From a56b1ab43633e6fd0356039c47da47291a3f3e12 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 26 Oct 2023 02:03:30 -0500 Subject: [PATCH 137/252] refactor(reconciler): remove replace --- packages/fiber/src/core/reconciler.tsx | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index bffa474edd..92055e4e0a 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -114,7 +114,7 @@ function createInstance(type: string, props: HostConfig['props'], root: RootStor // https://github.com/facebook/react/issues/20271 // This will make sure events and attach are only handled once when trees are complete -function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: Instance, replace: boolean = false) { +function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: Instance) { // Bail if tree isn't mounted or parent is not a container. // This ensures that the tree is finalized and React won't discard results to Suspense const state = child.root.getState() @@ -138,9 +138,10 @@ function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: if (child.props.attach) { attach(parent, child) } else if (isObject3D(child.object) && isObject3D(parent.object)) { - if (beforeChild) { + const childIndex = parent.object.children.indexOf(beforeChild?.object) + if (beforeChild && childIndex !== -1) { child.object.parent = parent.object - parent.object.children.splice(parent.object.children.indexOf(beforeChild.object), replace ? 1 : 0, child.object) + parent.object.children.splice(childIndex, 0, child.object) child.object.dispatchEvent({ type: 'added' }) } else { parent.object.add(child.object) @@ -169,18 +170,17 @@ function insertBefore( parent: HostConfig['instance'], child: HostConfig['instance'] | HostConfig['textInstance'], beforeChild: HostConfig['instance'] | HostConfig['textInstance'], - replace: boolean = false, ) { if (!child || !beforeChild) return // Link instances child.parent = parent const childIndex = parent.children.indexOf(beforeChild) - if (childIndex !== -1) parent.children.splice(childIndex, replace ? 1 : 0, child) - if (replace) beforeChild.parent = null + if (childIndex !== -1) parent.children.splice(childIndex, 0, child) + else parent.children.push(child) // Attach tree once complete - handleContainerEffects(parent, child, beforeChild, replace) + handleContainerEffects(parent, child, beforeChild) } function removeChild( @@ -261,11 +261,18 @@ function switchInstance( const parent = oldInstance.parent if (parent) { // Manually handle replace https://github.com/pmndrs/react-three-fiber/pull/2680 - // insertBefore(parent, newInstance, oldInstance, true) + + newInstance.autoRemovedBeforeAppend = !!newInstance.parent if (!oldInstance.autoRemovedBeforeAppend) removeChild(parent, oldInstance) - if (newInstance.parent) newInstance.autoRemovedBeforeAppend = true appendChild(parent, newInstance) + + // if (!oldInstance.autoRemovedBeforeAppend) { + // insertBefore(parent, newInstance, oldInstance) + // removeChild(parent, oldInstance) + // } else { + // appendChild(parent, newInstance) + // } } // This evil hack switches the react-internal fiber node From 2ec2bbc3c1c794886aa502965d60fc2f21693a4d Mon Sep 17 00:00:00 2001 From: Kris Date: Sat, 28 Oct 2023 22:41:52 -0400 Subject: [PATCH 138/252] [fix] Add missing math types --- packages/fiber/src/three-types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index a276ef1cf3..54452cd0e8 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -26,6 +26,8 @@ export type Color = MathType export type Layers = MathType export type Quaternion = MathType export type Euler = MathType +export type Matrix3 = MathType +export type Matrix4 = MathType export type WithMathProps

= { [K in keyof P]: P[K] extends MathRepresentation | THREE.Euler ? MathType : P[K] } From 42ccaeb7be8f1895ed642a9ca1963076559f7a61 Mon Sep 17 00:00:00 2001 From: Kris Date: Sun, 29 Oct 2023 05:35:18 -0400 Subject: [PATCH 139/252] [v9] fix: add missing math types (#3072) --- packages/fiber/src/three-types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index a276ef1cf3..54452cd0e8 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -26,6 +26,8 @@ export type Color = MathType export type Layers = MathType export type Quaternion = MathType export type Euler = MathType +export type Matrix3 = MathType +export type Matrix4 = MathType export type WithMathProps

= { [K in keyof P]: P[K] extends MathRepresentation | THREE.Euler ? MathType : P[K] } From 1dc2b95c2d3b483b38293f5a59ffbc7fe45c3f5c Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 29 Oct 2023 04:37:32 -0500 Subject: [PATCH 140/252] chore: update snapshot --- packages/fiber/tests/__snapshots__/index.test.tsx.snap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 3511033bfe..ee3995d0f8 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -44,6 +44,8 @@ Array [ "LoaderResult", "MathRepresentation", "MathType", + "Matrix3", + "Matrix4", "Mutable", "ObjectMap", "Overwrite", From fa978ba269c0109c0c2adfdc8a57a6525a7f1046 Mon Sep 17 00:00:00 2001 From: Kris Date: Mon, 20 Nov 2023 12:46:23 -0800 Subject: [PATCH 141/252] [fix] Guard against constructing without params in diffProps --- packages/fiber/src/core/utils.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 1330b05741..3fc123c65f 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -342,7 +342,7 @@ export function diffProps( // has no means to do this. Hence we curate a small collection of value-classes // with their respective constructor/set arguments // For removed props, try to set default values, if possible - if (root.constructor) { + if (root.constructor && root.constructor.length === 0) { // create a blank slate of the instance and copy the particular parameter. let ctor = DEFAULTS.get(root.constructor) if (!ctor) { From 6b3e3dc6e83740629da5ffb118fdb863a0ce9bf8 Mon Sep 17 00:00:00 2001 From: Charlie Fuller Date: Mon, 1 Jan 2024 16:15:28 +0000 Subject: [PATCH 142/252] docs: update introduction for three.js r155+ (#3134) --- docs/getting-started/introduction.mdx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx index fe74c119b9..91840f7ba3 100644 --- a/docs/getting-started/introduction.mdx +++ b/docs/getting-started/introduction.mdx @@ -80,8 +80,9 @@ function Box(props) { createRoot(document.getElementById('root')).render( - - + + + , @@ -122,8 +123,9 @@ function Box(props: ThreeElements['mesh']) { createRoot(document.getElementById('root')).render( - - + + + , @@ -165,8 +167,9 @@ function Box(props) { export default function App() { return ( - - + + + From 9d11627416612fa8d3c03b4379fa85dfcc8d5a36 Mon Sep 17 00:00:00 2001 From: Charlie Fuller Date: Mon, 1 Jan 2024 20:20:17 +0000 Subject: [PATCH 143/252] Update readme.md (#3135) --- readme.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 80aed89348..b4618e8841 100644 --- a/readme.md +++ b/readme.md @@ -75,8 +75,9 @@ function Box(props) { createRoot(document.getElementById('root')).render( - - + + + , @@ -117,8 +118,9 @@ function Box(props: ThreeElements['mesh']) { createRoot(document.getElementById('root') as HTMLElement).render( - - + + + , @@ -182,8 +184,9 @@ function Box(props) { export default function App() { return ( - - + + + From e07fccf9bd9c234bdf233420bc3ce3da3a86c3db Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 20 Mar 2024 00:22:37 -0700 Subject: [PATCH 144/252] fix: tests were not extending Three --- packages/fiber/tests/events.test.tsx | 32 ++++++++++++++++---------- packages/fiber/tests/hooks.test.tsx | 2 ++ packages/fiber/tests/index.test.tsx | 3 ++- packages/fiber/tests/renderer.test.tsx | 2 ++ 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/packages/fiber/tests/events.test.tsx b/packages/fiber/tests/events.test.tsx index d0d44afb08..a97515297f 100644 --- a/packages/fiber/tests/events.test.tsx +++ b/packages/fiber/tests/events.test.tsx @@ -1,6 +1,9 @@ import * as React from 'react' import { render, fireEvent, RenderResult } from '@testing-library/react' -import { Canvas, act } from '../src' +import { Canvas, act, extend } from '../src' +import THREE from 'three' + +extend(THREE as any) const getContainer = () => document.querySelector('canvas')?.parentNode?.parentNode as HTMLDivElement @@ -274,11 +277,16 @@ describe('events', () => { const handlePointerLeave = jest.fn() /* This component lets us unmount the event-handling object */ - function PointerCaptureTest(props: { hasMesh: boolean, manualRelease?: boolean }) { + function PointerCaptureTest(props: { hasMesh: boolean; manualRelease?: boolean }) { return ( {props.hasMesh && ( - + @@ -349,9 +357,9 @@ describe('events', () => { /* testing-utils/react's fireEvent wraps the event like React does, so it doesn't match how our event handlers are called in production, so we call dispatchEvent directly. */ await act(async () => canvas.dispatchEvent(moveIn)) - expect(handlePointerEnter).toHaveBeenCalledTimes(1); - expect(handlePointerMove).toHaveBeenCalledTimes(1); - + expect(handlePointerEnter).toHaveBeenCalledTimes(1) + expect(handlePointerMove).toHaveBeenCalledTimes(1) + const down = new PointerEvent('pointerdown', { pointerId }) Object.defineProperty(down, 'offsetX', { get: () => 577 }) Object.defineProperty(down, 'offsetY', { get: () => 480 }) @@ -361,11 +369,11 @@ describe('events', () => { // If we move the pointer now, when it is captured, it should raise the onPointerMove event even though the pointer is not over the element, // and NOT raise the onPointerLeave event. await act(async () => canvas.dispatchEvent(moveOut)) - expect(handlePointerMove).toHaveBeenCalledTimes(2); - expect(handlePointerLeave).not.toHaveBeenCalled(); + expect(handlePointerMove).toHaveBeenCalledTimes(2) + expect(handlePointerLeave).not.toHaveBeenCalled() await act(async () => canvas.dispatchEvent(moveIn)) - expect(handlePointerMove).toHaveBeenCalledTimes(3); + expect(handlePointerMove).toHaveBeenCalledTimes(3) const up = new PointerEvent('pointerup', { pointerId }) Object.defineProperty(up, 'offsetX', { get: () => 577 }) @@ -376,11 +384,11 @@ describe('events', () => { await act(async () => canvas.dispatchEvent(lostpointercapture)) // The pointer is still over the element, so onPointerLeave should not have been called. - expect(handlePointerLeave).not.toHaveBeenCalled(); + expect(handlePointerLeave).not.toHaveBeenCalled() // The element pointer should no longer be captured, so moving it away should call onPointerLeave. - await act(async () => canvas.dispatchEvent(moveOut)); - expect(handlePointerEnter).toHaveBeenCalledTimes(1); + await act(async () => canvas.dispatchEvent(moveOut)) + expect(handlePointerEnter).toHaveBeenCalledTimes(1) expect(handlePointerLeave).toHaveBeenCalledTimes(1) }) }) diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index 37bdd86efb..ffc96dc562 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -14,8 +14,10 @@ import { ObjectMap, useInstanceHandle, Instance, + extend, } from '../src' +extend(THREE as any) const root = createRoot(document.createElement('canvas')) describe('hooks', () => { diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index 54bc65ce1e..3768649f0c 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import * as THREE from 'three' -import * as ts from 'typescript' +import ts from 'typescript' import * as path from 'path' import { ReconcilerRoot, @@ -14,6 +14,7 @@ import { extend, } from '../src/index' +extend(THREE as any) let root: ReconcilerRoot = null! beforeEach(() => (root = createRoot(document.createElement('canvas')))) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index c69f55a6ca..7fd5afd952 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -3,6 +3,8 @@ import * as THREE from 'three' import { ReconcilerRoot, createRoot, act, extend, ThreeElement } from '../src/index' import { suspend } from 'suspend-react' +extend(THREE as any) + class Mock extends THREE.Group { static instances: string[] constructor(name: string = '') { From 037b5f923e53d055ed8765d22dacd63c8511bbfb Mon Sep 17 00:00:00 2001 From: AbsharHassan <95441061+AbsharHassan@users.noreply.github.com> Date: Tue, 2 Jan 2024 13:46:50 +0500 Subject: [PATCH 145/252] fix(RTTR): set initial size for NaN in viewport (#3137) --- .../test-renderer/src/__tests__/RTTR.hooks.test.tsx | 4 ++-- packages/test-renderer/src/index.tsx | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx index d0721d80c8..f96a2f1348 100644 --- a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx @@ -27,12 +27,12 @@ describe('ReactThreeTestRenderer Hooks', () => { return } - await ReactThreeTestRenderer.create() + await ReactThreeTestRenderer.create(, { width: 1280, height: 800 }) expect(result.camera instanceof THREE.Camera).toBeTruthy() expect(result.scene instanceof THREE.Scene).toBeTruthy() expect(result.raycaster instanceof THREE.Raycaster).toBeTruthy() - expect(result.size).toEqual({ height: 0, width: 0, top: 0, left: 0 }) + expect(result.size).toEqual({ height: 800, width: 1280, top: 0, left: 0 }) }) it('can handle useLoader hook', async () => { diff --git a/packages/test-renderer/src/index.tsx b/packages/test-renderer/src/index.tsx index f97761601a..76b2039b0d 100644 --- a/packages/test-renderer/src/index.tsx +++ b/packages/test-renderer/src/index.tsx @@ -19,7 +19,18 @@ extend(THREE as any) const create = async (element: React.ReactNode, options?: Partial): Promise => { const canvas = createCanvas(options) - const _root = createRoot(canvas).configure({ frameloop: 'never', ...options, events: undefined }) + const _root = createRoot(canvas).configure({ + frameloop: 'never', + // TODO: remove and use default behavior + size: { + width: options?.width ?? 1280, + height: options?.height ?? 800, + top: 0, + left: 0, + }, + ...options, + events: undefined, + }) const _store = mockRoots.get(canvas)!.store await act(async () => _root.render(element)) From c4e248e295d67b301152778afd8ef1c9e5519b8c Mon Sep 17 00:00:00 2001 From: Michael Dougall <6801309+itsdouges@users.noreply.github.com> Date: Tue, 2 Jan 2024 20:41:16 +1100 Subject: [PATCH 146/252] chore: add triplex link --- docs/triplex-app.png | Bin 0 -> 458598 bytes readme.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 docs/triplex-app.png diff --git a/docs/triplex-app.png b/docs/triplex-app.png new file mode 100644 index 0000000000000000000000000000000000000000..523c71b78df8d892f7dd2df3ee08a1e8dc716b88 GIT binary patch literal 458598 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 mx@rsV8wISpeDPAe_xu0S-Q^nKfe)Af0000 +> +> Looking for a Unity like editing experience? [Triplex](https://triplex.dev) is a visual editor where your code is the source of truth. + #### Does it have limitations? None. Everything that works in Threejs will work here without exception. From bbf86577ed1ae6d67e33078fdb87f50719b7cdb4 Mon Sep 17 00:00:00 2001 From: Michael Dougall <6801309+itsdouges@users.noreply.github.com> Date: Tue, 2 Jan 2024 20:47:39 +1100 Subject: [PATCH 147/252] chore: update links --- readme.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/readme.md b/readme.md index 4f53d4dee5..612dd30aa1 100644 --- a/readme.md +++ b/readme.md @@ -8,7 +8,7 @@ [![ETH](https://img.shields.io/badge/ETH-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/eth/address/0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682) [![BTC](https://img.shields.io/badge/BTC-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/btc/address/36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH) - + react-three-fiber is a React renderer for threejs. @@ -18,10 +18,14 @@ Build your scene declaratively with re-usable, self-contained components that re npm install three @types/three @react-three/fiber ``` -> +--- + +> > > Looking for a Unity like editing experience? [Triplex](https://triplex.dev) is a visual editor where your code is the source of truth. +--- + #### Does it have limitations? None. Everything that works in Threejs will work here without exception. @@ -221,7 +225,7 @@ Some helpful material: - [Discover Threejs](https://discoverthreejs.com), especially the [Tips and Tricks](https://discoverthreejs.com/tips-and-tricks) chapter for best practices - [Bruno Simons Threejs Jouney](https://threejs-journey.com), arguably the best learning resource, now includes a full [R3F chapter](https://threejs-journey.com/lessons/what-are-react-and-react-three-fiber) - + # Ecosystem @@ -252,7 +256,7 @@ There is a vibrant and extensive eco system around three-fiber, full of librarie - [`maath`](https://github.com/pmndrs/maath) – a kitchen sink for math helpers - [`miniplex`](https://github.com/hmans/miniplex) – ECS (entity management system) - [`composer-suite`](https://github.com/hmans/composer-suite) – composing shaders, particles, effects and game mechanics -- [`triplex`](https://triplex.dev/) – scene editor for react-three-fiber +- [`triplex`](https://triplex.dev/) – visual editor for react-three-fiber - [`koestlich`](https://github.com/coconut-xr/koestlich) – UI component library for react-three-fiber # How to contribute From ebd4220fb3e356954b589d1ec527e4de6fa998a8 Mon Sep 17 00:00:00 2001 From: Michael Dougall <6801309+itsdouges@users.noreply.github.com> Date: Tue, 2 Jan 2024 20:55:44 +1100 Subject: [PATCH 148/252] chore: center align --- readme.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 612dd30aa1..b72395288f 100644 --- a/readme.md +++ b/readme.md @@ -20,9 +20,12 @@ npm install three @types/three @react-three/fiber --- -> -> -> Looking for a Unity like editing experience? [Triplex](https://triplex.dev) is a visual editor where your code is the source of truth. +

--- From 40bfbcb22bc686cc5e6425e7a8e56023504bbd39 Mon Sep 17 00:00:00 2001 From: Michael Dougall <6801309+itsdouges@users.noreply.github.com> Date: Tue, 2 Jan 2024 21:00:21 +1100 Subject: [PATCH 149/252] chore: remove div --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index b72395288f..51e403b897 100644 --- a/readme.md +++ b/readme.md @@ -23,7 +23,7 @@ npm install three @types/three @react-three/fiber From 0b515aa162107e44b3dccc3b617ccbdc51c0ae34 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 2 Jan 2024 04:26:41 -0600 Subject: [PATCH 150/252] fix(native): use MSAA for antialias on iOS (#3139) --- packages/fiber/src/native/Canvas.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index ced3ef12fb..f57a56f0f6 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -67,6 +67,8 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( const viewRef = React.useRef(null!) const root = React.useRef>(null!) + const [antialias, setAntialias] = React.useState(true) + const onLayout = React.useCallback((e: LayoutChangeEvent) => { const { width, height, x, y } = e.nativeEvent.layout setSize({ width, height, top: y, left: x }) @@ -82,7 +84,10 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( addEventListener: (() => {}) as any, removeEventListener: (() => {}) as any, clientHeight: context.drawingBufferHeight, - getContext: (() => context) as any, + getContext: ((_: any, { antialias = false }) => { + setAntialias(antialias) + return context + }) as any, } as HTMLCanvasElement root.current = createRoot(canvasShim) @@ -143,7 +148,9 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( return ( - {width > 0 && } + {width > 0 && ( + + )} ) }, From ed81989172c036cdc910d229597d51af87b6f4bd Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 2 Jan 2024 04:27:21 -0600 Subject: [PATCH 151/252] docs(changeset): fix(native): use MSAA for antialias on iOS --- .changeset/slow-days-relax.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/slow-days-relax.md diff --git a/.changeset/slow-days-relax.md b/.changeset/slow-days-relax.md new file mode 100644 index 0000000000..b5ffb30593 --- /dev/null +++ b/.changeset/slow-days-relax.md @@ -0,0 +1,5 @@ +--- +'@react-three/fiber': patch +--- + +fix(native): use MSAA for antialias on iOS From 03d832a2f2323be64597e84bc3301bc46ffac898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Fri, 12 Jan 2024 22:30:38 +0100 Subject: [PATCH 152/252] fix: portal events, update examples # Conflicts: # example/package.json # packages/fiber/src/core/renderer.ts # packages/fiber/src/core/store.ts # packages/fiber/src/core/utils.ts # yarn.lock --- example/package.json | 33 +- example/src/App.tsx | 2 +- example/src/demos/AutoDispose.tsx | 2 +- example/src/demos/ContextMenuOverride.tsx | 6 +- example/src/demos/Gestures.tsx | 6 +- example/src/demos/Gltf.tsx | 2 +- example/src/demos/MultiView.tsx | 6 +- example/src/demos/Portals.tsx | 6 +- example/src/demos/ResetProps.tsx | 6 +- example/src/demos/StopPropagation.tsx | 4 +- example/src/demos/SuspenseAndErrors.tsx | 4 +- example/src/demos/SuspenseMaterial.tsx | 2 +- example/src/demos/Test.tsx | 55 +- example/src/demos/ViewTracking.tsx | 6 +- example/src/demos/Viewcube.tsx | 4 +- packages/fiber/src/core/store.ts | 2 +- yarn.lock | 11164 -------------------- 17 files changed, 79 insertions(+), 11231 deletions(-) delete mode 100644 yarn.lock diff --git a/example/package.json b/example/package.json index 7ad7448bf5..b99c1f235f 100644 --- a/example/package.json +++ b/example/package.json @@ -7,26 +7,27 @@ "serve": "vite preview" }, "dependencies": { - "@react-spring/core": "^9.6.1", - "@react-spring/three": "^9.6.1", - "@react-three/drei": "^9.74.7", + "@react-spring/core": "^9.7.3", + "@react-spring/three": "^9.7.3", + "@react-three/drei": "^9.93.0", "@use-gesture/react": "latest", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "react-merge-refs": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-merge-refs": "^2.1.1", "react-use-refs": "^1.0.1", - "styled-components": "^5.3.5", - "three": "^0.141.0", - "three-stdlib": "^2.13.0", + "styled-components": "^6.1.8", + "three": "^0.160.0", + "three-stdlib": "^2.29.1", "use-error-boundary": "^2.0.6", - "wouter": "^2.8.0-alpha.2", - "zustand": "^3.7.1" + "wouter": "^2.12.1", + "zustand": "^4.4.7" }, "devDependencies": { - "@types/react": "^18.0.0", - "@types/styled-components": "^5.1.24", - "@vitejs/plugin-react": "^2.0.1", - "typescript": "^4.6.3", - "vite": "^3.0.7" + "@types/react": "^18.2.47", + "@types/styled-components": "^5.1.34", + "@vitejs/plugin-react-refresh": "^1.3.6", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.3.3", + "vite": "^5.0.11" } } diff --git a/example/src/App.tsx b/example/src/App.tsx index ea82527361..e70dc1a95d 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -20,7 +20,7 @@ function Demo() { const { Component } = visibleComponents[compName] return ( - {e}}> + {e.message}}> ) diff --git a/example/src/demos/AutoDispose.tsx b/example/src/demos/AutoDispose.tsx index eaa6ad8709..1c6c1fbf7c 100644 --- a/example/src/demos/AutoDispose.tsx +++ b/example/src/demos/AutoDispose.tsx @@ -51,7 +51,7 @@ function Switcher() { export default function App() { return ( - + ) diff --git a/example/src/demos/ContextMenuOverride.tsx b/example/src/demos/ContextMenuOverride.tsx index f0445b0ac1..202305b67a 100644 --- a/example/src/demos/ContextMenuOverride.tsx +++ b/example/src/demos/ContextMenuOverride.tsx @@ -9,8 +9,8 @@ export default function App() { orthographic camera={{ zoom: 150, fov: 75, position: [0, 0, 25] }} onPointerMissed={() => console.log('canvas.missed')}> - - + + !value) }} onPointerMissed={() => console.log('mesh.missed')}> - +
diff --git a/example/src/demos/Gestures.tsx b/example/src/demos/Gestures.tsx index ac5af5e222..c24736e9cf 100644 --- a/example/src/demos/Gestures.tsx +++ b/example/src/demos/Gestures.tsx @@ -46,9 +46,9 @@ function Obj({ scale = 1, z = 0, opacity = 1 }) { export default function App() { return ( - - - + + + diff --git a/example/src/demos/Gltf.tsx b/example/src/demos/Gltf.tsx index fe5f4bf16d..6f0394e75e 100644 --- a/example/src/demos/Gltf.tsx +++ b/example/src/demos/Gltf.tsx @@ -15,7 +15,7 @@ function Test() { export default function App() { return ( - + diff --git a/example/src/demos/MultiView.tsx b/example/src/demos/MultiView.tsx index a91f9fbd9e..669545ee2c 100644 --- a/example/src/demos/MultiView.tsx +++ b/example/src/demos/MultiView.tsx @@ -149,9 +149,9 @@ const App = () => ( function Scene({ children, controls = true, preset }: any) { return ( - - - + + + diff --git a/example/src/demos/Portals.tsx b/example/src/demos/Portals.tsx index 24b2922f1c..ddab34803c 100644 --- a/example/src/demos/Portals.tsx +++ b/example/src/demos/Portals.tsx @@ -8,9 +8,9 @@ export function Lights() { return ( <> - - - + + + ) } diff --git a/example/src/demos/ResetProps.tsx b/example/src/demos/ResetProps.tsx index 9d173c1d4f..f3e71f5914 100644 --- a/example/src/demos/ResetProps.tsx +++ b/example/src/demos/ResetProps.tsx @@ -50,9 +50,9 @@ function Scene() { return ( <> - - - + + + ( - - + + diff --git a/example/src/demos/SuspenseAndErrors.tsx b/example/src/demos/SuspenseAndErrors.tsx index 89244ca1ed..98bec1ac6d 100644 --- a/example/src/demos/SuspenseAndErrors.tsx +++ b/example/src/demos/SuspenseAndErrors.tsx @@ -24,8 +24,8 @@ export default function App() { }, []) return ( - - + + diff --git a/example/src/demos/SuspenseMaterial.tsx b/example/src/demos/SuspenseMaterial.tsx index dc81992be2..ff3a114273 100644 --- a/example/src/demos/SuspenseMaterial.tsx +++ b/example/src/demos/SuspenseMaterial.tsx @@ -7,7 +7,7 @@ export default function App() { const [arg, inc] = useReducer((x) => x + 1, 0) return ( - + diff --git a/example/src/demos/Test.tsx b/example/src/demos/Test.tsx index 73f440ba73..a3daefdf60 100644 --- a/example/src/demos/Test.tsx +++ b/example/src/demos/Test.tsx @@ -1,35 +1,46 @@ import * as THREE from 'three' -import React, { useState, useEffect, useReducer } from 'react' +import * as React from 'react' import { Canvas, useFrame } from '@react-three/fiber' +import { OrbitControls, Hud } from '@react-three/drei' -function Test() { - const [o1] = useState( - () => new THREE.Mesh(new THREE.BoxGeometry(), new THREE.MeshBasicMaterial({ color: 'hotpink' })), - ) - const [o2] = useState( - () => new THREE.Mesh(new THREE.BoxGeometry(), new THREE.MeshBasicMaterial({ color: 'aquamarine' })), +function Box({ color = 'orange', ...props }) { + const ref = React.useRef(null!) + const [hovered, hover] = React.useState(false) + const [clicked, click] = React.useState(false) + useFrame((state, delta) => (ref.current.rotation.x += delta)) + return ( + click(!clicked)} + onPointerOver={(event) => (event.stopPropagation(), hover(true))} + onPointerOut={() => hover(false)}> + + + ) - const [which, toggle] = useReducer((state) => !state, true) - useEffect(() => { - const interval = setInterval(toggle, 1000) - return () => clearInterval(interval) - }, []) - - useFrame((state) => { - //console.log(state.pointer.x) - }) - - return } export default function App() { - const [foo, bar] = useState(0) - useEffect(() => { - setTimeout(() => bar(1), 1000) + const [visible, set] = React.useState(true) + React.useEffect(() => { + setTimeout(() => set(false), 2000) + setTimeout(() => set(true), 4000) }, []) return ( - + + + + + + + + + {visible && } + + ) } diff --git a/example/src/demos/ViewTracking.tsx b/example/src/demos/ViewTracking.tsx index 568b5e666f..4710de9eca 100644 --- a/example/src/demos/ViewTracking.tsx +++ b/example/src/demos/ViewTracking.tsx @@ -238,9 +238,9 @@ export default function App() { function Scene() { return ( <> - - - + + + ) diff --git a/example/src/demos/Viewcube.tsx b/example/src/demos/Viewcube.tsx index e7346dd422..d0e242acbf 100644 --- a/example/src/demos/Viewcube.tsx +++ b/example/src/demos/Viewcube.tsx @@ -49,8 +49,8 @@ function Viewcube() { ))} - - + +
, scene, { camera, events: { priority: events.priority + 1 } }, diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 0ac4caae73..2748558fe9 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -148,7 +148,7 @@ export interface RootState { setFrameloop: (frameloop: Frameloop) => void /** When the canvas was clicked but nothing was hit */ onPointerMissed?: (event: MouseEvent) => void - /** If this state model is layerd (via createPortal) then this contains the previous layer */ + /** If this state model is layered (via createPortal) then this contains the previous layer */ previousRoot?: RootStore /** Internals */ internal: InternalState diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index f935b3cc1a..0000000000 --- a/yarn.lock +++ /dev/null @@ -1,11164 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.0" - -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@~7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" - integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== - -"@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== - -"@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@7.17.8": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" - integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.7" - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.8" - "@babel/parser" "^7.17.8" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.7.2", "@babel/core@^7.7.7", "@babel/core@^7.8.0": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" - integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.9" - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.9" - "@babel/parser" "^7.17.9" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/core@^7.11.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" - integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.0" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.0" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/core@^7.13.16", "@babel/core@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" - integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.10" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" - "@babel/types" "^7.18.10" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.14.0", "@babel/generator@^7.17.7", "@babel/generator@^7.17.9", "@babel/generator@^7.7.2": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" - integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a" - integrity sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA== - dependencies: - "@babel/types" "^7.18.10" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== - dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" - integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" - integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" - integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" - integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" - integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" - integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-module-transforms@^7.21.0": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-replace-supers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" - integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-simple-access@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" - integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helper-wrap-function@^7.18.9": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz#a7fcd3ab9b1be4c9b52cf7d7fdc1e88c2ce93396" - integrity sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ== - dependencies: - "@babel/helper-function-name" "^7.18.9" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/helpers@^7.17.8", "@babel/helpers@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" - integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" - -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.16.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" - integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.8", "@babel/parser@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" - integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== - -"@babel/parser@^7.13.16", "@babel/parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.10.tgz#94b5f8522356e69e8277276adf67ed280c90ecc1" - integrity sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg== - -"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - -"@babel/plugin-proposal-async-generator-functions@^7.0.0": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952" - integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-class-properties@^7.13.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" - integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.6" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz#a40ab158ca55627b71c5513f03d3469026a9e929" - integrity sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-default-from" "^7.16.7" - -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" - integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== - dependencies: - "@babel/compat-data" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.13.12": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz#fa89cf13b60de2c3f79acdc2b52a21174c6de060" - integrity sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.16.7", "@babel/plugin-syntax-flow@^7.2.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" - integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-flow@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" - integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.16.7", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.16.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" - integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" - integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-flow" "^7.16.7" - -"@babel/plugin-transform-flow-strip-types@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz#5b4cc521426263b5ce08893a2db41097ceba35bf" - integrity sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-flow" "^7.18.6" - -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== - dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.7.5": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" - integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== - dependencies: - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.13.8": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" - integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== - dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" - integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.16.7.tgz#f432ad0cba14c4a1faf44f0076c69e42a4d4479e" - integrity sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-self@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" - integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz#1879c3f23629d287cc6186a6c683154509ec70c0" - integrity sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-source@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz#06e9ae8a14d2bc19ce6e3c447d842032a50598fc" - integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" - integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" - integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.18.10" - -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" - integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== - dependencies: - regenerator-transform "^0.15.0" - -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-runtime@^7.0.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" - integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-typescript@^7.16.7", "@babel/plugin-transform-typescript@^7.5.0": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" - integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" - -"@babel/plugin-transform-typescript@^7.18.6": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.10.tgz#b23401b32f1f079396bcaed01667a54ebe4f9f85" - integrity sha512-j2HQCJuMbi88QftIb5zlRu3c7PU+sXNnscqsrjqegoGiCgXR569pEdben9vly5QHKL2ilYkfnSwu64zsZo/VYQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-typescript" "^7.18.6" - -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/preset-env@7.16.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - -"@babel/preset-flow@^7.13.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb" - integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-flow-strip-types" "^7.18.6" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" - -"@babel/preset-typescript@^7.13.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" - -"@babel/preset-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" - integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.16.7" - -"@babel/register@^7.13.16": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" - integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.5" - source-map-support "^0.5.16" - -"@babel/runtime@^7.0.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.17.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" - integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.0.0", "@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/template@^7.18.10", "@babel/template@^7.18.6": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" - integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.9" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.9" - "@babel/types" "^7.17.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.10.tgz#37ad97d1cb00efa869b91dd5d1950f8a6cf0cb08" - integrity sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.10" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" - integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@changesets/apply-release-plan@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-6.0.0.tgz#6c663ff99d919bba3902343d76c35cbbbb046520" - integrity sha512-gp6nIdVdfYdwKww2+f8whckKmvfE4JEm4jJgBhTmooi0uzHWhnxvk6JIzQi89qEAMINN0SeVNnXiAtbFY0Mj3w== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/config" "^2.0.0" - "@changesets/get-version-range-type" "^0.3.2" - "@changesets/git" "^1.3.2" - "@changesets/types" "^5.0.0" - "@manypkg/get-packages" "^1.1.3" - detect-indent "^6.0.0" - fs-extra "^7.0.1" - lodash.startcase "^4.4.0" - outdent "^0.5.0" - prettier "^1.19.1" - resolve-from "^5.0.0" - semver "^5.4.1" - -"@changesets/assemble-release-plan@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-5.1.2.tgz#63ed3a00f62b5af08a82e83801a252ac9726c625" - integrity sha512-nOFyDw4APSkY/vh5WNwGEtThPgEjVShp03PKVdId6wZTJALVcAALCSLmDRfeqjE2z9EsGJb7hZdDlziKlnqZgw== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/errors" "^0.1.4" - "@changesets/get-dependents-graph" "^1.3.2" - "@changesets/types" "^5.0.0" - "@manypkg/get-packages" "^1.1.3" - semver "^5.4.1" - -"@changesets/changelog-git@^0.1.11": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.1.11.tgz#80eb45d3562aba2164f25ccc31ac97b9dcd1ded3" - integrity sha512-sWJvAm+raRPeES9usNpZRkooeEB93lOpUN0Lmjz5vhVAb7XGIZrHEJ93155bpE1S0c4oJ5Di9ZWgzIwqhWP/Wg== - dependencies: - "@changesets/types" "^5.0.0" - -"@changesets/cli@^2.22.0": - version "2.22.0" - resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.22.0.tgz#3bdbfb4a7a81ef37f63114e77da84e23f906b763" - integrity sha512-4bA3YoBkd5cm5WUxmrR2N9WYE7EeQcM+R3bVYMUj2NvffkQVpU3ckAI+z8UICoojq+HRl2OEwtz+S5UBmYY4zw== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/apply-release-plan" "^6.0.0" - "@changesets/assemble-release-plan" "^5.1.2" - "@changesets/changelog-git" "^0.1.11" - "@changesets/config" "^2.0.0" - "@changesets/errors" "^0.1.4" - "@changesets/get-dependents-graph" "^1.3.2" - "@changesets/get-release-plan" "^3.0.8" - "@changesets/git" "^1.3.2" - "@changesets/logger" "^0.0.5" - "@changesets/pre" "^1.0.11" - "@changesets/read" "^0.5.5" - "@changesets/types" "^5.0.0" - "@changesets/write" "^0.1.8" - "@manypkg/get-packages" "^1.1.3" - "@types/is-ci" "^3.0.0" - "@types/semver" "^6.0.0" - chalk "^2.1.0" - enquirer "^2.3.0" - external-editor "^3.1.0" - fs-extra "^7.0.1" - human-id "^1.0.2" - is-ci "^3.0.1" - meow "^6.0.0" - outdent "^0.5.0" - p-limit "^2.2.0" - preferred-pm "^3.0.0" - resolve-from "^5.0.0" - semver "^5.4.1" - spawndamnit "^2.0.0" - term-size "^2.1.0" - tty-table "^2.8.10" - -"@changesets/config@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@changesets/config/-/config-2.0.0.tgz#1770fdfeba2155cf07154c37e96b55cbd27969f0" - integrity sha512-r5bIFY6CN3K6SQ+HZbjyE3HXrBIopONR47mmX7zUbORlybQXtympq9rVAOzc0Oflbap8QeIexc+hikfZoREXDg== - dependencies: - "@changesets/errors" "^0.1.4" - "@changesets/get-dependents-graph" "^1.3.2" - "@changesets/logger" "^0.0.5" - "@changesets/types" "^5.0.0" - "@manypkg/get-packages" "^1.1.3" - fs-extra "^7.0.1" - micromatch "^4.0.2" - -"@changesets/errors@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.1.4.tgz#f79851746c43679a66b383fdff4c012f480f480d" - integrity sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q== - dependencies: - extendable-error "^0.1.5" - -"@changesets/get-dependents-graph@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.2.tgz#f3ec7ce75f4afb6e3e4b6a87fde065f552c85998" - integrity sha512-tsqA6qZRB86SQuApSoDvI8yEWdyIlo/WLI4NUEdhhxLMJ0dapdeT6rUZRgSZzK1X2nv5YwR0MxQBbDAiDibKrg== - dependencies: - "@changesets/types" "^5.0.0" - "@manypkg/get-packages" "^1.1.3" - chalk "^2.1.0" - fs-extra "^7.0.1" - semver "^5.4.1" - -"@changesets/get-release-plan@^3.0.8": - version "3.0.8" - resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-3.0.8.tgz#2ac7c4f7903aedede3d27af66311ad1db7937e5d" - integrity sha512-TJYiWNuP0Lzu2dL/KHuk75w7TkiE5HqoYirrXF7SJIxkhlgH9toQf2C7IapiFTObtuF1qDN8HJAX1CuIOwXldg== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/assemble-release-plan" "^5.1.2" - "@changesets/config" "^2.0.0" - "@changesets/pre" "^1.0.11" - "@changesets/read" "^0.5.5" - "@changesets/types" "^5.0.0" - "@manypkg/get-packages" "^1.1.3" - -"@changesets/get-version-range-type@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz#8131a99035edd11aa7a44c341cbb05e668618c67" - integrity sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg== - -"@changesets/git@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@changesets/git/-/git-1.3.2.tgz#336051d9a6d965806b1bc473559a9a2cc70773a6" - integrity sha512-p5UL+urAg0Nnpt70DLiBe2iSsMcDubTo9fTOD/61krmcJ466MGh71OHwdAwu1xG5+NKzeysdy1joRTg8CXcEXA== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/errors" "^0.1.4" - "@changesets/types" "^5.0.0" - "@manypkg/get-packages" "^1.1.3" - is-subdir "^1.1.1" - spawndamnit "^2.0.0" - -"@changesets/logger@^0.0.5": - version "0.0.5" - resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.0.5.tgz#68305dd5a643e336be16a2369cb17cdd8ed37d4c" - integrity sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw== - dependencies: - chalk "^2.1.0" - -"@changesets/parse@^0.3.13": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.3.13.tgz#82788c1fc18da4750b07357a7a06142d0d975aa1" - integrity sha512-wh9Ifa0dungY6d2nMz6XxF6FZ/1I7j+mEgPAqrIyKS64nifTh1Ua82qKKMMK05CL7i4wiB2NYc3SfnnCX3RVeA== - dependencies: - "@changesets/types" "^5.0.0" - js-yaml "^3.13.1" - -"@changesets/pre@^1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-1.0.11.tgz#46a56790fdceabd03407559bbf91340c8e83fb6a" - integrity sha512-CXZnt4SV9waaC9cPLm7818+SxvLKIDHUxaiTXnJYDp1c56xIexx1BNfC1yMuOdzO2a3rAIcZua5Odxr3dwSKfg== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/errors" "^0.1.4" - "@changesets/types" "^5.0.0" - "@manypkg/get-packages" "^1.1.3" - fs-extra "^7.0.1" - -"@changesets/read@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.5.5.tgz#9ed90ef3e9f1ba3436ba5580201854a3f4163058" - integrity sha512-bzonrPWc29Tsjvgh+8CqJ0apQOwWim0zheeD4ZK44ApSa/GudnZJTODtA3yNOOuQzeZmL0NUebVoHIurtIkA7w== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/git" "^1.3.2" - "@changesets/logger" "^0.0.5" - "@changesets/parse" "^0.3.13" - "@changesets/types" "^5.0.0" - chalk "^2.1.0" - fs-extra "^7.0.1" - p-filter "^2.1.0" - -"@changesets/types@^4.0.1": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" - integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== - -"@changesets/types@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@changesets/types/-/types-5.0.0.tgz#d5eb52d074bc0358ce47d54bca54370b907812a0" - integrity sha512-IT1kBLSbAgTS4WtpU6P5ko054hq12vk4tgeIFRVE7Vnm4a/wgbNvBalgiKP0MjEXbCkZbItiGQHkCGxYWR55sA== - -"@changesets/write@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.1.8.tgz#feed408f644c496bc52afc4dd1353670b4152ecb" - integrity sha512-oIHeFVMuP6jf0TPnKPpaFpvvAf3JBc+s2pmVChbeEgQTBTALoF51Z9kqxQfG4XONZPHZnqkmy564c7qohhhhTQ== - dependencies: - "@babel/runtime" "^7.10.4" - "@changesets/types" "^5.0.0" - fs-extra "^7.0.1" - human-id "^1.0.2" - prettier "^1.19.1" - -"@chevrotain/cst-dts-gen@^10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.1.2.tgz#4ee6eff237bb47f4990cfb76c18ee2e71237929c" - integrity sha512-E/XrL0QlzExycPzwhOEZGVOheJ/Clr5uNv3oCds88MiNqEmg3UU1iauZk7DhjsUo3jgEW4lf0I5HRl7/HC5ZkQ== - dependencies: - "@chevrotain/gast" "^10.1.2" - "@chevrotain/types" "^10.1.2" - lodash "4.17.21" - -"@chevrotain/gast@^10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@chevrotain/gast/-/gast-10.1.2.tgz#91d5b342480d7532118a6cf3958955f86c9cc03e" - integrity sha512-er+TcxUOMuGOPoiOq8CJsRm92zGE4YPIYtyxJfxoVwVgtj4AMrPNCmrHvYaK/bsbt2DaDuFdcbbAfM9bcBXW6Q== - dependencies: - "@chevrotain/types" "^10.1.2" - lodash "4.17.21" - -"@chevrotain/types@^10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-10.1.2.tgz#f4caa373b1cd14d13ecb61c77dfee2456eef1ab3" - integrity sha512-4qF9SmmWKv8AIG/3d+71VFuqLumNCQTP5GoL0CW6x7Ay2OdXm6FUgWFLTMneGUjYUk2C+MSCf7etQfdq3LEr1A== - -"@chevrotain/utils@^10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-10.1.2.tgz#d2fb7b968141139e5c2419553e5295382c265e7d" - integrity sha512-bbZIpW6fdyf7FMaeDmw3cBbkTqsecxEkwlVKgVfqqXWBPLH6azxhPA2V9F7OhoZSVrsnMYw7QuyK6qutXPjEew== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@emotion/is-prop-valid@^1.1.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" - integrity sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ== - dependencies: - "@emotion/memoize" "^0.7.4" - -"@emotion/memoize@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== - -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@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== - -"@eslint/eslintrc@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" - integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.3.1" - globals "^13.9.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@expo/config-plugins@~7.2.0": - version "7.2.5" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.2.5.tgz#b15f22878975fdc4ddcfa8cdc971937ddc4c0249" - integrity sha512-w+5ccu1IxBHgyQk9CPFKLZOk8yZQEyTjbJwOzESK1eR7QwosbcsLkN1c1WWUZYiCXwORu3UTwJYll4+X2xxJhQ== - dependencies: - "@expo/config-types" "^49.0.0-alpha.1" - "@expo/json-file" "~8.2.37" - "@expo/plist" "^0.0.20" - "@expo/sdk-runtime-versions" "^1.0.0" - "@react-native/normalize-color" "^2.0.0" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.5.3" - slash "^3.0.0" - xcode "^3.0.1" - xml2js "0.6.0" - -"@expo/config-types@^49.0.0-alpha.1": - version "49.0.0" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-49.0.0.tgz#15ffef715285c06703f6fb7ec0cda853f645cc09" - integrity sha512-8eyREVi+K2acnMBe/rTIu1dOfyR2+AMnTLHlut+YpMV9OZPdeKV0Bs9BxAewGqBA2slslbQ9N39IS2CuTKpXkA== - -"@expo/config@~8.1.0": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.1.2.tgz#7fff28b3acefe39702e9f3ce1c9fd896a52caa80" - integrity sha512-4e7hzPj50mQIlsrzOH6XZ36O094mPfPTIDIH4yv49bWNMc7GFLTofB/lcT+QyxiLaJuC0Wlk9yOLB8DIqmtwug== - dependencies: - "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "~7.2.0" - "@expo/config-types" "^49.0.0-alpha.1" - "@expo/json-file" "^8.2.37" - getenv "^1.0.0" - glob "7.1.6" - require-from-string "^2.0.2" - resolve-from "^5.0.0" - semver "7.5.3" - slugify "^1.3.4" - sucrase "^3.20.0" - -"@expo/json-file@^8.2.37", "@expo/json-file@~8.2.37": - version "8.2.37" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049" - integrity sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q== - dependencies: - "@babel/code-frame" "~7.10.4" - json5 "^2.2.2" - write-file-atomic "^2.3.0" - -"@expo/plist@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.20.tgz#a6b3124438031c02b762bad5a47b70584d3c0072" - integrity sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA== - dependencies: - "@xmldom/xmldom" "~0.7.7" - base64-js "^1.2.3" - xmlbuilder "^14.0.0" - -"@expo/sdk-runtime-versions@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" - integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== - -"@hapi/hoek@^9.0.0": - version "9.2.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" - integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@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" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/console@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.3.tgz#1f25a99f7f860e4c46423b5b1038262466fadde1" - integrity sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A== - dependencies: - "@jest/types" "^29.4.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.4.3" - jest-util "^29.4.3" - slash "^3.0.0" - -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/core@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.3.tgz#829dd65bffdb490de5b0f69e97de8e3b5eadd94b" - integrity sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ== - dependencies: - "@jest/console" "^29.4.3" - "@jest/reporters" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.4.3" - jest-config "^29.4.3" - jest-haste-map "^29.4.3" - jest-message-util "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-resolve-dependencies "^29.4.3" - jest-runner "^29.4.3" - jest-runtime "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" - jest-watcher "^29.4.3" - micromatch "^4.0.4" - pretty-format "^29.4.3" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/create-cache-key-function@^27.0.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" - integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== - dependencies: - "@jest/types" "^27.5.1" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/environment@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.3.tgz#9fe2f3169c3b33815dc4bd3960a064a83eba6548" - integrity sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA== - dependencies: - "@jest/fake-timers" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/node" "*" - jest-mock "^29.4.3" - -"@jest/expect-utils@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.3.tgz#95ce4df62952f071bcd618225ac7c47eaa81431e" - integrity sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.3.tgz#d31a28492e45a6bcd0f204a81f783fe717045c6e" - integrity sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ== - dependencies: - expect "^29.4.3" - jest-snapshot "^29.4.3" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/fake-timers@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.3.tgz#31e982638c60fa657d310d4b9d24e023064027b0" - integrity sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw== - dependencies: - "@jest/types" "^29.4.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.4.3" - jest-mock "^29.4.3" - jest-util "^29.4.3" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/globals@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.3.tgz#63a2c4200d11bc6d46f12bbe25b07f771fce9279" - integrity sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA== - dependencies: - "@jest/environment" "^29.4.3" - "@jest/expect" "^29.4.3" - "@jest/types" "^29.4.3" - jest-mock "^29.4.3" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/reporters@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.3.tgz#0a68a0c0f20554760cc2e5443177a0018969e353" - integrity sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" - jest-worker "^29.4.3" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.3.tgz#e13d973d16c8c7cc0c597082d5f3b9e7f796ccb8" - integrity sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA== - dependencies: - "@jest/console" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/test-sequencer@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz#0862e876a22993385a0f3e7ea1cc126f208a2898" - integrity sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw== - dependencies: - "@jest/test-result" "^29.4.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" - slash "^3.0.0" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/transform@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.3.tgz#f7d17eac9cb5bb2e1222ea199c7c7e0835e0c037" - integrity sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.4.3" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" - jest-regex-util "^29.4.3" - jest-util "^29.4.3" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.3.tgz#9069145f4ef09adf10cec1b2901b2d390031431f" - integrity sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" - integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@manypkg/find-root@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" - integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== - dependencies: - "@babel/runtime" "^7.5.5" - "@types/node" "^12.7.1" - find-up "^4.1.0" - fs-extra "^8.1.0" - -"@manypkg/get-packages@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" - integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== - dependencies: - "@babel/runtime" "^7.5.5" - "@changesets/types" "^4.0.1" - "@manypkg/find-root" "^1.1.0" - fs-extra "^8.1.0" - globby "^11.0.0" - read-yaml-file "^1.1.0" - -"@mediapipe/tasks-vision@^0.10.0": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@mediapipe/tasks-vision/-/tasks-vision-0.10.1.tgz#68047459352019cc141dc9c1d15c05b8ab689423" - integrity sha512-/zIKjOAIABx+KVfqe8hA6X2pxBGsBYlEtvD7/gpXecvzKefo/JQO6XaggmJul7+noaqiPYM0CVGZxmFJ2oTdSQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@preconstruct/cli@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@preconstruct/cli/-/cli-2.1.5.tgz#f7f6d06809f382521589af15f67b87009b240c58" - integrity sha512-bMnGTkaotxq+xoOkXoUOfTFvxBX/ZUxukcacf3mx3G7Iz5m/T4ZGzSOU12pxl64e+rVWGTKlUsgaDSgyFkup0A== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/core" "^7.7.7" - "@babel/helper-module-imports" "^7.10.4" - "@babel/runtime" "^7.7.7" - "@preconstruct/hook" "^0.4.0" - "@rollup/plugin-alias" "^3.1.1" - "@rollup/plugin-commonjs" "^15.0.0" - "@rollup/plugin-json" "^4.1.0" - "@rollup/plugin-node-resolve" "^9.0.0" - "@rollup/plugin-replace" "^2.4.1" - builtin-modules "^3.1.0" - chalk "^4.1.0" - dataloader "^2.0.0" - detect-indent "^6.0.0" - enquirer "^2.3.6" - estree-walker "^2.0.1" - fast-deep-equal "^2.0.1" - fast-glob "^3.2.4" - fs-extra "^9.0.1" - is-ci "^2.0.0" - is-reference "^1.2.1" - jest-worker "^26.3.0" - magic-string "^0.25.7" - meow "^7.1.0" - ms "^2.1.2" - normalize-path "^3.0.0" - npm-packlist "^2.1.2" - p-limit "^3.0.2" - parse-glob "^3.0.4" - parse-json "^5.1.0" - quick-lru "^5.1.1" - resolve "^1.17.0" - resolve-from "^5.0.0" - rollup "^2.32.0" - semver "^7.3.4" - terser "^5.2.1" - v8-compile-cache "^2.1.1" - -"@preconstruct/hook@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@preconstruct/hook/-/hook-0.4.0.tgz#c15dfacfc6e60652a6837209c2fd87f0240b099e" - integrity sha512-a7mrlPTM3tAFJyz43qb4pPVpUx8j8TzZBFsNFqcKcE/sEakNXRlQAuCT4RGZRf9dQiiUnBahzSIWawU4rENl+Q== - dependencies: - "@babel/core" "^7.7.7" - "@babel/plugin-transform-modules-commonjs" "^7.7.5" - pirates "^4.0.1" - source-map-support "^0.5.16" - -"@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" - integrity sha512-IwS1M1NHg6+qL8PThZYMSIMYbZ6Zbx+lIck9PLBskbosFo24M3lCOflOl++Bggjakp6mR+sRXxLMexid/GeOsQ== - dependencies: - "@react-native-community/cli-tools" "^8.0.4" - chalk "^4.1.2" - execa "^1.0.0" - prompts "^2.4.0" - -"@react-native-community/cli-config@^8.0.4": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-8.0.4.tgz#40e9e4e12ba70a6e12d1e777373af6fa1ac2e4e6" - integrity sha512-0vcrIETka1Tr0blr0AjVkoP/1yynvarJQXi8Yry/XB3BLenrkUFxolqqA3Ff55KFQ7t1IzAuFtfuVZs25LvyDQ== - dependencies: - "@react-native-community/cli-tools" "^8.0.4" - cosmiconfig "^5.1.0" - deepmerge "^3.2.0" - glob "^7.1.3" - joi "^17.2.1" - -"@react-native-community/cli-debugger-ui@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-8.0.0.tgz#98263dc525e65015e2d6392c940114028f87e8e9" - integrity sha512-u2jq06GZwZ9sRERzd9FIgpW6yv4YOW4zz7Ym/B8eSzviLmy3yI/8mxJtvlGW+J8lBsfMcQoqJpqI6Rl1nZy9yQ== - dependencies: - serve-static "^1.13.1" - -"@react-native-community/cli-doctor@^8.0.4": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-8.0.4.tgz#9216867f0d8590868dc5b8035f62bbcac68b3254" - integrity sha512-Blw/66qwoEoKrtwn3O9iTtXbt4YWlwqNse5BJeRDzlSdutWTX4PgJu/34gyvOHGysNlrf+GYkeyqqxI/y0s07A== - dependencies: - "@react-native-community/cli-config" "^8.0.4" - "@react-native-community/cli-platform-ios" "^8.0.4" - "@react-native-community/cli-tools" "^8.0.4" - chalk "^4.1.2" - command-exists "^1.2.8" - envinfo "^7.7.2" - execa "^1.0.0" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" - node-stream-zip "^1.9.1" - ora "^5.4.1" - prompts "^2.4.0" - semver "^6.3.0" - strip-ansi "^5.2.0" - sudo-prompt "^9.0.0" - wcwidth "^1.0.1" - -"@react-native-community/cli-hermes@^8.0.5": - version "8.0.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-8.0.5.tgz#639edc6b0ce73f705e4b737e3de1cc47d42516ff" - integrity sha512-Zm0wM6SfgYAEX1kfJ1QBvTayabvh79GzmjHyuSnEROVNPbl4PeCG4WFbwy489tGwOP9Qx9fMT5tRIFCD8bp6/g== - dependencies: - "@react-native-community/cli-platform-android" "^8.0.5" - "@react-native-community/cli-tools" "^8.0.4" - chalk "^4.1.2" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" - -"@react-native-community/cli-platform-android@^8.0.2", "@react-native-community/cli-platform-android@^8.0.5": - version "8.0.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-8.0.5.tgz#da11d2678adeca98e83494d68de80e50571b4af4" - integrity sha512-z1YNE4T1lG5o9acoQR1GBvf7mq6Tzayqo/za5sHVSOJAC9SZOuVN/gg/nkBa9a8n5U7qOMFXfwhTMNqA474gXA== - dependencies: - "@react-native-community/cli-tools" "^8.0.4" - chalk "^4.1.2" - execa "^1.0.0" - fs-extra "^8.1.0" - glob "^7.1.3" - jetifier "^1.6.2" - lodash "^4.17.15" - logkitty "^0.7.1" - slash "^3.0.0" - -"@react-native-community/cli-platform-ios@^8.0.2", "@react-native-community/cli-platform-ios@^8.0.4": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.4.tgz#15225c09a1218a046f11165a54bf14b59dad7020" - integrity sha512-7Jdptedfg/J0Xo2rQbJ4jmo+PMYOiIiRcNDCSI5dBcNkQfSq4MMYUnKQx5DdZHgrfxE0O1vE4iNmJdd4wePz8w== - dependencies: - "@react-native-community/cli-tools" "^8.0.4" - chalk "^4.1.2" - execa "^1.0.0" - glob "^7.1.3" - js-yaml "^3.13.1" - lodash "^4.17.15" - ora "^5.4.1" - plist "^3.0.2" - -"@react-native-community/cli-plugin-metro@^8.0.4": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-8.0.4.tgz#a364a50a2e05fc5d0b548759e499e5b681b6e4cc" - integrity sha512-UWzY1eMcEr/6262R2+d0Is5M3L/7Y/xXSDIFMoc5Rv5Wucl3hJM/TxHXmByvHpuJf6fJAfqOskyt4bZCvbI+wQ== - dependencies: - "@react-native-community/cli-server-api" "^8.0.4" - "@react-native-community/cli-tools" "^8.0.4" - chalk "^4.1.2" - metro "^0.70.1" - metro-config "^0.70.1" - metro-core "^0.70.1" - metro-react-native-babel-transformer "^0.70.1" - metro-resolver "^0.70.1" - metro-runtime "^0.70.1" - readline "^1.3.0" - -"@react-native-community/cli-server-api@^8.0.4": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-8.0.4.tgz#d45d895a0a6e8b960c9d677188d414a996faa4d3" - integrity sha512-Orr14njx1E70CVrUA8bFdl+mrnbuXUjf1Rhhm0RxUadFpvkHuOi5dh8Bryj2MKtf8eZrpEwZ7tuQPhJEULW16A== - dependencies: - "@react-native-community/cli-debugger-ui" "^8.0.0" - "@react-native-community/cli-tools" "^8.0.4" - compression "^1.7.1" - connect "^3.6.5" - errorhandler "^1.5.0" - nocache "^3.0.1" - pretty-format "^26.6.2" - serve-static "^1.13.1" - ws "^7.5.1" - -"@react-native-community/cli-tools@^8.0.4": - version "8.0.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-8.0.4.tgz#994b9d56c84472491c876b71acd4356773fcbe65" - integrity sha512-ePN9lGxh6LRFiotyddEkSmuqpQhnq2iw9oiXYr4EFWpIEy0yCigTuSTiDF68+c8M9B+7bTwkRpz/rMPC4ViO5Q== - dependencies: - appdirsjs "^1.2.4" - chalk "^4.1.2" - find-up "^5.0.0" - lodash "^4.17.15" - mime "^2.4.1" - node-fetch "^2.6.0" - open "^6.2.0" - ora "^5.4.1" - semver "^6.3.0" - shell-quote "^1.7.3" - -"@react-native-community/cli-types@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-8.0.0.tgz#72d24178e5ed1c2d271da43e0a4a4f59178f261a" - integrity sha512-1lZS1PEvMlFaN3Se1ksyoFWzMjk+YfKi490GgsqKJln9gvFm8tqVPdnXttI5Uf2DQf3BMse8Bk8dNH4oV6Ewow== - dependencies: - joi "^17.2.1" - -"@react-native-community/cli@^8.0.3": - version "8.0.5" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-8.0.5.tgz#902a13b5336508f7989fddf39e6bf85b63a66de9" - integrity sha512-X0AMNK+sKDJQX8eQRkqgddJsZPWlHgLryX7O9usj78UFEK8VqVYtpv08piWecfAhC2mZU4/Lww4bKu9uJ1rdyQ== - dependencies: - "@react-native-community/cli-clean" "^8.0.4" - "@react-native-community/cli-config" "^8.0.4" - "@react-native-community/cli-debugger-ui" "^8.0.0" - "@react-native-community/cli-doctor" "^8.0.4" - "@react-native-community/cli-hermes" "^8.0.5" - "@react-native-community/cli-plugin-metro" "^8.0.4" - "@react-native-community/cli-server-api" "^8.0.4" - "@react-native-community/cli-tools" "^8.0.4" - "@react-native-community/cli-types" "^8.0.0" - chalk "^4.1.2" - commander "^2.19.0" - execa "^1.0.0" - find-up "^4.1.0" - fs-extra "^8.1.0" - graceful-fs "^4.1.3" - leven "^3.1.0" - lodash "^4.17.15" - minimist "^1.2.0" - prompts "^2.4.0" - semver "^6.3.0" - -"@react-native/assets@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" - integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== - -"@react-native/normalize-color@2.0.0", "@react-native/normalize-color@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567" - integrity sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw== - -"@react-native/polyfills@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" - integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== - -"@react-spring/animated@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.6.1.tgz#ccc626d847cbe346f5f8815d0928183c647eb425" - integrity sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ== - dependencies: - "@react-spring/shared" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/animated@~9.7.2": - version "9.7.2" - resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.2.tgz#0119db8075e91d693ec45c42575541e01b104a70" - integrity sha512-ipvleJ99ipqlnHkz5qhSsgf/ny5aW0ZG8Q+/2Oj9cI7LCc7COdnrSO6V/v8MAX3JOoQNzfz6dye2s5Pt5jGaIA== - dependencies: - "@react-spring/shared" "~9.7.2" - "@react-spring/types" "~9.7.2" - -"@react-spring/core@^9.6.1", "@react-spring/core@~9.7.2": - version "9.7.2" - resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.2.tgz#804ebadee45a6adff00886454d6f1c5d97ee219d" - integrity sha512-fF512edZT/gKVCA90ZRxfw1DmELeVwiL4OC2J6bMUlNr707C0h4QRoec6DjzG27uLX2MvS1CEatf9KRjwZR9/w== - dependencies: - "@react-spring/animated" "~9.7.2" - "@react-spring/rafz" "~9.7.2" - "@react-spring/shared" "~9.7.2" - "@react-spring/types" "~9.7.2" - -"@react-spring/core@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.6.1.tgz#ebe07c20682b360b06af116ea24e2b609e778c10" - integrity sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ== - dependencies: - "@react-spring/animated" "~9.6.1" - "@react-spring/rafz" "~9.6.1" - "@react-spring/shared" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/rafz@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.6.1.tgz#d71aafb92b78b24e4ff84639f52745afc285c38d" - integrity sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ== - -"@react-spring/rafz@~9.7.2": - version "9.7.2" - resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.2.tgz#77e7088c215e05cf893851cd87ceb40d89f2a7d7" - integrity sha512-kDWMYDQto3+flkrX3vy6DU/l9pxQ4TVW91DglQEc11iDc7shF4+WVDRJvOVLX+xoMP7zyag1dMvlIgvQ+dvA/A== - -"@react-spring/shared@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.6.1.tgz#4e2e4296910656c02bd9fd54c559702bc836ac4e" - integrity sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw== - dependencies: - "@react-spring/rafz" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/shared@~9.7.2": - version "9.7.2" - resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.2.tgz#b8485617bdcc9f6348b245922051fb534e07c566" - integrity sha512-6U9qkno+9DxlH5nSltnPs+kU6tYKf0bPLURX2te13aGel8YqgcpFYp5Av8DcN2x3sukinAsmzHUS/FRsdZMMBA== - dependencies: - "@react-spring/rafz" "~9.7.2" - "@react-spring/types" "~9.7.2" - -"@react-spring/three@^9.6.1": - version "9.7.2" - resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.7.2.tgz#2dd23e6e654fc57589cf6f89d6a809bc7f8a96b1" - integrity sha512-u7VAjc+az82PM+WOC2sTbZQLBixuN+0jX/oahzyjEnIds5eUJgaBqZRYAAEMupuzGGl8H3QqL3bFgBEQLq6ADQ== - dependencies: - "@react-spring/animated" "~9.7.2" - "@react-spring/core" "~9.7.2" - "@react-spring/shared" "~9.7.2" - "@react-spring/types" "~9.7.2" - -"@react-spring/three@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.6.1.tgz#095fcd1dc6509127c33c14486d88289b89baeb9d" - integrity sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA== - dependencies: - "@react-spring/animated" "~9.6.1" - "@react-spring/core" "~9.6.1" - "@react-spring/shared" "~9.6.1" - "@react-spring/types" "~9.6.1" - -"@react-spring/types@~9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.6.1.tgz#913d3a68c5cbc1124fdb18eff919432f7b6abdde" - integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q== - -"@react-spring/types@~9.7.2": - version "9.7.2" - resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.2.tgz#e04dd72755d88b0e3163ba143ecd8ba78b68a5b0" - integrity sha512-GEflx2Ex/TKVMHq5g5MxQDNNPNhqg+4Db9m7+vGTm8ttZiyga7YQUF24shgRNebKIjahqCuei16SZga8h1pe4g== - -"@react-three/drei@^9.74.7": - version "9.74.8" - resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.74.8.tgz#31cc37e700c7323452528bc2e217ce1df8811661" - integrity sha512-jdFVa2ANEHOUVcczHgmnuo5WjFh3gqCbGb9JV2tqfk5RTnXzTHNT3i7nzSOGtY0k+cKPQcEfO99Qf7reONYSPA== - dependencies: - "@babel/runtime" "^7.11.2" - "@mediapipe/tasks-vision" "^0.10.0" - "@react-spring/three" "~9.6.1" - "@use-gesture/react" "^10.2.24" - camera-controls "^2.3.1" - detect-gpu "^5.0.14" - glsl-noise "^0.0.0" - lodash.clamp "^4.0.3" - lodash.omit "^4.5.0" - lodash.pick "^4.4.0" - maath "^0.5.2" - meshline "^3.1.6" - react-composer "^5.0.3" - react-merge-refs "^1.1.0" - stats.js "^0.17.0" - suspend-react "^0.0.8" - three-mesh-bvh "^0.5.23" - three-stdlib "^2.23.5" - troika-three-text "^0.47.1" - utility-types "^3.10.0" - zustand "^3.5.13" - -"@rollup/plugin-alias@^3.1.1": - version "3.1.9" - resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.9.tgz#a5d267548fe48441f34be8323fb64d1d4a1b3fdf" - integrity sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw== - dependencies: - slash "^3.0.0" - -"@rollup/plugin-commonjs@^15.0.0": - version "15.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz#1e7d076c4f1b2abf7e65248570e555defc37c238" - integrity sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ== - dependencies: - "@rollup/pluginutils" "^3.1.0" - commondir "^1.0.1" - estree-walker "^2.0.1" - glob "^7.1.6" - is-reference "^1.2.1" - magic-string "^0.25.7" - resolve "^1.17.0" - -"@rollup/plugin-json@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" - integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== - dependencies: - "@rollup/pluginutils" "^3.0.8" - -"@rollup/plugin-node-resolve@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6" - integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.17.0" - -"@rollup/plugin-replace@^2.4.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@testing-library/dom@^8.5.0": - version "8.13.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5" - integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" - aria-query "^5.0.0" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.4.4" - pretty-format "^27.0.2" - -"@testing-library/react@^13.0.0-alpha.5": - version "13.0.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.0.1.tgz#00d223e182923d341a9610590561fb9dd1324110" - integrity sha512-zeHx3PohYYp+4bTJwrixQY8zSBZjWUGwYc7OhD1EpWTHS92RleApLoP72NdwaWxOrM1P1Uezt3XvGf6t2XSWPQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.5.0" - "@types/react-dom" "^18.0.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/aria-query@^4.2.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.0.tgz#7a9b80f712fe2052bc20da153ff1e552404d8e4b" - integrity sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/draco3d@^1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/draco3d/-/draco3d-1.4.2.tgz#7faccb809db2a5e19b9efb97c5f2eb9d64d527ea" - integrity sha512-goh23EGr6CLV6aKPwN1p8kBD/7tT5V/bLpToSbarKrwVejqNrspVrv8DhliteYkkhZYrlq/fwKZRRUzH4XN88w== - -"@types/eslint@^8.4.10": - version "8.21.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" - integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/hoist-non-react-statics@*": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/is-ci@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.0.tgz#7e8910af6857601315592436f030aaa3ed9783c3" - integrity sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ== - dependencies: - ci-info "^3.1.0" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.2.5": - version "29.4.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" - integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@*", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/lodash@^4.14.191": - version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" - integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== - -"@types/minimatch@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/node@*": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.24.tgz#20ba1bf69c1b4ab405c7a01e950c4f446b05029f" - integrity sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g== - -"@types/node@^12.7.1": - version "12.20.48" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.48.tgz#55f70bd432b6515828c0298689776861b90ca4fa" - integrity sha512-4kxzqkrpwYtn6okJUcb2lfUu9ilnb3yhUOH6qX3nug8D2DupZ2drIkff2yJzYcNJVl3begnlcaBJ7tqiTTzjnQ== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/offscreencanvas@^2019.6.4": - version "2019.7.0" - resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz#e4a932069db47bb3eabeb0b305502d01586fa90d" - integrity sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg== - -"@types/prettier@^2.1.5": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" - integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== - -"@types/prop-types@*": - version "15.7.5" - 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.1": - version "18.0.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.1.tgz#cb3cc10ea91141b12c71001fede1017acfbce4db" - integrity sha512-jCwTXvHtRLiyVvKm9aEdHXs8rflVOGd5Sl913JZrPshfXjn8NYsTNZOz70bCsA31IR0TOqwi3ad+X4tSCBoMTw== - 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" - integrity sha512-mSUCuGUsW2kJlZiu4GmdYVDKZX/52iyC9rm6dxAmflJj1b7kSO/CMSDy5WbcfS8QerxTqbYGTrIwHD0GnXHzbQ== - 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" - integrity sha512-5cjk9ottZAj7eaTsqzPUIlrVbh3hBAO2YaEL1rkjHKB3xNAId7oU8GhzvAX+gfmlfoxTwJnBjPxEHyxkEA1Ffg== - dependencies: - "@types/react" "*" - -"@types/react-test-renderer@^17.0.1": - version "17.0.2" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-17.0.2.tgz#5f800a39b12ac8d2a2149e7e1885215bcf4edbbf" - integrity sha512-+F1KONQTBHDBBhbHuT2GNydeMpPuviduXIVJRB7Y4nma4NR5DrTJfMMZ+jbhEHbpwL+Uqhs1WXh4KHiyrtYTPg== - dependencies: - "@types/react" "^17" - -"@types/react@*", "@types/react@^18.0.5": - version "18.0.5" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.5.tgz#1a4d4b705ae6af5aed369dec22800b20f89f5301" - integrity sha512-UPxNGInDCIKlfqBrm8LDXYWNfLHwIdisWcsH5GpMyGjhEDLFgTtlRBaoWuCua9HcyuE0rMkmAeZ3FXV1pYLIYQ== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^17": - version "17.0.44" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.44.tgz#c3714bd34dd551ab20b8015d9d0dbec812a51ec7" - integrity sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^18.0.0": - version "18.0.17" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" - integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/scheduler@*", "@types/scheduler@^0.16.2": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/semver@^6.0.0": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" - integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/styled-components@^5.1.24": - version "5.1.25" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.25.tgz#0177c4ab5fa7c6ed0565d36f597393dae3f380ad" - integrity sha512-fgwl+0Pa8pdkwXRoVPP9JbqF0Ivo9llnmsm+7TCI330kbPIFd9qv1Lrhr37shf4tnxCOSu+/IgqM7uJXLWZZNQ== - dependencies: - "@types/hoist-non-react-statics" "*" - "@types/react" "*" - csstype "^3.0.2" - -"@types/three@^0.141.0": - version "0.141.0" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.141.0.tgz#d9d81a54b28ebc2a56931dfd4d9c54d25c20d6c8" - integrity sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA== - dependencies: - "@types/webxr" "*" - -"@types/webxr@*": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.4.0.tgz#ad06c96a324293e0d5175d13dd5ded5931f90ba3" - integrity sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg== - -"@types/webxr@*": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.6.tgz#835c7ac9983a732e2e849d0d302bc735aa455126" - integrity sha512-/uWg82/WT+Pl18b2kkG6nlbiiaNIb8RN2mvvcGexGvwLvUrEhDhGBzYHiwa5nQPtin0hISyrXkKOKVScTK+kKg== - -"@types/webxr@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.2.tgz#5d9627b0ffe223aa3b166de7112ac8a9460dc54f" - integrity sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.22" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" - integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.17.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz#9608a4b6d0427104bccf132f058cba629a6553c0" - integrity sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg== - dependencies: - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/type-utils" "5.19.0" - "@typescript-eslint/utils" "5.19.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.2.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.17.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.19.0.tgz#05e587c1492868929b931afa0cb5579b0f728e75" - integrity sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ== - dependencies: - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/typescript-estree" "5.19.0" - debug "^4.3.2" - -"@typescript-eslint/scope-manager@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz#97e59b0bcbcb54dbcdfba96fc103b9020bbe9cb4" - integrity sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g== - dependencies: - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/visitor-keys" "5.19.0" - -"@typescript-eslint/type-utils@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz#80f2125b0dfe82494bbae1ea99f1c0186d420282" - integrity sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q== - dependencies: - "@typescript-eslint/utils" "5.19.0" - debug "^4.3.2" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.19.0.tgz#12d3d600d754259da771806ee8b2c842d3be8d12" - integrity sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w== - -"@typescript-eslint/typescript-estree@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz#fc987b8f62883f9ea6a5b488bdbcd20d33c0025f" - integrity sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw== - dependencies: - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/visitor-keys" "5.19.0" - debug "^4.3.2" - globby "^11.0.4" - is-glob "^4.0.3" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.19.0", "@typescript-eslint/utils@^5.10.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.19.0.tgz#fe87f1e3003d9973ec361ed10d36b4342f1ded1e" - integrity sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/typescript-estree" "5.19.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/visitor-keys@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz#c84ebc7f6c744707a361ca5ec7f7f64cd85b8af6" - integrity sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ== - dependencies: - "@typescript-eslint/types" "5.19.0" - eslint-visitor-keys "^3.0.0" - -"@use-gesture/core@10.2.11": - version "10.2.11" - resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.2.11.tgz#914c36f190bcf452500d11a11fc294fe56e5dc2f" - integrity sha512-5YeVrT9prf9UeaAO+2fIuiKdZ01uVBvVsjG79berGZPTHVkz01eFX2ODWJG05uQTqmRw6olz1J80yt6qcGPdvA== - -"@use-gesture/core@10.2.27": - version "10.2.27" - resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.2.27.tgz#0f24b17c036cd828ba07e3451ff45e2df959c6f5" - integrity sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA== - -"@use-gesture/react@^10.2.24": - version "10.2.27" - resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.2.27.tgz#7fbd50d14449ec5bc49c9b6cfef8a2845f5e0608" - integrity sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w== - dependencies: - "@use-gesture/core" "10.2.27" - -"@use-gesture/react@latest": - version "10.2.11" - resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.2.11.tgz#f23776050aeaee3b18f80df9cd2b765229bbfa66" - integrity sha512-yATjHv6ZNe9Jar1YtJvcb6KxwpcGGW/X8FEUY6xo2mDxHkP7dCsnhZZm7I+giGlrJKBMvpVBARsbUhwQP6v6nA== - dependencies: - "@use-gesture/core" "10.2.11" - -"@vitejs/plugin-react@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.0.1.tgz#3197c01d8e4a4eb9fed829c7888c467a43aadd4e" - integrity sha512-uINzNHmjrbunlFtyVkST6lY1ewSfz/XwLufG0PIqvLGnpk2nOIOa/1CACTDNcKi1/RwaCzJLmsXwm1NsUVV/NA== - dependencies: - "@babel/core" "^7.18.10" - "@babel/plugin-transform-react-jsx" "^7.18.10" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-jsx-self" "^7.18.6" - "@babel/plugin-transform-react-jsx-source" "^7.18.6" - magic-string "^0.26.2" - react-refresh "^0.14.0" - -"@webgpu/glslang@^0.0.15": - version "0.0.15" - resolved "https://registry.yarnpkg.com/@webgpu/glslang/-/glslang-0.0.15.tgz#f5ccaf6015241e6175f4b90906b053f88483d1f2" - integrity sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q== - -"@xmldom/xmldom@~0.7.7": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" - integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -absolute-path@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= - -accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -acorn@^8.4.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -anser@^1.4.9: - version "1.4.10" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" - integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== - -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-fragments@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" - integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== - dependencies: - colorette "^1.0.7" - slice-ansi "^2.0.0" - strip-ansi "^5.0.0" - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: - version "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.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -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" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" - integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -appdirsjs@^1.2.4: - version "1.2.6" - resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.6.tgz#fccf9ee543315492867cacfcfd4a2b32257d30ac" - integrity sha512-D8wJNkqMCeQs3kLasatELsddox/Xqkhp+J07iXGyL54fVN7oc+nmNfYzGuCs1IEP6uBw+TfpuO3JKwc+lECy4w== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" - integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-differ@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" - integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== - -array-includes@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" - integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -ast-types@0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" - integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== - dependencies: - tslib "^2.0.1" - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-jest@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.3.tgz#478b84d430972b277ad67dd631be94abea676792" - integrity sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw== - dependencies: - "@jest/transform" "^29.4.3" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.4.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-jest-hoist@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz#ad1dfb5d31940957e00410ef7d9b2aa94b216101" - integrity sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.21.0" - -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" - integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-fbjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -babel-preset-jest@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz#bb926b66ae253b69c6e3ef87511b8bb5c53c5b52" - integrity sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw== - dependencies: - babel-plugin-jest-hoist "^29.4.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -better-path-resolve@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" - integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== - dependencies: - is-windows "^1.0.0" - -bidi-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.2.tgz#1a497a762c2ddea377429d2649c9ce0f8a91527f" - integrity sha512-rzSy/k7WdX5zOyeHHCOixGXbCHkyogkxPKL2r8QtzHmVQDiWCXUWa18bLdMWT9CYMLOYTjWpTHawuev2ouYJVw== - dependencies: - require-from-string "^2.0.2" - -big-integer@1.6.x: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blueimp-md5@^2.10.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" - integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== - -bplist-creator@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" - integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== - dependencies: - stream-buffers "2.2.x" - -bplist-parser@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" - integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== - dependencies: - big-integer "1.6.x" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -breakword@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.5.tgz#fd420a417f55016736b5b615161cae1c8f819810" - integrity sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg== - dependencies: - wcwidth "^1.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.17.5, browserslist@^4.20.2: - version "4.20.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" - integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== - dependencies: - caniuse-lite "^1.0.30001317" - electron-to-chromium "^1.4.84" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" - -browserslist@^4.21.3: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -builtin-modules@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" - integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0, camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" - integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= - -camera-controls@^2.3.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-2.4.2.tgz#815aa5d7c4c43054fc55fb8b6cc685a56540fea2" - integrity sha512-blYDPECYFT/4egDMNWqKc2lBrpOfIAjPPRUNVswQELPi8naGBXUvZM3sDJSNuIRaHqid+JKPtlcoZk+Cb+X5qg== - -caniuse-lite@^1.0.30001317: - version "1.0.30001332" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" - integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== - -caniuse-lite@^1.0.30001449: - version "1.0.30001458" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" - integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== - -chalk@^2.0.0, chalk@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chevrotain@^10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-10.1.2.tgz#c990ab43e32fd0bfb176ad1cbdebf48302ac8542" - integrity sha512-hvRiQuhhTZxkPMGD/dke+s1EGo8AkKDBU05CcufBO278qgAQSwIC4QyLdHz0CFHVtqVYWjlAS5D1KwvBbaHT+w== - dependencies: - "@chevrotain/cst-dts-gen" "^10.1.2" - "@chevrotain/gast" "^10.1.2" - "@chevrotain/types" "^10.1.2" - "@chevrotain/utils" "^10.1.2" - lodash "4.17.21" - regexp-to-ast "0.5.0" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.1.0, ci-info@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" - integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^1.0.7: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -colorette@^2.0.16: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -commander@^2.19.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -connect@^3.6.5: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.22.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.0.tgz#7ce17ab57c378be2c717c7c8ed8f82a50a25b3e4" - integrity sha512-WwA7xbfRGrk8BGaaHlakauVXrlYmAIkk8PNGb1FDQS+Rbrewc3pgFfwJFRw6psmJVAll7Px9UHRYE16oRQnwAQ== - dependencies: - browserslist "^4.20.2" - semver "7.0.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, 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" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= - -css-to-react-native@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" - integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.2: - version "3.0.11" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" - integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== - -csv-generate@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" - integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== - -csv-parse@^4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" - integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== - -csv-stringify@^5.6.5: - version "5.6.5" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" - integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== - -csv@^5.3.1: - version "5.5.3" - resolved "https://registry.yarnpkg.com/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" - integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== - dependencies: - csv-generate "^3.4.3" - csv-parse "^4.16.3" - csv-stringify "^5.6.5" - stream-transform "^2.1.3" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -dataloader@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7" - integrity sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ== - -dayjs@^1.8.15: - version "1.11.1" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.1.tgz#90b33a3dda3417258d48ad2771b415def6545eb0" - integrity sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA== - -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -define-properties@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-gpu@^5.0.14: - version "5.0.27" - resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.27.tgz#821d9331c87e32568c483d85e12a9adee43d7bb2" - integrity sha512-IDjjqTkS+f0xm/ntbD21IPYiF0srzpePC/hhUMmctEsoklZwJwStJiMi/KN0pnH0LjSsgjwbP+QwW7y+Qf4/SQ== - dependencies: - webgl-constants "^1.1.1" - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-accessibility-api@^0.5.9: - version "0.5.13" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.13.tgz#102ee5f25eacce09bdf1cfa5a298f86da473be4b" - integrity sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -draco3d@^1.4.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.2.tgz#a09604a9e6bbf4e5a69208af4622038c55ef4ca7" - integrity sha512-AeRQ25Fb29c14vpjnh167UGW0nGY0ZpEM3ld+zEXoEySlmEXcXfsCHZeTgo5qXH925V1JsdjrzasdaQ22/vXog== - -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" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.4.284: - version "1.4.311" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz#953bc9a4767f5ce8ec125f9a1ad8e00e8f67e479" - integrity sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw== - -electron-to-chromium@^1.4.84: - version "1.4.110" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.110.tgz#269208d7cf7e32123b1d87bf4e6e1fd9ac7ff51d" - integrity sha512-TvHZrkj9anfWkxgblHlNr4IMQdm2N6D0o8Wu1BDpSL/RKT4DHyUt/tvDFtApgZ+LGFL3U9EO4LRZ1eSlQ8xMYA== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "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" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.0, enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -envinfo@^7.7.2: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.7.tgz#b0c6e2ce27d0495cf78ad98715e0cad1219abb57" - integrity sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA== - dependencies: - stackframe "^1.1.1" - -errorhandler@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" - integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== - dependencies: - accepts "~1.3.7" - escape-html "~1.0.3" - -es-abstract@^1.19.1, es-abstract@^1.19.2: - version "1.19.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" - integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - 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== - 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" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-import-resolver-alias@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz#297062890e31e4d6651eb5eba9534e1f6e68fc97" - integrity sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w== - -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-plugin-import@^2.25.4: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jest@^27.2.1: - version "27.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz#b85b4adf41c682ea29f1f01c8b11ccc39b5c672c" - integrity sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg== - dependencies: - "@typescript-eslint/utils" "^5.10.0" - -eslint-plugin-prettier@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" - integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-react-hooks@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" - integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== - -eslint-plugin-react@^7.29.4: - version "7.29.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2" - integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ== - dependencies: - array-includes "^3.1.4" - array.prototype.flatmap "^1.2.5" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.0" - object.values "^1.1.5" - prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" - string.prototype.matchall "^4.0.6" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.12.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.13.0.tgz#6fcea43b6811e655410f5626cfcf328016badcd7" - integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ== - dependencies: - "@eslint/eslintrc" "^1.2.1" - "@humanwhocodes/config-array" "^0.9.2" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.6.0" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" - integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== - dependencies: - acorn "^8.7.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^3.3.0" - -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -event-target-shim@^5.0.0, event-target-shim@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@^5.0.0, execa@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -expect@^29.0.0, expect@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.3.tgz#5e47757316df744fe3b8926c3ae8a3ebdafff7fe" - integrity sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg== - dependencies: - "@jest/expect-utils" "^29.4.3" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" - -expo-asset@^8.6.0: - version "8.10.1" - resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-8.10.1.tgz#a7e8cf1c555ab8f844599822cb084fee95a93644" - integrity sha512-5VMTESxgY9GBsspO/esY25SKEa7RyascVkLe/OcL1WgblNFm7xCCEEUIW8VWS1nHJQGYxpMZPr3bEfjMpdWdyA== - dependencies: - blueimp-md5 "^2.10.0" - expo-constants "~14.4.2" - expo-file-system "~15.4.0" - invariant "^2.2.4" - md5-file "^3.2.3" - path-browserify "^1.0.0" - url-parse "^1.5.9" - -expo-constants@~14.4.2: - version "14.4.2" - resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-14.4.2.tgz#cac5e8b524069545739b8d8595ce96cc5be6578c" - integrity sha512-nOB122DOAjk+KrJT69lFQAoYVQGQjFHSigCPVBzVdko9S1xGsfiOH9+X5dygTsZTIlVLpQJDdmZ7ONiv3i+26w== - dependencies: - "@expo/config" "~8.1.0" - uuid "^3.3.2" - -expo-file-system@^15.4.3, expo-file-system@~15.4.0: - version "15.4.4" - resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-15.4.4.tgz#b29e0507b57ee0cc7173cf8844aaf992e411f518" - integrity sha512-F0xS88D85F7qVQ61r0qBnzh6VW/s6iIl+VaQEEi2nAIOQHw1JIEj4yCXPLTtbyn5VmArbe2dSL3KYz1V+BLkKA== - dependencies: - uuid "^3.4.0" - -expo-gl-cpp@~11.4.0: - version "11.4.0" - resolved "https://registry.yarnpkg.com/expo-gl-cpp/-/expo-gl-cpp-11.4.0.tgz#62b4b5c61ef065e94aa790a872aad2eee2ae11ea" - integrity sha512-vt9QYKX/4TxMaNnbv9ww5KILwyCmg91gqwA/6xuo4MqWxGkZoxy+b8lqsQthuPdn+FHgF0BNcvFW9nbN+JeSRg== - -expo-gl@^11.4.0: - version "11.4.0" - resolved "https://registry.yarnpkg.com/expo-gl/-/expo-gl-11.4.0.tgz#0aa6b05908f1a8405f804f3e1a360a215569b9f2" - integrity sha512-Q0/4git7mNanxPe4/DMC6dk9F1Xu2ACTmacWdoLjS3NByUzFt25vFtrbf9R3FCgWcBlA9ncfVp1CsYgA4+61Dg== - dependencies: - expo-gl-cpp "~11.4.0" - invariant "^2.2.4" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extendable-error@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" - integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== - -external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.2.4, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fflate@^0.6.9: - version "0.6.10" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.6.10.tgz#5f40f9659205936a2d18abf88b2e7781662b6d43" - integrity sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0, find-up@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-yarn-workspace-root2@1.2.16: - version "1.2.16" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" - integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== - dependencies: - micromatch "^4.0.2" - pkg-dir "^4.2.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - -flow-parser@0.*: - version "0.176.2" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.176.2.tgz#e04ac9f766ea9491fd515c84a82ef360e3a0c659" - integrity sha512-unqoh60i18C67h2rvK0SCFUBac/waUcx7CF1a5E4D0Cwj1NErTP42RF7yb7+dy25Tpyzt7uwVtXw13Wr17VzWA== - -flow-parser@^0.121.0: - version "0.121.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" - integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -functions-have-names@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" - integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getenv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" - integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.6.0, globals@^13.9.0: - version "13.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" - integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== - dependencies: - type-fest "^0.20.2" - -globby@^11.0.0, globby@^11.0.4: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -glsl-noise@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/glsl-noise/-/glsl-noise-0.0.0.tgz#367745f3a33382c0eeec4cb54b7e99cfc1d7670b" - integrity sha1-NndF86MzgsDu7Ey1S36Zz8HXZws= - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hermes-engine@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.11.0.tgz#bb224730d230a02a5af02c4e090d1f52d57dd3db" - integrity sha512-7aMUlZja2IyLYAcZ69NBnwJAR5ZOYlSllj0oMpx08a8HzxHOys0eKCzfphrf6D0vX1JGO1QQvVsQKe6TkYherw== - -hermes-estree@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.6.0.tgz#e866fddae1b80aec65fe2ae450a5f2070ad54033" - integrity sha512-2YTGzJCkhdmT6VuNprWjXnvTvw/3iPNw804oc7yknvQpNKo+vJGZmtvLLCghOZf0OwzKaNAzeIMp71zQbNl09w== - -hermes-parser@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.6.0.tgz#00d14e91bca830b3c1457050fa4187400cb96328" - integrity sha512-Vf58jBZca2+QBLR9h7B7mdg8oFz2g5ILz1iVouZ5DOrOrAfBmPfJjdjDT8jrO0f+iJ4/hSRrQHqHIjSnTaLUDQ== - dependencies: - hermes-estree "0.6.0" - -hermes-profile-transformer@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" - integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== - dependencies: - source-map "^0.7.3" - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-id@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" - integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -husky@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" - integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-walk@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - -ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -image-size@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" - integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-ci@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - -is-core-module@^2.2.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - -is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-reference@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-subdir@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" - integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== - dependencies: - better-path-resolve "1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.0, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -its-fine@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.0.6.tgz#087b14d71137816dab676d8b57c35a6cd5d2b021" - integrity sha512-VZJZPwVT2kxe5KQv+TxCjojfLiUIut8zXDNLTxcM7gJ/xQ/bSPk5M0neZ+j3myy45KKkltY1mm1jyJgx3Fxsdg== - dependencies: - "@types/react-reconciler" "^0.28.0" - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-changed-files@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.3.tgz#7961fe32536b9b6d5c28dfa0abcfab31abcf50a7" - integrity sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-circus@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.3.tgz#fff7be1cf5f06224dd36a857d52a9efeb005ba04" - integrity sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw== - dependencies: - "@jest/environment" "^29.4.3" - "@jest/expect" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-runtime "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" - p-limit "^3.1.0" - pretty-format "^29.4.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-cli@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.3.tgz#fe31fdd0c90c765f392b8b7c97e4845071cd2163" - integrity sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg== - dependencies: - "@jest/core" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-config@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.3.tgz#fca9cdfe6298ae6d04beef1624064d455347c978" - integrity sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.4.3" - "@jest/types" "^29.4.3" - babel-jest "^29.4.3" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.4.3" - jest-environment-node "^29.4.3" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-runner "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.4.3" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-diff@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.3.tgz#42f4eb34d0bf8c0fb08b0501069b87e8e84df347" - integrity sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.4.3" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-each@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.3.tgz#a434c199a2f6151c5e3dc80b2d54586bdaa72819" - integrity sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q== - dependencies: - "@jest/types" "^29.4.3" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.4.3" - pretty-format "^29.4.3" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-environment-node@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.3.tgz#579c4132af478befc1889ddc43c2413a9cdbe014" - integrity sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg== - dependencies: - "@jest/environment" "^29.4.3" - "@jest/fake-timers" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/node" "*" - jest-mock "^29.4.3" - jest-util "^29.4.3" - -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^27.3.1, jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-haste-map@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.3.tgz#085a44283269e7ace0645c63a57af0d2af6942e2" - integrity sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ== - dependencies: - "@jest/types" "^29.4.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.4.3" - jest-worker "^29.4.3" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-leak-detector@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz#2b35191d6b35aa0256e63a9b79b0f949249cf23a" - integrity sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.4.3" - -jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz#ea68ebc0568aebea4c4213b99f169ff786df96a0" - integrity sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg== - dependencies: - chalk "^4.0.0" - jest-diff "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.4.3" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.3.tgz#65b5280c0fdc9419503b49d4f48d4999d481cb5b" - integrity sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.4.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.4.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-mock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.3.tgz#23d84a20a74cdfff0510fdbeefb841ed57b0fe7e" - integrity sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg== - dependencies: - "@jest/types" "^29.4.3" - "@types/node" "*" - jest-util "^29.4.3" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve-dependencies@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz#9ad7f23839a6d88cef91416bda9393a6e9fd1da5" - integrity sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.4.3" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-resolve@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.3.tgz#3c5b5c984fa8a763edf9b3639700e1c7900538e2" - integrity sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" - jest-pnp-resolver "^1.2.2" - jest-util "^29.4.3" - jest-validate "^29.4.3" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runner@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.3.tgz#68dc82c68645eda12bea42b5beece6527d7c1e5e" - integrity sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA== - dependencies: - "@jest/console" "^29.4.3" - "@jest/environment" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.4.3" - jest-haste-map "^29.4.3" - jest-leak-detector "^29.4.3" - jest-message-util "^29.4.3" - jest-resolve "^29.4.3" - jest-runtime "^29.4.3" - jest-util "^29.4.3" - jest-watcher "^29.4.3" - jest-worker "^29.4.3" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-runtime@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.3.tgz#f25db9874dcf35a3ab27fdaabca426666cc745bf" - integrity sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q== - dependencies: - "@jest/environment" "^29.4.3" - "@jest/fake-timers" "^29.4.3" - "@jest/globals" "^29.4.3" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" - jest-message-util "^29.4.3" - jest-mock "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-snapshot@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.3.tgz#183d309371450d9c4a3de7567ed2151eb0e91145" - integrity sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.4.3" - graceful-fs "^4.2.9" - jest-diff "^29.4.3" - jest-get-type "^29.4.3" - jest-haste-map "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" - natural-compare "^1.4.0" - pretty-format "^29.4.3" - semver "^7.3.5" - -jest-util@^27.0.0, jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" - integrity sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q== - dependencies: - "@jest/types" "^29.4.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^26.5.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== - dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" - chalk "^4.0.0" - jest-get-type "^26.3.0" - leven "^3.1.0" - pretty-format "^26.6.2" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-validate@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.3.tgz#a13849dec4f9e95446a7080ad5758f58fa88642f" - integrity sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw== - dependencies: - "@jest/types" "^29.4.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.4.3" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-watcher@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.3.tgz#e503baa774f0c2f8f3c8db98a22ebf885f19c384" - integrity sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA== - dependencies: - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.4.3" - string-length "^4.0.1" - -jest-worker@^26.3.0: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^27.2.0, jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" - integrity sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA== - dependencies: - "@types/node" "*" - jest-util "^29.4.3" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.3.1: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.3.tgz#1b8be541666c6feb99990fd98adac4737e6e6386" - integrity sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA== - dependencies: - "@jest/core" "^29.4.3" - "@jest/types" "^29.4.3" - import-local "^3.0.2" - jest-cli "^29.4.3" - -jetifier@^1.6.2: - version "1.6.8" - resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" - integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== - -joi@^17.2.1: - version "17.6.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" - integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsc-android@^250230.2.1: - version "250230.2.1" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" - integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== - -jscodeshift@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef" - integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== - dependencies: - "@babel/core" "^7.13.16" - "@babel/parser" "^7.13.16" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/preset-flow" "^7.13.13" - "@babel/preset-typescript" "^7.13.0" - "@babel/register" "^7.13.16" - babel-core "^7.0.0-bridge.0" - chalk "^4.1.2" - flow-parser "0.*" - graceful-fs "^4.2.4" - micromatch "^3.1.10" - neo-async "^2.5.0" - node-dir "^0.1.17" - recast "^0.20.4" - temp "^0.8.4" - write-file-atomic "^2.3.0" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@2.x, json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -"jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.2.2" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c" - integrity sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw== - dependencies: - array-includes "^3.1.4" - object.assign "^4.1.2" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -ktx-parse@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.2.2.tgz#b037b66044855215b332cb73104590af49e47791" - integrity sha512-cFBc1jnGG2WlUf52NbDUXK2obJ+Mo9WUkBRvr6tP6CKxRMvZwDDFNV3JAS4cewETp5KyexByfWm9sm+O8AffiQ== - -ktx-parse@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.4.5.tgz#79905e22281a9d3e602b2ff522df1ee7d1813aa6" - integrity sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^12.3.7: - version "12.3.8" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.3.8.tgz#ee3fe2e16c9d76f99d8348072900b017d6d76901" - integrity sha512-0+UpNaqIwKRSGAFOCcpuYNIv/j5QGVC+xUVvmSdxHO+IfIGoHbFLo3XcPmV/LLnsVj5EAncNHVtlITSoY5qWGQ== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.16" - commander "^8.3.0" - debug "^4.3.3" - execa "^5.1.1" - lilconfig "2.0.4" - listr2 "^4.0.1" - micromatch "^4.0.4" - normalize-path "^3.0.0" - object-inspect "^1.12.0" - pidtree "^0.5.0" - string-argv "^0.3.1" - supports-color "^9.2.1" - yaml "^1.10.2" - -listr2@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" - integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.5" - through "^2.3.8" - wrap-ansi "^7.0.0" - -load-yaml-file@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" - integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== - dependencies: - graceful-fs "^4.1.5" - js-yaml "^3.13.0" - pify "^4.0.1" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.clamp@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/lodash.clamp/-/lodash.clamp-4.0.3.tgz#5c24bedeeeef0753560dc2b4cb4671f90a6ddfaa" - integrity sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.omit@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= - -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg= - -lodash.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= - -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -logkitty@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" - integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== - dependencies: - ansi-fragments "^0.2.1" - dayjs "^1.8.15" - yargs "^15.1.0" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= - -maath@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/maath/-/maath-0.5.3.tgz#777a1f9b8463c6ffb199ea43406874a357c0cd58" - integrity sha512-ut63A4zTd9abtpi+sOHW1fPWPtAFrjK0E17eAthx1k93W/T2cWLKV5oaswyotJVDvvW1EXSdokAqhK5KOu0Qdw== - -magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -magic-string@^0.26.2: - version "0.26.2" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432" - integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5-file@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" - integrity sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw== - dependencies: - buffer-alloc "^1.1.0" - -memoize-one@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -meow@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" - integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -meow@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" - integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -meshline@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/meshline/-/meshline-3.1.6.tgz#eee67d9b0fd9841652cc1dc2d3833093ae8e68ca" - integrity sha512-8JZJOdaL5oz3PI/upG8JvP/5FfzYUOhrkJ8np/WKvXzl0/PZ2V9pqTvCIjSKv+w9ccg2xb+yyBhXAwt6ier3ug== - -metro-babel-transformer@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.70.3.tgz#dca61852be273824a4b641bd1ecafff07ff3ad1f" - integrity sha512-bWhZRMn+mIOR/s3BDpFevWScz9sV8FGktVfMlF1eJBLoX24itHDbXvTktKBYi38PWIKcHedh6THSFpJogfuwNA== - dependencies: - "@babel/core" "^7.14.0" - hermes-parser "0.6.0" - metro-source-map "0.70.3" - nullthrows "^1.1.1" - -metro-cache-key@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.70.3.tgz#898803db04178a8f440598afba7d82a9cf35abf7" - integrity sha512-0zpw+IcpM3hmGd5sKMdxNv3sbOIUYnMUvx1/yaM6vNRReSPmOLX0bP8fYf3CGgk8NEreZ1OHbVsuw7bdKt40Mw== - -metro-cache@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.70.3.tgz#42cf3cdf8a7b3691f3bef9a86bed38d4c5f6201f" - integrity sha512-iCix/+z812fUqa6KlOxaTkY6LQQDoXIe/VljXkGIvpygSCmYyhjQpfQVZEVVPezFmUBYXNdabdQ6cYx6JX3yMg== - dependencies: - metro-core "0.70.3" - rimraf "^2.5.4" - -metro-config@0.70.3, metro-config@^0.70.1: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.70.3.tgz#fe6f7330f679d5594e5724af7a69d4dbe1bb5bc3" - integrity sha512-SSCDjSTygoCgzoj61DdrBeJzZDRwQxUEfcgc6t6coxWSExXNR4mOngz0q4SAam49Bmjq9J2Jft6qUKnUTPrRgA== - dependencies: - cosmiconfig "^5.0.5" - jest-validate "^26.5.2" - metro "0.70.3" - metro-cache "0.70.3" - metro-core "0.70.3" - metro-runtime "0.70.3" - -metro-core@0.70.3, metro-core@^0.70.1: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.70.3.tgz#bf4dda15a5185f5a7931de463a1b97ac9ef680a0" - integrity sha512-NzfHB/w5R7yLaOeU1tzPTbBzCRsYSvpKJkLMP0yudszKZzIAZqNdjoEJ9GZ688Wi0ynZxcU0BxukXh4my80ZBw== - dependencies: - jest-haste-map "^27.3.1" - lodash.throttle "^4.1.1" - metro-resolver "0.70.3" - -metro-hermes-compiler@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.70.3.tgz#ac7ed656fbcf0a59adcd010d3639e4cfdbc76b4f" - integrity sha512-W6WttLi4E72JL/NyteQ84uxYOFMibe0PUr9aBKuJxxfCq6QRnJKOVcNY0NLW0He2tneXGk+8ZsNz8c0flEvYqg== - -metro-inspector-proxy@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.70.3.tgz#321c25b2261e76d8c4bcc39e092714adfcb50a14" - integrity sha512-qQoNdPGrmyoJSWYkxSDpTaAI8xyqVdNDVVj9KRm1PG8niSuYmrCCFGLLFsMvkVYwsCWUGHoGBx0UoAzVp14ejw== - dependencies: - connect "^3.6.5" - debug "^2.2.0" - ws "^7.5.1" - yargs "^15.3.1" - -metro-minify-uglify@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.70.3.tgz#2f28129ca5b8ef958f3e3fcf004c3707c7732e1e" - integrity sha512-oHyjV9WDqOlDE1FPtvs6tIjjeY/oP1PNUPYL1wqyYtqvjN+zzAOrcbsAAL1sv+WARaeiMsWkF2bwtNo+Hghoog== - dependencies: - uglify-es "^3.1.9" - -metro-react-native-babel-preset@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.70.3.tgz#1c77ec4544ecd5fb6c803e70b21284d7483e4842" - integrity sha512-4Nxc1zEiHEu+GTdEMEsHnRgfaBkg8f/Td3+FcQ8NTSvs+xL3LBrQy6N07idWSQZHIdGFf+tTHvRfSIWLD8u8Tg== - dependencies: - "@babel/core" "^7.14.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" - -metro-react-native-babel-transformer@0.70.3, metro-react-native-babel-transformer@^0.70.1: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.70.3.tgz#195597c32488f820aa9e441bbca7c04fe7de7a2d" - integrity sha512-WKBU6S/G50j9cfmFM4k4oRYprd8u3qjleD4so1E2zbTNILg+gYla7ZFGCAvi2G0ZcqS2XuGCR375c2hF6VVvwg== - dependencies: - "@babel/core" "^7.14.0" - babel-preset-fbjs "^3.4.0" - hermes-parser "0.6.0" - metro-babel-transformer "0.70.3" - metro-react-native-babel-preset "0.70.3" - metro-source-map "0.70.3" - nullthrows "^1.1.1" - -metro-resolver@0.70.3, metro-resolver@^0.70.1: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.70.3.tgz#c64fdd6d0a88fa62f3f99f87e539b5f603bd47bf" - integrity sha512-5Pc5S/Gs4RlLbziuIWtvtFd9GRoILlaRC8RZDVq5JZWcWHywKy/PjNmOBNhpyvtRlzpJfy/ssIfLhu8zINt1Mw== - dependencies: - absolute-path "^0.0.0" - -metro-runtime@0.70.3, metro-runtime@^0.70.1: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.70.3.tgz#09231b9d05dcbdfb5a13df0a45307273e6fe1168" - integrity sha512-22xU7UdXZacniTIDZgN2EYtmfau2pPyh97Dcs+cWrLcJYgfMKjWBtesnDcUAQy3PHekDYvBdJZkoQUeskYTM+w== - dependencies: - "@babel/runtime" "^7.0.0" - -metro-source-map@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.70.3.tgz#f5976108c18d4661eaa4d188c96713e5d67a903b" - integrity sha512-zsYtZGrwRbbGEFHtmMqqeCH9K9aTGNVPsurMOWCUeQA3VGyVGXPGtLMC+CdAM9jLpUyg6jw2xh0esxi+tYH7Uw== - dependencies: - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.0.0" - invariant "^2.2.4" - metro-symbolicate "0.70.3" - nullthrows "^1.1.1" - ob1 "0.70.3" - source-map "^0.5.6" - vlq "^1.0.0" - -metro-symbolicate@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.70.3.tgz#b039e5629c4ed0c999ea0496d580e1c98260f5cb" - integrity sha512-JTYkF1dpeDUssQ84juE1ycnhHki2ylJBBdJE1JHtfu5oC+z1ElDbBdPHq90Uvt8HbRov/ZAnxvv7Zy6asS+WCA== - dependencies: - invariant "^2.2.4" - metro-source-map "0.70.3" - nullthrows "^1.1.1" - source-map "^0.5.6" - through2 "^2.0.1" - vlq "^1.0.0" - -metro-transform-plugins@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.70.3.tgz#7fe87cd0d8979b4d5d6e375751d86188fff38fd9" - integrity sha512-dQRIJoTkWZN2IVS2KzgS1hs7ZdHDX3fS3esfifPkqFAEwHiLctCf0EsPgIknp0AjMLvmGWfSLJigdRB/dc0ASw== - dependencies: - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.14.0" - nullthrows "^1.1.1" - -metro-transform-worker@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.70.3.tgz#62bfa28ebef98803531c4bcb558de5fc804c94ef" - integrity sha512-MtVVsnHhhBOp9GRLCdAb2mD1dTCsIzT4+m34KMRdBDCEbDIb90YafT5prpU8qbj5uKd0o2FOQdrJ5iy5zQilHw== - dependencies: - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/types" "^7.0.0" - babel-preset-fbjs "^3.4.0" - metro "0.70.3" - metro-babel-transformer "0.70.3" - metro-cache "0.70.3" - metro-cache-key "0.70.3" - metro-hermes-compiler "0.70.3" - metro-source-map "0.70.3" - metro-transform-plugins "0.70.3" - nullthrows "^1.1.1" - -metro@0.70.3, metro@^0.70.1: - version "0.70.3" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.70.3.tgz#4290f538ab5446c7050e718b5c5823eea292c5c2" - integrity sha512-uEWS7xg8oTetQDABYNtsyeUjdLhH3KAvLFpaFFoJqUpOk2A3iygszdqmjobFl6W4zrvKDJS+XxdMR1roYvUhTw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.0.0" - absolute-path "^0.0.0" - accepts "^1.3.7" - async "^3.2.2" - chalk "^4.0.0" - ci-info "^2.0.0" - connect "^3.6.5" - debug "^2.2.0" - denodeify "^1.2.1" - error-stack-parser "^2.0.6" - fs-extra "^1.0.0" - graceful-fs "^4.2.4" - hermes-parser "0.6.0" - image-size "^0.6.0" - invariant "^2.2.4" - jest-haste-map "^27.3.1" - jest-worker "^27.2.0" - lodash.throttle "^4.1.1" - metro-babel-transformer "0.70.3" - metro-cache "0.70.3" - metro-cache-key "0.70.3" - metro-config "0.70.3" - metro-core "0.70.3" - metro-hermes-compiler "0.70.3" - metro-inspector-proxy "0.70.3" - metro-minify-uglify "0.70.3" - metro-react-native-babel-preset "0.70.3" - metro-resolver "0.70.3" - metro-runtime "0.70.3" - metro-source-map "0.70.3" - metro-symbolicate "0.70.3" - metro-transform-plugins "0.70.3" - metro-transform-worker "0.70.3" - mime-types "^2.1.27" - node-fetch "^2.2.0" - nullthrows "^1.1.1" - rimraf "^2.5.4" - serialize-error "^2.1.0" - source-map "^0.5.6" - strip-ansi "^6.0.0" - temp "0.8.3" - throat "^5.0.0" - ws "^7.5.1" - yargs "^15.3.1" - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0, minimist-options@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -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== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mixme@^0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.4.tgz#8cb3bd0cd32a513c161bf1ca99d143f0bcf2eff3" - integrity sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mmd-parser@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mmd-parser/-/mmd-parser-1.0.4.tgz#87cc05782cb5974ca854f0303fc5147bc9d690e7" - integrity sha512-Qi0VCU46t2IwfGv5KF0+D/t9cizcDug7qnNoy9Ggk7aucp0tssV8IwTMkBlDbm+VqAf3cdQHTCARKSsuS2MYFg== - -mri@^1.1.5: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1, ms@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multimatch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" - integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -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== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.5.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nocache@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" - integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== - -node-dir@^0.1.17: - version "0.1.17" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" - integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= - dependencies: - minimatch "^3.0.2" - -node-fetch@^2.2.0, node-fetch@^2.6.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-releases@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" - integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -node-stream-zip@^1.9.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" - integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-bundled@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^2.1.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" - integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== - dependencies: - glob "^7.1.6" - ignore-walk "^3.0.3" - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0, npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nullthrows@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" - integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -ob1@0.70.3: - version "0.70.3" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.70.3.tgz#f48cd5a5abf54b0c423b1b06b6d4ff4d049816cb" - integrity sha512-Vy9GGhuXgDRY01QA6kdhToPd8AkLdLpX9GjH5kpqluVqTu70mgOm7tpGoJDZGaNbr9nJlJgnipqHJQRPORixIQ== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.hasown@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" - integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^6.2.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" - integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== - dependencies: - is-wsl "^1.1.0" - -opentype.js@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/opentype.js/-/opentype.js-1.3.4.tgz#1c0e72e46288473cc4a4c6a2dc60fd7fe6020d77" - integrity sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw== - dependencies: - string.prototype.codepointat "^0.2.1" - tiny-inflate "^1.0.3" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -outdent@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" - integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== - -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0, parse-json@^5.1.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6, path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" - integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -plist@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" - integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== - dependencies: - base64-js "^1.5.1" - xmlbuilder "^9.0.7" - -plist@^3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" - integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== - dependencies: - base64-js "^1.5.1" - xmlbuilder "^15.1.1" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-value-parser@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -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== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -potpack@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" - integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== - -preferred-pm@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.3.tgz#1b6338000371e3edbce52ef2e4f65eb2e73586d6" - integrity sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ== - dependencies: - find-up "^5.0.0" - find-yarn-workspace-root2 "1.2.16" - path-exists "^4.0.0" - which-pm "2.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== - -pretty-format@^26.5.2, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -pretty-format@^27.0.2, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^29.0.0, pretty-format@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" - integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-quick@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e" - integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA== - dependencies: - chalk "^3.0.0" - execa "^4.0.0" - find-up "^4.1.0" - ignore "^5.1.4" - mri "^1.1.5" - multimatch "^4.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" - integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1, prompts@^2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.0, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -react-composer@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/react-composer/-/react-composer-5.0.3.tgz#7beb9513da5e8687f4f434ea1333ef36a4f3091b" - integrity sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA== - dependencies: - prop-types "^15.6.0" - -react-devtools-core@4.24.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.0.tgz#7daa196bdc64f3626b3f54f2ff2b96f7c4fdf017" - integrity sha512-Rw7FzYOOzcfyUPaAm9P3g0tFdGqGq2LLiAI+wjYcp6CsF3DeeMrRS3HZAho4s273C29G/DJhx0e8BpRE/QZNGg== - dependencies: - shell-quote "^1.6.1" - ws "^7" - -react-dom@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0.tgz#26b88534f8f1dbb80853e1eabe752f24100d8023" - integrity sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.21.0" - -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.0.0.tgz#026f6c4a27dbe33bf4a35655b9e1327c4e55e3f5" - integrity sha512-yUcBYdBBbo3QiPsgYDcfQcIkGZHfxOaoE6HLSnr1sPzMhdyxusbfKOSUbSd/ocGi32dxcj366PsTj+5oggeKKw== - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-merge-refs@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" - integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== - -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" - integrity sha512-TOZEqBarczcyYN3iZE3VpKkooOevaAzBq9n7lU0h9mQUvtRhLVyolc+a5K6cWI0e4v4K69I0MqzjPcPeFKo32Q== - dependencies: - "@babel/parser" "^7.14.0" - flow-parser "^0.121.0" - jscodeshift "^0.13.1" - nullthrows "^1.1.1" - -react-native-gradle-plugin@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.7.tgz#96602f909745239deab7b589443f14fce5da2056" - integrity sha512-+4JpbIx42zGTONhBTIXSyfyHICHC29VTvhkkoUOJAh/XHPEixpuBduYgf6Y4y9wsN1ARlQhBBoptTvXvAFQf5g== - -react-native@0.69.3: - version "0.69.3" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.69.3.tgz#8fc7afe0a302294262a6b49ba2089483db734c05" - integrity sha512-SyGkcoEUa/BkO+wKVnv4OsnLSNfUM5zLNXS3iT/3eXjKX91/FKBH/nfR9BE1c60X5LQe/P5QYqr6WPX3TRSQkA== - dependencies: - "@jest/create-cache-key-function" "^27.0.1" - "@react-native-community/cli" "^8.0.3" - "@react-native-community/cli-platform-android" "^8.0.2" - "@react-native-community/cli-platform-ios" "^8.0.2" - "@react-native/assets" "1.0.0" - "@react-native/normalize-color" "2.0.0" - "@react-native/polyfills" "2.0.0" - abort-controller "^3.0.0" - anser "^1.4.9" - base64-js "^1.1.2" - event-target-shim "^5.0.1" - hermes-engine "~0.11.0" - invariant "^2.2.4" - jsc-android "^250230.2.1" - memoize-one "^5.0.0" - metro-react-native-babel-transformer "0.70.3" - metro-runtime "0.70.3" - metro-source-map "0.70.3" - mkdirp "^0.5.1" - nullthrows "^1.1.1" - pretty-format "^26.5.2" - promise "^8.0.3" - react-devtools-core "4.24.0" - react-native-codegen "^0.69.1" - react-native-gradle-plugin "^0.0.7" - react-refresh "^0.4.0" - react-shallow-renderer "16.15.0" - regenerator-runtime "^0.13.2" - scheduler "^0.21.0" - stacktrace-parser "^0.1.3" - use-sync-external-store "^1.0.0" - 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== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.21.0" - -react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== - -react-refresh@^0.4.0: - version "0.4.3" - 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.13.1: - version "16.15.0" - resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" - integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== - dependencies: - object-assign "^4.1.1" - react-is "^16.12.0 || ^17.0.0 || ^18.0.0" - -react-test-renderer@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.0.0.tgz#fa403d625ea9478a70ace43db88833f6c3a5bb4c" - integrity sha512-SyZTP/FSkwfiKOZuTZiISzsrC8A80KNlQ8PyyoGoOq+VzMAab6Em1POK/CiX3+XyXG6oiJa1C53zYDbdrJu9fw== - dependencies: - react-is "^18.0.0" - react-shallow-renderer "^16.13.1" - scheduler "^0.21.0" - -react-use-measure@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba" - integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig== - dependencies: - debounce "^1.2.1" - -react-use-refs@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" - integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== - -react@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" - integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A== - dependencies: - loose-envify "^1.1.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -read-yaml-file@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" - integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== - dependencies: - graceful-fs "^4.1.5" - js-yaml "^3.6.1" - pify "^4.0.1" - strip-bom "^3.0.0" - -readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readline@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" - integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= - -recast@^0.20.4: - version "0.20.5" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" - integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== - dependencies: - ast-types "0.14.2" - esprima "~4.0.0" - source-map "~0.6.1" - tslib "^2.0.1" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp-to-ast@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz#56c73856bee5e1fef7f73a00f1473452ab712a24" - integrity sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw== - -regexp.prototype.flags@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regexpu-core@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" - integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== - -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== - dependencies: - jsesc "~0.5.0" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve.exports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" - integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== - -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^2.5.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= - -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - 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== - optionalDependencies: - fsevents "~2.3.2" - -rollup@^2.32.0: - version "2.70.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.2.tgz#808d206a8851628a065097b7ba2053bd83ba0c0d" - integrity sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.5: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" - integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== - dependencies: - loose-envify "^1.1.0" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.5.3: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= - -serve-static@^1.13.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1, shell-quote@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-plist@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" - integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== - dependencies: - bplist-creator "0.1.0" - bplist-parser "0.3.1" - plist "^3.0.5" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slugify@^1.3.4: - version "1.6.5" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.5.tgz#c8f5c072bf2135b80703589b39a3d41451fbe8c8" - integrity sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ== - -smartwrap@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-1.2.5.tgz#45ee3e09ac234e5f7f17c16e916f511834f3cd23" - integrity sha512-bzWRwHwu0RnWjwU7dFy7tF68pDAx/zMSu3g7xr9Nx5J0iSImYInglwEVExyHLxXljy6PWMjkSAbwF7t2mPnRmg== - dependencies: - breakword "^1.0.5" - grapheme-splitter "^1.0.4" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - yargs "^15.1.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - 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-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3, source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spawndamnit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" - integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== - dependencies: - cross-spawn "^5.1.0" - signal-exit "^3.0.2" - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.1.tgz#1033a3473ee67f08e2f2fc8eba6aef4f845124e1" - integrity sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg== - -stacktrace-parser@^0.1.3: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stats.js@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d" - integrity sha1-scPcRtlEmLV4t/05hbgaznExzH0= - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-buffers@2.2.x: - version "2.2.0" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" - integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== - -stream-transform@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" - integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== - dependencies: - mixme "^0.5.1" - -string-argv@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - 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: - 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== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: - 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.codepointat@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc" - integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== - -string.prototype.matchall@^4.0.6: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" - side-channel "^1.0.4" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -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" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - 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== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-components@^5.3.5: - version "5.3.5" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.5.tgz#a750a398d01f1ca73af16a241dec3da6deae5ec4" - integrity sha512-ndETJ9RKaaL6q41B69WudeqLzOpY1A/ET/glXkNZ2T7dPjPqpPCXXQjDFYZWwNnE5co0wX+gTCqx9mfxTmSIPg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -sucrase@^3.20.0: - version "3.25.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.25.0.tgz#6dffa34e614b3347877507a4380cc4f022b7b7aa" - integrity sha512-WxTtwEYXSmZArPGStGBicyRsg5TBEFhT5b7N+tF+zauImP0Acy+CoUK0/byJ8JNPK/5lbpWIVuFagI4+0l85QQ== - dependencies: - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -sudo-prompt@^9.0.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" - integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^9.2.1: - version "9.2.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.2.tgz#502acaf82f2b7ee78eb7c83dcac0f89694e5a7bb" - integrity sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA== - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -suspend-react@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/suspend-react/-/suspend-react-0.0.8.tgz#b0740c1386b4eb652f17affe4339915ee268bd31" - integrity sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg== - -suspend-react@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/suspend-react/-/suspend-react-0.1.3.tgz#a52f49d21cfae9a2fb70bd0c68413d3f9d90768e" - integrity sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - -temp@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" - integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== - dependencies: - rimraf "~2.6.2" - -term-size@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" - integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser@^5.2.1: - version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" - integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== - dependencies: - acorn "^8.5.0" - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -three-mesh-bvh@^0.5.23: - version "0.5.24" - resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.5.24.tgz#56dd27ad35bfbafacedaba4a4d567723bbdd686c" - integrity sha512-VTIgfjz8aFoPKTQoMIQQv9jJD4ybFRZuKKE1/kqy78FQcuHQ0+iIWv7C5cSb2inlvs7bNMVY3yRx3RXGZfrvzQ== - -three-stdlib@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.13.0.tgz#48baf2f85a781437e42cd53f672ea44ccce4a801" - integrity sha512-hFTTX6K6y8jrDREtzx1nl029rcOYJ5R8YBWg7M3s7uhcAx0fhs4d8tS+dj82vPksLDlMW8Pu/x0CVTRrqiUFDQ== - dependencies: - "@babel/runtime" "^7.16.7" - "@webgpu/glslang" "^0.0.15" - chevrotain "^10.1.2" - draco3d "^1.4.1" - fflate "^0.6.9" - ktx-parse "^0.2.1" - mmd-parser "^1.0.4" - opentype.js "^1.3.3" - potpack "^1.0.1" - zstddec "^0.0.2" - -three-stdlib@^2.23.5: - version "2.23.9" - resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.23.9.tgz#09c74fc6acced3d124e4f9d695156136c587a355" - integrity sha512-fYBClVGQptD7UZcoRZGNlR3sKcUW37hVPoEW1v68E4XuiwD0Ml/VqDUJ0yEMVE2DlooDvqgqv/rIcHC/B4N5pg== - dependencies: - "@types/draco3d" "^1.4.0" - "@types/offscreencanvas" "^2019.6.4" - "@types/webxr" "^0.5.2" - chevrotain "^10.1.2" - draco3d "^1.4.1" - fflate "^0.6.9" - ktx-parse "^0.4.5" - mmd-parser "^1.0.4" - opentype.js "^1.3.3" - potpack "^1.0.1" - zstddec "^0.0.2" - -three@^0.141.0: - version "0.141.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" - integrity sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA== - -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tiny-inflate@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" - integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -troika-three-text@^0.47.1: - version "0.47.2" - resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.47.2.tgz#fdf89059c010563bb829262b20c41f69ca79b712" - integrity sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng== - dependencies: - bidi-js "^1.0.2" - troika-three-utils "^0.47.2" - troika-worker-utils "^0.47.2" - webgl-sdf-generator "1.1.1" - -troika-three-utils@^0.47.2: - version "0.47.2" - resolved "https://registry.yarnpkg.com/troika-three-utils/-/troika-three-utils-0.47.2.tgz#af49ca694245dce631963d5fefe4e8e1b8af9044" - integrity sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg== - -troika-worker-utils@^0.47.2: - version "0.47.2" - resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz#e7c5de5f37d56c072b13fa8112bb844e048ff46c" - integrity sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -ts-jest@^27.1.4: - version "27.1.4" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00" - integrity sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "20.x" - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.1, tslib@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tty-table@^2.8.10: - version "2.8.13" - resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-2.8.13.tgz#d484a416381973eaebbdf19c79136b390e5c6d70" - integrity sha512-eVV/+kB6fIIdx+iUImhXrO22gl7f6VmmYh0Zbu6C196fe1elcHXd7U6LcLXu0YoVPc2kNesWiukYcdK8ZmJ6aQ== - dependencies: - chalk "^3.0.0" - csv "^5.3.1" - smartwrap "^1.2.3" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - yargs "^15.1.0" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== - -uglify-es@^3.1.9: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.0, universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse@^1.5.9: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-error-boundary@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/use-error-boundary/-/use-error-boundary-2.0.6.tgz#10f0cd45f6e53cedca8a567fa2b7bc8c709e4420" - integrity sha512-AWCVKSAanLe6R/on/ZkHYtGKfXs8BQX6z/TUGYqtvkajLqQyrGKJJscbahtq8OyN8L3LqTRjJWx4gCOLmfIObw== - -use-sync-external-store@1.2.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@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vite@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.7.tgz#f1e379857e9c5d652126f8b20d371e1365eb700f" - integrity sha512-dILhvKba1mbP1wCezVQx/qhEK7/+jVn9ciadEcyKMMhZpsuAi/eWZfJRMkmYlkSFG7Qq9NvJbgFq4XOBxugJsA== - dependencies: - esbuild "^0.14.47" - postcss "^8.4.16" - resolve "^1.22.1" - rollup ">=2.75.6 <2.77.0 || ~2.77.0" - optionalDependencies: - fsevents "~2.3.2" - -vlq@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" - integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -webgl-constants@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/webgl-constants/-/webgl-constants-1.1.1.tgz#f9633ee87fea56647a60b9ce735cbdfb891c6855" - integrity sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg== - -webgl-sdf-generator@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz#3e1b422b3d87cd3cc77f2602c9db63bc0f6accbd" - integrity sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-pm@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" - integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== - dependencies: - load-yaml-file "^0.2.0" - path-exists "^4.0.0" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "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== - -wouter@^2.8.0-alpha.2: - version "2.8.0-alpha.2" - resolved "https://registry.yarnpkg.com/wouter/-/wouter-2.8.0-alpha.2.tgz#d57dfbd23b964b8bd848f2ed3eb2b38cf3c00e00" - integrity sha512-aPsL5m5rW9RiceClOmGj6t5gn9Ut2TJVr98UDi1u9MIRNYiYVflg6vFIjdDYJ4IAyH0JdnkSgGwfo0LQS3k2zg== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.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== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^2.3.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^6.1.4: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -ws@^7, ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== - -ws@^7.5.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xcode@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" - integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== - dependencies: - simple-plist "^1.1.0" - uuid "^7.0.3" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xml2js@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" - integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" - integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== - -xmlbuilder@^15.1.1: - version "15.1.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" - integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== - -xmlbuilder@^9.0.7: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@20.x, yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^18.1.2, yargs-parser@^18.1.3: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.1.0, yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zstddec@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/zstddec/-/zstddec-0.0.2.tgz#57e2f28dd1ff56b750e07d158a43f0611ad9eeb4" - integrity sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA== - -zustand@^3.5.13, zustand@^3.7.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" - integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA== - -zustand@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.1.2.tgz#4912b24741662d8a84ed1cb52198471cb369c4b6" - integrity sha512-gcRaKchcxFPbImrBb/BKgujOhHhik9YhVpIeP87ETT7uokEe2Szu7KkuZ9ghjtD+/KKkcrRNktR2AiLXPIbKIQ== - dependencies: - use-sync-external-store "1.2.0" From a30b2e16c608165f4befca8b24f22533d20d1c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Mon, 22 Jan 2024 14:02:48 +0100 Subject: [PATCH 153/252] new examples --- docs/getting-started/examples.mdx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/examples.mdx b/docs/getting-started/examples.mdx index 620d7cbb50..6134008ed4 100644 --- a/docs/getting-started/examples.mdx +++ b/docs/getting-started/examples.mdx @@ -8,10 +8,13 @@ nav: 3
  • - +
  • +
  • + +
  • @@ -30,6 +33,9 @@ nav: 3
  • +
  • + +
  • @@ -56,6 +62,12 @@ nav: 3
  • +
  • + +
  • +
  • + +
  • @@ -338,7 +350,7 @@ nav: 3
  • - +
  • From f2d8adff4dad33861c8fab58d5bd957973ad236d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Fri, 12 Jan 2024 22:31:24 +0100 Subject: [PATCH 154/252] docs(changeset): fix: portal events, update examples --- .changeset/new-moles-eat.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/new-moles-eat.md diff --git a/.changeset/new-moles-eat.md b/.changeset/new-moles-eat.md new file mode 100644 index 0000000000..631b79d4dd --- /dev/null +++ b/.changeset/new-moles-eat.md @@ -0,0 +1,5 @@ +--- +'@react-three/fiber': patch +--- + +fix: portal events, update examples From db77e1635c84f7eda2218bec8c9089121349574c Mon Sep 17 00:00:00 2001 From: satelllte Date: Tue, 23 Jan 2024 01:50:16 +0200 Subject: [PATCH 155/252] chore(ci): matrix (#3146) --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c92149b26c..778420b5ef 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,10 +13,10 @@ jobs: - name: Checkout repo uses: actions/checkout@v4 - - name: Use Node ${{ matrix.node }} + - name: Use Node 18 uses: actions/setup-node@v3 with: - node-version: ${{ matrix.node }} + node-version: 18 - name: Install deps and build (with cache) uses: bahmutov/npm-install@v1 From 888f21367b565e55ec0f1ebd298e14f003236e65 Mon Sep 17 00:00:00 2001 From: satelllte Date: Tue, 23 Jan 2024 21:21:15 +0200 Subject: [PATCH 156/252] csb: node 18 (#3157) --- .codesandbox/ci.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json index a44a0e1b69..2b62ff8e38 100644 --- a/.codesandbox/ci.json +++ b/.codesandbox/ci.json @@ -1,4 +1,4 @@ { "sandboxes": ["/example"], - "node": "14" + "node": "18" } From 0d4011c9644b01cb6446833eae4408f01c26570c Mon Sep 17 00:00:00 2001 From: satelllte Date: Tue, 23 Jan 2024 21:23:25 +0200 Subject: [PATCH 157/252] chore(CI): setup-node v4 (#3144) --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 778420b5ef..a1645c6a8c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@v4 - name: Use Node 18 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 From 4fc5cfef814a3ade4d39f97f2eef4e839cd80594 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 20 Mar 2024 19:24:44 -0700 Subject: [PATCH 158/252] fix: tonemapping config overwrites userland --- packages/fiber/src/core/renderer.tsx | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 628ea67610..64453aec5d 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -361,15 +361,17 @@ export function createRoot(canvas: TCanvas): ReconcilerR } // Set color space and tonemapping preferences - const LinearEncoding = 3000 - const sRGBEncoding = 3001 - applyProps( - gl as any, - { - outputEncoding: linear ? LinearEncoding : sRGBEncoding, - toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping, - } as Partial>, - ) + if (!configured) { + const LinearEncoding = 3000 + const sRGBEncoding = 3001 + applyProps( + gl as any, + { + outputEncoding: linear ? LinearEncoding : sRGBEncoding, + toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping, + } as Partial>, + ) + } // Update color management state if (state.legacy !== legacy) state.set(() => ({ legacy })) From bbb3a032f9d7f7095e86bc3e5d1c598b37392ab3 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Thu, 21 Mar 2024 00:44:18 -0700 Subject: [PATCH 159/252] chore(tests): update color management checks --- packages/fiber/tests/index.test.tsx | 63 +++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index 3768649f0c..a58458149f 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -2,9 +2,10 @@ import * as React from 'react' import * as THREE from 'three' import ts from 'typescript' import * as path from 'path' +import { createCanvas } from '@react-three/test-renderer/src/createTestCanvas' import { ReconcilerRoot, - createRoot, + createRoot as createRootImpl, act, useFrame, useThree, @@ -16,9 +17,23 @@ import { extend(THREE as any) let root: ReconcilerRoot = null! +const roots: ReconcilerRoot[] = [] -beforeEach(() => (root = createRoot(document.createElement('canvas')))) -afterEach(async () => act(async () => root.unmount())) +function createRoot() { + const canvas = createCanvas() + const root = createRootImpl(canvas) + roots.push(root) + return root +} + +beforeEach(() => (root = createRoot())) + +afterEach(async () => { + for (const root of roots) { + await act(async () => root.unmount()) + } + roots.length = 0 +}) describe('createRoot', () => { it('should return a Zustand store', async () => { @@ -171,22 +186,34 @@ describe('createRoot', () => { }) it('should respect color management preferences via gl', async () => { - const texture = new THREE.Texture() as THREE.Texture & { colorSpace?: string } + let gl: THREE.WebGLRenderer & { outputColorSpace?: string } = null! + let texture: THREE.Texture & { colorSpace?: string } = null! + let key = 0 - function Test() { + function Test({ colorSpace = false }) { + gl = useThree((state) => state.gl) + texture = new THREE.Texture() return } const LinearEncoding = 3000 const sRGBEncoding = 3001 - let gl: THREE.WebGLRenderer & { outputColorSpace?: string } = null! - await act(async () => (gl = root.render().getState().gl)) + await act(async () => createRoot().render()) expect(gl.outputEncoding).toBe(sRGBEncoding) expect(gl.toneMapping).toBe(THREE.ACESFilmicToneMapping) expect(texture.encoding).toBe(sRGBEncoding) - await act(async () => root.configure({ linear: true, flat: true }).render()) + // @ts-ignore + THREE.WebGLRenderer.prototype.outputColorSpace ??= '' + // @ts-ignore + THREE.Texture.prototype.colorSpace ??= '' + + await act(async () => + createRoot() + .configure({ linear: true, flat: true }) + .render(), + ) expect(gl.outputEncoding).toBe(LinearEncoding) expect(gl.toneMapping).toBe(THREE.NoToneMapping) expect(texture.encoding).toBe(LinearEncoding) @@ -195,16 +222,26 @@ describe('createRoot', () => { const SRGBColorSpace = 'srgb' const LinearSRGBColorSpace = 'srgb-linear' - gl.outputColorSpace ??= '' - texture.colorSpace ??= '' - - await act(async () => root.configure({ linear: true }).render()) + await act(async () => + createRoot() + .configure({ linear: true }) + .render(), + ) expect(gl.outputColorSpace).toBe(LinearSRGBColorSpace) expect(texture.colorSpace).toBe(LinearSRGBColorSpace) - await act(async () => root.configure({ linear: false }).render()) + await act(async () => + createRoot() + .configure({ linear: false }) + .render(), + ) expect(gl.outputColorSpace).toBe(SRGBColorSpace) expect(texture.colorSpace).toBe(SRGBColorSpace) + + // @ts-ignore + delete THREE.WebGLRenderer.prototype.outputColorSpace + // @ts-ignore + delete THREE.Texture.prototype.colorSpace }) it('should respect legacy prop', async () => { From 4689d0ebcc70481eee2f22055fb184ea43f7b7ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=94?= Date: Thu, 15 Feb 2024 12:14:56 +0100 Subject: [PATCH 160/252] new sandboxes --- docs/getting-started/examples.mdx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/examples.mdx b/docs/getting-started/examples.mdx index 6134008ed4..124bc4fae2 100644 --- a/docs/getting-started/examples.mdx +++ b/docs/getting-started/examples.mdx @@ -8,10 +8,13 @@ nav: 3
  • - +
  • +
  • + +
  • @@ -33,11 +36,11 @@ nav: 3
  • +
    +
  • -
    -
  • @@ -59,6 +62,9 @@ nav: 3
  • +
  • + +
  • @@ -363,6 +369,9 @@ nav: 3
  • +
  • + +
  • From 0b82cdde69feb2efe651bf3560d95b77a9729b13 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Thu, 21 Mar 2024 00:51:49 -0700 Subject: [PATCH 161/252] fix: correctly pass frames in invalidate (#3185) --- packages/fiber/src/core/loop.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 1f71cb2fa4..1995d8f402 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -120,7 +120,7 @@ export function loop(timestamp: number): void { * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate */ export function invalidate(state?: RootState, frames = 1): void { - if (!state) return _roots.forEach((root) => invalidate(root.store.getState()), frames) + if (!state) return _roots.forEach((root) => invalidate(root.store.getState(), frames)) if (state.gl.xr?.isPresenting || !state.internal.active || state.frameloop === 'never') return // Increase frames, do not go higher than 60 state.internal.frames = Math.min(60, state.internal.frames + frames) From 765ae0466021f3d20fb8871f94fbe9c10e45da0a Mon Sep 17 00:00:00 2001 From: drcmda Date: Mon, 4 Mar 2024 23:19:52 +0100 Subject: [PATCH 162/252] Update readme.md --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 51e403b897..a73190104d 100644 --- a/readme.md +++ b/readme.md @@ -237,6 +237,7 @@ There is a vibrant and extensive eco system around three-fiber, full of librarie - [`@react-three/drei`](https://github.com/pmndrs/drei) – useful helpers, this is an eco system in itself - [`@react-three/gltfjsx`](https://github.com/pmndrs/gltfjsx) – turns GLTFs into JSX components - [`@react-three/postprocessing`](https://github.com/pmndrs/react-postprocessing) – post-processing effects +- [`@react-three/uikit`](https://github.com/pmndrs/uikit) – WebGL rendered UI components for three-fiber - [`@react-three/test-renderer`](https://github.com/pmndrs/react-three-fiber/tree/master/packages/test-renderer) – for unit tests in node - [`@react-three/offscreen`](https://github.com/pmndrs/react-three-offscreen) – offscreen/worker canvas for react-three-fiber - [`@react-three/flex`](https://github.com/pmndrs/react-three-flex) – flexbox for react-three-fiber From 0b4b51ab3d911446e941a52c2e8001fd8f9bb94b Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 27 Mar 2024 18:02:03 -0500 Subject: [PATCH 163/252] chore: resolve conflicts a4a31ed93c48d1e6dac91329bb5f2ca6a25e5f9c #3214 Misc transient Zustand changes --- packages/fiber/src/core/hooks.tsx | 3 ++- packages/fiber/src/core/reconciler.tsx | 15 +++++++++-- packages/fiber/src/core/renderer.tsx | 5 +--- packages/fiber/src/core/store.ts | 2 +- packages/fiber/src/core/utils.tsx | 17 +++++++++--- packages/fiber/tests/hooks.test.tsx | 26 +++++++++---------- packages/fiber/tests/utils.test.ts | 5 ++-- .../src/__tests__/RTTR.hooks.test.tsx | 16 +++++------- 8 files changed, 50 insertions(+), 39 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 4746c12657..623c957f65 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -35,7 +35,8 @@ export function useThree( selector: (state: RootState) => T = (state) => state as unknown as T, equalityFn?: (state: T, newState: T) => boolean, ): T { - return useStore()(selector, equalityFn) + // TODO: fix this type + return useStore()(selector, equalityFn as any) } /** diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 92055e4e0a..cda6204490 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -3,7 +3,17 @@ import * as React from 'react' import Reconciler from 'react-reconciler' import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' -import { diffProps, applyProps, invalidateInstance, attach, detach, prepare, globalScope, isObject3D } from './utils' +import { + diffProps, + applyProps, + invalidateInstance, + attach, + detach, + prepare, + globalScope, + isObject3D, + findInitialRoot, +} from './utils' import type { RootStore } from './store' import { removeInteractivity, type EventHandlers } from './events' import type { ThreeElement } from '../three-types' @@ -143,6 +153,7 @@ function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: child.object.parent = parent.object parent.object.children.splice(childIndex, 0, child.object) child.object.dispatchEvent({ type: 'added' }) + parent.object.dispatchEvent({ type: 'childadded', child: child.object }) } else { parent.object.add(child.object) } @@ -203,7 +214,7 @@ function removeChild( detach(parent, child) } else if (isObject3D(child.object) && isObject3D(parent.object)) { parent.object.remove(child.object) - removeInteractivity(child.root, child.object) + removeInteractivity(findInitialRoot(child), child.object) } // Allow objects to bail out of unmount disposal with dispose={null} diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 64453aec5d..dd9749642a 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -1,7 +1,7 @@ import * as THREE from 'three' import * as React from 'react' import { ConcurrentRoot } from 'react-reconciler/constants' -import create from 'zustand' +import { create } from 'zustand' import type { Properties, ThreeElement } from '../three-types' import { @@ -567,9 +567,6 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { return store // eslint-disable-next-line react-hooks/exhaustive-deps }, [previousRoot, container]) - React.useEffect(() => { - return () => usePortalStore.destroy() - }, [usePortalStore]) return ( <> diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 2748558fe9..fe2b67cea7 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -1,6 +1,6 @@ import * as THREE from 'three' import * as React from 'react' -import create, { type StoreApi, type UseBoundStore } from 'zustand' +import { create, type StoreApi, type UseBoundStore } from 'zustand' import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' import { calculateDpr, type Camera, isOrthographicCamera, prepare, updateCamera } from './utils' import type { FixedStage, Stage } from './stages' diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 3fc123c65f..291c70edcd 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -1,11 +1,20 @@ import * as THREE from 'three' import * as React from 'react' import { useFiber, traverseFiber, useContextBridge } from 'its-fine' -import { catalogue } from './reconciler' +import { Instance, catalogue } from './reconciler' import type { Fiber } from 'react-reconciler' import type { EventHandlers } from './events' -import type { Dpr, Renderer, RootState, RootStore, Size } from './store' -import type { ConstructorRepresentation, Instance } from './reconciler' +import type { Dpr, Renderer, RootStore, Size } from './store' + +/** + * Returns the instance's initial (outmost) root. + */ +export function findInitialRoot(instance: Instance): RootStore { + let root = instance.root + // TODO: this needs testing https://github.com/pmndrs/react-three-fiber/commit/a4a31ed93c48d1e6dac91329bb5f2ca6a25e5f9c + // while (root.getState().previousRoot) root = root.getState().previousRoot! + return root +} /** * Returns `true` with correct TS type inference if an object has a configurable color space (since r152). @@ -366,7 +375,7 @@ const __DEV__ = typeof process !== 'undefined' && process.env.NODE_ENV !== 'prod // This function applies a set of changes to the instance export function applyProps(object: Instance['object'], props: Instance['props']): Instance['object'] { const instance = object.__r3f - const rootState = instance?.root.getState() + const rootState = instance && findInitialRoot(instance).getState() const prevHandlers = instance?.eventCount for (const prop in props) { diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index e5fd4d8928..e3e4dec5d0 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import * as THREE from 'three' -import * as Stdlib from 'three-stdlib' import { createCanvas } from '@react-three/test-renderer/src/createTestCanvas' import { @@ -88,22 +87,21 @@ describe('hooks', () => { }) it('can handle useLoader hook', async () => { - let gltf!: Stdlib.GLTF & ObjectMap - const MockMesh = new THREE.Mesh() MockMesh.name = 'Scene' - jest.spyOn(Stdlib, 'GLTFLoader').mockImplementation( - () => - ({ - load: jest.fn().mockImplementation((_url, onLoad) => { - onLoad({ scene: MockMesh }) - }), - } as unknown as Stdlib.GLTFLoader), - ) + interface GLTF { + scene: THREE.Object3D + } + class GLTFLoader extends THREE.Loader { + load(url: string, onLoad: (gltf: GLTF) => void): void { + onLoad({ scene: MockMesh }) + } + } + let gltf!: GLTF & ObjectMap const Component = () => { - gltf = useLoader(Stdlib.GLTFLoader, '/suzanne.glb') + gltf = useLoader(GLTFLoader, '/suzanne.glb') return } @@ -147,8 +145,8 @@ describe('hooks', () => { return ( <> - - + + ) } diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index d90e23ef2d..983d160b55 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -16,12 +16,11 @@ import { } from '../src/core/utils' // Mocks a Zustand store -const storeMock: RootStore = Object.assign(() => null!, { +const storeMock = Object.assign(() => null!, { getState: () => null!, setState() {}, subscribe: () => () => {}, - destroy() {}, -}) +}) as unknown as RootStore describe('is', () => { const myFunc = () => null diff --git a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx index f96a2f1348..9f9e1a796c 100644 --- a/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.hooks.test.tsx @@ -1,5 +1,4 @@ import * as React from 'react' -import * as Stdlib from 'three-stdlib' import * as THREE from 'three' import { useFrame, useLoader, useThree } from '@react-three/fiber' @@ -37,17 +36,14 @@ describe('ReactThreeTestRenderer Hooks', () => { it('can handle useLoader hook', async () => { const MockMesh = new THREE.Mesh() - jest.spyOn(Stdlib, 'GLTFLoader').mockImplementation( - () => - ({ - load: jest.fn().mockImplementation((_url, onLoad) => { - onLoad(MockMesh) - }), - } as unknown as Stdlib.GLTFLoader), - ) + class Loader extends THREE.Loader { + load(url: string, onLoad: (mesh: THREE.Mesh) => void): void { + onLoad(MockMesh) + } + } const Component = () => { - const model = useLoader(Stdlib.GLTFLoader, '/suzanne.glb') + const model = useLoader(Loader, '/suzanne.glb') return } From 18a5d7b16531897627a3497fb3b73a48ef90c6a3 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 27 Mar 2024 18:05:57 -0500 Subject: [PATCH 164/252] chore: add lockfile back --- yarn.lock | 11303 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 11303 insertions(+) create mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..2d23fa2f2b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,11303 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.5.5": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/code-frame@~7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" + integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== + +"@babel/core@7.17.8": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" + integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.7" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.8" + "@babel/parser" "^7.17.8" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + +"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.14.8", "@babel/core@^7.23.5", "@babel/core@^7.23.9", "@babel/core@^7.7.2", "@babel/core@^7.7.7", "@babel/core@^7.8.0": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" + integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.1" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.1" + "@babel/parser" "^7.24.1" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.14.0", "@babel/generator@^7.17.7", "@babel/generator@^7.24.1", "@babel/generator@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== + dependencies: + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" + integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2", "@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" + integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.17.7", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.17.8", "@babel/helpers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.17.8", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.24.1" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.16.7": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" + integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-export-default-from" "^7.24.1" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.11": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.21.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c" + integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" + integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz#875c25e3428d7896c87589765fc8b9d32f24bd8d" + integrity sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== + dependencies: + "@babel/helper-module-imports" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" + integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" + integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/template" "^7.24.0" + +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" + integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc" + integrity sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-flow" "^7.24.1" + +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== + dependencies: + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.24.1", "@babel/plugin-transform-modules-commonjs@^7.7.5": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" + +"@babel/plugin-transform-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" + integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.20.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" + integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" + integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.14.5", "@babel/plugin-transform-react-jsx-self@^7.23.3": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz#a21d866d8167e752c6a7c4555dba8afcdfce6268" + integrity sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.14.5", "@babel/plugin-transform-react-jsx-source@^7.23.3": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz#a2dedb12b09532846721b5df99e52ef8dc3351d0" + integrity sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" + integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-regenerator@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" + integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + dependencies: + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-plugin-utils" "^7.24.0" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" + integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-typescript@^7.24.1", "@babel/plugin-transform-typescript@^7.5.0": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz#5c05e28bb76c7dfe7d6c5bed9951324fd2d3ab07" + integrity sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-typescript" "^7.24.1" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/preset-env@7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + dependencies: + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" + semver "^6.3.0" + +"@babel/preset-flow@^7.13.13": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.1.tgz#da7196c20c2d7dd4e98cfd8b192fe53b5eb6f0bb" + integrity sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-transform-flow-strip-types" "^7.24.1" + +"@babel/preset-modules@^0.1.5": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz#31bcdd8f19538437339d17af00d177d854d9d458" + integrity sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" + integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-syntax-jsx" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-typescript" "^7.24.1" + +"@babel/register@^7.13.16": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.23.7.tgz#485a5e7951939d21304cae4af1719fdb887bc038" + integrity sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.6" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.0.0", "@babel/template@^7.16.7", "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.14.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.24.1", "@babel/traverse@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== + dependencies: + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@changesets/apply-release-plan@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.0.0.tgz#ce3c3dfc5720550a5d592b54ad2f411f816ec5ff" + integrity sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/config" "^3.0.0" + "@changesets/get-version-range-type" "^0.4.0" + "@changesets/git" "^3.0.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + detect-indent "^6.0.0" + fs-extra "^7.0.1" + lodash.startcase "^4.4.0" + outdent "^0.5.0" + prettier "^2.7.1" + resolve-from "^5.0.0" + semver "^7.5.3" + +"@changesets/assemble-release-plan@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.0.tgz#c69969b4bef7c32a8544b6941d1053260ca47e05" + integrity sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/errors" "^0.2.0" + "@changesets/get-dependents-graph" "^2.0.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + semver "^7.5.3" + +"@changesets/changelog-git@^0.1.11": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.1.14.tgz#852caa7727dcf91497c131d05bc2cd6248532ada" + integrity sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA== + dependencies: + "@changesets/types" "^5.2.1" + +"@changesets/changelog-git@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.2.0.tgz#1f3de11becafff5a38ebe295038a602403c93a86" + integrity sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ== + dependencies: + "@changesets/types" "^6.0.0" + +"@changesets/cli@^2.22.0": + version "2.27.1" + resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.27.1.tgz#abce480fd30b9abbe2cfcf07d5d668c364ce2804" + integrity sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/apply-release-plan" "^7.0.0" + "@changesets/assemble-release-plan" "^6.0.0" + "@changesets/changelog-git" "^0.2.0" + "@changesets/config" "^3.0.0" + "@changesets/errors" "^0.2.0" + "@changesets/get-dependents-graph" "^2.0.0" + "@changesets/get-release-plan" "^4.0.0" + "@changesets/git" "^3.0.0" + "@changesets/logger" "^0.1.0" + "@changesets/pre" "^2.0.0" + "@changesets/read" "^0.6.0" + "@changesets/types" "^6.0.0" + "@changesets/write" "^0.3.0" + "@manypkg/get-packages" "^1.1.3" + "@types/semver" "^7.5.0" + ansi-colors "^4.1.3" + chalk "^2.1.0" + ci-info "^3.7.0" + enquirer "^2.3.0" + external-editor "^3.1.0" + fs-extra "^7.0.1" + human-id "^1.0.2" + meow "^6.0.0" + outdent "^0.5.0" + p-limit "^2.2.0" + preferred-pm "^3.0.0" + resolve-from "^5.0.0" + semver "^7.5.3" + spawndamnit "^2.0.0" + term-size "^2.1.0" + tty-table "^4.1.5" + +"@changesets/config@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@changesets/config/-/config-3.0.0.tgz#a1a1cafc77134b117b4a9266459c84fdd360a6be" + integrity sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA== + dependencies: + "@changesets/errors" "^0.2.0" + "@changesets/get-dependents-graph" "^2.0.0" + "@changesets/logger" "^0.1.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + fs-extra "^7.0.1" + micromatch "^4.0.2" + +"@changesets/errors@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.2.0.tgz#3c545e802b0f053389cadcf0ed54e5636ff9026a" + integrity sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow== + dependencies: + extendable-error "^0.1.5" + +"@changesets/get-dependents-graph@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-2.0.0.tgz#97f0cc9fbec436e0d6ab95a6a59c08acf21ac714" + integrity sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA== + dependencies: + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + chalk "^2.1.0" + fs-extra "^7.0.1" + semver "^7.5.3" + +"@changesets/get-release-plan@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-4.0.0.tgz#8cb057da90a08796a335dfd18073234d33902069" + integrity sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/assemble-release-plan" "^6.0.0" + "@changesets/config" "^3.0.0" + "@changesets/pre" "^2.0.0" + "@changesets/read" "^0.6.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + +"@changesets/get-version-range-type@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz#429a90410eefef4368502c41c63413e291740bf5" + integrity sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ== + +"@changesets/git@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@changesets/git/-/git-3.0.0.tgz#e71d003752a97bc27988db6d410e0038a4a88055" + integrity sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/errors" "^0.2.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + is-subdir "^1.1.1" + micromatch "^4.0.2" + spawndamnit "^2.0.0" + +"@changesets/logger@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.1.0.tgz#2d2a58536c5beeeaef52ab464931d99fcf24f17b" + integrity sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g== + dependencies: + chalk "^2.1.0" + +"@changesets/parse@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.4.0.tgz#5cabbd9844b3b213cb83f5edb5768454c70dd2b4" + integrity sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw== + dependencies: + "@changesets/types" "^6.0.0" + js-yaml "^3.13.1" + +"@changesets/pre@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-2.0.0.tgz#ad3edf3d6ac287991d7ef5e26cf280d03c9e3764" + integrity sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/errors" "^0.2.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + fs-extra "^7.0.1" + +"@changesets/read@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.6.0.tgz#27e13b58d0b0eb3b0a5cba48a3f4f71f05ef4610" + integrity sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/git" "^3.0.0" + "@changesets/logger" "^0.1.0" + "@changesets/parse" "^0.4.0" + "@changesets/types" "^6.0.0" + chalk "^2.1.0" + fs-extra "^7.0.1" + p-filter "^2.1.0" + +"@changesets/types@^4.0.1": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" + integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== + +"@changesets/types@^5.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-5.2.1.tgz#a228c48004aa8a93bce4be2d1d31527ef3bf21f6" + integrity sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg== + +"@changesets/types@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-6.0.0.tgz#e46abda9890610dd1fbe1617730173d2267544bd" + integrity sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ== + +"@changesets/write@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.3.0.tgz#c6c5bc390cce4031da20eab8a4ca2d71453a1985" + integrity sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/types" "^6.0.0" + fs-extra "^7.0.1" + human-id "^1.0.2" + prettier "^2.7.1" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@emotion/is-prop-valid@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/unitless@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@expo/config-plugins@~7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.6.0.tgz#8183051a40e5d529a19d3135fd52253a85dc6586" + integrity sha512-2YX5xQhxSWVFS2BzMo8SVJPGuc6R/Ci2o4oeMT5F/JvdUut56pBCZietkkAxX9gOcIYMMTYFJllMn/Ecb5v4yQ== + dependencies: + "@expo/config-types" "^50.0.0-alpha.1" + "@expo/fingerprint" "^0.4.0" + "@expo/json-file" "~8.2.37" + "@expo/plist" "^0.0.20" + "@expo/sdk-runtime-versions" "^1.0.0" + "@react-native/normalize-color" "^2.0.0" + chalk "^4.1.2" + debug "^4.3.1" + find-up "~5.0.0" + getenv "^1.0.0" + glob "7.1.6" + resolve-from "^5.0.0" + semver "^7.5.3" + slash "^3.0.0" + xcode "^3.0.1" + xml2js "0.6.0" + +"@expo/config-types@^50.0.0-alpha.1": + version "50.0.0" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.0.tgz#b534d3ec997ec60f8af24f6ad56244c8afc71a0b" + integrity sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw== + +"@expo/config@~8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.4.0.tgz#75e89c89f4c35b98b7c7b3343971e1881b659ec0" + integrity sha512-m3LkkONHrGsoFASyi3VuxJON/McRwMOtU9tw9PC/XEhRy1HfRALxdqTMl0W5X79ra7kCXd8H5EVTbTl9pvU+bw== + dependencies: + "@babel/code-frame" "~7.10.4" + "@expo/config-plugins" "~7.6.0" + "@expo/config-types" "^50.0.0-alpha.1" + "@expo/json-file" "^8.2.37" + getenv "^1.0.0" + glob "7.1.6" + require-from-string "^2.0.2" + resolve-from "^5.0.0" + semver "7.5.3" + slugify "^1.3.4" + sucrase "^3.20.0" + +"@expo/fingerprint@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.4.1.tgz#345cfac07da7a9ccfc7384f99562bffa1c17a2d6" + integrity sha512-OjL/moP9IV5fV0oQc/cOcNNTW/FlwK4fUHtgeka/Fk4A7L4evpXOt9hfQgDtY6Ig0QHINAYvKpWrfCkPxEh2/Q== + dependencies: + "@expo/spawn-async" "^1.5.0" + chalk "^4.1.2" + debug "^4.3.4" + find-up "^5.0.0" + minimatch "^3.0.4" + p-limit "^3.1.0" + resolve-from "^5.0.0" + +"@expo/json-file@^8.2.37": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.0.tgz#fc84af77b532a4e9bfb5beafd0e3b7f692b6bd7e" + integrity sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^2.2.2" + write-file-atomic "^2.3.0" + +"@expo/json-file@~8.2.37": + version "8.2.37" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049" + integrity sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^2.2.2" + write-file-atomic "^2.3.0" + +"@expo/plist@^0.0.20": + version "0.0.20" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.20.tgz#a6b3124438031c02b762bad5a47b70584d3c0072" + integrity sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA== + dependencies: + "@xmldom/xmldom" "~0.7.7" + base64-js "^1.2.3" + xmlbuilder "^14.0.0" + +"@expo/sdk-runtime-versions@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" + integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== + +"@expo/spawn-async@^1.5.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.7.2.tgz#fcfe66c3e387245e72154b1a7eae8cada6a47f58" + integrity sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew== + dependencies: + cross-spawn "^7.0.3" + +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@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" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^27.0.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== + dependencies: + "@jest/types" "^27.5.1" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@manypkg/find-root@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" + integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== + dependencies: + "@babel/runtime" "^7.5.5" + "@types/node" "^12.7.1" + find-up "^4.1.0" + fs-extra "^8.1.0" + +"@manypkg/get-packages@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" + integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== + dependencies: + "@babel/runtime" "^7.5.5" + "@changesets/types" "^4.0.1" + "@manypkg/find-root" "^1.1.0" + fs-extra "^8.1.0" + globby "^11.0.0" + read-yaml-file "^1.1.0" + +"@mediapipe/tasks-vision@0.10.8": + version "0.10.8" + resolved "https://registry.yarnpkg.com/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz#a78e137018a19933b7a1d0e887d553d4ab833d10" + integrity sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@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== + +"@preconstruct/cli@^2.1.5": + version "2.8.3" + resolved "https://registry.yarnpkg.com/@preconstruct/cli/-/cli-2.8.3.tgz#1d483dc4d00726965a9293391ac9b3cd060ebf01" + integrity sha512-4PNEPcp8REUdqZIjtpXF1fqECuHt+pIS6k0PluSRcgX0KwPtfSw407Y2B/ItndgtRD3rKHXI6cKkwh/6Mc4TXg== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/core" "^7.7.7" + "@babel/helper-module-imports" "^7.10.4" + "@babel/runtime" "^7.7.7" + "@preconstruct/hook" "^0.4.0" + "@rollup/plugin-alias" "^3.1.1" + "@rollup/plugin-commonjs" "^15.0.0" + "@rollup/plugin-json" "^4.1.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + builtin-modules "^3.1.0" + chalk "^4.1.0" + ci-info "^3.8.0" + dataloader "^2.0.0" + detect-indent "^6.0.0" + enquirer "^2.3.6" + estree-walker "^2.0.1" + fast-deep-equal "^2.0.1" + fast-glob "^3.2.4" + fs-extra "^9.0.1" + is-reference "^1.2.1" + jest-worker "^26.3.0" + magic-string "^0.30.0" + meow "^7.1.0" + ms "^2.1.2" + normalize-path "^3.0.0" + npm-packlist "^2.1.2" + p-limit "^3.0.2" + parse-glob "^3.0.4" + parse-json "^5.1.0" + quick-lru "^5.1.1" + resolve "^1.17.0" + resolve-from "^5.0.0" + rollup "^2.79.1" + semver "^7.3.4" + terser "^5.16.8" + v8-compile-cache "^2.1.1" + zod "^3.21.4" + +"@preconstruct/hook@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@preconstruct/hook/-/hook-0.4.0.tgz#c15dfacfc6e60652a6837209c2fd87f0240b099e" + integrity sha512-a7mrlPTM3tAFJyz43qb4pPVpUx8j8TzZBFsNFqcKcE/sEakNXRlQAuCT4RGZRf9dQiiUnBahzSIWawU4rENl+Q== + dependencies: + "@babel/core" "^7.7.7" + "@babel/plugin-transform-modules-commonjs" "^7.7.5" + pirates "^4.0.1" + source-map-support "^0.5.16" + +"@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" + integrity sha512-IwS1M1NHg6+qL8PThZYMSIMYbZ6Zbx+lIck9PLBskbosFo24M3lCOflOl++Bggjakp6mR+sRXxLMexid/GeOsQ== + dependencies: + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + execa "^1.0.0" + prompts "^2.4.0" + +"@react-native-community/cli-config@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-8.0.6.tgz#041eee7dd8fdef595bf7a3f24228c173bf294a44" + integrity sha512-mjVpVvdh8AviiO8xtqeX+BkjqE//NMDnISwsLWSJUfNCwTAPmdR8PGbhgP5O4hWHyJ3WkepTopl0ya7Tfi3ifw== + dependencies: + "@react-native-community/cli-tools" "^8.0.4" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + glob "^7.1.3" + joi "^17.2.1" + +"@react-native-community/cli-debugger-ui@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-8.0.0.tgz#98263dc525e65015e2d6392c940114028f87e8e9" + integrity sha512-u2jq06GZwZ9sRERzd9FIgpW6yv4YOW4zz7Ym/B8eSzviLmy3yI/8mxJtvlGW+J8lBsfMcQoqJpqI6Rl1nZy9yQ== + dependencies: + serve-static "^1.13.1" + +"@react-native-community/cli-doctor@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-8.0.6.tgz#954250155ab2f3a66a54821e071bc4a631d2dfff" + integrity sha512-ZQqyT9mJMVeFEVIwj8rbDYGCA2xXjJfsQjWk2iTRZ1CFHfhPSUuUiG8r6mJmTinAP9t+wYcbbIYzNgdSUKnDMw== + dependencies: + "@react-native-community/cli-config" "^8.0.6" + "@react-native-community/cli-platform-ios" "^8.0.6" + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + command-exists "^1.2.8" + envinfo "^7.7.2" + execa "^1.0.0" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + node-stream-zip "^1.9.1" + ora "^5.4.1" + prompts "^2.4.0" + semver "^6.3.0" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + +"@react-native-community/cli-hermes@^8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-8.0.5.tgz#639edc6b0ce73f705e4b737e3de1cc47d42516ff" + integrity sha512-Zm0wM6SfgYAEX1kfJ1QBvTayabvh79GzmjHyuSnEROVNPbl4PeCG4WFbwy489tGwOP9Qx9fMT5tRIFCD8bp6/g== + dependencies: + "@react-native-community/cli-platform-android" "^8.0.5" + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@^8.0.2", "@react-native-community/cli-platform-android@^8.0.5": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-8.0.5.tgz#da11d2678adeca98e83494d68de80e50571b4af4" + integrity sha512-z1YNE4T1lG5o9acoQR1GBvf7mq6Tzayqo/za5sHVSOJAC9SZOuVN/gg/nkBa9a8n5U7qOMFXfwhTMNqA474gXA== + dependencies: + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + execa "^1.0.0" + fs-extra "^8.1.0" + glob "^7.1.3" + jetifier "^1.6.2" + lodash "^4.17.15" + logkitty "^0.7.1" + slash "^3.0.0" + +"@react-native-community/cli-platform-ios@^8.0.2", "@react-native-community/cli-platform-ios@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-8.0.6.tgz#ab80cd4eb3014b8fcfc9bd1b53ec0a9f8e5d1430" + integrity sha512-CMR6mu/LVx6JVfQRDL9uULsMirJT633bODn+IrYmrwSz250pnhON16We8eLPzxOZHyDjm7JPuSgHG3a/BPiRuQ== + dependencies: + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + execa "^1.0.0" + glob "^7.1.3" + js-yaml "^3.13.1" + lodash "^4.17.15" + ora "^5.4.1" + plist "^3.0.2" + +"@react-native-community/cli-plugin-metro@^8.0.7": + version "8.0.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-8.0.7.tgz#ece95b62cd529bcdf916e8633909a6d7778c1a3a" + integrity sha512-RK08Fqh//+9nDntCeKBq2LskWp4rD64q56/PxboZZBu5Z8KANJ4OBUzBLxm0rD0h+l9j6AASlO907HooBTWxrA== + dependencies: + "@react-native-community/cli-server-api" "^8.0.4" + "@react-native-community/cli-tools" "^8.0.4" + chalk "^4.1.2" + metro "^0.70.4" + metro-config "^0.70.4" + metro-core "^0.70.4" + metro-react-native-babel-transformer "^0.70.4" + metro-resolver "^0.70.4" + metro-runtime "^0.70.4" + readline "^1.3.0" + +"@react-native-community/cli-server-api@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-8.0.4.tgz#d45d895a0a6e8b960c9d677188d414a996faa4d3" + integrity sha512-Orr14njx1E70CVrUA8bFdl+mrnbuXUjf1Rhhm0RxUadFpvkHuOi5dh8Bryj2MKtf8eZrpEwZ7tuQPhJEULW16A== + dependencies: + "@react-native-community/cli-debugger-ui" "^8.0.0" + "@react-native-community/cli-tools" "^8.0.4" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.0" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^7.5.1" + +"@react-native-community/cli-tools@^8.0.4": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-8.0.4.tgz#994b9d56c84472491c876b71acd4356773fcbe65" + integrity sha512-ePN9lGxh6LRFiotyddEkSmuqpQhnq2iw9oiXYr4EFWpIEy0yCigTuSTiDF68+c8M9B+7bTwkRpz/rMPC4ViO5Q== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + find-up "^5.0.0" + lodash "^4.17.15" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + ora "^5.4.1" + semver "^6.3.0" + shell-quote "^1.7.3" + +"@react-native-community/cli-types@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-8.0.0.tgz#72d24178e5ed1c2d271da43e0a4a4f59178f261a" + integrity sha512-1lZS1PEvMlFaN3Se1ksyoFWzMjk+YfKi490GgsqKJln9gvFm8tqVPdnXttI5Uf2DQf3BMse8Bk8dNH4oV6Ewow== + dependencies: + joi "^17.2.1" + +"@react-native-community/cli@^8.0.3": + version "8.0.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-8.0.7.tgz#0d28519d3b4e3557d0c30007716978e2c7f3d3b3" + integrity sha512-DCSf77c0RvTCvNLKxFwuGBMFFIRwDiZWLo6znM2oNCFRkN2gmSQsYm1twdAh5asuNmetEiPoHdGT289SMWSjSQ== + dependencies: + "@react-native-community/cli-clean" "^8.0.4" + "@react-native-community/cli-config" "^8.0.6" + "@react-native-community/cli-debugger-ui" "^8.0.0" + "@react-native-community/cli-doctor" "^8.0.6" + "@react-native-community/cli-hermes" "^8.0.5" + "@react-native-community/cli-plugin-metro" "^8.0.7" + "@react-native-community/cli-server-api" "^8.0.4" + "@react-native-community/cli-tools" "^8.0.4" + "@react-native-community/cli-types" "^8.0.0" + chalk "^4.1.2" + commander "^2.19.0" + execa "^1.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + graceful-fs "^4.1.3" + leven "^3.1.0" + lodash "^4.17.15" + minimist "^1.2.0" + prompts "^2.4.0" + semver "^6.3.0" + +"@react-native/assets-registry@~0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d" + integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ== + +"@react-native/assets@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" + integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== + +"@react-native/normalize-color@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567" + integrity sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw== + +"@react-native/normalize-color@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91" + integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== + +"@react-native/polyfills@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" + integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== + +"@react-spring/animated@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.6.1.tgz#ccc626d847cbe346f5f8815d0928183c647eb425" + integrity sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ== + dependencies: + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/animated@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.3.tgz#4211b1a6d48da0ff474a125e93c0f460ff816e0f" + integrity sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw== + dependencies: + "@react-spring/shared" "~9.7.3" + "@react-spring/types" "~9.7.3" + +"@react-spring/core@^9.7.3", "@react-spring/core@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.3.tgz#60056bcb397f2c4f371c6c9a5f882db77ae90095" + integrity sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ== + dependencies: + "@react-spring/animated" "~9.7.3" + "@react-spring/shared" "~9.7.3" + "@react-spring/types" "~9.7.3" + +"@react-spring/core@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.6.1.tgz#ebe07c20682b360b06af116ea24e2b609e778c10" + integrity sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/rafz" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/rafz@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.6.1.tgz#d71aafb92b78b24e4ff84639f52745afc285c38d" + integrity sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ== + +"@react-spring/shared@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.6.1.tgz#4e2e4296910656c02bd9fd54c559702bc836ac4e" + integrity sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw== + dependencies: + "@react-spring/rafz" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/shared@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.3.tgz#4cf29797847c689912aec4e62e34c99a4d5d9e53" + integrity sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA== + dependencies: + "@react-spring/types" "~9.7.3" + +"@react-spring/three@^9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.7.3.tgz#4358a0c4640efe2972c4f7d0f7cd4efe927471c1" + integrity sha512-Q1p512CqUlmMK8UMBF/Rj79qndhOWq4XUTayxMP9S892jiXzWQuj+xC3Xvm59DP/D4JXusXpxxqfgoH+hmOktA== + dependencies: + "@react-spring/animated" "~9.7.3" + "@react-spring/core" "~9.7.3" + "@react-spring/shared" "~9.7.3" + "@react-spring/types" "~9.7.3" + +"@react-spring/three@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.6.1.tgz#095fcd1dc6509127c33c14486d88289b89baeb9d" + integrity sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/types@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.6.1.tgz#913d3a68c5cbc1124fdb18eff919432f7b6abdde" + integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q== + +"@react-spring/types@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.3.tgz#ea78fd447cbc2612c1f5d55852e3c331e8172a0b" + integrity sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw== + +"@react-three/drei@^9.93.0": + version "9.102.6" + resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.102.6.tgz#bf705868a2b8f72004a0bec682520f1e3651c515" + integrity sha512-FUR7Ea3GLsxFmAGv8byVPgkhEB84VveiT23gIJMqTb/xCBkSHXvHGCiFgZOiiTScAT+GR8txrlX7dA8nbXJDKg== + dependencies: + "@babel/runtime" "^7.11.2" + "@mediapipe/tasks-vision" "0.10.8" + "@react-spring/three" "~9.6.1" + "@use-gesture/react" "^10.2.24" + camera-controls "^2.4.2" + cross-env "^7.0.3" + detect-gpu "^5.0.28" + glsl-noise "^0.0.0" + maath "^0.10.7" + meshline "^3.1.6" + react-composer "^5.0.3" + stats-gl "^2.0.0" + stats.js "^0.17.0" + suspend-react "^0.1.3" + three-mesh-bvh "^0.7.0" + three-stdlib "^2.29.4" + troika-three-text "^0.49.0" + tunnel-rat "^0.1.2" + utility-types "^3.10.0" + uuid "^9.0.1" + zustand "^3.7.1" + +"@rollup/plugin-alias@^3.1.1": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.9.tgz#a5d267548fe48441f34be8323fb64d1d4a1b3fdf" + integrity sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw== + dependencies: + slash "^3.0.0" + +"@rollup/plugin-commonjs@^15.0.0": + version "15.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz#1e7d076c4f1b2abf7e65248570e555defc37c238" + integrity sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-json@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^4.1.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@rollup/rollup-android-arm-eabi@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz#88ba199f996e0000689130ed69e47df8b0dfbc70" + integrity sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A== + +"@rollup/rollup-android-arm64@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.1.tgz#c89a55670e1179ed7ba3db06cee0d7da7b3d35ce" + integrity sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA== + +"@rollup/rollup-darwin-arm64@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.1.tgz#52e3496fa66d761833df23a9b4860e517efc7d1d" + integrity sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw== + +"@rollup/rollup-darwin-x64@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.1.tgz#7678922773a8b53d8b4b3c3cc3e77b65fc71b489" + integrity sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g== + +"@rollup/rollup-linux-arm-gnueabihf@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.1.tgz#69c3b896e3ee1c3487492323a02c2a3ae0d4b2e7" + integrity sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw== + +"@rollup/rollup-linux-arm64-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.1.tgz#13353f0ab65f4add0241f97f7ccc640b3a2b5cf2" + integrity sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ== + +"@rollup/rollup-linux-arm64-musl@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.1.tgz#bf64eaa29b2b1e6bc9195f04bb30b2a4ffdc25ae" + integrity sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA== + +"@rollup/rollup-linux-riscv64-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.1.tgz#ec05966a4ed1b3338c8842108353ac6d3443dc6a" + integrity sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ== + +"@rollup/rollup-linux-s390x-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.1.tgz#c10a1f1522f0c9191ee45f677bd08763ddfdc039" + integrity sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q== + +"@rollup/rollup-linux-x64-gnu@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.1.tgz#836f948b6efc53f05f57d1d9ba92e90d629b3f22" + integrity sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ== + +"@rollup/rollup-linux-x64-musl@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.1.tgz#07e0351cc18eeef026f903189d8312833cb6bd1f" + integrity sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ== + +"@rollup/rollup-win32-arm64-msvc@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.1.tgz#6f9359bbec6cb4a2c002642c63e3704b0b5e68b7" + integrity sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw== + +"@rollup/rollup-win32-ia32-msvc@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.1.tgz#d6545a29ac9dd8b39a9161b87924f13471eb992e" + integrity sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ== + +"@rollup/rollup-win32-x64-msvc@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.1.tgz#d1b221daca9afca1885b91a311c6f4a04b0deeb5" + integrity sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw== + +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@testing-library/dom@^8.5.0": + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/react@^13.0.0-alpha.5": + version "13.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/draco3d@^1.4.0": + version "1.4.9" + resolved "https://registry.yarnpkg.com/@types/draco3d/-/draco3d-1.4.9.tgz#eb3eb7c5fd6f3490ab86ed7ebf36e595a9dc179b" + integrity sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA== + +"@types/eslint@^8.4.10": + version "8.56.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.6.tgz#d5dc16cac025d313ee101108ba5714ea10eb3ed0" + integrity sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/hoist-non-react-statics@*": + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" + integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.2.5": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash@^4.14.191": + version "4.17.0" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3" + integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/node@*": + version "20.11.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + dependencies: + undici-types "~5.26.4" + +"@types/node@^12.7.1": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/offscreencanvas@^2019.6.4": + version "2019.7.3" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516" + integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A== + +"@types/prettier@^2.1.5": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.1": + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== + 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" + integrity sha512-mSUCuGUsW2kJlZiu4GmdYVDKZX/52iyC9rm6dxAmflJj1b7kSO/CMSDy5WbcfS8QerxTqbYGTrIwHD0GnXHzbQ== + 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.8" + resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.8.tgz#e51710572bcccf214306833c2438575d310b3e98" + integrity sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g== + dependencies: + "@types/react" "*" + +"@types/react-test-renderer@^17.0.1": + version "17.0.9" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-17.0.9.tgz#da6d06f3f37eefab39386c390140374dc5db5b33" + integrity sha512-bOfxcu5oZ+KxvACScbkTwZ4eGCtZFTz4VZCOVAIfGbThxqiXSIGipKVG8ubaYBXquUSQROzNIUzviWdSnnAlzg== + dependencies: + "@types/react" "^17" + +"@types/react@*", "@types/react@^18.0.5", "@types/react@^18.2.47": + version "18.2.73" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.73.tgz#0579548ad122660d99e00499d22e33b81e73ed94" + integrity sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/react@^17": + version "17.0.80" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41" + integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "^0.16" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/scheduler@^0.16", "@types/scheduler@^0.16.2": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/semver@^7.3.12", "@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/styled-components@^5.1.34": + version "5.1.34" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.34.tgz#4107df8ef8a7eaba4fa6b05f78f93fba4daf0300" + integrity sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA== + dependencies: + "@types/hoist-non-react-statics" "*" + "@types/react" "*" + csstype "^3.0.2" + +"@types/stylis@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" + integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== + +"@types/three@^0.141.0": + version "0.141.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.141.0.tgz#d9d81a54b28ebc2a56931dfd4d9c54d25c20d6c8" + integrity sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA== + dependencies: + "@types/webxr" "*" + +"@types/webxr@*", "@types/webxr@^0.5.2": + version "0.5.14" + resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.14.tgz#9a03121a4912ea113b31e5c9c17f164d4fff8a1f" + integrity sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^15.0.0": + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.17.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.17.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@use-gesture/core@10.3.1": + version "10.3.1" + resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.3.1.tgz#976c9421e905f0079d49822cfd5c2e56b808fc56" + integrity sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw== + +"@use-gesture/react@^10.2.24", "@use-gesture/react@latest": + version "10.3.1" + resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.3.1.tgz#17a743a894d9bd9a0d1980c618f37f0164469867" + integrity sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g== + dependencies: + "@use-gesture/core" "10.3.1" + +"@vitejs/plugin-react-refresh@^1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-refresh/-/plugin-react-refresh-1.3.6.tgz#19818392db01e81746cfeb04e096ab3010e79fe3" + integrity sha512-iNR/UqhUOmFFxiezt0em9CgmiJBdWR+5jGxB2FihaoJfqGt76kiwaKoVOJVU5NYcDWMdN06LbyN2VIGIoYdsEA== + dependencies: + "@babel/core" "^7.14.8" + "@babel/plugin-transform-react-jsx-self" "^7.14.5" + "@babel/plugin-transform-react-jsx-source" "^7.14.5" + "@rollup/pluginutils" "^4.1.1" + react-refresh "^0.10.0" + +"@vitejs/plugin-react@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" + integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== + dependencies: + "@babel/core" "^7.23.5" + "@babel/plugin-transform-react-jsx-self" "^7.23.3" + "@babel/plugin-transform-react-jsx-source" "^7.23.3" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.0" + +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@xmldom/xmldom@~0.7.7": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" + integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" + integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== + +accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-fragments@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" + integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== + dependencies: + colorette "^1.0.7" + slice-ansi "^2.0.0" + strip-ansi "^5.0.0" + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "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.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +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" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.0.0, 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== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +appdirsjs@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" + integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^3.2.2: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" + integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.1" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.10.1: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.2" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" + integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.1" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +better-path-resolve@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" + integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== + dependencies: + is-windows "^1.0.0" + +bidi-js@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2" + integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== + dependencies: + require-from-string "^2.0.2" + +big-integer@1.6.x: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blueimp-md5@^2.10.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== + +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + 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" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +breakword@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.6.tgz#242506e7b871b7fad1bce8dc05cb0f2a129c12bd" + integrity sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw== + dependencies: + wcwidth "^1.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + +camera-controls@^2.4.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-2.8.3.tgz#54c296d21564dede84e56ffd6b75b3daa3c76e90" + integrity sha512-zFjqUR6onLkG+z1A6vAWfzovxZxWVSvp6e5t3lfZgfgPZtX3n74aykNAUaoRbq8Y3tOxadHkDjbfGDOP9hFf2w== + +caniuse-lite@^1.0.30001587: + version "1.0.30001600" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" + integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== + +chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0, ci-info@^3.7.0, ci-info@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.0.7: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^9.3.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +component-emitter@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.6.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.36.1: + version "3.36.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" + integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== + dependencies: + browserslist "^4.23.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.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" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-to-react-native@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +csv-generate@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" + integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== + +csv-parse@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" + integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== + +csv-stringify@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" + integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== + +csv@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" + integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== + dependencies: + csv-generate "^3.4.3" + csv-parse "^4.16.3" + csv-stringify "^5.6.5" + stream-transform "^2.1.3" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dataloader@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + +dayjs@^1.8.15: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decimal.js@^10.2.1: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-gpu@^5.0.28: + version "5.0.38" + resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.38.tgz#1c05ce728ea1229d16db15b865631609bf0d6952" + integrity sha512-36QeGHSXYcJ/RfrnPEScR8GDprbXFG4ZhXsfVNVHztZr38+fRxgHnJl3CjYXXjbeRUhu3ZZBJh6Lg0A9v0Qd8A== + dependencies: + webgl-constants "^1.1.1" + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +draco3d@^1.4.1: + version "1.5.7" + resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.7.tgz#94f9bce293eb8920c159dc91a4ce9124a9e899e0" + integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ== + +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" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.668: + version "1.4.719" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.719.tgz#22a94ce7a5150511ba88e900836039e159efe22c" + integrity sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "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" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.0, enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +envinfo@^7.7.2: + version "7.11.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" + integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +errorhandler@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" + integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^8.5.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-import-resolver-alias@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz#297062890e31e4d6651eb5eba9534e1f6e68fc97" + integrity sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.25.4: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jest@^27.2.1: + version "27.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" + integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-prettier@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.29.4: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.12.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0, event-target-shim@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +expo-asset@^8.6.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-8.14.0.tgz#ac5afd1716cee3afc3818de53ed5228ae1b862b5" + integrity sha512-XovwM6RsOdTSw9yEw2gonkOnM8Yw5HoADZhoX4yhBRi/P5YSckJR9ipiQSOJBnHFU1JlxT9+AeAPTqnTqT8tyg== + dependencies: + "@react-native/assets-registry" "~0.72.0" + blueimp-md5 "^2.10.0" + expo-constants "~15.3.0" + expo-file-system "~15.9.0" + invariant "^2.2.4" + md5-file "^3.2.3" + +expo-constants@~15.3.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-15.3.0.tgz#18f33b9774fc2477065b1d935fb22c7ba49c0d3f" + integrity sha512-3HbZOBn4IAtBFvzifQRNebcqW6t2q9QobSwYpaW74Wjq1cu8sV3ZWHCM9cHyW3Rr2lElRReq/ViEYCvrYc0cEQ== + dependencies: + "@expo/config" "~8.4.0" + uuid "^3.3.2" + +expo-file-system@^15.4.3, expo-file-system@~15.9.0: + version "15.9.0" + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-15.9.0.tgz#b048b9168875634efcce0aa002ee0eec31ed42a8" + integrity sha512-ikzqBGpbSzp/57+aruXzRR2s0HEVYxdd1o3RxfswJRujjT/6X128xmUTTFDaQUr+zydyvxvY7Mo0szWpXhPyLA== + dependencies: + uuid "^3.4.0" + +expo-gl-cpp@~11.4.0: + version "11.4.0" + resolved "https://registry.yarnpkg.com/expo-gl-cpp/-/expo-gl-cpp-11.4.0.tgz#62b4b5c61ef065e94aa790a872aad2eee2ae11ea" + integrity sha512-vt9QYKX/4TxMaNnbv9ww5KILwyCmg91gqwA/6xuo4MqWxGkZoxy+b8lqsQthuPdn+FHgF0BNcvFW9nbN+JeSRg== + +expo-gl@^11.4.0: + version "11.4.0" + resolved "https://registry.yarnpkg.com/expo-gl/-/expo-gl-11.4.0.tgz#0aa6b05908f1a8405f804f3e1a360a215569b9f2" + integrity sha512-Q0/4git7mNanxPe4/DMC6dk9F1Xu2ACTmacWdoLjS3NByUzFt25vFtrbf9R3FCgWcBlA9ncfVp1CsYgA4+61Dg== + dependencies: + expo-gl-cpp "~11.4.0" + invariant "^2.2.4" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extendable-error@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" + integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== + +external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.4, fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fflate@^0.6.9: + version "0.6.10" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.6.10.tgz#5f40f9659205936a2d18abf88b2e7781662b6d43" + integrity sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0, find-up@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root2@1.2.16: + version "1.2.16" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== + dependencies: + micromatch "^4.0.2" + pkg-dir "^4.2.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +flow-parser@0.*: + version "0.232.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.232.0.tgz#db93a660e7017bd366290944c3328ca506ca7d2b" + integrity sha512-U8vcKyYdM+Kb0tPzfPJ5JyPMU0uXKwHxp0L6BcEc+wBlbTW9qRhOqV5DeGXclgclVvtqQNGEG8Strj/b6c/IxA== + +flow-parser@^0.121.0: + version "0.121.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" + integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "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.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2, 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.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +getenv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" + integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== + dependencies: + is-glob "^2.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.0, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +glsl-noise@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/glsl-noise/-/glsl-noise-0.0.0.tgz#367745f3a33382c0eeec4cb54b7e99cfc1d7670b" + integrity sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hermes-engine@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.11.0.tgz#bb224730d230a02a5af02c4e090d1f52d57dd3db" + integrity sha512-7aMUlZja2IyLYAcZ69NBnwJAR5ZOYlSllj0oMpx08a8HzxHOys0eKCzfphrf6D0vX1JGO1QQvVsQKe6TkYherw== + +hermes-estree@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.6.0.tgz#e866fddae1b80aec65fe2ae450a5f2070ad54033" + integrity sha512-2YTGzJCkhdmT6VuNprWjXnvTvw/3iPNw804oc7yknvQpNKo+vJGZmtvLLCghOZf0OwzKaNAzeIMp71zQbNl09w== + +hermes-parser@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.6.0.tgz#00d14e91bca830b3c1457050fa4187400cb96328" + integrity sha512-Vf58jBZca2+QBLR9h7B7mdg8oFz2g5ILz1iVouZ5DOrOrAfBmPfJjdjDT8jrO0f+iJ4/hSRrQHqHIjSnTaLUDQ== + dependencies: + hermes-estree "0.6.0" + +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" + +hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-id@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" + integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +husky@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== + dependencies: + minimatch "^3.0.4" + +ignore@^5.2.0, ignore@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +image-size@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" + integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.4, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip@^1.1.5: + version "1.1.9" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" + integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== + +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== + dependencies: + hasown "^2.0.0" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== + dependencies: + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== + dependencies: + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== + dependencies: + is-extglob "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-subdir@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" + integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== + dependencies: + better-path-resolve "1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +is-windows@^1.0.0, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +its-fine@^1.0.6: + version "1.1.3" + resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.1.3.tgz#703219c696b8093940ce8ce6c3a52258750d2989" + integrity sha512-mncCA+yb6tuh5zK26cHqKlsSyxm4zdm4YgJpxycyx6p9fgxgK5PLu3iDVpKhzTn57Yrv3jk/r0aK0RFTT1OjFw== + dependencies: + "@types/react-reconciler" "^0.28.0" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^27.3.1, jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^27.0.0, jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^26.5.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^26.3.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.2.0, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.3.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +jetifier@^1.6.2: + version "1.6.8" + resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" + integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== + +joi@^17.2.1: + version "17.12.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.12.2.tgz#283a664dabb80c7e52943c557aab82faea09f521" + integrity sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsc-android@^250230.2.1: + version "250230.2.1" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" + integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== + +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + +jscodeshift@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef" + integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.20.4" + temp "^0.8.4" + write-file-atomic "^2.3.0" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@2.x, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kleur@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^12.3.7: + version "12.5.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.5.0.tgz#d6925747480ae0e380d13988522f9dd8ef9126e3" + integrity sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.16" + commander "^9.3.0" + debug "^4.3.4" + execa "^5.1.1" + lilconfig "2.0.5" + listr2 "^4.0.5" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.2" + pidtree "^0.5.0" + string-argv "^0.3.1" + supports-color "^9.2.2" + yaml "^1.10.2" + +listr2@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" + integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.5" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-yaml-file@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.13.0" + pify "^4.0.1" + strip-bom "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +logkitty@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" + integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== + dependencies: + ansi-fragments "^0.2.1" + dayjs "^1.8.15" + yargs "^15.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +maath@^0.10.7: + version "0.10.7" + resolved "https://registry.yarnpkg.com/maath/-/maath-0.10.7.tgz#9289b42a5db8ac5b26407b3bfca4e3bebefe50b4" + integrity sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg== + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.30.0: + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +md5-file@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" + integrity sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw== + dependencies: + buffer-alloc "^1.1.0" + +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +meow@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" + +meow@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +meshline@^3.1.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/meshline/-/meshline-3.3.0.tgz#8d926d3889ea9c37b37484961fbfbff0a464cd51" + integrity sha512-EKKf2TLnfyqUeA7ryWFKgT9HchTMATvECGZnMQjtlcyxK0sB8shVLVkemBUp9dB3tkDEmoqQDLJCPStjkH8D7A== + +metro-babel-transformer@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.70.3.tgz#dca61852be273824a4b641bd1ecafff07ff3ad1f" + integrity sha512-bWhZRMn+mIOR/s3BDpFevWScz9sV8FGktVfMlF1eJBLoX24itHDbXvTktKBYi38PWIKcHedh6THSFpJogfuwNA== + dependencies: + "@babel/core" "^7.14.0" + hermes-parser "0.6.0" + metro-source-map "0.70.3" + nullthrows "^1.1.1" + +metro-babel-transformer@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.70.4.tgz#3ff0007c7fc009d5b656a71003a1bbb0560f6b70" + integrity sha512-XUM2929qE2AR5iqNnMof80h5lDf6rEZWP9J47u2XQI41TZT5J3Ttk33OJ7/ysLhv7ZPYt/WLnjB8skf23UA+yw== + dependencies: + "@babel/core" "^7.14.0" + hermes-parser "0.6.0" + metro-source-map "0.70.4" + nullthrows "^1.1.1" + +metro-cache-key@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.70.4.tgz#5d09ee6378cb5288db5a58bfc7273723c6b632c7" + integrity sha512-hZ5LMm54YCNmxxhKAnHdM9wGSji7bzyLWLSkJqY1u+yQjockQIEWR7uEFiBZ5up8K+eoiqmF5K8+VbrnZP8+Iw== + +metro-cache@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.70.4.tgz#d74d1a21c95f4abfb2bec9a0b44b345558df18a4" + integrity sha512-E78Psscwu3EHCwC+bGb9jXxFg8UL0zyWu5cjaBWrKa9NhIqiyCpUBrT0e9TfYxNdb7/OfMQUXW6oNm1HOZHPlg== + dependencies: + metro-core "0.70.4" + rimraf "^2.5.4" + +metro-config@0.70.4, metro-config@^0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.70.4.tgz#64a747efca743f772ff662732fb90ff17447a4ce" + integrity sha512-9ellClttQyXF5O487OiFNGxM87PSzsx0m61B7vdXzdyXhCwHk1a8J/8zn5WmOa9/Ix2dJ04N32NzeKgMWVhwQw== + dependencies: + cosmiconfig "^5.0.5" + jest-validate "^26.5.2" + metro "0.70.4" + metro-cache "0.70.4" + metro-core "0.70.4" + metro-runtime "0.70.4" + +metro-core@0.70.4, metro-core@^0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.70.4.tgz#053ecfcd56ba64c9a691b004b55be1c00da09a77" + integrity sha512-g4o3TD/EHiNOEXkE3MsyqvspKoBuZ3KoJDQnS7NlSwWK4nG6xcw8UiW1W/YJOfDnn/EkXIq3XAUkUX4UWVXuuQ== + dependencies: + jest-haste-map "^27.3.1" + lodash.throttle "^4.1.1" + metro-resolver "0.70.4" + +metro-hermes-compiler@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.70.4.tgz#9507c089e7ea31977c233651b48a5f5cac6d32ea" + integrity sha512-Eor/8SIntD23kQxrhlrPegel+sg3e3xDEaNFOxL3Rljbozr1zFq9Pyd3RjK48BkbpGCZmgXSW1XUY1aqzbkePA== + +metro-inspector-proxy@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.70.4.tgz#420bd0d531d406565efdef65dc99ca25c8e26e8c" + integrity sha512-ZkJmVb8CSRVDk0jJX2b9r10KBBG0Qc4mtK3A/FicsnaZ02ZxTy+bnSMEkyW4fhjbHS6Y3h9aBTFOkrK/Jmy1lA== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + ws "^7.5.1" + yargs "^15.3.1" + +metro-minify-uglify@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.70.4.tgz#6af9f2de3ab7de72996c8f5569cd46192e6eafb4" + integrity sha512-S/gtO75s/z6g8m1DOnZW1mm4ei2sTledowJ85rtBsZC8M7r/CAsSynVqkKkWjJ6Ro5TrlE7cfiTnQGojLXMWgg== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.70.3.tgz#1c77ec4544ecd5fb6c803e70b21284d7483e4842" + integrity sha512-4Nxc1zEiHEu+GTdEMEsHnRgfaBkg8f/Td3+FcQ8NTSvs+xL3LBrQy6N07idWSQZHIdGFf+tTHvRfSIWLD8u8Tg== + dependencies: + "@babel/core" "^7.14.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + +metro-react-native-babel-preset@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.70.4.tgz#fac01e1887ad5d15d0caa14c97e8eb52d880b623" + integrity sha512-qcJuLqvjlKhrOOuQShhVzCjjp7kHZIXCL+ybnYBqOY2ALVCyR3aELH0aUtOztRpJYFnqAMDOJmGqNVi6cUd24g== + dependencies: + "@babel/core" "^7.14.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + +metro-react-native-babel-transformer@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.70.3.tgz#195597c32488f820aa9e441bbca7c04fe7de7a2d" + integrity sha512-WKBU6S/G50j9cfmFM4k4oRYprd8u3qjleD4so1E2zbTNILg+gYla7ZFGCAvi2G0ZcqS2XuGCR375c2hF6VVvwg== + dependencies: + "@babel/core" "^7.14.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.6.0" + metro-babel-transformer "0.70.3" + metro-react-native-babel-preset "0.70.3" + metro-source-map "0.70.3" + nullthrows "^1.1.1" + +metro-react-native-babel-transformer@^0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.70.4.tgz#2d6c742ab6ee74385b4f6f794f9ec984cbb9bf43" + integrity sha512-wDHPqzn0QJKGJIMucbyBb1nXMry1yN+/brsqcXSiyS04PerEU25UKb0KXYMGmjCoygxCs2K71nCF1PsscNOVMA== + dependencies: + "@babel/core" "^7.14.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.6.0" + metro-babel-transformer "0.70.4" + metro-react-native-babel-preset "0.70.4" + metro-source-map "0.70.4" + nullthrows "^1.1.1" + +metro-resolver@0.70.4, metro-resolver@^0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.70.4.tgz#01a148bfb0bfac11c8d7f7b42372cc4fc4004c31" + integrity sha512-Dr+N54Av2raxP6IafBvIgwQKuYXbtfkDN0A4vwhiWM4exyQm+3eS8eRfByZKGYVAQ0iIK3WbXGpRo+pwhgj2yg== + dependencies: + absolute-path "^0.0.0" + +metro-runtime@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.70.3.tgz#09231b9d05dcbdfb5a13df0a45307273e6fe1168" + integrity sha512-22xU7UdXZacniTIDZgN2EYtmfau2pPyh97Dcs+cWrLcJYgfMKjWBtesnDcUAQy3PHekDYvBdJZkoQUeskYTM+w== + dependencies: + "@babel/runtime" "^7.0.0" + +metro-runtime@0.70.4, metro-runtime@^0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.70.4.tgz#b6299e9d10379912df8907ea013746bb23fe30e4" + integrity sha512-f1kGOOos5hxIdlXxBvQVg1WMiHeV4vR4B4fGikbMGlPtZEuzdYbep0myKjCHJc6v88IPtUmcgj5uZmhny8+jGg== + dependencies: + "@babel/runtime" "^7.0.0" + +metro-source-map@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.70.3.tgz#f5976108c18d4661eaa4d188c96713e5d67a903b" + integrity sha512-zsYtZGrwRbbGEFHtmMqqeCH9K9aTGNVPsurMOWCUeQA3VGyVGXPGtLMC+CdAM9jLpUyg6jw2xh0esxi+tYH7Uw== + dependencies: + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + invariant "^2.2.4" + metro-symbolicate "0.70.3" + nullthrows "^1.1.1" + ob1 "0.70.3" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-source-map@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.70.4.tgz#50523dd3a8d7fab7cc1f21ac4ada3ec3cd050cf3" + integrity sha512-4NLcyMll1KdSNKG4zM3ftT5JRqYaSBE4ww7D4cdz+niFMd+9iWmK5q2g+eOt29wKrMYpQMK0jLLaWFi9ol03UQ== + dependencies: + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + invariant "^2.2.4" + metro-symbolicate "0.70.4" + nullthrows "^1.1.1" + ob1 "0.70.4" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.70.3.tgz#b039e5629c4ed0c999ea0496d580e1c98260f5cb" + integrity sha512-JTYkF1dpeDUssQ84juE1ycnhHki2ylJBBdJE1JHtfu5oC+z1ElDbBdPHq90Uvt8HbRov/ZAnxvv7Zy6asS+WCA== + dependencies: + invariant "^2.2.4" + metro-source-map "0.70.3" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-symbolicate@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.70.4.tgz#2196b68023f9cf08dc0784fdb24e938e03a5a501" + integrity sha512-XJV040TcUj0uYGB+I2g9o6kX8RKj4Y7bQB/TOGsLevOdKn1gXb3PJ2ESooLl3HmyRDlrqasvdgWyCrkAlJI4Lw== + dependencies: + invariant "^2.2.4" + metro-source-map "0.70.4" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-transform-plugins@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.70.4.tgz#a72db84a81cff7e56b67bb39d017a1f5091ca3aa" + integrity sha512-U16mPSd4WrNyVP1k2uKrT5RAaJeUZPLn8dvzzL7YT2dv1mrQnjAGZ4wDR5q80EQhao05sc2ftw6oPBiPS4sgFg== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.14.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.70.4.tgz#73950d81d82cb58afcf288f0d8c8f35365bff928" + integrity sha512-N6rVZF1yUi4rnJsG+/e1wyrdpy6s39PzzsvA+gAS4Vxfe0iBo91votavjL4GF+tuekui/PoxOq5nOWo5aRAHhg== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + metro "0.70.4" + metro-babel-transformer "0.70.4" + metro-cache "0.70.4" + metro-cache-key "0.70.4" + metro-hermes-compiler "0.70.4" + metro-source-map "0.70.4" + metro-transform-plugins "0.70.4" + nullthrows "^1.1.1" + +metro@0.70.4, metro@^0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.70.4.tgz#6f83974979f60116db9accda92849adf0e5f70be" + integrity sha512-4Ff7jfCF7Jr/PVXvRGVRe5Sb0Qhqceh6i18aYEMfCS0pVsZZcTdXxgTdlB9KGnxSVxT8jjViid+oAAvNJcC2ug== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + accepts "^1.3.7" + async "^3.2.2" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + fs-extra "^1.0.0" + graceful-fs "^4.2.4" + hermes-parser "0.6.0" + image-size "^0.6.0" + invariant "^2.2.4" + jest-haste-map "^27.3.1" + jest-worker "^27.2.0" + jsc-safe-url "^0.2.2" + lodash.throttle "^4.1.1" + metro-babel-transformer "0.70.4" + metro-cache "0.70.4" + metro-cache-key "0.70.4" + metro-config "0.70.4" + metro-core "0.70.4" + metro-hermes-compiler "0.70.4" + metro-inspector-proxy "0.70.4" + metro-minify-uglify "0.70.4" + metro-react-native-babel-preset "0.70.4" + metro-resolver "0.70.4" + metro-runtime "0.70.4" + metro-source-map "0.70.4" + metro-symbolicate "0.70.4" + metro-transform-plugins "0.70.4" + metro-transform-worker "0.70.4" + mime-types "^2.1.27" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^6.0.0" + temp "0.8.3" + throat "^5.0.0" + ws "^7.5.1" + yargs "^15.3.1" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0, minimist-options@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixme@^0.5.1: + version "0.5.10" + resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.10.tgz#d653b2984b75d9018828f1ea333e51717ead5f51" + integrity sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1, ms@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.2.0, node-fetch@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +node-stream-zip@^1.9.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^2.1.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== + dependencies: + glob "^7.1.6" + ignore-walk "^3.0.3" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +nwsapi@^2.2.0: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +ob1@0.70.3: + version "0.70.3" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.70.3.tgz#f48cd5a5abf54b0c423b1b06b6d4ff4d049816cb" + integrity sha512-Vy9GGhuXgDRY01QA6kdhToPd8AkLdLpX9GjH5kpqluVqTu70mgOm7tpGoJDZGaNbr9nJlJgnipqHJQRPORixIQ== + +ob1@0.70.4: + version "0.70.4" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.70.4.tgz#683670a256667ac34f93046ee81eb504dcc0689d" + integrity sha512-u7UUis2Scwy+RDdJ0T49Urb0yTQTyEYt37lHzWDqpLQSLYZZGT3ZNtCvB88Z9yKhhouKD4TNOGkBJgkFJ+84sg== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.12.2, object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== + dependencies: + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^6.2.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +outdent@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" + integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0, parse-json@^5.1.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "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.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.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" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" + integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== + +pidtree@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" + integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +plist@^3.0.2, plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-value-parser@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.4.36: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +potpack@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" + integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== + +preferred-pm@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.1.3.tgz#4125ea5154603136c3b6444e5f5c94ecf90e4916" + integrity sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w== + dependencies: + find-up "^5.0.0" + find-yarn-workspace-root2 "1.2.16" + path-exists "^4.0.0" + which-pm "2.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.6.1, prettier@^2.7.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^27.0.2, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-quick@^3.1.3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.3.1.tgz#cfde97fec77a8d201a0e0c9c71d9990e12587ee2" + integrity sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg== + dependencies: + execa "^4.1.0" + find-up "^4.1.0" + ignore "^5.3.0" + mri "^1.2.0" + picocolors "^1.0.0" + picomatch "^3.0.1" + tslib "^2.6.2" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.0.3: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.0, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +react-composer@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-composer/-/react-composer-5.0.3.tgz#7beb9513da5e8687f4f434ea1333ef36a4f3091b" + integrity sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA== + dependencies: + prop-types "^15.6.0" + +react-devtools-core@4.24.0: + version "4.24.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.0.tgz#7daa196bdc64f3626b3f54f2ff2b96f7c4fdf017" + integrity sha512-Rw7FzYOOzcfyUPaAm9P3g0tFdGqGq2LLiAI+wjYcp6CsF3DeeMrRS3HZAho4s273C29G/DJhx0e8BpRE/QZNGg== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +react-dom@^18.0.0, 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== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-merge-refs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-2.1.1.tgz#e46763f8f1b881c0226ee54a1a2a10ffefba0233" + integrity sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag== + +react-native-codegen@^0.69.1: + version "0.69.2" + resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.69.2.tgz#e33ac3b1486de59ddae687b731ddbfcef8af0e4e" + integrity sha512-yPcgMHD4mqLbckqnWjFBaxomDnBREfRjDi2G/WxNyPBQLD+PXUEmZTkDx6QoOXN+Bl2SkpnNOSsLE2+/RUHoPw== + dependencies: + "@babel/parser" "^7.14.0" + flow-parser "^0.121.0" + jscodeshift "^0.13.1" + nullthrows "^1.1.1" + +react-native-gradle-plugin@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.7.tgz#96602f909745239deab7b589443f14fce5da2056" + integrity sha512-+4JpbIx42zGTONhBTIXSyfyHICHC29VTvhkkoUOJAh/XHPEixpuBduYgf6Y4y9wsN1ARlQhBBoptTvXvAFQf5g== + +react-native@0.69.3: + version "0.69.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.69.3.tgz#8fc7afe0a302294262a6b49ba2089483db734c05" + integrity sha512-SyGkcoEUa/BkO+wKVnv4OsnLSNfUM5zLNXS3iT/3eXjKX91/FKBH/nfR9BE1c60X5LQe/P5QYqr6WPX3TRSQkA== + dependencies: + "@jest/create-cache-key-function" "^27.0.1" + "@react-native-community/cli" "^8.0.3" + "@react-native-community/cli-platform-android" "^8.0.2" + "@react-native-community/cli-platform-ios" "^8.0.2" + "@react-native/assets" "1.0.0" + "@react-native/normalize-color" "2.0.0" + "@react-native/polyfills" "2.0.0" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + event-target-shim "^5.0.1" + hermes-engine "~0.11.0" + invariant "^2.2.4" + jsc-android "^250230.2.1" + memoize-one "^5.0.0" + metro-react-native-babel-transformer "0.70.3" + metro-runtime "0.70.3" + metro-source-map "0.70.3" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + pretty-format "^26.5.2" + promise "^8.0.3" + react-devtools-core "4.24.0" + react-native-codegen "^0.69.1" + react-native-gradle-plugin "^0.0.7" + react-refresh "^0.4.0" + react-shallow-renderer "16.15.0" + regenerator-runtime "^0.13.2" + scheduler "^0.21.0" + stacktrace-parser "^0.1.3" + use-sync-external-store "^1.0.0" + 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== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.21.0" + +react-refresh@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3" + integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ== + +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react-refresh@^0.4.0: + version "0.4.3" + 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: + version "16.15.0" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + +react-test-renderer@^18.0.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== + dependencies: + react-is "^18.2.0" + react-shallow-renderer "^16.15.0" + scheduler "^0.23.0" + +react-use-measure@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba" + integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig== + dependencies: + debounce "^1.2.1" + +react-use-refs@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" + integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== + +react@^18.0.0, 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" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +read-yaml-file@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" + integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.6.1" + pify "^4.0.1" + strip-bom "^3.0.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +recast@^0.20.4: + version "0.20.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" + integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.9: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rimraf@^2.5.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rollup@^2.79.1: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +rollup@^4.13.0: + version "4.13.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.1.tgz#5bd6d84eafd60280487085b8bf9c91679571005a" + integrity sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.13.1" + "@rollup/rollup-android-arm64" "4.13.1" + "@rollup/rollup-darwin-arm64" "4.13.1" + "@rollup/rollup-darwin-x64" "4.13.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.13.1" + "@rollup/rollup-linux-arm64-gnu" "4.13.1" + "@rollup/rollup-linux-arm64-musl" "4.13.1" + "@rollup/rollup-linux-riscv64-gnu" "4.13.1" + "@rollup/rollup-linux-s390x-gnu" "4.13.1" + "@rollup/rollup-linux-x64-gnu" "4.13.1" + "@rollup/rollup-linux-x64-musl" "4.13.1" + "@rollup/rollup-win32-arm64-msvc" "4.13.1" + "@rollup/rollup-win32-ia32-msvc" "4.13.1" + "@rollup/rollup-win32-x64-msvc" "4.13.1" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" + integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== + 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@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + +serve-static@^1.13.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1, shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "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== + +simple-plist@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" + integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.1" + plist "^3.0.5" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slugify@^1.3.4: + version "1.6.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" + integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + +smartwrap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" + integrity sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== + dependencies: + array.prototype.flat "^1.2.3" + breakword "^1.0.5" + grapheme-splitter "^1.0.4" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + yargs "^15.1.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-js@^1.0.2, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spawndamnit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" + integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== + dependencies: + cross-spawn "^5.1.0" + signal-exit "^3.0.2" + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-parser@^0.1.3: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stats-gl@^2.0.0: + version "2.2.7" + resolved "https://registry.yarnpkg.com/stats-gl/-/stats-gl-2.2.7.tgz#9b605f7dfcd3289f1d7791bda5094b8031b35c60" + integrity sha512-3EjvpmVgUic2YxCM+dxwg68B0tzWqMCAmflmdbqEKuqwZL+huYieqV14crm80NB7r2F4mWaYcLLlcpbhteEagw== + +stats.js@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d" + integrity sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +stream-buffers@2.2.x: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== + +stream-transform@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" + integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== + dependencies: + mixme "^0.5.1" + +string-argv@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0, 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.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + 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" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +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 "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-components@^6.1.8: + version "6.1.8" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" + integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== + dependencies: + "@emotion/is-prop-valid" "1.2.1" + "@emotion/unitless" "0.8.0" + "@types/stylis" "4.2.0" + css-to-react-native "3.2.0" + csstype "3.1.2" + postcss "8.4.31" + shallowequal "1.1.0" + stylis "4.3.1" + tslib "2.5.0" + +stylis@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" + integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== + +sucrase@^3.20.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +sudo-prompt@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^9.2.2: + version "9.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +suspend-react@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/suspend-react/-/suspend-react-0.1.3.tgz#a52f49d21cfae9a2fb70bd0c68413d3f9d90768e" + integrity sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +temp@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +term-size@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser@^5.16.8: + version "5.30.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.0.tgz#64cb2af71e16ea3d32153f84d990f9be0cdc22bf" + integrity sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +three-mesh-bvh@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.3.tgz#91f2d7e26f230288b5b0a6bdf41bdd9620348945" + integrity sha512-3W6KjzmupjfE89GuHPT31kxKWZ4YGZPEZJNysJpiOZfQRsBQQgmK7v/VJPpjG6syhAvTnY+5Fr77EvIkTLpGSw== + +three-stdlib@^2.13.0, three-stdlib@^2.29.1, three-stdlib@^2.29.4: + version "2.29.6" + resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.6.tgz#d1d17a7e5d48921ebb3aed9f5131bb85968e4d29" + integrity sha512-nj9bHkzhhwfmqQcM/keC2RDb0bHhbw6bRXTy81ehzi8F1rtp6pJ5eS0/vl1Eg5RMFqXOMyxJ6sDHPoLU+IrVZg== + dependencies: + "@types/draco3d" "^1.4.0" + "@types/offscreencanvas" "^2019.6.4" + "@types/webxr" "^0.5.2" + draco3d "^1.4.1" + fflate "^0.6.9" + potpack "^1.0.1" + +three@^0.141.0: + version "0.141.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" + integrity sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA== + +three@^0.160.0: + version "0.160.1" + resolved "https://registry.yarnpkg.com/three/-/three-0.160.1.tgz#61fe2907312e8604b1f64187f58e047503847413" + integrity sha512-Bgl2wPJypDOZ1stAxwfWAcJ0WQf7QzlptsxkjYiURPz+n5k4RBDLsq+6f9Y75TYxn6aHLcWz+JNmwTOXWrQTBQ== + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +troika-three-text@^0.49.0: + version "0.49.0" + resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.49.0.tgz#bc2dc1924250c477cd39316cd83585dee12550e0" + integrity sha512-sn9BNC6eIX8OO3iAkPwjecJ7Pn21Ve8P1UNFMNeQzXx759rrqS4i4pSZs7FLMYdWyCKVXBFGimBySFwRKLjq/Q== + dependencies: + bidi-js "^1.0.2" + troika-three-utils "^0.49.0" + troika-worker-utils "^0.49.0" + webgl-sdf-generator "1.1.1" + +troika-three-utils@^0.49.0: + version "0.49.0" + resolved "https://registry.yarnpkg.com/troika-three-utils/-/troika-three-utils-0.49.0.tgz#3fbdbf8783740ce3c1f7acac642e7e957ea4f090" + integrity sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA== + +troika-worker-utils@^0.49.0: + version "0.49.0" + resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz#e5e200a09d2e0e4eb9fe818a83effa912e2ec4b4" + integrity sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +ts-jest@^27.1.4: + version "27.1.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" + integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tty-table@^4.1.5: + version "4.2.3" + resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.2.3.tgz#e33eb4007a0a9c976c97c37fa13ba66329a5c515" + integrity sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA== + dependencies: + chalk "^4.1.2" + csv "^5.5.3" + kleur "^4.1.5" + smartwrap "^2.0.2" + strip-ansi "^6.0.1" + wcwidth "^1.0.1" + yargs "^17.7.1" + +tunnel-rat@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tunnel-rat/-/tunnel-rat-0.1.2.tgz#1717efbc474ea2d8aa05a91622457a6e201c0aeb" + integrity sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ== + dependencies: + zustand "^4.3.2" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4.6.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +typescript@^5.3.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== + +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-error-boundary@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/use-error-boundary/-/use-error-boundary-2.0.6.tgz#10f0cd45f6e53cedca8a567fa2b7bc8c709e4420" + integrity sha512-AWCVKSAanLe6R/on/ZkHYtGKfXs8BQX6z/TUGYqtvkajLqQyrGKJJscbahtq8OyN8L3LqTRjJWx4gCOLmfIObw== + +use-sync-external-store@1.2.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@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-compile-cache@^2.1.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vite@^5.0.11: + version "5.2.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.6.tgz#fc2ce309e0b4871e938cb0aca3b96c422c01f222" + integrity sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA== + dependencies: + esbuild "^0.20.1" + postcss "^8.4.36" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webgl-constants@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/webgl-constants/-/webgl-constants-1.1.1.tgz#f9633ee87fea56647a60b9ce735cbdfb891c6855" + integrity sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg== + +webgl-sdf-generator@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz#3e1b422b3d87cd3cc77f2602c9db63bc0f6accbd" + integrity sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-pm@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== + dependencies: + load-yaml-file "^0.2.0" + path-exists "^4.0.0" + +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wouter@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/wouter/-/wouter-2.12.1.tgz#11d913324c6320b679873783acb15ea3523b8521" + integrity sha512-G7a6JMSLSNcu6o8gdOfIzqxuo8Qx1qs+9rpVnlurH69angsSFPZP5gESNuVNeJct/MGpQg191pDo4HUjTx7IIQ== + dependencies: + use-sync-external-store "^1.0.0" + +"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" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +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 "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^6.1.4: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.4.6, ws@^7.5.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xcode@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" + integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== + dependencies: + simple-plist "^1.1.0" + uuid "^7.0.3" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml2js@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" + integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" + integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== + +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.x, yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^18.1.2, yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.1.0, yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1, yargs@^17.7.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.21.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + +zustand@^3.7.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" + integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA== + +zustand@^4.1.2, zustand@^4.3.2, zustand@^4.4.7: + version "4.5.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848" + integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== + dependencies: + use-sync-external-store "1.2.0" From d7a5b31af3574a664b99e51e476a0707ab990904 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 29 Mar 2024 01:36:44 -0500 Subject: [PATCH 165/252] chore: mirror #3197 --- packages/fiber/src/core/loop.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 1995d8f402..48d2502a74 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -75,6 +75,7 @@ function update(timestamp: number, state: RootState, frame?: XRFrame) { } let running = false +let useFrameInProgress = false let repeat: number let frame: number let state: RootState @@ -88,6 +89,7 @@ export function loop(timestamp: number): void { flushGlobalEffects('before', timestamp) // Render all roots + useFrameInProgress = true for (const root of _roots.values()) { state = root.store.getState() @@ -100,6 +102,7 @@ export function loop(timestamp: number): void { repeat += update(timestamp, state) } } + useFrameInProgress = true // Run after-effects flushGlobalEffects('after', timestamp) @@ -122,8 +125,21 @@ export function loop(timestamp: number): void { export function invalidate(state?: RootState, frames = 1): void { if (!state) return _roots.forEach((root) => invalidate(root.store.getState(), frames)) if (state.gl.xr?.isPresenting || !state.internal.active || state.frameloop === 'never') return - // Increase frames, do not go higher than 60 - state.internal.frames = Math.min(60, state.internal.frames + frames) + + if (frames > 1) { + // legacy support for people using frames parameters + // Increase frames, do not go higher than 60 + state.internal.frames = Math.min(60, state.internal.frames + frames) + } else { + if (useFrameInProgress) { + //called from within a useFrame, it means the user wants an additional frame + state.internal.frames = 2 + } else { + //the user need a new frame, no need to increment further than 1 + state.internal.frames = 1 + } + } + // If the render-loop isn't active, start it if (!running) { running = true From b4f7bbc08315460321a2a1b254b4c2967fa2dc10 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 22 Apr 2024 15:33:01 -0500 Subject: [PATCH 166/252] fix(useLoader): loosen object3d check --- packages/fiber/src/core/hooks.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 623c957f65..9ef6fd9a98 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -2,7 +2,7 @@ import * as THREE from 'three' import * as React from 'react' import { suspend, preload, clear } from 'suspend-react' import { context, RootState, RenderCallback, UpdateCallback, StageTypes, RootStore } from './store' -import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect } from './utils' +import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect, isObject3D } from './utils' import { Stages } from './stages' import type { Instance } from './reconciler' @@ -109,7 +109,7 @@ function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressE new Promise>((res, reject) => loader.load( input, - (data) => res(data?.scene instanceof THREE.Object3D ? Object.assign(data, buildGraph(data.scene)) : data), + (data) => res(isObject3D(data?.scene) ? Object.assign(data, buildGraph(data.scene)) : data), onProgress, (error) => reject(new Error(`Could not load ${input}: ${(error as ErrorEvent)?.message}`)), ), From 6d2543b1b83131fe03e390a58e1f7d242c126045 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 22 Apr 2024 16:16:11 -0500 Subject: [PATCH 167/252] chore(examples): remove styled-components --- example/package.json | 2 - example/src/App.tsx | 24 +++-- example/src/components.tsx | 20 ++++ example/src/styles.css | 189 +++++++++++++++++++++++++++++++++++++ example/src/styles.tsx | 160 ------------------------------- yarn.lock | 120 +---------------------- 6 files changed, 223 insertions(+), 292 deletions(-) create mode 100644 example/src/components.tsx create mode 100644 example/src/styles.css delete mode 100644 example/src/styles.tsx diff --git a/example/package.json b/example/package.json index b99c1f235f..be374cb55f 100644 --- a/example/package.json +++ b/example/package.json @@ -15,7 +15,6 @@ "react-dom": "^18.2.0", "react-merge-refs": "^2.1.1", "react-use-refs": "^1.0.1", - "styled-components": "^6.1.8", "three": "^0.160.0", "three-stdlib": "^2.29.1", "use-error-boundary": "^2.0.6", @@ -24,7 +23,6 @@ }, "devDependencies": { "@types/react": "^18.2.47", - "@types/styled-components": "^5.1.34", "@vitejs/plugin-react-refresh": "^1.3.6", "@vitejs/plugin-react": "^4.2.1", "typescript": "^5.3.3", diff --git a/example/src/App.tsx b/example/src/App.tsx index e70dc1a95d..41858d7aa5 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -2,7 +2,8 @@ import * as React from 'react' import { useErrorBoundary } from 'use-error-boundary' import { Route, useRoute, Redirect } from 'wouter' -import { Global, Loading, Page, DemoPanel, Dot, Error } from './styles' +import { Loading, Page, DemoPanel, Dot, Error } from './components' +import './styles.css' import * as demos from './demos' @@ -47,17 +48,14 @@ export default function App() { const dev = new URLSearchParams(location.search).get('dev') return ( - <> - - - }> - } /> - - - - - {dev === null && } - - + + }> + } /> + + + + + {dev === null && } + ) } diff --git a/example/src/components.tsx b/example/src/components.tsx new file mode 100644 index 0000000000..b5775242ca --- /dev/null +++ b/example/src/components.tsx @@ -0,0 +1,20 @@ +import * as React from 'react' +import { type LinkProps, Link } from 'wouter' + +export const Page = (props: { children?: React.ReactNode }) =>
    + +export const DemoPanel = (props: { children?: React.ReactNode }) =>
    + +export const Dot = (props: React.PropsWithChildren) => + +export const Loading = () => { + return ( +
    +
    Loading.
    +
    + ) +} + +export const Error = ({ children }: { children?: React.ReactNode }) => { + return
    {children}
    +} diff --git a/example/src/styles.css b/example/src/styles.css new file mode 100644 index 0000000000..9a813beab0 --- /dev/null +++ b/example/src/styles.css @@ -0,0 +1,189 @@ +/* @import url('@pmndrs/branding/styles.css'); */ +@import url('https://rsms.me/inter/inter.css'); + +.pmndrs-menu { + font-family: 'Inter var', sans-serif; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + color: #808080; + padding: 40px; + pointer-events: none; + justify-content: flex-start; + align-items: flex-end; + flex-direction: row; + font-size: 10px; + line-height: 1.5em; +} + +.pmndrs-menu > div { + word-wrap: none; + word-break: none; + white-space: pre; + padding-left: 25px; + padding-right: 25px; + display: flex; + justify-content: flex-start; + align-items: flex-start; + flex-direction: column; +} + +.pmndrs-menu > div b { + font-weight: 600; + color: #b0b0b0; +} + +.pmndrs-menu a { + pointer-events: all; + cursor: pointer; + color: inherit; + text-decoration: none; +} + +.pmndrs-menu a:hover { + text-decoration: underline; + color: inherit; +} + +* { + box-sizing: border-box; +} + +html, +body, +#root { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: hidden; +} + +#root { + overflow: auto; +} + +body { + position: fixed; + overflow: hidden; + overscroll-behavior-y: none; + font-family: 'Inter var', sans-serif; + color: black; + background: #dedddf !important; +} + +canvas { + touch-action: none; +} + +.container { + position: relative; + width: 100%; + height: 100%; +} + +.text { + line-height: 1em; + text-align: left; + font-size: 8em; + word-break: break-word; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.Page { + position: relative; + width: 100%; + height: 100vh; + + & > h1 { + font-family: 'Roboto', sans-serif; + font-weight: 900; + font-size: 8em; + margin: 0; + color: white; + line-height: 0.59em; + letter-spacing: -2px; + } + + & > h1 { + position: absolute; + top: 70px; + left: 60px; + } + + & > span { + position: absolute; + bottom: 60px; + right: 60px; + } + + @media only screen and (max-width: 1000px) { + & > h1 { + font-size: 5em; + letter-spacing: -1px; + } + } + + & > a { + margin: 0; + color: white; + text-decoration: none; + } +} + +.DemoPanel { + z-index: 1000; + position: absolute; + bottom: 50px; + left: 50px; + max-width: 250px; +} + +.Dot { + display: inline-block; + width: 20px; + height: 20px; + border-radius: 50%; + margin: 8px; +} + +.LoadingContainer { + position: fixed; + inset: 0; + z-index: 100; + display: flex; + align-items: center; + justify-content: center; + + background-color: #dedddf; + color: white; +} + +.LoadingMessage { + font-family: 'Inter', Helvetica, sans-serif; +} + +.Error { + position: absolute; + padding: 10px 20px; + bottom: unset; + right: unset; + top: 60px; + left: 60px; + max-width: 380px; + border: 2px solid #ff5050; + color: #ff5050; +} diff --git a/example/src/styles.tsx b/example/src/styles.tsx deleted file mode 100644 index db509b6ed9..0000000000 --- a/example/src/styles.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import * as React from 'react' -import styled, { createGlobalStyle } from 'styled-components' -import { Link } from 'wouter' - -const Page = styled.div` - position: relative; - width: 100%; - height: 100vh; - - & > h1 { - font-family: 'Roboto', sans-serif; - font-weight: 900; - font-size: 8em; - margin: 0; - color: white; - line-height: 0.59em; - letter-spacing: -2px; - } - - & > h1 { - position: absolute; - top: 70px; - left: 60px; - } - - & > span { - position: absolute; - bottom: 60px; - right: 60px; - } - - @media only screen and (max-width: 1000px) { - & > h1 { - font-size: 5em; - letter-spacing: -1px; - } - } - - & > a { - margin: 0; - color: white; - text-decoration: none; - } -` - -const Global = createGlobalStyle` - @import url('@pmndrs/branding/styles.css'); - - * { - box-sizing: border-box; - } - - html, - body, - #root { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - overflow: hidden; - } - - #root { - overflow: auto; - } - - body { - position: fixed; - overflow: hidden; - overscroll-behavior-y: none; - font-family: 'Inter var', sans-serif; - color: black; - background: #dedddf !important; - } - - canvas { - touch-action: none; - } - - .container { - position: relative; - width: 100%; - height: 100%; - } - - .text { - line-height: 1em; - text-align: left; - font-size: 8em; - word-break: break-word; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -` -export const DemoPanel = styled.div` - z-index: 1000; - position: absolute; - bottom: 50px; - left: 50px; - max-width: 250px; -` - -export const Dot = styled(Link)` - display: inline-block; - width: 20px; - height: 20px; - border-radius: 50%; - margin: 8px; -` - -const LoadingContainer = styled.div` - position: fixed; - inset: 0; - z-index: 100; - display: flex; - align-items: center; - justify-content: center; - - background-color: #dedddf; - color: white; -` - -const LoadingMessage = styled.div` - font-family: 'Inter', Helvetica, sans-serif; -` - -export const Loading = () => { - return ( - - Loading. - - ) -} - -const StyledError = styled.div` - position: absolute; - padding: 10px 20px; - bottom: unset; - right: unset; - top: 60px; - left: 60px; - max-width: 380px; - border: 2px solid #ff5050; - color: #ff5050; -` - -export const Error = ({ children }: React.PropsWithChildren<{}>) => { - return {children} -} - -export { Global, Page } diff --git a/yarn.lock b/yarn.lock index 2d23fa2f2b..5018f08fe7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1336,23 +1336,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@emotion/is-prop-valid@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/unitless@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== - "@esbuild/aix-ppc64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" @@ -2796,14 +2779,6 @@ dependencies: "@types/node" "*" -"@types/hoist-non-react-statics@*": - version "3.3.5" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" - integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" @@ -2957,20 +2932,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/styled-components@^5.1.34": - version "5.1.34" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.34.tgz#4107df8ef8a7eaba4fa6b05f78f93fba4daf0300" - integrity sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA== - dependencies: - "@types/hoist-non-react-statics" "*" - "@types/react" "*" - csstype "^3.0.2" - -"@types/stylis@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" - integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== - "@types/three@^0.141.0": version "0.141.0" resolved "https://registry.yarnpkg.com/@types/three/-/three-0.141.0.tgz#d9d81a54b28ebc2a56931dfd4d9c54d25c20d6c8" @@ -3965,11 +3926,6 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - camera-controls@^2.4.2: version "2.8.3" resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-2.8.3.tgz#54c296d21564dede84e56ffd6b75b3daa3c76e90" @@ -4326,20 +4282,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-to-react-native@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -4357,11 +4299,6 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -5892,13 +5829,6 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" -hoist-non-react-statics@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -8327,7 +8257,7 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.6, nanoid@^3.3.7: +nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -8878,20 +8808,6 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-value-parser@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@^8.4.36: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" @@ -9084,7 +9000,7 @@ react-dom@^18.0.0, react-dom@^18.2.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9717,11 +9633,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shallowequal@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -9872,7 +9783,7 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -source-map-js@^1.0.2, source-map-js@^1.2.0: +source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== @@ -10185,26 +10096,6 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -styled-components@^6.1.8: - version "6.1.8" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" - integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== - dependencies: - "@emotion/is-prop-valid" "1.2.1" - "@emotion/unitless" "0.8.0" - "@types/stylis" "4.2.0" - css-to-react-native "3.2.0" - csstype "3.1.2" - postcss "8.4.31" - shallowequal "1.1.0" - stylis "4.3.1" - tslib "2.5.0" - -stylis@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" - integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== - sucrase@^3.20.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" @@ -10537,11 +10428,6 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" From be6cc237d6b999c9c1be9b4124b79e9d7388b14e Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 25 Apr 2024 22:59:33 -0500 Subject: [PATCH 168/252] [v9] fix!: upgrade reconciler for React 19 (#3224) --- example/package.json | 4 +- package.json | 16 +- packages/fiber/package.json | 12 +- packages/fiber/src/core/reconciler.tsx | 140 ++++++---- packages/fiber/src/core/renderer.tsx | 14 +- packages/fiber/src/core/utils.tsx | 2 +- packages/fiber/tests/canvas.native.test.tsx | 2 +- packages/fiber/tests/renderer.test.tsx | 42 ++- packages/shared/setupTests.ts | 8 +- packages/test-renderer/package.json | 2 +- packages/test-renderer/src/helpers/waitFor.ts | 4 +- yarn.lock | 244 +++++++----------- 12 files changed, 241 insertions(+), 249 deletions(-) diff --git a/example/package.json b/example/package.json index be374cb55f..b1457a6007 100644 --- a/example/package.json +++ b/example/package.json @@ -11,8 +11,8 @@ "@react-spring/three": "^9.7.3", "@react-three/drei": "^9.93.0", "@use-gesture/react": "latest", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "19.0.0-canary-db913d8e17-20240422", + "react-dom": "19.0.0-canary-db913d8e17-20240422", "react-merge-refs": "^2.1.1", "react-use-refs": "^1.0.1", "three": "^0.160.0", diff --git a/package.json b/package.json index 3e0a8822a4..061cf759bd 100644 --- a/package.json +++ b/package.json @@ -49,13 +49,13 @@ "@changesets/changelog-git": "^0.1.11", "@changesets/cli": "^2.22.0", "@preconstruct/cli": "^2.1.5", - "@testing-library/react": "^13.0.0-alpha.5", + "@testing-library/react": "^15.0.2", "@types/jest": "^29.2.5", - "@types/react": "^18.0.5", - "@types/react-dom": "^18.0.1", + "@types/react": "18.2.73", + "@types/react-dom": "18.2.22", "@types/react-native": "0.69.5", - "@types/react-test-renderer": "^17.0.1", - "@types/scheduler": "^0.16.2", + "@types/react-test-renderer": "18.0.7", + "@types/scheduler": "0.23.0", "@types/three": "^0.141.0", "@typescript-eslint/eslint-plugin": "^5.17.0", "@typescript-eslint/parser": "^5.17.0", @@ -76,10 +76,10 @@ "lint-staged": "^12.3.7", "prettier": "^2.6.1", "pretty-quick": "^3.1.3", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "19.0.0-beta-94eed63c49-20240425", + "react-dom": "19.0.0-beta-94eed63c49-20240425", "react-native": "0.69.3", - "react-test-renderer": "^18.0.0", + "react-test-renderer": "19.0.0-beta-94eed63c49-20240425", "regenerator-runtime": "^0.13.9", "three": "^0.141.0", "three-stdlib": "^2.13.0", diff --git a/packages/fiber/package.json b/packages/fiber/package.json index c3133e030a..7bbe75e75d 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -43,13 +43,13 @@ }, "dependencies": { "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", + "@types/react-reconciler": "^0.28.8", "base64-js": "^1.5.1", "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", + "its-fine": "^1.2.5", + "react-reconciler": "0.31.0-beta-94eed63c49-20240425", "react-use-measure": "^2.1.1", - "scheduler": "^0.21.0", + "scheduler": "0.25.0-beta-94eed63c49-20240425", "suspend-react": "^0.1.3", "zustand": "^4.1.2" }, @@ -58,8 +58,8 @@ "expo-asset": ">=8.4", "expo-gl": ">=11.0", "expo-file-system": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", + "react": ">=19.0", + "react-dom": ">=19.0", "react-native": ">=0.69", "three": ">=0.141" }, diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index cda6204490..a936f7c683 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -1,7 +1,13 @@ import * as THREE from 'three' import * as React from 'react' import Reconciler from 'react-reconciler' -import { ContinuousEventPriority, DiscreteEventPriority, DefaultEventPriority } from 'react-reconciler/constants' +import { + // @ts-ignore + NoEventPriority, + ContinuousEventPriority, + DiscreteEventPriority, + DefaultEventPriority, +} from 'react-reconciler/constants' import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler' import { diffProps, @@ -73,7 +79,7 @@ interface HostConfig { suspenseInstance: Instance hydratableInstance: never publicInstance: Instance['object'] - hostContext: never + hostContext: {} updatePayload: null | [true] | [false, Instance['props']] childSet: never timeoutHandle: number | undefined @@ -238,13 +244,18 @@ function removeChild( if (shouldDispose && child.type !== 'primitive' && child.object.type !== 'Scene') { if (typeof child.object.dispose === 'function') { const dispose = child.object.dispose.bind(child.object) - scheduleCallback(idlePriority, () => { + const handleDispose = () => { try { dispose() } catch (e) { - /* ... */ + // no-op } - }) + } + + // In a testing environment, cleanup immediately + if (typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined') handleDispose() + // Otherwise, using a real GPU so schedule cleanup to prevent stalls + else scheduleCallback(idlePriority, handleDispose) } } @@ -309,6 +320,37 @@ function switchInstance( const handleTextInstance = () => console.warn('R3F: Text is not allowed in JSX! This could be stray whitespace or characters.') +const NO_CONTEXT: HostConfig['hostContext'] = {} + +let currentUpdatePriority: number = NoEventPriority + +// Effectively removed to diff in commit phase +// https://github.com/facebook/react/pull/27409 +function prepareUpdate( + instance: HostConfig['instance'], + _type: string, + oldProps: HostConfig['props'], + newProps: HostConfig['props'], +): HostConfig['updatePayload'] { + // Reconstruct primitives if object prop changes + if (instance.type === 'primitive' && oldProps.object !== newProps.object) return [true] + + // Throw if an object or literal was passed for args + if (newProps.args !== undefined && !Array.isArray(newProps.args)) + throw new Error('R3F: The args prop must be an array!') + + // Reconstruct instance if args change + if (newProps.args?.length !== oldProps.args?.length) return [true] + if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) return [true] + + // Create a diff-set, flag if there are any changes + const changedProps = diffProps(instance, newProps, true) + if (Object.keys(changedProps).length) return [false, changedProps] + + // Otherwise do not touch the instance + return null +} + export const reconciler = Reconciler< HostConfig['type'], HostConfig['props'], @@ -324,11 +366,11 @@ export const reconciler = Reconciler< HostConfig['timeoutHandle'], HostConfig['noTimeout'] >({ - supportsMutation: true, isPrimaryRenderer: false, + warnsIfNotActing: false, + supportsMutation: true, supportsPersistence: false, supportsHydration: false, - noTimeout: -1, createInstance, removeChild, appendChild, @@ -352,29 +394,20 @@ export const reconciler = Reconciler< insertBefore(scene, child, beforeChild) }, - getRootHostContext: () => null, - getChildHostContext: (parentHostContext) => parentHostContext, - prepareUpdate(instance, _type, oldProps, newProps) { - // Reconstruct primitives if object prop changes - if (instance.type === 'primitive' && oldProps.object !== newProps.object) return [true] - - // Throw if an object or literal was passed for args - if (newProps.args !== undefined && !Array.isArray(newProps.args)) - throw new Error('R3F: The args prop must be an array!') - - // Reconstruct instance if args change - if (newProps.args?.length !== oldProps.args?.length) return [true] - if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) return [true] - - // Create a diff-set, flag if there are any changes - const changedProps = diffProps(instance, newProps, true) - if (Object.keys(changedProps).length) return [false, changedProps] - - // Otherwise do not touch the instance - return null - }, - commitUpdate(instance, diff, type, _oldProps, newProps, fiber) { - const [reconstruct, changedProps] = diff! + getRootHostContext: () => NO_CONTEXT, + getChildHostContext: () => NO_CONTEXT, + // @ts-ignore prepareUpdate and updatePayload removed with React 19 + commitUpdate( + instance: HostConfig['instance'], + type: HostConfig['type'], + oldProps: HostConfig['props'], + newProps: HostConfig['props'], + fiber: any, + ) { + const diff = prepareUpdate(instance, type, oldProps, newProps) + if (diff === null) return + + const [reconstruct, changedProps] = diff // Reconstruct when args or 0, scheduleTimeout: (typeof setTimeout === 'function' ? setTimeout : undefined) as any, cancelTimeout: (typeof clearTimeout === 'function' ? clearTimeout : undefined) as any, - // @ts-ignore Deprecated experimental APIs - // https://github.com/facebook/react/blob/main/packages/shared/ReactFeatureFlags.js - // https://github.com/pmndrs/react-three-fiber/pull/2360#discussion_r916356874 - beforeActiveInstanceBlur: () => {}, - afterActiveInstanceBlur: () => {}, - detachDeletedInstance: () => {}, - // Gives React a clue as to how import the current interaction is - // https://github.com/facebook/react/tree/main/packages/react-reconciler#getcurrenteventpriority - getCurrentEventPriority() { + noTimeout: -1, + getInstanceFromNode: () => null, + beforeActiveInstanceBlur() {}, + afterActiveInstanceBlur() {}, + detachDeletedInstance() {}, + // @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 + shouldAttemptEagerTransition() { + return false + }, + requestPostPaintCallback() {}, + maySuspendCommit() { + return false + }, + preloadInstance() { + return true // true indicates already loaded + }, + startSuspendingCommit() {}, + suspendInstance() {}, + waitForCommitToBeReady() { + return null + }, + NotPendingTransition: null, + setCurrentUpdatePriority(newPriority: number) { + currentUpdatePriority = newPriority + }, + getCurrentUpdatePriority() { + return currentUpdatePriority + }, + resolveUpdatePriority() { + if (currentUpdatePriority) return currentUpdatePriority if (!globalScope) return DefaultEventPriority const name = globalScope.event?.type diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index dd9749642a..64a68eb305 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -207,7 +207,19 @@ export function createRoot(canvas: TCanvas): ReconcilerR const store = prevStore || createStore(invalidate, advance) // Create renderer const fiber = - prevFiber || reconciler.createContainer(store, ConcurrentRoot, null, false, null, '', logRecoverableError, null) + prevFiber || + (reconciler as any).createContainer( + store, // container + ConcurrentRoot, // tag + null, // hydration callbacks + false, // isStrictMode + null, // concurrentUpdatesByDefaultOverride + '', // identifierPrefix + logRecoverableError, // onUncaughtError + logRecoverableError, // onCaughtError + logRecoverableError, // onRecoverableError + null, // transitionCallbacks + ) // Map it if (!prevRoot) _roots.set(canvas, { fiber, store }) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 291c70edcd..995ab208e8 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -38,7 +38,7 @@ export type Act = (cb: () => Promise) => Promise /** * 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 export type Camera = (THREE.OrthographicCamera | THREE.PerspectiveCamera) & { manual?: boolean } export const isOrthographicCamera = (def: Camera): def is THREE.OrthographicCamera => diff --git a/packages/fiber/tests/canvas.native.test.tsx b/packages/fiber/tests/canvas.native.test.tsx index 8ffd1371f3..1f49083f68 100644 --- a/packages/fiber/tests/canvas.native.test.tsx +++ b/packages/fiber/tests/canvas.native.test.tsx @@ -61,6 +61,6 @@ describe('native Canvas', () => { ), ) - expect(() => renderer.unmount()).not.toThrow() + expect(async () => await act(async () => renderer.unmount())).not.toThrow() }) }) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 7fd5afd952..ad31f55e11 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -24,20 +24,14 @@ extend({ Mock }) type ComponentMesh = THREE.Mesh -const expectToThrow = async (callback: () => any) => { - const error = console.error - console.error = jest.fn() - - let thrown = false +const expectToThrow = async (callback: () => any, message: string) => { + let error: Error | undefined try { await callback() - } catch (_) { - thrown = true + } catch (e) { + error = e as Error } - - expect(thrown).toBe(true) - expect(console.error).toBeCalled() - console.error = error + expect(error?.message).toBe(message) } describe('renderer', () => { @@ -256,8 +250,8 @@ describe('renderer', () => { // Throw on non-array value await expectToThrow( - // @ts-expect-error - async () => await act(async () => root.render()), + async () => await act(async () => root.render()), + 'R3F: The args prop must be an array!', ) // Set @@ -316,8 +310,8 @@ describe('renderer', () => { // Throw on undefined await expectToThrow( - // @ts-expect-error - async () => await act(async () => root.render()), + async () => await act(async () => root.render()), + "R3F: Primitives without 'object' are invalid!", ) // Update @@ -397,21 +391,21 @@ describe('renderer', () => { // Removes events expect(internal.interaction.length).toBe(0) // Calls dispose on top-level instance - expect(dispose).toBeCalled() + expect(dispose).toHaveBeenCalled() // Also disposes of children - expect(childDispose).toBeCalled() + expect(childDispose).toHaveBeenCalled() // Disposes of attached children - expect(attachDispose).toBeCalled() + expect(attachDispose).toHaveBeenCalled() // Properly detaches attached children - expect(attach).toBeCalledTimes(1) - expect(detach).toBeCalledTimes(1) + expect(attach).toHaveBeenCalledTimes(1) + expect(detach).toHaveBeenCalledTimes(1) // Respects dispose={null} - expect(flagDispose).not.toBeCalled() + expect(flagDispose).not.toHaveBeenCalled() // Does not dispose of primitives - expect(object.dispose).not.toBeCalled() + expect(object.dispose).not.toHaveBeenCalled() // Only disposes of declarative primitive children - expect(objectExternal.dispose).not.toBeCalled() - expect(disposeDeclarativePrimitive).toBeCalled() + expect(objectExternal.dispose).not.toHaveBeenCalled() + expect(disposeDeclarativePrimitive).toHaveBeenCalled() }) it('can swap 4 array primitives', async () => { diff --git a/packages/shared/setupTests.ts b/packages/shared/setupTests.ts index 7bfa887704..156be2033a 100644 --- a/packages/shared/setupTests.ts +++ b/packages/shared/setupTests.ts @@ -5,16 +5,12 @@ import 'regenerator-runtime/runtime' 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 // ESLint is broken atm -- TypeError: The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received 'http://localhost/eslintrc.cjs' jest.mock('eslint', () => ({ diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 4a86c84780..3d4076bd82 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -22,7 +22,7 @@ ] }, "peerDependencies": { - "react": ">=18.0", + "react": ">=19.0", "@react-three/fiber": ">=9.0.0", "three": ">=0.141" } diff --git a/packages/test-renderer/src/helpers/waitFor.ts b/packages/test-renderer/src/helpers/waitFor.ts index d80d2aec30..1cb20c8361 100644 --- a/packages/test-renderer/src/helpers/waitFor.ts +++ b/packages/test-renderer/src/helpers/waitFor.ts @@ -1,6 +1,4 @@ -import * as React from 'react' - -const act: (cb: () => Promise) => Promise = (React as any).unstable_act +import { act } from '@react-three/fiber' export interface WaitOptions { interval?: number diff --git a/yarn.lock b/yarn.lock index 5018f08fe7..6e6ee8b0de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2663,27 +2663,27 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@testing-library/dom@^8.5.0": - version "8.20.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" - integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== +"@testing-library/dom@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.0.0.tgz#ae1ab88aad35a728a38264041163174cafd7e8dd" + integrity sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^5.0.1" - aria-query "5.1.3" + aria-query "5.3.0" chalk "^4.1.0" dom-accessibility-api "^0.5.9" lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/react@^13.0.0-alpha.5": - version "13.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" - integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== +"@testing-library/react@^15.0.2": + version "15.0.2" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-15.0.2.tgz#d0fd7e9c41b819557639acf5f18e4cd1007ec295" + integrity sha512-5mzIpuytB1ctpyywvyaY2TAAUQVCZIGqwiqFQf6u9lvj/SJQepGUzNV18Xpk+NLCaCE2j7CWrZE0tEf9xLZYiQ== dependencies: "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.5.0" + "@testing-library/dom" "^10.0.0" "@types/react-dom" "^18.0.0" "@tootallnate/once@1": @@ -2858,7 +2858,7 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.1": +"@types/react-dom@18.2.22", "@types/react-dom@^18.0.0": version "18.2.22" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== @@ -2872,28 +2872,21 @@ 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": +"@types/react-reconciler@^0.28.0", "@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-test-renderer@^17.0.1": - version "17.0.9" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-17.0.9.tgz#da6d06f3f37eefab39386c390140374dc5db5b33" - integrity sha512-bOfxcu5oZ+KxvACScbkTwZ4eGCtZFTz4VZCOVAIfGbThxqiXSIGipKVG8ubaYBXquUSQROzNIUzviWdSnnAlzg== +"@types/react-test-renderer@18.0.7": + version "18.0.7" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.7.tgz#2cfe657adb3688cdf543995eceb2e062b5a68728" + integrity sha512-1+ANPOWc6rB3IkSnElhjv6VLlKg2dSv/OWClUyZimbLsQyBn8Js9Vtdsi3UICJ2rIQ3k2la06dkB+C92QfhKmg== dependencies: - "@types/react" "^17" + "@types/react" "*" -"@types/react@*", "@types/react@^18.0.5", "@types/react@^18.2.47": +"@types/react@*", "@types/react@18.2.73", "@types/react@^18.2.47": version "18.2.73" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.73.tgz#0579548ad122660d99e00499d22e33b81e73ed94" integrity sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA== @@ -2901,15 +2894,6 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/react@^17": - version "17.0.80" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41" - integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "^0.16" - csstype "^3.0.2" - "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -2917,10 +2901,10 @@ dependencies: "@types/node" "*" -"@types/scheduler@^0.16", "@types/scheduler@^0.16.2": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== +"@types/scheduler@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.23.0.tgz#0a6655b3e2708eaabca00b7372fafd7a792a7b09" + integrity sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw== "@types/semver@^7.3.12", "@types/semver@^7.5.0": version "7.5.8" @@ -3286,12 +3270,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== +aria-query@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" arr-diff@^4.0.0: version "4.0.0" @@ -3308,7 +3292,7 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -4434,30 +4418,6 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -4535,6 +4495,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -4756,21 +4721,6 @@ es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - es-iterator-helpers@^1.0.17: version "1.0.18" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" @@ -5547,7 +5497,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -5970,7 +5920,7 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.4, internal-slot@^1.0.7: +internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -5998,15 +5948,7 @@ is-accessor-descriptor@^1.0.1: dependencies: hasown "^2.0.0" -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: +is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -6180,7 +6122,7 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-map@^2.0.2, is-map@^2.0.3: +is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -6251,7 +6193,7 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.2, is-set@^2.0.3: +is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== @@ -6432,10 +6374,10 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" -its-fine@^1.0.6: - version "1.1.3" - resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.1.3.tgz#703219c696b8093940ce8ce6c3a52258750d2989" - integrity sha512-mncCA+yb6tuh5zK26cHqKlsSyxm4zdm4YgJpxycyx6p9fgxgK5PLu3iDVpKhzTn57Yrv3jk/r0aK0RFTT1OjFw== +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" @@ -8428,14 +8370,6 @@ object-inspect@^1.12.2, object-inspect@^1.13.1: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -8987,15 +8921,26 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" -react-dom@^18.0.0, 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-94eed63c49-20240425: + version "19.0.0-beta-94eed63c49-20240425" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-beta-94eed63c49-20240425.tgz#5d10ac9f95f43f26130c2b8f59accc8f18485963" + integrity sha512-V0uHW7Xd0u/LDlmFO8sJ9TTNizAESS+pexJNOi3KbOU1taf2gUO5J8YIWis60xcQbh7YBqSklyYIIq3DfiKz3Q== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "0.25.0-beta-94eed63c49-20240425" + +react-dom@19.0.0-canary-db913d8e17-20240422: + version "19.0.0-canary-db913d8e17-20240422" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-canary-db913d8e17-20240422.tgz#606831aa157749c4f556a7d40645a3fae9245440" + integrity sha512-+LmfcPoEv38BcToZ76NWbPgyAqFzZb9ONYVn1F7p6cZmtJerNjmwTBOGZ06h/tugQwg0+dU2igpS3veF5l9E3g== + dependencies: + scheduler "0.25.0-canary-db913d8e17-20240422" + +react-is@19.0.0-beta-94eed63c49-20240425: + version "19.0.0-beta-94eed63c49-20240425" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-beta-94eed63c49-20240425.tgz#e636ae331655ced5616a9ce252e827ed1b917eda" + integrity sha512-jG3jI4NjfbeH899/6kP16TUT+CeVUFNDTw8nPvUxaLSPZVY3s33PRbOOcrd3X4r5nlsyozOYEzkomUlLM3bZcw== -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: +"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== @@ -9069,13 +9014,12 @@ react-native@0.69.3: 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-94eed63c49-20240425: + version "0.31.0-beta-94eed63c49-20240425" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-beta-94eed63c49-20240425.tgz#c2d469ab0f933d82150ca871b8b2daae001fd0d7" + integrity sha512-1ffTu3lmFEjdSlHxGjb7ztGDdXtbhKSka8cTRB8/Cj99536qvLpohOfpEsdzkBo1x3I31Q4h+C8g/fZ54MZBxA== dependencies: - loose-envify "^1.1.0" - scheduler "^0.21.0" + scheduler "0.25.0-beta-94eed63c49-20240425" react-refresh@^0.10.0: version "0.10.0" @@ -9092,7 +9036,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== @@ -9100,14 +9044,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.0.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-94eed63c49-20240425: + version "19.0.0-beta-94eed63c49-20240425" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-beta-94eed63c49-20240425.tgz#458653f26e807c1b3b3c5fa3870ef5939d64afa5" + integrity sha512-lLAOO6Duvq6EHt3dGfn3pK8fBkJgHU2gqceje903/TDTlqlCrm+CXxCOsc6fjqWpD0RYkd1v8FpDEnusaQXijw== dependencies: - react-is "^18.2.0" - react-shallow-renderer "^16.15.0" - scheduler "^0.23.0" + react-is "19.0.0-beta-94eed63c49-20240425" + scheduler "0.25.0-beta-94eed63c49-20240425" react-use-measure@^2.1.1: version "2.1.1" @@ -9121,12 +9064,15 @@ react-use-refs@^1.0.1: resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== -react@^18.0.0, 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-94eed63c49-20240425: + version "19.0.0-beta-94eed63c49-20240425" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-94eed63c49-20240425.tgz#7b30b64c9b3517240d47ac00184ae2d59554bb9b" + integrity sha512-BPPKh5bZwcpw/Dgfh3A0MoU1GSl2edR2JggCq3QPdghQsrFg1aBuMkul5YB4rpII400RYq9VC5eF5Nm3spx0gA== + +react@19.0.0-canary-db913d8e17-20240422: + version "19.0.0-canary-db913d8e17-20240422" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-canary-db913d8e17-20240422.tgz#cbf02302e5c082da6c4deefce59525a92972d3ee" + integrity sha512-6D1y1MWw586E1LRbKTZWTGUk8ONtdwu1zPN7EGMiJb0XDcXrLDjvA9dCmXWyRfivV6z+PRJh9YpS3DZjpq24Bg== read-pkg-up@^7.0.1: version "7.0.1" @@ -9252,7 +9198,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== @@ -9512,6 +9458,16 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +scheduler@0.25.0-beta-94eed63c49-20240425: + version "0.25.0-beta-94eed63c49-20240425" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-94eed63c49-20240425.tgz#db261000b28fa56d65fff2e9c17eb7bd094a669a" + integrity sha512-U8hoOV7uut5E8cMvRSMikEBBqLXfv2BpdxUsG45euaOfnqEgFrCdLLh6ydM+YBJ36+28olXMNmK2PFFzeg4UdQ== + +scheduler@0.25.0-canary-db913d8e17-20240422: + version "0.25.0-canary-db913d8e17-20240422" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-canary-db913d8e17-20240422.tgz#93e0c376902c1faeb461c4777348873945f8d036" + integrity sha512-UOxM9t/xYfVfbM4zT4QmAMSBqP9/D9pUGPkrB4F0q3vTkIAGfTEE9qvRpAetAD+3zU0s9Ow30fG57VgvscNZYw== + scheduler@^0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" @@ -9519,13 +9475,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@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" @@ -9933,13 +9882,6 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - stream-buffers@2.2.x: version "2.2.0" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" @@ -10921,7 +10863,7 @@ which-pm@2.0.0: load-yaml-file "^0.2.0" path-exists "^4.0.0" -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== From 2c4f448f3d2eec8181fbe4b437f749198e01d16e Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 25 Apr 2024 23:05:41 -0500 Subject: [PATCH 169/252] chore: resolve conflicts --- .../test-renderer/src/__tests__/RTTR.events.test.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/test-renderer/src/__tests__/RTTR.events.test.tsx b/packages/test-renderer/src/__tests__/RTTR.events.test.tsx index c2254c799a..b38e8e3f70 100644 --- a/packages/test-renderer/src/__tests__/RTTR.events.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.events.test.tsx @@ -39,6 +39,8 @@ describe('ReactThreeTestRenderer Events', () => { it('should not throw if the handle name is incorrect', async () => { const handlePointerDown = jest.fn() + const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementationOnce(jest.fn()) + const Component = () => { return ( @@ -50,13 +52,13 @@ describe('ReactThreeTestRenderer Events', () => { const { scene, fireEvent } = await ReactThreeTestRenderer.create() - const warn = console.warn.bind(console) - console.warn = jest.fn() - expect(async () => await fireEvent(scene.children[0], 'onPointerUp')).not.toThrow() - expect(console.warn).toBeCalled() + expect(handlePointerDown).not.toHaveBeenCalled() - console.warn = warn + expect(consoleWarnSpy).toHaveBeenCalledTimes(1) + expect(consoleWarnSpy).toHaveBeenCalledWith( + 'Handler for onPointerUp was not found. You must pass event names in camelCase or name of the handler https://github.com/pmndrs/react-three-fiber/blob/master/packages/test-renderer/markdown/rttr.md#create-fireevent', + ) }) }) From 4c1242c965b3fdc8762f2fd8d48a087e080bb26a Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 25 Apr 2024 23:31:04 -0500 Subject: [PATCH 170/252] [v9] chore(tests): add array attach case (#3070) --- packages/fiber/tests/renderer.test.tsx | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index ad31f55e11..91f490ade6 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -437,6 +437,55 @@ describe('renderer', () => { expect(scene.children).toStrictEqual(mixedArray) }) + // TODO: fix this case, also see: + // https://github.com/pmndrs/react-three-fiber/issues/1892 + // https://github.com/pmndrs/react-three-fiber/issues/3125 + // https://github.com/pmndrs/react-three-fiber/issues/3143 + it.skip('can swap 4 array primitives via attach', async () => { + const a = new THREE.Group() + const b = new THREE.Group() + const c = new THREE.Group() + const d = new THREE.Group() + const array = [a, b, c, d] + + const Test = ({ array }: { array: THREE.Group[] }) => ( + <> + {array.map((group, i) => ( + + ))} + + ) + + const store = await act(async () => root.render()) + const state = store.getState() + + expect(state.scene.children.length).toBe(0) + expect(state.scene.userData.objects[0]).toBe(a) + expect(state.scene.userData.objects[1]).toBe(b) + expect(state.scene.userData.objects[2]).toBe(c) + expect(state.scene.userData.objects[3]).toBe(d) + + const reversedArray = [...array.reverse()] + + await act(async () => root.render()) + + expect(state.scene.children.length).toBe(0) + expect(state.scene.userData.objects[0]).toBe(d) + expect(state.scene.userData.objects[1]).toBe(c) + expect(state.scene.userData.objects[2]).toBe(b) + expect(state.scene.userData.objects[3]).toBe(a) + + const mixedArray = [b, a, d, c] + + await act(async () => root.render()) + + expect(state.scene.children.length).toBe(0) + expect(state.scene.userData.objects[0]).toBe(b) + expect(state.scene.userData.objects[1]).toBe(a) + expect(state.scene.userData.objects[2]).toBe(d) + expect(state.scene.userData.objects[3]).toBe(c) + }) + it('should gracefully handle text', async () => { const warn = console.warn console.warn = jest.fn() From 85fad8e1ef14f04e025f244ebb5565fd7255725c Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 25 Apr 2024 23:35:13 -0500 Subject: [PATCH 171/252] feat(useLoader): support loader instances (#3131) --- packages/fiber/src/core/hooks.tsx | 38 ++++++++++++++++++++--------- packages/fiber/tests/hooks.test.tsx | 18 ++++++++++++++ 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 40ab66cd5f..326ede0800 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -92,16 +92,27 @@ export type Extensions = (loader: Loader) => void const memoizedLoaders = new WeakMap, Loader>() +const isConstructor = (value: unknown): value is LoaderProto => + typeof value === 'function' && value?.prototype?.constructor === value + function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressEvent) => void) { - return function (Proto: LoaderProto, ...input: string[]) { - // Construct new loader and run extensions - let loader = memoizedLoaders.get(Proto)! - if (!loader) { - loader = new Proto() - memoizedLoaders.set(Proto, loader) + return async function (Proto: Loader | LoaderProto, ...input: string[]) { + let loader: Loader + + // Construct and cache loader if constructor was passed + if (isConstructor(Proto)) { + loader = memoizedLoaders.get(Proto)! + if (!loader) { + loader = new Proto() + memoizedLoaders.set(Proto, loader) + } + } else { + loader = Proto } + // Apply loader extensions if (extensions) extensions(loader) + // Go through the urls and load them return Promise.all( input.map( @@ -128,14 +139,14 @@ type GLTFLike = { scene: THREE.Object3D } * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#useloader */ export function useLoader( - Proto: LoaderProto, + loader: Loader | LoaderProto, input: U, extensions?: Extensions, onProgress?: (event: ProgressEvent) => void, ) { // Use suspense to load async assets const keys = (Array.isArray(input) ? input : [input]) as string[] - const results = suspend(loadingFn(extensions, onProgress), [Proto, ...keys], { equal: is.equ }) + const results = suspend(loadingFn(extensions, onProgress), [loader, ...keys], { equal: is.equ }) // Return the object(s) return (Array.isArray(input) ? results : results[0]) as unknown as U extends any[] ? LoaderResult[] @@ -146,18 +157,21 @@ export function useLoader( * Preloads an asset into cache as a side-effect. */ useLoader.preload = function ( - Proto: LoaderProto, + loader: Loader | LoaderProto, input: U, extensions?: Extensions, ): void { const keys = (Array.isArray(input) ? input : [input]) as string[] - return preload(loadingFn(extensions), [Proto, ...keys]) + return preload(loadingFn(extensions), [loader, ...keys]) } /** * Removes a loaded asset from cache. */ -useLoader.clear = function (Proto: LoaderProto, input: U): void { +useLoader.clear = function ( + loader: Loader | LoaderProto, + input: U, +): void { const keys = (Array.isArray(input) ? input : [input]) as string[] - return clear([Proto, ...keys]) + return clear([loader, ...keys]) } diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index e3e4dec5d0..90edb1de54 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -159,6 +159,24 @@ describe('hooks', () => { expect(extensions).toBeCalledTimes(1) }) + it('can handle useLoader with an existing loader instance', async () => { + class Loader extends THREE.Loader { + load(_url: string, onLoad: (result: null) => void): void { + onLoad(null) + } + } + + const loader = new Loader() + let proto!: Loader + + function Test(): null { + return useLoader(loader, '', (loader) => (proto = loader)) + } + await act(async () => root.render()) + + expect(proto).toBe(loader) + }) + it('can handle useLoader with a loader extension', async () => { class Loader extends THREE.Loader { load(_url: string, onLoad: (result: null) => void): void { From 9e209428d4a23e8e330c6f6af34465ac5a5ec64a Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 25 Apr 2024 23:54:56 -0500 Subject: [PATCH 172/252] [v9] fix!: don't automatically set texture colorSpace, colorMap fallback (#3163) --- packages/fiber/src/core/utils.tsx | 34 +++++++++++++++++++++-------- packages/fiber/tests/index.test.tsx | 9 ++++---- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 995ab208e8..c30ae78f1a 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -372,6 +372,23 @@ export function diffProps( type ClassConstructor = { new (): void } const __DEV__ = typeof process !== 'undefined' && process.env.NODE_ENV !== 'production' +// const LinearEncoding = 3000 +const sRGBEncoding = 3001 +const SRGBColorSpace = 'srgb' +const LinearSRGBColorSpace = 'srgb-linear' + +// https://github.com/mrdoob/three.js/pull/27042 +// https://github.com/mrdoob/three.js/pull/22748 +const colorMaps = [ + 'map', + 'emissiveMap', + 'sheenTintMap', // (object: Instance['object'], props: Instance['props']): Instance['object'] { const instance = object.__r3f @@ -399,10 +416,6 @@ export function applyProps(object: Instance['object'], props: Instan // Alias (output)encoding => (output)colorSpace (since r152) // https://github.com/pmndrs/react-three-fiber/pull/2829 if (hasColorSpace(root)) { - const sRGBEncoding = 3001 - const SRGBColorSpace = 'srgb' - const LinearSRGBColorSpace = 'srgb-linear' - if (key === 'encoding') { key = 'colorSpace' value = value === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace @@ -441,7 +454,7 @@ export function applyProps(object: Instance['object'], props: Instan // Allow setting array scalars if (!isColor && target.setScalar && typeof value === 'number') target.setScalar(value) // Otherwise just set ... - else if (value !== undefined) target.set(value) + else if (value !== undefined) target.set(value) // TODO: unreachable // For versions of three which don't support THREE.ColorManagement, // Auto-convert sRGB colors @@ -452,18 +465,21 @@ export function applyProps(object: Instance['object'], props: Instan else { root[key] = value - // Auto-convert sRGB textures, for now ... + // Auto-convert sRGB texture parameters for built-in materials // https://github.com/pmndrs/react-three-fiber/issues/344 + // https://github.com/mrdoob/three.js/pull/25857 if ( rootState && + !rootState.linear && + colorMaps.includes(key) && root[key] instanceof THREE.Texture && // sRGB textures must be RGBA8 since r137 https://github.com/mrdoob/three.js/pull/23129 root[key].format === THREE.RGBAFormat && root[key].type === THREE.UnsignedByteType ) { - const texture = root[key] as THREE.Texture - if (hasColorSpace(texture) && hasColorSpace(rootState.gl)) texture.colorSpace = rootState.gl.outputColorSpace - else texture.encoding = rootState.gl.outputEncoding + // NOTE: this cannot be set from the renderer (e.g. sRGB source textures rendered to P3) + if (hasColorSpace(root[key])) root[key].colorSpace = 'srgb' + else root[key].encoding = sRGBEncoding } } } diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index a58458149f..bba208021b 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -190,7 +190,7 @@ describe('createRoot', () => { let texture: THREE.Texture & { colorSpace?: string } = null! let key = 0 - function Test({ colorSpace = false }) { + function Test() { gl = useThree((state) => state.gl) texture = new THREE.Texture() return @@ -221,19 +221,20 @@ describe('createRoot', () => { // Sets outputColorSpace since r152 const SRGBColorSpace = 'srgb' const LinearSRGBColorSpace = 'srgb-linear' + const NoColorSpace = '' await act(async () => createRoot() .configure({ linear: true }) - .render(), + .render(), ) expect(gl.outputColorSpace).toBe(LinearSRGBColorSpace) - expect(texture.colorSpace).toBe(LinearSRGBColorSpace) + expect(texture.colorSpace).toBe(NoColorSpace) await act(async () => createRoot() .configure({ linear: false }) - .render(), + .render(), ) expect(gl.outputColorSpace).toBe(SRGBColorSpace) expect(texture.colorSpace).toBe(SRGBColorSpace) From f722b5d0619486c01dd434085145ab447a646d43 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 01:26:40 -0500 Subject: [PATCH 173/252] chore(examples): use React beta --- example/package.json | 4 ++-- yarn.lock | 17 ----------------- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/example/package.json b/example/package.json index b1457a6007..ff0554ec27 100644 --- a/example/package.json +++ b/example/package.json @@ -11,8 +11,8 @@ "@react-spring/three": "^9.7.3", "@react-three/drei": "^9.93.0", "@use-gesture/react": "latest", - "react": "19.0.0-canary-db913d8e17-20240422", - "react-dom": "19.0.0-canary-db913d8e17-20240422", + "react": "19.0.0-beta-94eed63c49-20240425", + "react-dom": "19.0.0-beta-94eed63c49-20240425", "react-merge-refs": "^2.1.1", "react-use-refs": "^1.0.1", "three": "^0.160.0", diff --git a/yarn.lock b/yarn.lock index 6e6ee8b0de..7fa1b2ca91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8928,13 +8928,6 @@ react-dom@19.0.0-beta-94eed63c49-20240425: dependencies: scheduler "0.25.0-beta-94eed63c49-20240425" -react-dom@19.0.0-canary-db913d8e17-20240422: - version "19.0.0-canary-db913d8e17-20240422" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-canary-db913d8e17-20240422.tgz#606831aa157749c4f556a7d40645a3fae9245440" - integrity sha512-+LmfcPoEv38BcToZ76NWbPgyAqFzZb9ONYVn1F7p6cZmtJerNjmwTBOGZ06h/tugQwg0+dU2igpS3veF5l9E3g== - dependencies: - scheduler "0.25.0-canary-db913d8e17-20240422" - react-is@19.0.0-beta-94eed63c49-20240425: version "19.0.0-beta-94eed63c49-20240425" resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-beta-94eed63c49-20240425.tgz#e636ae331655ced5616a9ce252e827ed1b917eda" @@ -9069,11 +9062,6 @@ react@19.0.0-beta-94eed63c49-20240425: resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-94eed63c49-20240425.tgz#7b30b64c9b3517240d47ac00184ae2d59554bb9b" integrity sha512-BPPKh5bZwcpw/Dgfh3A0MoU1GSl2edR2JggCq3QPdghQsrFg1aBuMkul5YB4rpII400RYq9VC5eF5Nm3spx0gA== -react@19.0.0-canary-db913d8e17-20240422: - version "19.0.0-canary-db913d8e17-20240422" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-canary-db913d8e17-20240422.tgz#cbf02302e5c082da6c4deefce59525a92972d3ee" - integrity sha512-6D1y1MWw586E1LRbKTZWTGUk8ONtdwu1zPN7EGMiJb0XDcXrLDjvA9dCmXWyRfivV6z+PRJh9YpS3DZjpq24Bg== - read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -9463,11 +9451,6 @@ scheduler@0.25.0-beta-94eed63c49-20240425: resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-94eed63c49-20240425.tgz#db261000b28fa56d65fff2e9c17eb7bd094a669a" integrity sha512-U8hoOV7uut5E8cMvRSMikEBBqLXfv2BpdxUsG45euaOfnqEgFrCdLLh6ydM+YBJ36+28olXMNmK2PFFzeg4UdQ== -scheduler@0.25.0-canary-db913d8e17-20240422: - version "0.25.0-canary-db913d8e17-20240422" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-canary-db913d8e17-20240422.tgz#93e0c376902c1faeb461c4777348873945f8d036" - integrity sha512-UOxM9t/xYfVfbM4zT4QmAMSBqP9/D9pUGPkrB4F0q3vTkIAGfTEE9qvRpAetAD+3zU0s9Ow30fG57VgvscNZYw== - scheduler@^0.21.0: version "0.21.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" From d092606acc32b5de20707cf049cc5964aa470dcc Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 01:47:58 -0500 Subject: [PATCH 174/252] chore: cleanup global access --- packages/fiber/src/core/reconciler.tsx | 7 ++----- packages/fiber/src/core/utils.tsx | 9 --------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index a936f7c683..125079eb9f 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -16,7 +16,6 @@ import { attach, detach, prepare, - globalScope, isObject3D, findInitialRoot, } from './utils' @@ -483,11 +482,9 @@ export const reconciler = Reconciler< return currentUpdatePriority }, resolveUpdatePriority() { - if (currentUpdatePriority) return currentUpdatePriority - if (!globalScope) return DefaultEventPriority + if (currentUpdatePriority !== NoEventPriority) return currentUpdatePriority - const name = globalScope.event?.type - switch (name) { + switch (typeof window !== 'undefined' && window.event?.type) { case 'click': case 'contextmenu': case 'dblclick': diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index c30ae78f1a..fd3210a64b 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -534,13 +534,4 @@ export function updateCamera(camera: Camera, size: Size): void { } } -/** - * Get a handle to the current global scope in window and worker contexts if able - * https://github.com/pmndrs/react-three-fiber/pull/2493 - */ -export const globalScope = - (typeof global !== 'undefined' && global) || - (typeof self !== 'undefined' && self) || - (typeof window !== 'undefined' && window) - export const isObject3D = (object: any): object is THREE.Object3D => object?.isObject3D From 15fb1dd9479739cbeb8a655211b0704cc866abc6 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 02:21:45 -0500 Subject: [PATCH 175/252] chore(reconciler): cleanup switchInstance --- packages/fiber/src/core/reconciler.tsx | 31 +++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 125079eb9f..6daf1041f4 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -79,7 +79,7 @@ interface HostConfig { hydratableInstance: never publicInstance: Instance['object'] hostContext: {} - updatePayload: null | [true] | [false, Instance['props']] + updatePayload: null | [true] | [false, Instance['props']] // NOTE: removed with React 19 childSet: never timeoutHandle: number | undefined noTimeout: -1 @@ -228,7 +228,7 @@ function removeChild( // Recursively remove instance children if (recursive !== false) { for (const node of child.children) removeChild(child, node, shouldDispose, true) - child.children = [] + child.children.length = 0 } // Unlink instance object @@ -262,6 +262,14 @@ function removeChild( if (dispose === undefined) invalidateInstance(child) } +function setFiberInstance(fiber: Reconciler.Fiber | null, instance: HostConfig['instance']): void { + if (fiber !== null) { + fiber.stateNode = instance + if (typeof fiber.ref === 'function') fiber.ref(instance.object) + else if (fiber.ref) fiber.ref.current = instance.object + } +} + function switchInstance( oldInstance: HostConfig['instance'], type: HostConfig['type'], @@ -276,7 +284,7 @@ function switchInstance( removeChild(oldInstance, child, false, false) appendChild(newInstance, child) } - oldInstance.children = [] + oldInstance.children.length = 0 // Link up new instance const parent = oldInstance.parent @@ -296,18 +304,12 @@ function switchInstance( // } } - // This evil hack switches the react-internal fiber node + // This evil hack switches the react-internal fiber instance // https://github.com/facebook/react/issues/14983 - // https://github.com/facebook/react/pull/15021 - for (const _fiber of [fiber, fiber.alternate]) { - if (_fiber !== null) { - _fiber.stateNode = newInstance - if (_fiber.ref) { - if (typeof _fiber.ref === 'function') _fiber.ref(newInstance.object) - else _fiber.ref.current = newInstance.object - } - } - } + // TODO: investigate scheduling key prop change instead of switchInstance entirely + // https://github.com/facebook/react/pull/15021#issuecomment-480185369 + setFiberInstance(fiber, newInstance) + setFiberInstance(fiber.alternate, newInstance) // Tree was updated, request a frame invalidateInstance(newInstance) @@ -448,7 +450,6 @@ export const reconciler = Reconciler< createTextInstance: handleTextInstance, hideTextInstance: handleTextInstance, unhideTextInstance: handleTextInstance, - // SSR fallbacks scheduleTimeout: (typeof setTimeout === 'function' ? setTimeout : undefined) as any, cancelTimeout: (typeof clearTimeout === 'function' ? clearTimeout : undefined) as any, noTimeout: -1, From 1e7761390a3fcbd44c0bfd843098ef0d07d450c4 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 03:49:43 -0500 Subject: [PATCH 176/252] chore: cleanup, re-enable eslint tests --- package.json | 5 ++- packages/fiber/src/core/store.ts | 2 +- packages/fiber/src/core/utils.tsx | 23 ++++++------ packages/shared/setupTests.ts | 14 -------- yarn.lock | 58 +++++++++++++++---------------- 5 files changed, 45 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index 061cf759bd..064d0a303a 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "expo-file-system": "^15.4.3", "expo-gl": "^11.4.0", "husky": "^7.0.4", - "jest": "^29.3.1", + "jest": "^29.7.0", "jest-cli": "^27.5.1", "lint-staged": "^12.3.7", "prettier": "^2.6.1", @@ -80,10 +80,9 @@ "react-dom": "19.0.0-beta-94eed63c49-20240425", "react-native": "0.69.3", "react-test-renderer": "19.0.0-beta-94eed63c49-20240425", - "regenerator-runtime": "^0.13.9", "three": "^0.141.0", "three-stdlib": "^2.13.0", - "ts-jest": "^27.1.4", + "ts-jest": "^29.1.2", "typescript": "^4.6.3" }, "dependencies": {} diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index fe2b67cea7..72f0351eb4 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -2,7 +2,7 @@ import * as THREE from 'three' import * as React from 'react' import { create, type StoreApi, type UseBoundStore } from 'zustand' import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' -import { calculateDpr, type Camera, isOrthographicCamera, prepare, updateCamera } from './utils' +import { calculateDpr, type Camera, isOrthographicCamera, updateCamera } from './utils' import type { FixedStage, Stage } from './stages' export interface Intersection extends THREE.Intersection { diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index fd3210a64b..0e8faa6841 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -313,7 +313,7 @@ export const RESERVED_PROPS = [ 'dispose', ] -export const DEFAULTS = new Map() +const MEMOIZED_PROTOTYPES = new Map() // This function prepares a set of changes to be applied to the instance export function diffProps( @@ -353,10 +353,10 @@ export function diffProps( // For removed props, try to set default values, if possible if (root.constructor && root.constructor.length === 0) { // create a blank slate of the instance and copy the particular parameter. - let ctor = DEFAULTS.get(root.constructor) + let ctor = MEMOIZED_PROTOTYPES.get(root.constructor) if (!ctor) { ctor = new root.constructor() - DEFAULTS.set(root.constructor, ctor) + MEMOIZED_PROTOTYPES.set(root.constructor, ctor) } changedProps[key] = ctor[key] } else { @@ -389,6 +389,8 @@ const colorMaps = [ 'envMap', ] +const EVENT_REGEX = /^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/ + // This function applies a set of changes to the instance export function applyProps(object: Instance['object'], props: Instance['props']): Instance['object'] { const instance = object.__r3f @@ -402,13 +404,14 @@ export function applyProps(object: Instance['object'], props: Instan if (RESERVED_PROPS.includes(prop)) continue // Deal with pointer events, including removing them if undefined - if (instance && /^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(prop)) { + if (instance && EVENT_REGEX.test(prop)) { if (typeof value === 'function') instance.handlers[prop as keyof EventHandlers] = value as any else delete instance.handlers[prop as keyof EventHandlers] instance.eventCount = Object.keys(instance.handlers).length } // Ignore setting undefined props + // https://github.com/pmndrs/react-three-fiber/issues/274 if (value === undefined) continue let { root, key, target } = resolve(object, prop) @@ -447,17 +450,15 @@ export function applyProps(object: Instance['object'], props: Instan if (target.fromArray) target.fromArray(value) else target.set(...value) } - // Set literal types, ignore undefined - // https://github.com/pmndrs/react-three-fiber/issues/274 + // Set literal types else if (target?.set && typeof value !== 'object') { const isColor = target instanceof THREE.Color // Allow setting array scalars if (!isColor && target.setScalar && typeof value === 'number') target.setScalar(value) - // Otherwise just set ... - else if (value !== undefined) target.set(value) // TODO: unreachable + // Otherwise just set single value + else target.set(value) - // For versions of three which don't support THREE.ColorManagement, - // Auto-convert sRGB colors + // Emulate THREE.ColorManagement for older three.js versions // https://github.com/pmndrs/react-three-fiber/issues/344 if (!getColorManagement() && !rootState?.linear && isColor) target.convertSRGBToLinear() } @@ -484,6 +485,7 @@ export function applyProps(object: Instance['object'], props: Instan } } + // Register event handlers if ( instance?.parent && rootState?.internal && @@ -505,6 +507,7 @@ export function applyProps(object: Instance['object'], props: Instan else if (instance.object instanceof THREE.Material) instance.props.attach = 'material' } + // Instance was updated, request a frame if (instance) invalidateInstance(instance) return object diff --git a/packages/shared/setupTests.ts b/packages/shared/setupTests.ts index 156be2033a..640b6f69d4 100644 --- a/packages/shared/setupTests.ts +++ b/packages/shared/setupTests.ts @@ -1,7 +1,6 @@ import * as THREE from 'three' import { WebGL2RenderingContext } from '@react-three/test-renderer/src/WebGL2RenderingContext' import { extend } from '@react-three/fiber' -import 'regenerator-runtime/runtime' declare global { var IS_REACT_ACT_ENVIRONMENT: boolean @@ -12,19 +11,6 @@ declare global { global.IS_REACT_ACT_ENVIRONMENT = true global.IS_REACT_NATIVE_TEST_ENVIRONMENT = true // hide react-test-renderer warnings -// ESLint is broken atm -- TypeError: The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received 'http://localhost/eslintrc.cjs' -jest.mock('eslint', () => ({ - RuleTester: class { - run() { - it.skip('RuleTester.run', () => {}) - } - static only() { - it.skip('RuleTester.only', () => {}) - return {} - } - }, -})) - // PointerEvent is not in JSDOM // https://github.com/jsdom/jsdom/pull/2666#issuecomment-691216178 // https://w3c.github.io/pointerevents/#pointerevent-interface diff --git a/yarn.lock b/yarn.lock index 7fa1b2ca91..f80de79854 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7040,7 +7040,7 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^27.0.0, jest-util@^27.5.1: +jest-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== @@ -7052,7 +7052,7 @@ jest-util@^27.0.0, jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.7.0: +jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== @@ -7155,7 +7155,7 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.3.1: +jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== @@ -7304,11 +7304,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@2.x, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -7316,6 +7311,11 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" +json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -9161,7 +9161,7 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.2: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== @@ -9470,18 +9470,18 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" -semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -10310,19 +10310,19 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-jest@^27.1.4: - version "27.1.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" - integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== +ts-jest@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.2.tgz#7613d8c81c43c8cb312c6904027257e814c40e09" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" - semver "7.x" - yargs-parser "20.x" + semver "^7.5.3" + yargs-parser "^21.0.1" ts-node@^10.9.1: version "10.9.2" @@ -11025,11 +11025,6 @@ yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@20.x, yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -11038,7 +11033,12 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^21.1.1: +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== From dd148bd5f3a8c136d4e91ebef2af2a52becf2fdf Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 04:03:56 -0500 Subject: [PATCH 177/252] fix(updateCamera): don't update world matrices --- packages/fiber/src/core/utils.tsx | 26 ++++++------ .../tests/__snapshots__/utils.test.ts.snap | 42 ------------------- packages/fiber/tests/utils.test.ts | 42 +++++++------------ 3 files changed, 28 insertions(+), 82 deletions(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 0e8faa6841..90ea148334 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -519,22 +519,20 @@ export function invalidateInstance(instance: Instance): void { } export function updateCamera(camera: Camera, size: Size): void { - // https://github.com/pmndrs/react-three-fiber/issues/92 // Do not mess with the camera if it belongs to the user - if (!camera.manual) { - if (isOrthographicCamera(camera)) { - camera.left = size.width / -2 - camera.right = size.width / 2 - camera.top = size.height / 2 - camera.bottom = size.height / -2 - } else { - camera.aspect = size.width / size.height - } - camera.updateProjectionMatrix() - // https://github.com/pmndrs/react-three-fiber/issues/178 - // Update matrix world since the renderer is a frame late - camera.updateMatrixWorld() + // https://github.com/pmndrs/react-three-fiber/issues/92 + if (camera.manual) return + + if (isOrthographicCamera(camera)) { + camera.left = size.width / -2 + camera.right = size.width / 2 + camera.top = size.height / 2 + camera.bottom = size.height / -2 + } else { + camera.aspect = size.width / size.height } + + camera.updateProjectionMatrix() } export const isObject3D = (object: any): object is THREE.Object3D => object?.isObject3D diff --git a/packages/fiber/tests/__snapshots__/utils.test.ts.snap b/packages/fiber/tests/__snapshots__/utils.test.ts.snap index f9204e847e..86b671c6c9 100644 --- a/packages/fiber/tests/__snapshots__/utils.test.ts.snap +++ b/packages/fiber/tests/__snapshots__/utils.test.ts.snap @@ -22,27 +22,6 @@ Array [ `; exports[`updateCamera updates camera matrices 2`] = ` -Array [ - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, -] -`; - -exports[`updateCamera updates camera matrices 3`] = ` Array [ 1, 0, @@ -62,24 +41,3 @@ Array [ 1, ] `; - -exports[`updateCamera updates camera matrices 4`] = ` -Array [ - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, -] -`; diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 983d160b55..d007b722b7 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -134,21 +134,21 @@ describe('dispose', () => { mesh.geometry.dispose = jest.fn() dispose(mesh) - expect(mesh.dispose).toBeCalled() - expect(mesh.material.dispose).toBeCalled() - expect(mesh.geometry.dispose).toBeCalled() + expect(mesh.dispose).toHaveBeenCalled() + expect(mesh.material.dispose).toHaveBeenCalled() + expect(mesh.geometry.dispose).toHaveBeenCalled() }) it('should not dispose of a THREE.Scene', () => { const scene = Object.assign(new THREE.Scene(), { dispose: jest.fn() }) dispose(scene) - expect(scene.dispose).not.toBeCalled() + expect(scene.dispose).not.toHaveBeenCalled() const disposable = { dispose: jest.fn(), scene } dispose(disposable) - expect(disposable.dispose).toBeCalled() - expect(disposable.scene.dispose).not.toBeCalled() + expect(disposable.dispose).toHaveBeenCalled() + expect(disposable.scene.dispose).not.toHaveBeenCalled() }) }) @@ -163,8 +163,8 @@ describe('getInstanceProps', () => { ) expect(filtered).toStrictEqual(props) - expect(get).not.toBeCalled() - expect(set).not.toBeCalled() + expect(get).not.toHaveBeenCalled() + expect(set).not.toHaveBeenCalled() }) }) @@ -304,8 +304,8 @@ describe('diffProps', () => { ) expect(filtered).toStrictEqual(props) - expect(get).not.toBeCalled() - expect(set).not.toBeCalled() + expect(get).not.toHaveBeenCalled() + expect(set).not.toHaveBeenCalled() }) }) @@ -327,8 +327,8 @@ describe('applyProps', () => { ) expect(target).toStrictEqual(props) - expect(get).not.toBeCalled() - expect(set).not.toBeCalled() + expect(get).not.toHaveBeenCalled() + expect(set).not.toHaveBeenCalled() }) it('should overwrite non-atomic properties', () => { @@ -409,21 +409,15 @@ describe('updateCamera', () => { const perspective = new THREE.PerspectiveCamera() perspective.updateProjectionMatrix = jest.fn() - perspective.updateMatrixWorld = jest.fn() updateCamera(perspective, size) - expect(perspective.updateProjectionMatrix).toBeCalled() - expect(perspective.updateMatrixWorld).toBeCalled() + expect(perspective.updateProjectionMatrix).toHaveBeenCalled() expect(perspective.projectionMatrix.toArray()).toMatchSnapshot() - expect(perspective.matrixWorld.toArray()).toMatchSnapshot() const orthographic = new THREE.OrthographicCamera() orthographic.updateProjectionMatrix = jest.fn() - orthographic.updateMatrixWorld = jest.fn() updateCamera(orthographic, size) - expect(orthographic.updateProjectionMatrix).toBeCalled() - expect(orthographic.updateMatrixWorld).toBeCalled() + expect(orthographic.updateProjectionMatrix).toHaveBeenCalled() expect(orthographic.projectionMatrix.toArray()).toMatchSnapshot() - expect(orthographic.matrixWorld.toArray()).toMatchSnapshot() }) it('respects camera.manual', () => { @@ -431,16 +425,12 @@ describe('updateCamera', () => { const perspective = Object.assign(new THREE.PerspectiveCamera(), { manual: true }) perspective.updateProjectionMatrix = jest.fn() - perspective.updateMatrixWorld = jest.fn() updateCamera(perspective, size) - expect(perspective.updateProjectionMatrix).not.toBeCalled() - expect(perspective.updateMatrixWorld).not.toBeCalled() + expect(perspective.updateProjectionMatrix).not.toHaveBeenCalled() const orthographic = Object.assign(new THREE.OrthographicCamera(), { manual: true }) orthographic.updateProjectionMatrix = jest.fn() - orthographic.updateMatrixWorld = jest.fn() updateCamera(orthographic, size) - expect(orthographic.updateProjectionMatrix).not.toBeCalled() - expect(orthographic.updateMatrixWorld).not.toBeCalled() + expect(orthographic.updateProjectionMatrix).not.toHaveBeenCalled() }) }) From 1cde39287a2fa362a825e44b4f75e4575d25e1ac Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 04:40:28 -0500 Subject: [PATCH 178/252] RELEASING: Releasing 2 package(s) Releases: @react-three/fiber@9.0.0-alpha.3 @react-three/test-renderer@9.0.0-alpha.3 [skip ci] --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 7bbe75e75d..0a60a7ab45 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.2", + "version": "9.0.0-alpha.3", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 3d4076bd82..97f918a5af 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-alpha.0", + "version": "9.0.0-alpha.3", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": ">=9.0.0", + "@react-three/fiber": "9.0.0-alpha.3", "three": ">=0.141" } } From 425b6bd6b54d6d98bb8e560610bd6b642f51fc5a Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 10:27:13 -0500 Subject: [PATCH 179/252] chore(tests): use names in swap cases --- packages/fiber/tests/renderer.test.tsx | 41 +++++++++++--------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 91f490ade6..e3fdc21e62 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -410,9 +410,13 @@ describe('renderer', () => { it('can swap 4 array primitives', async () => { const a = new THREE.Group() + a.name = 'a' const b = new THREE.Group() + b.name = 'b' const c = new THREE.Group() + c.name = 'c' const d = new THREE.Group() + d.name = 'd' const Test = ({ array }: { array: THREE.Group[] }) => ( <> @@ -426,15 +430,15 @@ describe('renderer', () => { const store = await act(async () => root.render()) const { scene } = store.getState() - expect(scene.children).toStrictEqual(array) + expect(scene.children.map((o) => o.name)).toStrictEqual(array.map((o) => o.name)) const reversedArray = [d, c, b, a] await act(async () => root.render()) - expect(scene.children).toStrictEqual(reversedArray) + expect(scene.children.map((o) => o.name)).toStrictEqual(reversedArray.map((o) => o.name)) const mixedArray = [b, a, d, c] await act(async () => root.render()) - expect(scene.children).toStrictEqual(mixedArray) + expect(scene.children.map((o) => o.name)).toStrictEqual(mixedArray.map((o) => o.name)) }) // TODO: fix this case, also see: @@ -443,9 +447,13 @@ describe('renderer', () => { // https://github.com/pmndrs/react-three-fiber/issues/3143 it.skip('can swap 4 array primitives via attach', async () => { const a = new THREE.Group() + a.name = 'a' const b = new THREE.Group() + b.name = 'b' const c = new THREE.Group() + c.name = 'c' const d = new THREE.Group() + d.name = 'c' const array = [a, b, c, d] const Test = ({ array }: { array: THREE.Group[] }) => ( @@ -457,33 +465,20 @@ describe('renderer', () => { ) const store = await act(async () => root.render()) - const state = store.getState() + const { scene } = store.getState() - expect(state.scene.children.length).toBe(0) - expect(state.scene.userData.objects[0]).toBe(a) - expect(state.scene.userData.objects[1]).toBe(b) - expect(state.scene.userData.objects[2]).toBe(c) - expect(state.scene.userData.objects[3]).toBe(d) + expect(scene.children.length).toBe(0) + expect(scene.userData.objects.map((o: THREE.Object3D) => o.name)).toStrictEqual(array.map((o) => o.name)) const reversedArray = [...array.reverse()] - await act(async () => root.render()) - - expect(state.scene.children.length).toBe(0) - expect(state.scene.userData.objects[0]).toBe(d) - expect(state.scene.userData.objects[1]).toBe(c) - expect(state.scene.userData.objects[2]).toBe(b) - expect(state.scene.userData.objects[3]).toBe(a) + expect(scene.children.length).toBe(0) + expect(scene.userData.objects.map((o: THREE.Object3D) => o.name)).toStrictEqual(reversedArray.map((o) => o.name)) const mixedArray = [b, a, d, c] - await act(async () => root.render()) - - expect(state.scene.children.length).toBe(0) - expect(state.scene.userData.objects[0]).toBe(b) - expect(state.scene.userData.objects[1]).toBe(a) - expect(state.scene.userData.objects[2]).toBe(d) - expect(state.scene.userData.objects[3]).toBe(c) + expect(scene.children.length).toBe(0) + expect(scene.userData.objects.map((o: THREE.Object3D) => o.name)).toStrictEqual(mixedArray.map((o) => o.name)) }) it('should gracefully handle text', async () => { From c3a118935cb9be748a6a4a69bf18774285e82dc4 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 10:35:34 -0500 Subject: [PATCH 180/252] chore(tests): cleanup --- packages/fiber/tests/renderer.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index e3fdc21e62..f0e5c3eb1b 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -470,7 +470,7 @@ describe('renderer', () => { expect(scene.children.length).toBe(0) expect(scene.userData.objects.map((o: THREE.Object3D) => o.name)).toStrictEqual(array.map((o) => o.name)) - const reversedArray = [...array.reverse()] + const reversedArray = [d, c, b, a] await act(async () => root.render()) expect(scene.children.length).toBe(0) expect(scene.userData.objects.map((o: THREE.Object3D) => o.name)).toStrictEqual(reversedArray.map((o) => o.name)) From 0af41db84d7ba6237e51257e9581105ee59a55bd Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 26 Apr 2024 20:20:10 -0500 Subject: [PATCH 181/252] perf(reconciler): inline prepareUpdate --- packages/fiber/src/core/reconciler.tsx | 48 ++++++++------------------ packages/fiber/src/core/utils.tsx | 48 +++++++++++--------------- packages/fiber/tests/utils.test.ts | 4 +-- 3 files changed, 38 insertions(+), 62 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 6daf1041f4..0cc81b88ae 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -325,33 +325,6 @@ const NO_CONTEXT: HostConfig['hostContext'] = {} let currentUpdatePriority: number = NoEventPriority -// Effectively removed to diff in commit phase -// https://github.com/facebook/react/pull/27409 -function prepareUpdate( - instance: HostConfig['instance'], - _type: string, - oldProps: HostConfig['props'], - newProps: HostConfig['props'], -): HostConfig['updatePayload'] { - // Reconstruct primitives if object prop changes - if (instance.type === 'primitive' && oldProps.object !== newProps.object) return [true] - - // Throw if an object or literal was passed for args - if (newProps.args !== undefined && !Array.isArray(newProps.args)) - throw new Error('R3F: The args prop must be an array!') - - // Reconstruct instance if args change - if (newProps.args?.length !== oldProps.args?.length) return [true] - if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) return [true] - - // Create a diff-set, flag if there are any changes - const changedProps = diffProps(instance, newProps, true) - if (Object.keys(changedProps).length) return [false, changedProps] - - // Otherwise do not touch the instance - return null -} - export const reconciler = Reconciler< HostConfig['type'], HostConfig['props'], @@ -405,17 +378,26 @@ export const reconciler = Reconciler< newProps: HostConfig['props'], fiber: any, ) { - const diff = prepareUpdate(instance, type, oldProps, newProps) - if (diff === null) return + let reconstruct = false - const [reconstruct, changedProps] = diff + // Reconstruct primitives if object prop changes + if (instance.type === 'primitive' && oldProps.object !== newProps.object) reconstruct = true + // Reconstruct instance if args was changed to an invalid value + else if (newProps.args !== undefined && !Array.isArray(newProps.args)) reconstruct = true + // Reconstruct instance if args were added or removed + else if (newProps.args?.length !== oldProps.args?.length) reconstruct = true + // Reconstruct instance if args were changed + else if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) reconstruct = true // Reconstruct when args or false, commitMount() {}, diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 90ea148334..f859201736 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -316,11 +316,7 @@ export const RESERVED_PROPS = [ const MEMOIZED_PROTOTYPES = new Map() // This function prepares a set of changes to be applied to the instance -export function diffProps( - instance: Instance, - newProps: Instance['props'], - resetRemoved = false, -): Instance['props'] { +export function diffProps(instance: Instance, newProps: Instance['props']): Instance['props'] { const changedProps: Instance['props'] = {} // Sort through props @@ -340,29 +336,27 @@ export function diffProps( } // Reset removed props for HMR - if (resetRemoved) { - for (const prop in instance.props) { - if (RESERVED_PROPS.includes(prop) || newProps.hasOwnProperty(prop)) continue - - const { root, key } = resolve(instance.object, prop) - - // https://github.com/mrdoob/three.js/issues/21209 - // HMR/fast-refresh relies on the ability to cancel out props, but threejs - // has no means to do this. Hence we curate a small collection of value-classes - // with their respective constructor/set arguments - // For removed props, try to set default values, if possible - if (root.constructor && root.constructor.length === 0) { - // create a blank slate of the instance and copy the particular parameter. - let ctor = MEMOIZED_PROTOTYPES.get(root.constructor) - if (!ctor) { - ctor = new root.constructor() - MEMOIZED_PROTOTYPES.set(root.constructor, ctor) - } - changedProps[key] = ctor[key] - } else { - // instance does not have constructor, just set it to 0 - changedProps[key] = 0 + for (const prop in instance.props) { + if (RESERVED_PROPS.includes(prop) || newProps.hasOwnProperty(prop)) continue + + const { root, key } = resolve(instance.object, prop) + + // https://github.com/mrdoob/three.js/issues/21209 + // HMR/fast-refresh relies on the ability to cancel out props, but threejs + // has no means to do this. Hence we curate a small collection of value-classes + // with their respective constructor/set arguments + // For removed props, try to set default values, if possible + if (root.constructor && root.constructor.length === 0) { + // create a blank slate of the instance and copy the particular parameter. + let ctor = MEMOIZED_PROTOTYPES.get(root.constructor) + if (!ctor) { + ctor = new root.constructor() + MEMOIZED_PROTOTYPES.set(root.constructor, ctor) } + changedProps[key] = ctor[key] + } else { + // instance does not have constructor, just set it to 0 + changedProps[key] = 0 } } diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index d007b722b7..9aab82b649 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -283,13 +283,13 @@ describe('diffProps', () => { const instance = prepare(new THREE.Object3D(), storeMock, '', { position: [0, 0, 1] }) const newProps = {} - const filtered = diffProps(instance, newProps, true) + const filtered = diffProps(instance, newProps) expect(filtered).toStrictEqual({ position: new THREE.Object3D().position }) }) it('should reset removed props for HMR', () => { const instance = prepare(new THREE.Object3D(), storeMock, '', { scale: 10 }) - const filtered = diffProps(instance, {}, true) + const filtered = diffProps(instance, {}) expect((filtered.scale as THREE.Vector3).toArray()).toStrictEqual([1, 1, 1]) }) From f2de25cfdccd0941691e843845636ac49c00bff2 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 16:34:31 -0500 Subject: [PATCH 182/252] fix(types): use new createWithEqualityFn signature --- packages/fiber/src/core/hooks.tsx | 3 +-- packages/fiber/src/core/renderer.tsx | 4 ++-- packages/fiber/src/core/store.ts | 7 ++++--- packages/fiber/tests/utils.test.ts | 9 +++------ 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 326ede0800..35443dfeff 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -35,8 +35,7 @@ export function useThree( selector: (state: RootState) => T = (state) => state as unknown as T, equalityFn?: (state: T, newState: T) => boolean, ): T { - // TODO: fix this type - return useStore()(selector, equalityFn as any) + return useStore()(selector, equalityFn) } /** diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 64a68eb305..dbc4e77829 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -1,7 +1,7 @@ import * as THREE from 'three' import * as React from 'react' import { ConcurrentRoot } from 'react-reconciler/constants' -import { create } from 'zustand' +import { createWithEqualityFn } from 'zustand/traditional' import type { Properties, ThreeElement } from '../three-types' import { @@ -569,7 +569,7 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { }) const usePortalStore = React.useMemo(() => { - const store = create((set, get) => ({ ...rest, set, get } as RootState)) + const store = createWithEqualityFn((set, get) => ({ ...rest, set, get } as RootState)) // Subscribe to previous root-state and copy changes over to the mirrored portal-state const onMutate = (prev: RootState) => store.setState((state) => inject.current(prev, state)) diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 72f0351eb4..cd4f8a0835 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -1,6 +1,7 @@ import * as THREE from 'three' import * as React from 'react' -import { create, type StoreApi, type UseBoundStore } from 'zustand' +import { type StoreApi } from 'zustand' +import { createWithEqualityFn, type UseBoundStoreWithEqualityFn } from 'zustand/traditional' import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' import { calculateDpr, type Camera, isOrthographicCamera, updateCamera } from './utils' import type { FixedStage, Stage } from './stages' @@ -154,7 +155,7 @@ export interface RootState { internal: InternalState } -export type RootStore = UseBoundStore> +export type RootStore = UseBoundStoreWithEqualityFn> export const context = React.createContext(null!) @@ -162,7 +163,7 @@ export const createStore = ( invalidate: (state?: RootState, frames?: number) => void, advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: XRFrame) => void, ): RootStore => { - const rootStore = create((set, get) => { + const rootStore = createWithEqualityFn((set, get) => { const position = new THREE.Vector3() const defaultTarget = new THREE.Vector3() const tempTarget = new THREE.Vector3() diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 9aab82b649..895b295d0e 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -1,5 +1,6 @@ import * as THREE from 'three' -import { Instance, RootStore } from '../src' +import { createWithEqualityFn } from 'zustand/traditional' +import { type RootStore, type Instance } from '../src' import { is, dispose, @@ -16,11 +17,7 @@ import { } from '../src/core/utils' // Mocks a Zustand store -const storeMock = Object.assign(() => null!, { - getState: () => null!, - setState() {}, - subscribe: () => () => {}, -}) as unknown as RootStore +const storeMock = createWithEqualityFn(() => null!) satisfies RootStore describe('is', () => { const myFunc = () => null From ad0e822530eea7cb1a66c199183909433d688689 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 17:20:53 -0500 Subject: [PATCH 183/252] fix(types): shim OffscreenCanvas Mirrors https://github.com/DefinitelyTyped/DefinitelyTyped/pull/54988 --- packages/fiber/src/core/renderer.tsx | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index dbc4e77829..e090969c6b 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -36,19 +36,17 @@ import { import { useStore } from './hooks' import { Stage, Lifecycle, Stages } from './stages' -// TODO: fix type resolve -declare var OffscreenCanvas: any -type OffscreenCanvas = any +// Shim for OffscreenCanvas since it was removed from DOM types +// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/54988 +interface OffscreenCanvas extends EventTarget {} -type Canvas = HTMLCanvasElement | OffscreenCanvas - -export const _roots = new Map() +export const _roots = new Map() const shallowLoose = { objects: 'shallow', strict: false } as EquConfig export type GLProps = | Renderer - | ((canvas: Canvas) => Renderer) + | ((canvas: HTMLCanvasElement | OffscreenCanvas) => Renderer) | Partial | THREE.WebGLRendererParameters> export type CameraProps = ( @@ -63,7 +61,7 @@ export type CameraProps = ( manual?: boolean } -export interface RenderProps { +export interface RenderProps { /** A threejs renderer instance or props that go into the default renderer */ gl?: GLProps /** Dimensions to fit the renderer to. Will measure canvas dimensions if omitted */ @@ -114,7 +112,7 @@ export interface RenderProps { render?: 'auto' | 'manual' } -const createRendererInstance = ( +const createRendererInstance = ( gl: GLProps | undefined, canvas: TCanvas, ): THREE.WebGLRenderer => { @@ -163,13 +161,13 @@ const createStages = (stages: Stage[] | undefined, store: RootStore) => { Stages.Render.add(renderCallback, store) } -export interface ReconcilerRoot { +export interface ReconcilerRoot { configure: (config?: RenderProps) => ReconcilerRoot render: (element: React.ReactNode) => RootStore unmount: () => void } -function computeInitialSize(canvas: Canvas, size?: Size): Size { +function computeInitialSize(canvas: HTMLCanvasElement | OffscreenCanvas, size?: Size): Size { if (!size && canvas instanceof HTMLCanvasElement && canvas.parentElement) { const { width, height, top, left } = canvas.parentElement.getBoundingClientRect() return { width, height, top, left } @@ -185,7 +183,9 @@ function computeInitialSize(canvas: Canvas, size?: Size): Size { return { width: 0, height: 0, top: 0, left: 0, ...size } } -export function createRoot(canvas: TCanvas): ReconcilerRoot { +export function createRoot( + canvas: TCanvas, +): ReconcilerRoot { // Check against mistaken use of createRoot const prevRoot = _roots.get(canvas) const prevFiber = prevRoot?.fiber @@ -437,7 +437,7 @@ export function createRoot(canvas: TCanvas): ReconcilerR } } -export function render( +export function render( children: React.ReactNode, canvas: TCanvas, config: RenderProps, @@ -448,14 +448,14 @@ export function render( return root.render(children) } -interface ProviderProps { +interface ProviderProps { onCreated?: (state: RootState) => void store: RootStore children: React.ReactNode rootElement: TCanvas } -function Provider({ +function Provider({ store, children, onCreated, @@ -475,7 +475,7 @@ function Provider({ return {children} } -export function unmountComponentAtNode( +export function unmountComponentAtNode( canvas: TCanvas, callback?: (canvas: TCanvas) => void, ): void { From eafb2cc23d04973cd630dc9c7514c89ffb0fb122 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 17:21:51 -0500 Subject: [PATCH 184/252] fix(findInitialRoot): restore traverse, add coverage --- packages/fiber/src/core/utils.tsx | 3 +- packages/fiber/tests/utils.test.ts | 66 ++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index f859201736..15ae327372 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -11,8 +11,7 @@ import type { Dpr, Renderer, RootStore, Size } from './store' */ export function findInitialRoot(instance: Instance): RootStore { let root = instance.root - // TODO: this needs testing https://github.com/pmndrs/react-three-fiber/commit/a4a31ed93c48d1e6dac91329bb5f2ca6a25e5f9c - // while (root.getState().previousRoot) root = root.getState().previousRoot! + while (root.getState().previousRoot) root = root.getState().previousRoot! return root } diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 895b295d0e..384e975183 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -1,6 +1,5 @@ import * as THREE from 'three' -import { createWithEqualityFn } from 'zustand/traditional' -import { type RootStore, type Instance } from '../src' +import { type RootStore, type Instance, act, createRoot } from '../src' import { is, dispose, @@ -14,10 +13,22 @@ import { diffProps, applyProps, updateCamera, + findInitialRoot, } from '../src/core/utils' -// Mocks a Zustand store -const storeMock = createWithEqualityFn(() => null!) satisfies RootStore +function createMockStore(): RootStore { + let store!: RootStore + + try { + act(async () => (store = createRoot(document.createElement('canvas')).render(null))).then(() => null) + } catch (e) { + console.error(e) + } + + return store +} + +const store = createMockStore() describe('is', () => { const myFunc = () => null @@ -168,9 +179,9 @@ describe('getInstanceProps', () => { describe('prepare', () => { it('should create an instance descriptor', () => { const object = new THREE.Object3D() - const instance = prepare(object, storeMock, 'object3D', { name: 'object' }) + const instance = prepare(object, store, 'object3D', { name: 'object' }) - expect(instance.root).toBe(storeMock) + expect(instance.root).toBe(store) expect(instance.type).toBe('object3D') expect(instance.props.name).toBe('object') expect(instance.object).toBe(object) @@ -181,7 +192,7 @@ describe('prepare', () => { const containerDesc = {} const container = { __r3f: containerDesc } - const instance = prepare(container, storeMock, 'container', {}) + const instance = prepare(container, store, 'container', {}) expect(container.__r3f).toBe(containerDesc) expect(instance).toBe(containerDesc) }) @@ -210,8 +221,8 @@ describe('resolve', () => { describe('attach / detach', () => { it('should attach & detach using string values', () => { - const parent = prepare({ prop: null }, storeMock, '', {}) - const child = prepare({}, storeMock, '', { attach: 'prop' }) + const parent = prepare({ prop: null }, store, '', {}) + const child = prepare({}, store, '', { attach: 'prop' }) attach(parent, child) expect(parent.object.prop).toBe(child.object) @@ -226,8 +237,8 @@ describe('attach / detach', () => { const mount = jest.fn() const unmount = jest.fn() - const parent = prepare({}, storeMock, '', {}) - const child = prepare({}, storeMock, '', { attach: () => (mount(), unmount) }) + const parent = prepare({}, store, '', {}) + const child = prepare({}, store, '', { attach: () => (mount(), unmount) }) attach(parent, child) expect(mount).toBeCalledTimes(1) @@ -241,8 +252,8 @@ describe('attach / detach', () => { }) it('should create array when using array-index syntax', () => { - const parent = prepare({ prop: null }, storeMock, '', {}) - const child = prepare({}, storeMock, '', { attach: 'prop-0' }) + const parent = prepare({ prop: null }, store, '', {}) + const child = prepare({}, store, '', { attach: 'prop-0' }) attach(parent, child) expect(parent.object.prop).toStrictEqual([child.object]) @@ -257,7 +268,7 @@ describe('attach / detach', () => { describe('diffProps', () => { it('should filter changed props', () => { - const instance = prepare({}, storeMock, '', { foo: true }) + const instance = prepare({}, store, '', { foo: true }) const newProps = { foo: true, bar: false } const filtered = diffProps(instance, newProps) @@ -271,13 +282,13 @@ describe('diffProps', () => { const oldProps = { map: texture1, 'map-needsUpdate': true, 'map-name': 'test' } const newProps = { map: texture2, 'map-needsUpdate': true, 'map-name': 'test' } - const instance = prepare({}, storeMock, '', oldProps) + const instance = prepare({}, store, '', oldProps) const filtered = diffProps(instance, newProps) expect(filtered).toStrictEqual(newProps) }) it('should pick removed props for HMR', () => { - const instance = prepare(new THREE.Object3D(), storeMock, '', { position: [0, 0, 1] }) + const instance = prepare(new THREE.Object3D(), store, '', { position: [0, 0, 1] }) const newProps = {} const filtered = diffProps(instance, newProps) @@ -285,7 +296,7 @@ describe('diffProps', () => { }) it('should reset removed props for HMR', () => { - const instance = prepare(new THREE.Object3D(), storeMock, '', { scale: 10 }) + const instance = prepare(new THREE.Object3D(), store, '', { scale: 10 }) const filtered = diffProps(instance, {}) expect((filtered.scale as THREE.Vector3).toArray()).toStrictEqual([1, 1, 1]) }) @@ -296,7 +307,7 @@ describe('diffProps', () => { const props = { foo: true } const filtered = diffProps( - prepare({}, storeMock, '', {}), + prepare({}, store, '', {}), RESERVED_PROPS.reduce((acc, key) => ({ ...acc, [key]: { get, set } }), props), ) @@ -431,3 +442,22 @@ describe('updateCamera', () => { expect(orthographic.updateProjectionMatrix).not.toHaveBeenCalled() }) }) + +describe('findInitialRoot', () => { + it('finds the nearest root for portals', () => { + const portalStore = createMockStore() + portalStore.getState().previousRoot = store + + const instance = prepare(new THREE.Object3D(), portalStore, '', {}) + const root = findInitialRoot(instance) + + expect(root).toBe(store) + }) + + it('falls back to the local root', () => { + const instance = prepare(new THREE.Object3D(), store, '', {}) + const root = findInitialRoot(instance) + + expect(root).toBe(store) + }) +}) From b252c8a55aa648a43427a6442aa77660c10e9e54 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 19:20:57 -0500 Subject: [PATCH 185/252] chore(demos): cleanup SVGRenderer --- example/package.json | 3 +- example/src/demos/SVGRenderer.tsx | 63 +++++++------------------------ yarn.lock | 19 +++++++--- 3 files changed, 27 insertions(+), 58 deletions(-) diff --git a/example/package.json b/example/package.json index ff0554ec27..b84c4c6d25 100644 --- a/example/package.json +++ b/example/package.json @@ -13,10 +13,9 @@ "@use-gesture/react": "latest", "react": "19.0.0-beta-94eed63c49-20240425", "react-dom": "19.0.0-beta-94eed63c49-20240425", - "react-merge-refs": "^2.1.1", "react-use-refs": "^1.0.1", "three": "^0.160.0", - "three-stdlib": "^2.29.1", + "three-stdlib": "^2.29.8", "use-error-boundary": "^2.0.6", "wouter": "^2.12.1", "zustand": "^4.4.7" diff --git a/example/src/demos/SVGRenderer.tsx b/example/src/demos/SVGRenderer.tsx index 928391fec8..90709cfef5 100644 --- a/example/src/demos/SVGRenderer.tsx +++ b/example/src/demos/SVGRenderer.tsx @@ -1,16 +1,6 @@ import * as THREE from 'three' -import React, { useRef, useState } from 'react' -import { - RenderProps, - extend, - createRoot, - unmountComponentAtNode, - useFrame, - events, - ReconcilerRoot, -} from '@react-three/fiber' -import useMeasure, { Options as ResizeOptions } from 'react-use-measure' -import mergeRefs from 'react-merge-refs' +import React, { useEffect, useRef, useState } from 'react' +import { useFrame, Canvas } from '@react-three/fiber' import { SVGRenderer } from 'three-stdlib' function TorusKnot() { @@ -28,48 +18,21 @@ function TorusKnot() { ) } +const gl = new SVGRenderer() +gl.domElement.style.position = 'absolute' +gl.domElement.style.top = 0 +gl.domElement.style.left = 0 + export default function () { + useEffect(() => { + document.body.appendChild(gl.domElement) + return () => document.body.removeChild(gl.domElement) + }, []) + return ( - + ) } - -interface Props extends Omit, 'size' | 'gl'>, React.HTMLAttributes { - children: React.ReactNode - resize?: ResizeOptions -} - -function Canvas({ children, resize, style, className, ...props }: Props) { - React.useMemo(() => extend(THREE), []) - - const [bind, size] = useMeasure({ scroll: true, debounce: { scroll: 50, resize: 0 }, ...resize }) - const ref = React.useRef(null!) - const [gl] = useState(() => new SVGRenderer() as unknown as THREE.WebGLRenderer) - const root = React.useRef>(null!) - - if (size.width > 0 && size.height > 0) { - if (!root.current) root.current = createRoot(ref.current) - root.current.configure({ ...props, size, events, gl }) - root.current.render(children) - } - - React.useEffect(() => { - const container = ref.current - container.appendChild(gl.domElement) - return () => { - container.removeChild(gl.domElement) - unmountComponentAtNode(container) - } - }, []) - - return ( -
    - ) -} diff --git a/yarn.lock b/yarn.lock index f80de79854..1bcbaf590a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8948,11 +8948,6 @@ 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-merge-refs@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-2.1.1.tgz#e46763f8f1b881c0226ee54a1a2a10ffefba0233" - integrity sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag== - react-native-codegen@^0.69.1: version "0.69.2" resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.69.2.tgz#e33ac3b1486de59ddae687b731ddbfcef8af0e4e" @@ -10159,7 +10154,7 @@ three-mesh-bvh@^0.7.0: resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.3.tgz#91f2d7e26f230288b5b0a6bdf41bdd9620348945" integrity sha512-3W6KjzmupjfE89GuHPT31kxKWZ4YGZPEZJNysJpiOZfQRsBQQgmK7v/VJPpjG6syhAvTnY+5Fr77EvIkTLpGSw== -three-stdlib@^2.13.0, three-stdlib@^2.29.1, three-stdlib@^2.29.4: +three-stdlib@^2.13.0, three-stdlib@^2.29.4: version "2.29.6" resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.6.tgz#d1d17a7e5d48921ebb3aed9f5131bb85968e4d29" integrity sha512-nj9bHkzhhwfmqQcM/keC2RDb0bHhbw6bRXTy81ehzi8F1rtp6pJ5eS0/vl1Eg5RMFqXOMyxJ6sDHPoLU+IrVZg== @@ -10171,6 +10166,18 @@ three-stdlib@^2.13.0, three-stdlib@^2.29.1, three-stdlib@^2.29.4: fflate "^0.6.9" potpack "^1.0.1" +three-stdlib@^2.29.8: + version "2.29.8" + resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.8.tgz#d2aebed6bb12451ccf69d7ff3aaed22ff6df98dd" + integrity sha512-macJJjnrWlLnQ3S0u+iHDSIPvgUOGtBKAk0rlcDxKP1q8RvxkVm2LBGyBfjVcmz8kzwTWYuOuk300rqcMMHS7w== + dependencies: + "@types/draco3d" "^1.4.0" + "@types/offscreencanvas" "^2019.6.4" + "@types/webxr" "^0.5.2" + draco3d "^1.4.1" + fflate "^0.6.9" + potpack "^1.0.1" + three@^0.141.0: version "0.141.0" resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" From 817335b2c4b1bf20ee43aeb2e1dab6f371cf23d0 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 19:21:40 -0500 Subject: [PATCH 186/252] chore: cleanup --- example/src/demos/SVGRenderer.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/src/demos/SVGRenderer.tsx b/example/src/demos/SVGRenderer.tsx index 90709cfef5..4d7a214ea9 100644 --- a/example/src/demos/SVGRenderer.tsx +++ b/example/src/demos/SVGRenderer.tsx @@ -20,17 +20,17 @@ function TorusKnot() { const gl = new SVGRenderer() gl.domElement.style.position = 'absolute' -gl.domElement.style.top = 0 -gl.domElement.style.left = 0 +gl.domElement.style.top = '0' +gl.domElement.style.left = '0' export default function () { useEffect(() => { document.body.appendChild(gl.domElement) - return () => document.body.removeChild(gl.domElement) + return () => void document.body.removeChild(gl.domElement) }, []) return ( - + From b62c8078c352533a9b1a9b349a93d932a4f1b464 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 19:34:16 -0500 Subject: [PATCH 187/252] chore(demos): upgrade deps --- example/package.json | 4 +-- yarn.lock | 59 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/example/package.json b/example/package.json index b84c4c6d25..4c02824f5e 100644 --- a/example/package.json +++ b/example/package.json @@ -9,13 +9,13 @@ "dependencies": { "@react-spring/core": "^9.7.3", "@react-spring/three": "^9.7.3", - "@react-three/drei": "^9.93.0", + "@react-three/drei": "^9.105.5", "@use-gesture/react": "latest", "react": "19.0.0-beta-94eed63c49-20240425", "react-dom": "19.0.0-beta-94eed63c49-20240425", "react-use-refs": "^1.0.1", "three": "^0.160.0", - "three-stdlib": "^2.29.8", + "three-stdlib": "^2.29.9", "use-error-boundary": "^2.0.6", "wouter": "^2.12.1", "zustand": "^4.4.7" diff --git a/yarn.lock b/yarn.lock index 1bcbaf590a..ce0be5357f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2092,6 +2092,13 @@ resolved "https://registry.yarnpkg.com/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz#a78e137018a19933b7a1d0e887d553d4ab833d10" integrity sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q== +"@monogrid/gainmap-js@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz#8c736088012ae8cd1f7b3d5adbd221c3905ab4ed" + integrity sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA== + dependencies: + promise-worker-transferable "^1.0.4" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2452,19 +2459,21 @@ resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.3.tgz#ea78fd447cbc2612c1f5d55852e3c331e8172a0b" integrity sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw== -"@react-three/drei@^9.93.0": - version "9.102.6" - resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.102.6.tgz#bf705868a2b8f72004a0bec682520f1e3651c515" - integrity sha512-FUR7Ea3GLsxFmAGv8byVPgkhEB84VveiT23gIJMqTb/xCBkSHXvHGCiFgZOiiTScAT+GR8txrlX7dA8nbXJDKg== +"@react-three/drei@^9.105.5": + version "9.105.5" + resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.105.5.tgz#440b345c781a2c8674c82be1f081e240828782ca" + integrity sha512-qo5ys8y1tNJ9cUloBXJHvtMLVY7mrH8XAgLzFxo6Wr6IzJM3lAOcOucbZehpl/6iZFmWaqbhLXg/YTQpHUJpEQ== dependencies: "@babel/runtime" "^7.11.2" "@mediapipe/tasks-vision" "0.10.8" + "@monogrid/gainmap-js" "^3.0.5" "@react-spring/three" "~9.6.1" "@use-gesture/react" "^10.2.24" camera-controls "^2.4.2" cross-env "^7.0.3" detect-gpu "^5.0.28" glsl-noise "^0.0.0" + hls.js "1.3.5" maath "^0.10.7" meshline "^3.1.6" react-composer "^5.0.3" @@ -2472,7 +2481,7 @@ stats.js "^0.17.0" suspend-react "^0.1.3" three-mesh-bvh "^0.7.0" - three-stdlib "^2.29.4" + three-stdlib "^2.29.9" troika-three-text "^0.49.0" tunnel-rat "^0.1.2" utility-types "^3.10.0" @@ -5779,6 +5788,11 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" +hls.js@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.3.5.tgz#0e8b0799ecf2feb7ba199f5e95f35ba9552e04f4" + integrity sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -5873,6 +5887,11 @@ image-size@^0.6.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -6178,6 +6197,11 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-promise@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + is-reference@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -7405,6 +7429,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@^3.0.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lilconfig@2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" @@ -8829,6 +8860,14 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +promise-worker-transferable@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz#2c72861ba053e5ae42b487b4a83b1ed3ae3786e8" + integrity sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw== + dependencies: + is-promise "^2.1.0" + lie "^3.0.2" + promise@^8.0.3: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -10154,7 +10193,7 @@ three-mesh-bvh@^0.7.0: resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.7.3.tgz#91f2d7e26f230288b5b0a6bdf41bdd9620348945" integrity sha512-3W6KjzmupjfE89GuHPT31kxKWZ4YGZPEZJNysJpiOZfQRsBQQgmK7v/VJPpjG6syhAvTnY+5Fr77EvIkTLpGSw== -three-stdlib@^2.13.0, three-stdlib@^2.29.4: +three-stdlib@^2.13.0: version "2.29.6" resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.6.tgz#d1d17a7e5d48921ebb3aed9f5131bb85968e4d29" integrity sha512-nj9bHkzhhwfmqQcM/keC2RDb0bHhbw6bRXTy81ehzi8F1rtp6pJ5eS0/vl1Eg5RMFqXOMyxJ6sDHPoLU+IrVZg== @@ -10166,10 +10205,10 @@ three-stdlib@^2.13.0, three-stdlib@^2.29.4: fflate "^0.6.9" potpack "^1.0.1" -three-stdlib@^2.29.8: - version "2.29.8" - resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.8.tgz#d2aebed6bb12451ccf69d7ff3aaed22ff6df98dd" - integrity sha512-macJJjnrWlLnQ3S0u+iHDSIPvgUOGtBKAk0rlcDxKP1q8RvxkVm2LBGyBfjVcmz8kzwTWYuOuk300rqcMMHS7w== +three-stdlib@^2.29.9: + version "2.29.9" + resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.29.9.tgz#ee8fe2ce01f08817c15bb7f00c52b6558c981ff8" + integrity sha512-O6HRkJXX5A3DGXdvMwi8XqYlTV1wXdhKhxWmTuDoXFN4aZj96GW7gKj8FQ4bWFV2L8SmXuYSpkvJoG/1GCc9Ug== dependencies: "@types/draco3d" "^1.4.0" "@types/offscreencanvas" "^2019.6.4" From d7eb0779a2d2e2b4c512f3e791815153fc051705 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 20:11:21 -0500 Subject: [PATCH 188/252] [v9] refactor!: remove viewport, add dpr (#2887) --- docs/API/hooks.mdx | 58 ++++++------ example/src/demos/Gestures.tsx | 4 +- example/src/demos/ResetProps.tsx | 8 +- packages/fiber/src/core/index.tsx | 1 - packages/fiber/src/core/renderer.tsx | 8 +- packages/fiber/src/core/store.ts | 90 +++---------------- .../tests/__snapshots__/index.test.tsx.snap | 1 - packages/fiber/tests/index.test.tsx | 29 +++--- 8 files changed, 65 insertions(+), 134 deletions(-) diff --git a/docs/API/hooks.mdx b/docs/API/hooks.mdx index 57a9b51dd3..3e8e00d475 100644 --- a/docs/API/hooks.mdx +++ b/docs/API/hooks.mdx @@ -36,7 +36,7 @@ function App() { ## useThree -This hook gives you access to the state model which contains the default renderer, the scene, your camera, and so on. It also gives you the current size of the canvas in screen and viewport coordinates. +This hook gives you access to the state model which contains the default renderer, the scene, your camera, and so on. It also gives you the current size of the canvas. ```jsx import { useThree } from '@react-three/fiber' @@ -49,33 +49,33 @@ The hook is reactive, if you resize the browser for instance, you get fresh meas ### State properties -| Prop | Description | Type | -| --------------- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| gl | Renderer | `THREE.WebGLRenderer` | -| scene | Scene | `THREE.Scene` | -| camera | Camera | `THREE.PerspectiveCamera` | -| raycaster | Default raycaster | `THREE.Raycaster` | -| pointer | Contains updated, normalized, centric pointer coordinates | `THREE.Vector2` | -| mouse | Note: this is deprecated, use `pointer` instead! Normalized event coordinates | `THREE.Vector2` | -| clock | Running system clock | `THREE.Clock` | -| linear | True when the colorspace is linear | `boolean` | -| flat | True when no tonemapping is used | `boolean` | -| legacy | Disables global color management via `THREE.ColorManagement` | `boolean` | -| frameloop | Render mode: always, demand, never | `always`, `demand`, `never` | -| performance | System regression | `{ current: number, min: number, max: number, debounce: number, regress: () => void }` | -| size | Canvas size in pixels | `{ width: number, height: number, top: number, left: number }` | -| viewport | Viewport size in three.js units | `{ width: number, height: number, initialDpr: number, dpr: number, factor: number, distance: number, aspect: number, getCurrentViewport: (camera?: Camera, target?: THREE.Vector3, size?: Size) => Viewport }` | -| xr | XR interface, manages WebXR rendering | `{ connect: () => void, disconnect: () => void }` | -| set | Allows you to set any state property | `(state: SetState) => void` | -| get | Allows you to retrieve any state property non-reactively | `() => GetState` | -| invalidate | Request a new render, given that `frameloop === 'demand'` | `() => void` | -| advance | Advance one tick, given that `frameloop === 'never'` | `(timestamp: number, runGlobalEffects?: boolean) => void` | -| setSize | Resize the canvas | `(width: number, height: number, top?: number, left?: number) => void` | -| setDpr | Set the pixel-ratio | `(dpr: number) => void` | -| setFrameloop | Shortcut to set the current render mode | `(frameloop?: 'always', 'demand', 'never') => void` | -| setEvents | Shortcut to setting the event layer | `(events: Partial>) => void` | -| onPointerMissed | Response for pointer clicks that have missed a target | `() => void` | -| events | Pointer-event handling | `{ connected: TargetNode, handlers: Events, connect: (target: TargetNode) => void, disconnect: () => void }` | +| Prop | Description | Type | +| --------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| gl | Renderer | `THREE.WebGLRenderer` | +| scene | Scene | `THREE.Scene` | +| camera | Camera | `THREE.PerspectiveCamera` | +| raycaster | Default raycaster | `THREE.Raycaster` | +| pointer | Contains updated, normalized, centric pointer coordinates | `THREE.Vector2` | +| mouse | Note: this is deprecated, use `pointer` instead! Normalized event coordinates | `THREE.Vector2` | +| clock | Running system clock | `THREE.Clock` | +| linear | True when the colorspace is linear | `boolean` | +| flat | True when no tonemapping is used | `boolean` | +| legacy | Disables global color management via `THREE.ColorManagement` | `boolean` | +| frameloop | Render mode: always, demand, never | `always`, `demand`, `never` | +| performance | System regression | `{ current: number, min: number, max: number, debounce: number, regress: () => void }` | +| dpr | The current pixel ratio | `number` | +| size | Canvas size in pixels | `{ width: number, height: number, top: number, left: number }` | +| xr | XR interface, manages WebXR rendering | `{ connect: () => void, disconnect: () => void }` | +| set | Allows you to set any state property | `(state: SetState) => void` | +| get | Allows you to retrieve any state property non-reactively | `() => GetState` | +| invalidate | Request a new render, given that `frameloop === 'demand'` | `() => void` | +| advance | Advance one tick, given that `frameloop === 'never'` | `(timestamp: number, runGlobalEffects?: boolean) => void` | +| setSize | Resize the canvas | `(width: number, height: number, top?: number, left?: number) => void` | +| setDpr | Set the pixel-ratio | `(dpr: number) => void` | +| setFrameloop | Shortcut to set the current render mode | `(frameloop?: 'always', 'demand', 'never') => void` | +| setEvents | Shortcut to setting the event layer | `(events: Partial>) => void` | +| onPointerMissed | Response for pointer clicks that have missed a target | `() => void` | +| events | Pointer-event handling | `{ connected: TargetNode, handlers: Events, connect: (target: TargetNode) => void, disconnect: () => void }` | ### Selector @@ -85,7 +85,7 @@ You can also select properties, this allows you to avoid needless re-render for // Will only trigger re-render when the default camera is exchanged const camera = useThree((state) => state.camera) // Will only re-render on resize changes -const viewport = useThree((state) => state.viewport) +const { width, height } = useThree((state) => state.size) // ❌ You cannot expect reactivity from three.js internals! const zoom = useThree((state) => state.camera.zoom) ``` diff --git a/example/src/demos/Gestures.tsx b/example/src/demos/Gestures.tsx index c24736e9cf..3467829450 100644 --- a/example/src/demos/Gestures.tsx +++ b/example/src/demos/Gestures.tsx @@ -3,12 +3,12 @@ import { Canvas, useThree, useFrame } from '@react-three/fiber' import { useDrag } from '@use-gesture/react' function Obj({ scale = 1, z = 0, opacity = 1 }) { - const { viewport } = useThree() + const { size } = useThree() const [hovered, hover] = useState(false) const [position, set] = useState<[number, number, number]>([0, 0, z]) const bind = useDrag(({ event, offset: [x, y] }) => { event.stopPropagation() - const aspect = viewport.getCurrentViewport().factor + const aspect = size.width / size.height set([x / aspect, -y / aspect, z]) }) diff --git a/example/src/demos/ResetProps.tsx b/example/src/demos/ResetProps.tsx index f3e71f5914..a253e39bfc 100644 --- a/example/src/demos/ResetProps.tsx +++ b/example/src/demos/ResetProps.tsx @@ -6,19 +6,21 @@ import { OrbitControls } from '@react-three/drei' function AdaptivePixelRatio() { const gl = useThree((state) => state.gl) const current = useThree((state) => state.performance.current) - const initialDpr = useThree((state) => state.viewport.initialDpr) + const initialDpr = useRef(1) + const dpr = useThree((state) => state.dpr) + initialDpr.current ??= dpr const setDpr = useThree((state) => state.setDpr) // Restore initial pixelratio on unmount useEffect(() => { const domElement = gl.domElement return () => { - setDpr(initialDpr) + setDpr(initialDpr.current) domElement.style.imageRendering = 'auto' } }, []) // Set adaptive pixelratio useEffect(() => { - setDpr(current * initialDpr) + setDpr(current * initialDpr.current) gl.domElement.style.imageRendering = current === 1 ? 'auto' : 'pixelated' }, [current]) return null diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index e3dc0aeb1f..e8cca14cf5 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -30,7 +30,6 @@ export type { Subscription, Dpr, Size, - Viewport, RenderCallback, UpdateCallback, LegacyAlways, diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index e090969c6b..7f1e59ebcd 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -401,7 +401,7 @@ export function createRoot( state.setSize(size.width, size.height, size.top, size.left) } // Check pixelratio - if (dpr && state.viewport.dpr !== calculateDpr(dpr)) state.setDpr(dpr) + if (dpr && state.dpr !== calculateDpr(dpr)) state.setDpr(dpr) // Check frameloop if (state.frameloop !== frameloop) state.setFrameloop(frameloop) // Check pointer missed @@ -537,11 +537,8 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { const [pointer] = React.useState(() => new THREE.Vector2()) const inject = useMutableCallback((rootState: RootState, injectState: RootState) => { - let viewport if (injectState.camera && size) { const camera = injectState.camera - // Calculate the override viewport, if present - viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), size) // Update the portal camera, if it differs from the previous layer if (camera !== rootState.camera) updateCamera(camera, size) } @@ -558,10 +555,9 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { mouse: pointer, // Their previous root is the layer before it previousRoot, - // Events, size and viewport can be overridden by the inject layer + // Events and size can be overridden by the inject layer events: { ...rootState.events, ...injectState.events, ...events }, size: { ...rootState.size, ...size }, - viewport: { ...rootState.viewport, ...viewport }, // Layers are allowed to override events setEvents: (events: Partial>) => injectState.set((state) => ({ ...state, events: { ...state.events, ...events } })), diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index cd4f8a0835..56e023daa4 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -3,7 +3,7 @@ import * as React from 'react' import { type StoreApi } from 'zustand' import { createWithEqualityFn, type UseBoundStoreWithEqualityFn } from 'zustand/traditional' import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' -import { calculateDpr, type Camera, isOrthographicCamera, updateCamera } from './utils' +import { calculateDpr, type Camera, updateCamera } from './utils' import type { FixedStage, Stage } from './stages' export interface Intersection extends THREE.Intersection { @@ -23,18 +23,6 @@ export interface Size { top: number left: number } -export interface Viewport extends Size { - /** The initial pixel ratio */ - initialDpr: number - /** Current pixel ratio */ - dpr: number - /** size.width / viewport.width */ - factor: number - /** Camera distance */ - distance: number - /** Camera aspect ratio: width / height */ - aspect: number -} export type RenderCallback = (state: RootState, delta: number, frame?: XRFrame) => void export type UpdateCallback = RenderCallback @@ -125,16 +113,10 @@ export interface RootState { frameloop: FrameloopLegacy /** Adaptive performance interface */ performance: Performance + /** The current pixel ratio */ + dpr: number /** Reactive pixel-size of the canvas */ size: Size - /** Reactive size of the viewport in threejs units */ - viewport: Viewport & { - getCurrentViewport: ( - camera?: Camera, - target?: THREE.Vector3 | Parameters, - size?: Size, - ) => Omit - } /** Flags the canvas for render, but doesn't render in itself */ invalidate: (frames?: number) => void /** Advance (render) one step */ @@ -164,29 +146,6 @@ export const createStore = ( advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: XRFrame) => void, ): RootStore => { const rootStore = createWithEqualityFn((set, get) => { - const position = new THREE.Vector3() - const defaultTarget = new THREE.Vector3() - const tempTarget = new THREE.Vector3() - function getCurrentViewport( - camera: Camera = get().camera, - target: THREE.Vector3 | Parameters = defaultTarget, - size: Size = get().size, - ): Omit { - const { width, height, top, left } = size - const aspect = width / height - if (target instanceof THREE.Vector3) tempTarget.copy(target) - else tempTarget.set(...target) - const distance = camera.getWorldPosition(position).distanceTo(tempTarget) - if (isOrthographicCamera(camera)) { - return { width: width / camera.zoom, height: height / camera.zoom, top, left, factor: 1, distance, aspect } - } else { - const fov = (camera.fov * Math.PI) / 180 // convert vertical fov to radians - const h = 2 * Math.tan(fov / 2) * distance // visible height - const w = h * (width / height) - return { width: w, height: h, top, left, factor: width / w, distance, aspect } - } - } - let performanceTimeout: ReturnType | undefined = undefined const setPerformanceCurrent = (current: number) => set((state) => ({ performance: { ...state.performance, current } })) @@ -239,32 +198,15 @@ export const createStore = ( }, }, + dpr: 1, size: { width: 0, height: 0, top: 0, left: 0 }, - viewport: { - initialDpr: 0, - dpr: 0, - width: 0, - height: 0, - top: 0, - left: 0, - aspect: 0, - distance: 0, - factor: 0, - getCurrentViewport, - }, setEvents: (events: Partial>) => set((state) => ({ ...state, events: { ...state.events, ...events } })), setSize: (width: number, height: number, top: number = 0, left: number = 0) => { - const camera = get().camera - const size = { width, height, top, left } - set((state) => ({ size, viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) } })) + set({ size: { width, height, top, left } }) }, - setDpr: (dpr: Dpr) => - set((state) => { - const resolved = calculateDpr(dpr) - return { viewport: { ...state.viewport, dpr: resolved, initialDpr: state.viewport.initialDpr || resolved } } - }), + setDpr: (dpr: Dpr) => set({ dpr: calculateDpr(dpr) }), setFrameloop: (frameloop: Frameloop) => { const state = get() const mode: FrameloopLegacy = @@ -345,29 +287,19 @@ export const createStore = ( const state = rootStore.getState() let oldSize = state.size - let oldDpr = state.viewport.dpr - let oldCamera = state.camera - rootStore.subscribe(() => { - const { camera, size, viewport, gl, set } = rootStore.getState() - + let oldDpr = state.dpr + rootStore.subscribe(({ camera, size, dpr, gl }) => { // Resize camera and renderer on changes to size and pixelratio - if (size.width !== oldSize.width || size.height !== oldSize.height || viewport.dpr !== oldDpr) { + if (size !== oldSize || dpr !== oldDpr) { oldSize = size - oldDpr = viewport.dpr + oldDpr = dpr // Update camera & renderer updateCamera(camera, size) - gl.setPixelRatio(viewport.dpr) + gl.setPixelRatio(dpr) const updateStyle = typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement gl.setSize(size.width, size.height, updateStyle) } - - // Update viewport once the camera changes - if (camera !== oldCamera) { - oldCamera = camera - // Update viewport - set((state) => ({ viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(camera) } })) - } }) // Invalidate on any change diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index ee3995d0f8..64852f0b9e 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -76,7 +76,6 @@ Array [ "Vector3", "Vector4", "VectorRepresentation", - "Viewport", "WithMathProps", "XRManager", "_roots", diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index bba208021b..eae81bd40e 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -51,22 +51,11 @@ describe('createRoot', () => { expect(camera.position.z).toEqual(5) }) - it('should handle an performance changing functions', async () => { - let store: RootStore = null! - await act(async () => { - store = root.configure({ dpr: [1, 2], performance: { min: 0.2 } }).render() - }) - - expect(store.getState().viewport.initialDpr).toEqual(window.devicePixelRatio) + it('should handle any performance changing functions', async () => { + const store = await act(async () => root.configure({ performance: { min: 0.2 } }).render()) expect(store.getState().performance.min).toEqual(0.2) expect(store.getState().performance.current).toEqual(1) - await act(async () => { - store.getState().setDpr(0.1) - }) - - expect(store.getState().viewport.dpr).toEqual(0.1) - jest.useFakeTimers() await act(async () => { @@ -85,6 +74,20 @@ describe('createRoot', () => { jest.useRealTimers() }) + it('should handle the DPR prop reactively', async () => { + // Initial clamp + const store = await act(async () => root.configure({ dpr: [1, 2] }).render()) + expect(store.getState().dpr).toEqual(window.devicePixelRatio) + + // Reactive update + await act(async () => store.getState().setDpr(0.1)) + expect(store.getState().dpr).toEqual(0.1) + + // Reactive clamp + await act(async () => store.getState().setDpr([1, 2])) + expect(store.getState().dpr).toEqual(window.devicePixelRatio) + }) + it('should set PCFSoftShadowMap as the default shadow map', async () => { const store = await act(async () => root.configure({ shadows: true }).render()) const { gl } = store.getState() From 538a89a5466566c9a5f4c4d5537344fc22786604 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 27 Apr 2024 20:04:01 -0700 Subject: [PATCH 189/252] chore: Use React beta typings --- example/package.json | 9 +++++-- package.json | 9 ++++--- yarn.lock | 61 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 63 insertions(+), 16 deletions(-) diff --git a/example/package.json b/example/package.json index ff0554ec27..6b8ca7dc78 100644 --- a/example/package.json +++ b/example/package.json @@ -22,10 +22,15 @@ "zustand": "^4.4.7" }, "devDependencies": { - "@types/react": "^18.2.47", + "@types/react": "npm:types-react@beta", + "@types/react-dom": "npm:types-react-dom@beta", "@vitejs/plugin-react-refresh": "^1.3.6", "@vitejs/plugin-react": "^4.2.1", "typescript": "^5.3.3", - "vite": "^5.0.11" + "vite": "^5.2.10" + }, + "overrides": { + "@types/react": "npm:types-react@beta", + "@types/react-dom": "npm:types-react-dom@beta" } } diff --git a/package.json b/package.json index 064d0a303a..f0dfc2fe0a 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "@preconstruct/cli": "^2.1.5", "@testing-library/react": "^15.0.2", "@types/jest": "^29.2.5", - "@types/react": "18.2.73", - "@types/react-dom": "18.2.22", + "@types/react": "npm:types-react@beta", + "@types/react-dom": "npm:types-react-dom@beta", "@types/react-native": "0.69.5", "@types/react-test-renderer": "18.0.7", "@types/scheduler": "0.23.0", @@ -85,5 +85,8 @@ "ts-jest": "^29.1.2", "typescript": "^4.6.3" }, - "dependencies": {} + "overrides": { + "@types/react": "npm:types-react@beta", + "@types/react-dom": "npm:types-react-dom@beta" + } } diff --git a/yarn.lock b/yarn.lock index f80de79854..3431a91f15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2858,13 +2858,20 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@18.2.22", "@types/react-dom@^18.0.0": +"@types/react-dom@^18.0.0": version "18.2.22" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== dependencies: "@types/react" "*" +"@types/react-dom@npm:types-react-dom@beta": + version "19.0.0-beta.1" + resolved "https://registry.yarnpkg.com/types-react-dom/-/types-react-dom-19.0.0-beta.1.tgz#393901da15ad756f0ce101f12a1e3256d2ce1256" + integrity sha512-fXQfv6OQOXxmgNQ7RuhX615Wx4680LqVbrEbxch+ZQ56ZDAZKXptLl3XoHaHU31Yd2xiig/VlXzohCexKXNzBQ== + 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" @@ -2886,7 +2893,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@18.2.73", "@types/react@^18.2.47": +"@types/react@*": version "18.2.73" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.73.tgz#0579548ad122660d99e00499d22e33b81e73ed94" integrity sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA== @@ -2894,6 +2901,13 @@ "@types/prop-types" "*" csstype "^3.0.2" +"@types/react@npm:types-react@beta": + version "19.0.0-beta.1" + resolved "https://registry.yarnpkg.com/types-react/-/types-react-19.0.0-beta.1.tgz#0a5ee6e0c8eb3d238c3f8ad61bb5820faa53c84d" + integrity sha512-gQpuPdi+Gu+nIFmhnFLINkGQ4j0eRY7olV3lzncFJy2g5TfnSEFD1xU86u5KgRytFswwZ5pGEPWEizefwPaxTw== + dependencies: + csstype "^3.0.2" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -8742,7 +8756,7 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss@^8.4.36: +postcss@^8.4.38: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -9890,7 +9904,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.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": + 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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +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== @@ -9968,7 +9991,7 @@ 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: +"strip-ansi-cjs@npm: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== @@ -9982,6 +10005,13 @@ 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== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10691,13 +10721,13 @@ 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@^5.0.11: - version "5.2.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.6.tgz#fc2ce309e0b4871e938cb0aca3b96c422c01f222" - integrity sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA== +vite@^5.2.10: + version "5.2.10" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.10.tgz#2ac927c91e99d51b376a5c73c0e4b059705f5bd7" + integrity sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw== dependencies: esbuild "^0.20.1" - postcss "^8.4.36" + postcss "^8.4.38" rollup "^4.13.0" optionalDependencies: fsevents "~2.3.3" @@ -10878,7 +10908,7 @@ wouter@^2.12.1: dependencies: use-sync-external-store "^1.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm: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== @@ -10896,6 +10926,15 @@ 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== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From d7f7ed45b12e6ff9d74f89a9dfc80c564c09e5ea Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 27 Apr 2024 20:09:57 -0700 Subject: [PATCH 190/252] fix: JSX namespacing for v19 --- packages/fiber/src/three-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 54452cd0e8..89a05a014e 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -61,7 +61,7 @@ export interface ThreeElements extends ThreeElementsImpl { primitive: Omit, 'args'> & { object: object } } -declare global { +declare module 'react' { namespace JSX { interface IntrinsicElements extends ThreeElements {} } From 0ffa7184c5d51de76e4c8a3eaabd902258c027d7 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 22:42:19 -0500 Subject: [PATCH 191/252] fix(types): use new ref type --- docs/API/canvas.mdx | 42 +++++++++++++------------- packages/fiber/src/core/hooks.tsx | 2 +- packages/fiber/src/core/store.ts | 8 ++--- packages/fiber/src/core/utils.tsx | 4 +-- packages/fiber/src/web/Canvas.tsx | 2 +- packages/fiber/tests/hooks.test.tsx | 2 +- packages/fiber/tests/renderer.test.tsx | 19 +++++++----- 7 files changed, 41 insertions(+), 38 deletions(-) diff --git a/docs/API/canvas.mdx b/docs/API/canvas.mdx index 2ba2c8272f..0b0e36281a 100644 --- a/docs/API/canvas.mdx +++ b/docs/API/canvas.mdx @@ -23,27 +23,27 @@ const App = () => ( ## Render Props -| Prop | Description | Default | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| children | three.js JSX elements or regular components | | -| gl | Props that go into the default renderer, or your own renderer. Also accepts a synchronous callback like `gl={canvas => new Renderer({ canvas })}` | `{}` | -| scene | Props that go into the default camera, or your own `THREE.Scene` | `{}` | -| camera | Props that go into the default camera, or your own `THREE.Camera` | `{ fov: 75, near: 0.1, far: 1000, position: [0, 0, 5] }` | -| scene | Props that go into the default scene, or your own `THREE.Scene` | `{}` | -| shadows | Props that go into `gl.shadowMap`, can be set true for `PCFsoft` or one of the following: 'basic', 'percentage', 'soft', 'variance' | `false` | -| raycaster | Props that go into the default raycaster | `{}` | -| frameloop | Render mode: always, demand, never | `always` | -| resize | Resize config, see react-use-measure's options | `{ scroll: true, debounce: { scroll: 50, resize: 0 } }` | -| orthographic | Creates an orthographic camera | `false` | -| dpr | Pixel-ratio, use `window.devicePixelRatio`, or automatic: [min, max] | `[1, 2]` | -| legacy | Enables THREE.ColorManagement in three r139 or later | `false` | -| linear | Switch off automatic sRGB color space and gamma correction | `false` | -| events | Configuration for the event manager, as a function of state | `import { events } from "@react-three/fiber"` | -| eventSource | The source where events are being subscribed to, HTMLElement | `React.MutableRefObject`, `gl.domElement.parentNode` | -| eventPrefix | The event prefix that is cast into canvas pointer x/y events | `offset` | -| flat | Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` | `false` | -| onCreated | Callback after the canvas has rendered (but not yet committed) | `(state) => {}` | -| onPointerMissed | Response for pointer clicks that have missed any target | `(event) => {}` | +| Prop | Description | Default | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | +| children | three.js JSX elements or regular components | | +| gl | Props that go into the default renderer, or your own renderer. Also accepts a synchronous callback like `gl={canvas => new Renderer({ canvas })}` | `{}` | +| scene | Props that go into the default camera, or your own `THREE.Scene` | `{}` | +| camera | Props that go into the default camera, or your own `THREE.Camera` | `{ fov: 75, near: 0.1, far: 1000, position: [0, 0, 5] }` | +| scene | Props that go into the default scene, or your own `THREE.Scene` | `{}` | +| shadows | Props that go into `gl.shadowMap`, can be set true for `PCFsoft` or one of the following: 'basic', 'percentage', 'soft', 'variance' | `false` | +| raycaster | Props that go into the default raycaster | `{}` | +| frameloop | Render mode: always, demand, never | `always` | +| resize | Resize config, see react-use-measure's options | `{ scroll: true, debounce: { scroll: 50, resize: 0 } }` | +| orthographic | Creates an orthographic camera | `false` | +| dpr | Pixel-ratio, use `window.devicePixelRatio`, or automatic: [min, max] | `[1, 2]` | +| legacy | Enables THREE.ColorManagement in three r139 or later | `false` | +| linear | Switch off automatic sRGB color space and gamma correction | `false` | +| events | Configuration for the event manager, as a function of state | `import { events } from "@react-three/fiber"` | +| eventSource | The source where events are being subscribed to, HTMLElement | `React.RefObject`, `gl.domElement.parentNode` | +| eventPrefix | The event prefix that is cast into canvas pointer x/y events | `offset` | +| flat | Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` | `false` | +| onCreated | Callback after the canvas has rendered (but not yet committed) | `(state) => {}` | +| onPointerMissed | Response for pointer clicks that have missed any target | `(event) => {}` | ## Render defaults diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 35443dfeff..24566c6466 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -12,7 +12,7 @@ import type { Instance } from './reconciler' * * **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']).__r3f!), diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 56e023daa4..826d033199 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -11,7 +11,7 @@ export interface Intersection extends THREE.Intersection { } export type Subscription = { - ref: React.MutableRefObject + ref: React.RefObject priority: number store: RootStore } @@ -60,7 +60,7 @@ export interface InternalState { capturedMap: Map> initialClick: [x: number, y: number] initialHits: THREE.Object3D[] - lastEvent: React.MutableRefObject + lastEvent: React.RefObject active: boolean priority: number frames: number @@ -70,7 +70,7 @@ export interface InternalState { render: 'auto' | 'manual' /** The max delta time between two frames. */ maxDelta: number - subscribe: (callback: React.MutableRefObject, priority: number, store: RootStore) => () => void + subscribe: (callback: React.RefObject, priority: number, store: RootStore) => () => void } export interface XRManager { @@ -249,7 +249,7 @@ export const createStore = ( render: 'auto', maxDelta: 1 / 10, priority: 0, - subscribe: (ref: React.MutableRefObject, priority: number, store: RootStore) => { + subscribe: (ref: React.RefObject, priority: number, store: RootStore) => { const state = get() const internal = state.internal // If this subscription was given a priority, it takes rendering into its own hands diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 15ae327372..78b6cb5351 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -42,7 +42,7 @@ export const act: Act = (React as any).act export type Camera = (THREE.OrthographicCamera | THREE.PerspectiveCamera) & { manual?: boolean } export const isOrthographicCamera = (def: Camera): def is THREE.OrthographicCamera => def && (def as THREE.OrthographicCamera).isOrthographicCamera -export const isRef = (obj: any): obj is React.MutableRefObject => obj && obj.hasOwnProperty('current') +export const isRef = (obj: any): obj is React.RefObject => obj && obj.hasOwnProperty('current') /** * An SSR-friendly useLayoutEffect. @@ -58,7 +58,7 @@ export const useIsomorphicLayoutEffect = ? React.useLayoutEffect : React.useEffect -export function useMutableCallback(fn: T): React.MutableRefObject { +export function useMutableCallback(fn: T): React.RefObject { const ref = React.useRef(fn) useIsomorphicLayoutEffect(() => void (ref.current = fn), [fn]) return ref diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 3cf09b3cb1..89c5934c45 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -28,7 +28,7 @@ export interface CanvasProps */ resize?: ResizeOptions /** The target where events are being subscribed to, default: the div that wraps canvas */ - eventSource?: HTMLElement | React.MutableRefObject + eventSource?: HTMLElement | React.RefObject /** The event prefix that is cast into canvas pointer x/y events, default: "offset" */ eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen' } diff --git a/packages/fiber/tests/hooks.test.tsx b/packages/fiber/tests/hooks.test.tsx index 90edb1de54..03a9aa4bd8 100644 --- a/packages/fiber/tests/hooks.test.tsx +++ b/packages/fiber/tests/hooks.test.tsx @@ -245,7 +245,7 @@ describe('hooks', () => { it('can handle useInstanceHandle hook', async () => { const ref = React.createRef() - let instance!: React.MutableRefObject + let instance!: React.RefObject const Component = () => { instance = useInstanceHandle(ref) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index f0e5c3eb1b..a5e4054421 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import * as THREE from 'three' -import { ReconcilerRoot, createRoot, act, extend, ThreeElement } from '../src/index' +import { ReconcilerRoot, createRoot, act, extend, ThreeElement, ThreeElements } from '../src/index' import { suspend } from 'suspend-react' extend(THREE as any) @@ -90,7 +90,10 @@ describe('renderer', () => { function Test() { React.useInsertionEffect(() => void lifecycle.push('useInsertionEffect'), []) - React.useImperativeHandle(React.useRef(), () => void lifecycle.push('refCallback')) + React.useImperativeHandle(React.useRef(null), () => { + lifecycle.push('refCallback') + return null + }) React.useLayoutEffect(() => void lifecycle.push('useLayoutEffect'), []) React.useEffect(() => void lifecycle.push('useEffect'), []) lifecycle.push('render') @@ -110,9 +113,9 @@ describe('renderer', () => { it('should forward ref three object', async () => { // Note: Passing directly should be less strict, and assigning current should be more strict - let immutableRef!: React.RefObject - let mutableRef!: React.MutableRefObject - let mutableRefSpecific!: React.MutableRefObject + let immutableRef!: React.RefObject + let mutableRef!: React.RefObject + let mutableRefSpecific!: React.RefObject const RefTest = () => { immutableRef = React.createRef() @@ -232,7 +235,7 @@ describe('renderer', () => { const child = React.createRef() const attachedChild = React.createRef() - const Test = (props: JSX.IntrinsicElements['mesh']) => ( + const Test = (props: ThreeElements['mesh']) => ( @@ -287,7 +290,7 @@ describe('renderer', () => { const child = React.createRef() const attachedChild = React.createRef() - const Test = (props: JSX.IntrinsicElements['primitive']) => ( + const Test = (props: ThreeElements['primitive']) => ( @@ -342,7 +345,7 @@ describe('renderer', () => { const disposeDeclarativePrimitive = jest.fn() - const Test = (props: JSX.IntrinsicElements['mesh']) => ( + const Test = (props: ThreeElements['mesh']) => ( { From e0f8a3ac477b58ae93da51767ada2a3561945218 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 27 Apr 2024 22:50:07 -0500 Subject: [PATCH 192/252] fix(types): resolve remaining type issues --- packages/fiber/src/native/Canvas.tsx | 9 ++++++--- packages/test-renderer/src/__tests__/RTTR.core.test.tsx | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index f57a56f0f6..e4bcd8e20b 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -8,7 +8,10 @@ import { extend, createRoot, unmountComponentAtNode, RenderProps, ReconcilerRoot import { createTouchEvents } from './events' import { RootState, Size } from '../core/store' -export interface CanvasProps extends Omit, 'size' | 'dpr'>, ViewProps { +// TODO: React 19 needs support from react-native +const _View = View as any + +export interface CanvasProps extends Omit, 'size' | 'dpr'>, Omit { children: React.ReactNode style?: ViewStyle } @@ -147,11 +150,11 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( }, [canvas]) return ( - + <_View {...props} ref={viewRef} onLayout={onLayout} style={{ flex: 1, ...style }} {...bind}> {width > 0 && ( )} - + ) }, ) diff --git a/packages/test-renderer/src/__tests__/RTTR.core.test.tsx b/packages/test-renderer/src/__tests__/RTTR.core.test.tsx index 2ab11ba3ce..e3a12784ef 100644 --- a/packages/test-renderer/src/__tests__/RTTR.core.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.core.test.tsx @@ -25,7 +25,7 @@ describe('ReactThreeTestRenderer Core', () => { it('renders a simple component with hooks', async () => { const Mesh = () => { - const meshRef = React.useRef>() + const meshRef = React.useRef>(null) useFrame(() => void (meshRef.current!.position.x += 0.01)) return ( From bcc062016cc6e054f4e40aee750a4b10d22b13d4 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 27 Apr 2024 21:40:10 -0700 Subject: [PATCH 193/252] chore: replace ts-ignore with ts-expect-error --- packages/fiber/src/core/reconciler.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 0cc81b88ae..b27ba1baae 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -2,7 +2,7 @@ import * as THREE from 'three' import * as React from 'react' import Reconciler from 'react-reconciler' import { - // @ts-ignore + // @ts-expect-error NoEventPriority, ContinuousEventPriority, DiscreteEventPriority, @@ -97,7 +97,7 @@ export const extend = ( catalogue[Component] = objects // Returns a component whose name will be inferred in devtools - // @ts-ignore + // @ts-expect-error return React.forwardRef({ [objects.name]: (props, ref) => }[objects.name]) } else { return void Object.assign(catalogue, objects) as any @@ -370,7 +370,7 @@ export const reconciler = Reconciler< }, getRootHostContext: () => NO_CONTEXT, getChildHostContext: () => NO_CONTEXT, - // @ts-ignore prepareUpdate and updatePayload removed with React 19 + // @ts-expect-error prepareUpdate and updatePayload removed with React 19 commitUpdate( instance: HostConfig['instance'], type: HostConfig['type'], @@ -439,7 +439,6 @@ export const reconciler = Reconciler< beforeActiveInstanceBlur() {}, afterActiveInstanceBlur() {}, detachDeletedInstance() {}, - // @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 shouldAttemptEagerTransition() { From f1a296db1c45e19810089fb9c0efaa259287fb1c Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 28 Apr 2024 01:19:22 -0500 Subject: [PATCH 194/252] chore(tests): add failing suspense case --- packages/fiber/tests/renderer.test.tsx | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index a5e4054421..ffb07f2386 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -548,4 +548,26 @@ describe('renderer', () => { expect(lastAttached).toBe(lastMounted) expect(Mock.instances).toStrictEqual(['suspense', 'parent', 'child', 'parent', 'child']) }) + + it('should toggle visibility during Suspense non-destructively', async () => { + const a = Promise.resolve(new THREE.Object3D()) + const b = Promise.resolve(new THREE.Object3D()) + + function AsyncPrimitive({ object }: { object: Promise }) { + return + } + + for (let i = 0; i < 3; i++) { + await act(async () => + root.render( + + + , + ), + ) + } + + expect((await a).visible).toBe(true) + expect((await b).visible).toBe(true) + }) }) From eafe554c2a5eee7fb05af41b2048d400011d45c9 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 28 Apr 2024 01:24:26 -0500 Subject: [PATCH 195/252] fix(reconciler): don't implement (un)hideInstance methods (#3241) --- packages/fiber/src/core/reconciler.tsx | 25 ++----------------------- packages/fiber/src/core/utils.tsx | 1 - 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index b27ba1baae..2afd8b898d 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -65,7 +65,6 @@ export interface Instance { handlers: Partial attach?: AttachType previousAttach?: any - isHidden: boolean autoRemovedBeforeAppend?: boolean } @@ -407,28 +406,8 @@ export const reconciler = Reconciler< resetAfterCommit: () => {}, shouldSetTextContent: () => false, clearContainer: () => false, - hideInstance(instance) { - if (instance.props.attach && instance.parent?.object) { - detach(instance.parent, instance) - } else if (isObject3D(instance.object)) { - instance.object.visible = false - } - - instance.isHidden = true - invalidateInstance(instance) - }, - unhideInstance(instance) { - if (instance.isHidden) { - if (instance.props.attach && instance.parent?.object) { - attach(instance.parent, instance) - } else if (isObject3D(instance.object) && instance.props.visible !== false) { - instance.object.visible = true - } - } - - instance.isHidden = false - invalidateInstance(instance) - }, + hideInstance() {}, + unhideInstance() {}, createTextInstance: handleTextInstance, hideTextInstance: handleTextInstance, unhideTextInstance: handleTextInstance, diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 78b6cb5351..4ee52b5099 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -240,7 +240,6 @@ export function prepare(target: T, root: RootStore, type: string, props object, eventCount: 0, handlers: {}, - isHidden: false, } if (object) { object.__r3f = instance From a17fe45c6e11f5dbad16a89c5159bfb597ce106f Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 28 Apr 2024 01:51:28 -0500 Subject: [PATCH 196/252] RELEASING: Releasing 2 package(s) Releases: @react-three/fiber@9.0.0-alpha.4 @react-three/test-renderer@9.0.0-alpha.4 [skip ci] --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 0a60a7ab45..afe8f56874 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.3", + "version": "9.0.0-alpha.4", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 97f918a5af..7285df60f7 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-alpha.3", + "version": "9.0.0-alpha.4", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-alpha.3", + "@react-three/fiber": "9.0.0-alpha.4", "three": ">=0.141" } } From 0d8d270b77843da70d0951f747049eb373662087 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 28 Apr 2024 04:52:27 -0500 Subject: [PATCH 197/252] chore(hooks): cleanup --- packages/fiber/src/core/hooks.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index 24566c6466..f5df469fe2 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -8,19 +8,20 @@ import type { Instance } from './reconciler' /** * Exposes an object's {@link Instance}. - * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#useInstanceHandle + * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#useinstancehandle * * **Note**: this is an escape hatch to react-internal fields. Expect this to change significantly between versions. */ -export function useInstanceHandle(ref: React.RefObject): React.RefObject { +export function useInstanceHandle(ref: React.RefObject): React.RefObject> { const instance = React.useRef(null!) - useIsomorphicLayoutEffect( - () => void (instance.current = (ref.current as unknown as Instance['object']).__r3f!), - [ref], - ) + React.useImperativeHandle(instance, () => (ref.current as unknown as Instance['object']).__r3f!, [ref]) return instance } +/** + * Returns the R3F Canvas' Zustand store. Useful for [transient updates](https://github.com/pmndrs/zustand#transient-updates-for-often-occurring-state-changes). + * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usestore + */ export function useStore(): RootStore { const store = React.useContext(context) if (!store) throw new Error('R3F: Hooks can only be used within the Canvas component!') @@ -55,7 +56,7 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): /** * Executes a callback in a given update stage. - * Uses the stage instance to indetify which stage to target in the lifecycle. + * Uses the stage instance to identify which stage to target in the lifecycle. */ export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.Update): void { const store = useStore() @@ -129,8 +130,6 @@ function loadingFn(extensions?: Extensions, onProgress?: (event: ProgressE } } -type GLTFLike = { scene: THREE.Object3D } - /** * Synchronously loads and caches assets with a three loader. * From 11415152e8852934b15b6dd91e67013fa6a010be Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 30 Apr 2024 12:36:37 -0500 Subject: [PATCH 198/252] chore: resolve conflicts --- packages/fiber/src/core/renderer.tsx | 16 +++++++++++++++- packages/fiber/tests/renderer.test.tsx | 17 +++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 7f1e59ebcd..3e10d72c06 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -277,7 +277,21 @@ export function createRoot( : new THREE.PerspectiveCamera(75, 0, 0.1, 1000) if (!isCamera) { camera.position.z = 5 - if (cameraOptions) applyProps(camera, cameraOptions as any) + if (cameraOptions) { + applyProps(camera, cameraOptions as any) + // Preserve user-defined frustum if possible + // https://github.com/pmndrs/react-three-fiber/issues/3160 + if ( + 'aspect' in cameraOptions || + 'left' in cameraOptions || + 'right' in cameraOptions || + 'bottom' in cameraOptions || + 'top' in cameraOptions + ) { + ;(camera as any).manual = true + camera.updateProjectionMatrix() + } + } // Always look at center by default if (!state.camera && !cameraOptions?.rotation) camera.lookAt(0, 0, 0) } diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index ffb07f2386..632add1c86 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -570,4 +570,21 @@ describe('renderer', () => { expect((await a).visible).toBe(true) expect((await b).visible).toBe(true) }) + + it('preserves camera frustum props for perspective', async () => { + const store = await act(async () => root.configure({ camera: { aspect: 0 } }).render(null)) + const camera = store.getState().camera as THREE.PerspectiveCamera + expect(camera.aspect).toBe(0) + }) + + it('preserves camera frustum props for orthographic', async () => { + const store = await act(async () => + root.configure({ orthographic: true, camera: { left: 0, right: 0, top: 0, bottom: 0 } }).render(null), + ) + const camera = store.getState().camera as THREE.OrthographicCamera + expect(camera.left).toBe(0) + expect(camera.right).toBe(0) + expect(camera.top).toBe(0) + expect(camera.bottom).toBe(0) + }) }) From 5a076d916a14b06cf262a5f684a70358ed9055d6 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Tue, 30 Apr 2024 17:03:55 -0700 Subject: [PATCH 199/252] fix(reconciler): instances were not being unhidden properly --- packages/fiber/src/core/reconciler.tsx | 29 ++++++++++++++++++++++++-- packages/fiber/src/core/utils.tsx | 1 + 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 2afd8b898d..0e7c19a1b5 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -65,6 +65,7 @@ export interface Instance { handlers: Partial attach?: AttachType previousAttach?: any + isHidden: boolean autoRemovedBeforeAppend?: boolean } @@ -275,6 +276,16 @@ function switchInstance( props: HostConfig['props'], fiber: Reconciler.Fiber, ) { + // If the old instance is hidden, we need to unhide it. + // This only possible because an instance be hidden but not unhidden with the React reconciler for reasons I don't understand. + // We manualy check if it was hidden and unhide it. + if (oldInstance.isHidden) { + oldInstance.isHidden = false + if (isObject3D(oldInstance.object) && oldInstance.props.visible !== false) { + oldInstance.object.visible = true + } + } + // Create a new instance const newInstance = createInstance(type, props, oldInstance.root) @@ -406,8 +417,22 @@ export const reconciler = Reconciler< resetAfterCommit: () => {}, shouldSetTextContent: () => false, clearContainer: () => false, - hideInstance() {}, - unhideInstance() {}, + hideInstance(instance) { + if (isObject3D(instance.object)) { + instance.object.visible = false + } + + instance.isHidden = true + invalidateInstance(instance) + }, + unhideInstance(instance) { + if (isObject3D(instance.object) && instance.props.visible !== false && instance.isHidden) { + instance.object.visible = true + } + + instance.isHidden = false + invalidateInstance(instance) + }, createTextInstance: handleTextInstance, hideTextInstance: handleTextInstance, unhideTextInstance: handleTextInstance, diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 4ee52b5099..78b6cb5351 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -240,6 +240,7 @@ export function prepare(target: T, root: RootStore, type: string, props object, eventCount: 0, handlers: {}, + isHidden: false, } if (object) { object.__r3f = instance From f6e4c462e18df78dcfc648ea6cd07ee63b15db73 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 1 May 2024 01:13:27 -0500 Subject: [PATCH 200/252] chore: cleanup --- packages/fiber/src/core/reconciler.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 0e7c19a1b5..26f6a8a01e 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -277,8 +277,9 @@ function switchInstance( fiber: Reconciler.Fiber, ) { // If the old instance is hidden, we need to unhide it. - // This only possible because an instance be hidden but not unhidden with the React reconciler for reasons I don't understand. - // We manualy check if it was hidden and unhide it. + // React assumes it can discard instances since they're pure for DOM. + // This isn't true for us since our lifetimes are impure and longliving. + // So, we manually check if an instance was hidden and unhide it. if (oldInstance.isHidden) { oldInstance.isHidden = false if (isObject3D(oldInstance.object) && oldInstance.props.visible !== false) { From 6607d4d1301cd58dec7b9b5b2d44b7b10bf55ff0 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 1 May 2024 01:19:59 -0500 Subject: [PATCH 201/252] chore: re-use (un)hide hooks --- packages/fiber/src/core/reconciler.tsx | 46 ++++++++++++++------------ 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 26f6a8a01e..0afdda57b5 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -127,6 +127,27 @@ function createInstance(type: string, props: HostConfig['props'], root: RootStor return instance } +function hideInstance(instance: HostConfig['instance']): void { + if (instance.props.attach && instance.parent?.object) { + attach(instance.parent, instance) + } else if (isObject3D(instance.object) && instance.props.visible !== false) { + instance.object.visible = true + } + + instance.isHidden = true + invalidateInstance(instance) +} +function unhideInstance(instance: HostConfig['instance']): void { + if (instance.props.attach && instance.parent?.object) { + detach(instance.parent, instance) + } else if (isObject3D(instance.object)) { + instance.object.visible = false + } + + instance.isHidden = false + invalidateInstance(instance) +} + // https://github.com/facebook/react/issues/20271 // This will make sure events and attach are only handled once when trees are complete function handleContainerEffects(parent: Instance, child: Instance, beforeChild?: Instance) { @@ -280,12 +301,7 @@ function switchInstance( // React assumes it can discard instances since they're pure for DOM. // This isn't true for us since our lifetimes are impure and longliving. // So, we manually check if an instance was hidden and unhide it. - if (oldInstance.isHidden) { - oldInstance.isHidden = false - if (isObject3D(oldInstance.object) && oldInstance.props.visible !== false) { - oldInstance.object.visible = true - } - } + if (oldInstance.isHidden) unhideInstance(oldInstance) // Create a new instance const newInstance = createInstance(type, props, oldInstance.root) @@ -418,22 +434,8 @@ export const reconciler = Reconciler< resetAfterCommit: () => {}, shouldSetTextContent: () => false, clearContainer: () => false, - hideInstance(instance) { - if (isObject3D(instance.object)) { - instance.object.visible = false - } - - instance.isHidden = true - invalidateInstance(instance) - }, - unhideInstance(instance) { - if (isObject3D(instance.object) && instance.props.visible !== false && instance.isHidden) { - instance.object.visible = true - } - - instance.isHidden = false - invalidateInstance(instance) - }, + hideInstance, + unhideInstance, createTextInstance: handleTextInstance, hideTextInstance: handleTextInstance, unhideTextInstance: handleTextInstance, From 03c823bdd59a7e16cbfa197bf569740e8bd59ddb Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 1 May 2024 01:26:40 -0500 Subject: [PATCH 202/252] fix: swapped hide/unhide --- packages/fiber/src/core/reconciler.tsx | 33 +++++++++++++++----------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 0afdda57b5..fc3da40527 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -128,24 +128,29 @@ function createInstance(type: string, props: HostConfig['props'], root: RootStor } function hideInstance(instance: HostConfig['instance']): void { - if (instance.props.attach && instance.parent?.object) { - attach(instance.parent, instance) - } else if (isObject3D(instance.object) && instance.props.visible !== false) { - instance.object.visible = true - } + if (!instance.isHidden) { + if (instance.props.attach && instance.parent?.object) { + detach(instance.parent, instance) + } else if (isObject3D(instance.object)) { + instance.object.visible = false + } - instance.isHidden = true - invalidateInstance(instance) + instance.isHidden = true + invalidateInstance(instance) + } } + function unhideInstance(instance: HostConfig['instance']): void { - if (instance.props.attach && instance.parent?.object) { - detach(instance.parent, instance) - } else if (isObject3D(instance.object)) { - instance.object.visible = false - } + if (instance.isHidden) { + if (instance.props.attach && instance.parent?.object) { + attach(instance.parent, instance) + } else if (isObject3D(instance.object) && instance.props.visible !== false) { + instance.object.visible = true + } - instance.isHidden = false - invalidateInstance(instance) + instance.isHidden = false + invalidateInstance(instance) + } } // https://github.com/facebook/react/issues/20271 From f6325a6cd9c84e3632dfb9cb8b64fb7bed4f213d Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Wed, 1 May 2024 10:28:27 -0700 Subject: [PATCH 203/252] test: suspense visibility --- packages/fiber/tests/renderer.test.tsx | 106 +++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 632add1c86..7f4281fcfd 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -571,6 +571,112 @@ describe('renderer', () => { expect((await b).visible).toBe(true) }) + it('should hide suspended objects when displaying fallback', async () => { + const a = new THREE.Object3D() + const b = new THREE.Object3D() + const fallback = new THREE.Object3D() + + let resolveA: () => void + const aPromise = new Promise((res) => { + resolveA = () => res(a) + }) + + let resolveB: () => void + const bPromise = new Promise((res) => { + resolveB = () => res(b) + }) + + function Fallback() { + return + } + + function AsyncPrimitive({ object }: { object: Promise }) { + return + } + + // Mount unresolved A promise. + // Fallback should be mounted and nothing else. + const store = await act(async () => + root.render( + }> + + , + ), + ) + + const scene = store.getState().scene as THREE.Scene + + expect(a.visible).toBe(true) + expect(b.visible).toBe(true) + expect(scene.children.includes(fallback)).toBe(true) + expect(scene.children.includes(a)).toBe(false) + + // Resolve A promise. + // A should be mounted and visible and fallback should be unmounted. + await act(async () => resolveA()) + await act(async () => + root.render( + }> + + , + ), + ) + + expect(a.visible).toBe(true) + expect(b.visible).toBe(true) + expect(scene.children.includes(fallback)).toBe(false) + expect(scene.children.includes(a)).toBe(true) + + // Mount unresolved B promise. + // A should remain mounted but be invisible, Fallback is mounted, B is unmounted. + await act(async () => + root.render( + }> + + , + ), + ) + + expect(a.visible).toBe(false) + expect(b.visible).toBe(true) + expect(scene.children.includes(fallback)).toBe(true) + expect(scene.children.includes(a)).toBe(true) + expect(scene.children.includes(b)).toBe(false) + + // Resolve B promise. + // B should be mounted and visible, fallback should be unmounted, A also unmounted and unhidden. + await act(async () => resolveB()) + await act(async () => + root.render( + }> + + , + ), + ) + + expect(a.visible).toBe(true) + expect(b.visible).toBe(true) + expect(scene.children.includes(fallback)).toBe(false) + expect(scene.children.includes(a)).toBe(false) + expect(scene.children.includes(b)).toBe(true) + + // Remount resolved A promise. + // A should be mounted and visible, B should be unmounted and visible (not hidden), fallback should be unmounted. + await act(async () => + root.render( + }> + + , + ), + ) + + expect(a.visible).toBe(true) + expect(b.visible).toBe(true) + expect(scene.children.includes(fallback)).toBe(false) + expect(scene.children.includes(a)).toBe(true) + expect(scene.children.includes(b)).toBe(false) + }) + it('preserves camera frustum props for perspective', async () => { const store = await act(async () => root.configure({ camera: { aspect: 0 } }).render(null)) const camera = store.getState().camera as THREE.PerspectiveCamera From cc3080b214c297a6d15c57d4de7c14f398cc721b Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 3 May 2024 11:44:45 -0500 Subject: [PATCH 204/252] chore(tests): fix typo in sorted attach case --- packages/fiber/tests/renderer.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 7f4281fcfd..1de394aba2 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -456,7 +456,7 @@ describe('renderer', () => { const c = new THREE.Group() c.name = 'c' const d = new THREE.Group() - d.name = 'c' + d.name = 'd' const array = [a, b, c, d] const Test = ({ array }: { array: THREE.Group[] }) => ( From 1183029d539d0b8bed6c9e2baa6afecc5739b5f4 Mon Sep 17 00:00:00 2001 From: Kris Baumgarter Date: Fri, 3 May 2024 11:09:55 -0700 Subject: [PATCH 205/252] [v9] fix: primitive children mounting (#3248) --- packages/fiber/src/core/reconciler.tsx | 21 ++++++-- packages/fiber/tests/renderer.test.tsx | 67 ++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index fc3da40527..06d05f2522 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -104,7 +104,12 @@ export const extend = ( } } -function createInstance(type: string, props: HostConfig['props'], root: RootStore): HostConfig['instance'] { +function createInstance( + type: string, + props: HostConfig['props'], + root: RootStore, + flushPrimitive = true, +): HostConfig['instance'] { // Get target from catalogue const name = `${type[0].toUpperCase()}${type.slice(1)}` const target = catalogue[name] @@ -121,6 +126,9 @@ function createInstance(type: string, props: HostConfig['props'], root: RootStor // Throw if an object or literal was passed for args if (props.args !== undefined && !Array.isArray(props.args)) throw new Error('R3F: The args prop must be an array!') + // Regenerate the R3F instance for primitives to simulate a new object + if (flushPrimitive && type === 'primitive' && props.object?.__r3f) delete props.object.__r3f + // Create instance const instance = prepare(props.object, root, type, props) @@ -309,7 +317,12 @@ function switchInstance( if (oldInstance.isHidden) unhideInstance(oldInstance) // Create a new instance - const newInstance = createInstance(type, props, oldInstance.root) + const newInstance = createInstance(type, props, oldInstance.root, false) + + // Update attach props for primitives since we don't flush them + if (type === 'primitive') { + newInstance.props.attach = props.attach + } // Move children to new instance for (const child of oldInstance.children) { @@ -377,7 +390,9 @@ export const reconciler = Reconciler< supportsMutation: true, supportsPersistence: false, supportsHydration: false, - createInstance, + createInstance(type, props, root) { + return createInstance(type, props, root) + }, removeChild, appendChild, appendInitialChild: appendChild, diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 1de394aba2..46f5d1f5a6 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -85,6 +85,69 @@ describe('renderer', () => { expect(object.name).toBe('primitive') }) + it('should remove children from primitive when unmounted', async () => { + const object = new THREE.Group() + + function Parent({ children, show }: { children: React.ReactNode; show: boolean }) { + return show ? {children} : null + } + + function Component({ show }: { show: boolean }) { + return ( + + + + + ) + } + + const store = await act(async () => root.render()) + const { scene } = store.getState() + + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBe(object) + expect(object.children.length).toBe(2) + + await act(async () => root.render()) + + expect(scene.children.length).toBe(0) + expect(object.children.length).toBe(0) + }) + + it('should remove then add children from primitive when key changes', async () => { + const object = new THREE.Group() + + function Parent({ children, primitiveKey }: { children: React.ReactNode; primitiveKey: string }) { + return ( + + {children} + + ) + } + + function Component({ primitiveKey }: { primitiveKey: string }) { + return ( + + + + + ) + } + + const store = await act(async () => root.render()) + const { scene } = store.getState() + + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBe(object) + expect(object.children.length).toBe(2) + + await act(async () => root.render()) + + expect(scene.children.length).toBe(1) + expect(scene.children[0]).toBe(object) + expect(object.children.length).toBe(2) + }) + it('should go through lifecycle', async () => { const lifecycle: string[] = [] @@ -444,11 +507,9 @@ describe('renderer', () => { expect(scene.children.map((o) => o.name)).toStrictEqual(mixedArray.map((o) => o.name)) }) - // TODO: fix this case, also see: - // https://github.com/pmndrs/react-three-fiber/issues/1892 // https://github.com/pmndrs/react-three-fiber/issues/3125 // https://github.com/pmndrs/react-three-fiber/issues/3143 - it.skip('can swap 4 array primitives via attach', async () => { + it('can swap 4 array primitives via attach', async () => { const a = new THREE.Group() a.name = 'a' const b = new THREE.Group() From 6f8f73694f487ad1d9db0ed63585412844f24de6 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 4 May 2024 11:17:49 -0500 Subject: [PATCH 206/252] Revert "[v9] refactor!: remove viewport, add dpr (#2887)" This reverts commit d7eb0779a2d2e2b4c512f3e791815153fc051705. --- docs/API/hooks.mdx | 58 ++++++------ example/src/demos/Gestures.tsx | 4 +- example/src/demos/ResetProps.tsx | 8 +- packages/fiber/src/core/index.tsx | 1 + packages/fiber/src/core/renderer.tsx | 8 +- packages/fiber/src/core/store.ts | 90 ++++++++++++++++--- .../tests/__snapshots__/index.test.tsx.snap | 1 + packages/fiber/tests/index.test.tsx | 29 +++--- 8 files changed, 134 insertions(+), 65 deletions(-) diff --git a/docs/API/hooks.mdx b/docs/API/hooks.mdx index 3e8e00d475..57a9b51dd3 100644 --- a/docs/API/hooks.mdx +++ b/docs/API/hooks.mdx @@ -36,7 +36,7 @@ function App() { ## useThree -This hook gives you access to the state model which contains the default renderer, the scene, your camera, and so on. It also gives you the current size of the canvas. +This hook gives you access to the state model which contains the default renderer, the scene, your camera, and so on. It also gives you the current size of the canvas in screen and viewport coordinates. ```jsx import { useThree } from '@react-three/fiber' @@ -49,33 +49,33 @@ The hook is reactive, if you resize the browser for instance, you get fresh meas ### State properties -| Prop | Description | Type | -| --------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| gl | Renderer | `THREE.WebGLRenderer` | -| scene | Scene | `THREE.Scene` | -| camera | Camera | `THREE.PerspectiveCamera` | -| raycaster | Default raycaster | `THREE.Raycaster` | -| pointer | Contains updated, normalized, centric pointer coordinates | `THREE.Vector2` | -| mouse | Note: this is deprecated, use `pointer` instead! Normalized event coordinates | `THREE.Vector2` | -| clock | Running system clock | `THREE.Clock` | -| linear | True when the colorspace is linear | `boolean` | -| flat | True when no tonemapping is used | `boolean` | -| legacy | Disables global color management via `THREE.ColorManagement` | `boolean` | -| frameloop | Render mode: always, demand, never | `always`, `demand`, `never` | -| performance | System regression | `{ current: number, min: number, max: number, debounce: number, regress: () => void }` | -| dpr | The current pixel ratio | `number` | -| size | Canvas size in pixels | `{ width: number, height: number, top: number, left: number }` | -| xr | XR interface, manages WebXR rendering | `{ connect: () => void, disconnect: () => void }` | -| set | Allows you to set any state property | `(state: SetState) => void` | -| get | Allows you to retrieve any state property non-reactively | `() => GetState` | -| invalidate | Request a new render, given that `frameloop === 'demand'` | `() => void` | -| advance | Advance one tick, given that `frameloop === 'never'` | `(timestamp: number, runGlobalEffects?: boolean) => void` | -| setSize | Resize the canvas | `(width: number, height: number, top?: number, left?: number) => void` | -| setDpr | Set the pixel-ratio | `(dpr: number) => void` | -| setFrameloop | Shortcut to set the current render mode | `(frameloop?: 'always', 'demand', 'never') => void` | -| setEvents | Shortcut to setting the event layer | `(events: Partial>) => void` | -| onPointerMissed | Response for pointer clicks that have missed a target | `() => void` | -| events | Pointer-event handling | `{ connected: TargetNode, handlers: Events, connect: (target: TargetNode) => void, disconnect: () => void }` | +| Prop | Description | Type | +| --------------- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| gl | Renderer | `THREE.WebGLRenderer` | +| scene | Scene | `THREE.Scene` | +| camera | Camera | `THREE.PerspectiveCamera` | +| raycaster | Default raycaster | `THREE.Raycaster` | +| pointer | Contains updated, normalized, centric pointer coordinates | `THREE.Vector2` | +| mouse | Note: this is deprecated, use `pointer` instead! Normalized event coordinates | `THREE.Vector2` | +| clock | Running system clock | `THREE.Clock` | +| linear | True when the colorspace is linear | `boolean` | +| flat | True when no tonemapping is used | `boolean` | +| legacy | Disables global color management via `THREE.ColorManagement` | `boolean` | +| frameloop | Render mode: always, demand, never | `always`, `demand`, `never` | +| performance | System regression | `{ current: number, min: number, max: number, debounce: number, regress: () => void }` | +| size | Canvas size in pixels | `{ width: number, height: number, top: number, left: number }` | +| viewport | Viewport size in three.js units | `{ width: number, height: number, initialDpr: number, dpr: number, factor: number, distance: number, aspect: number, getCurrentViewport: (camera?: Camera, target?: THREE.Vector3, size?: Size) => Viewport }` | +| xr | XR interface, manages WebXR rendering | `{ connect: () => void, disconnect: () => void }` | +| set | Allows you to set any state property | `(state: SetState) => void` | +| get | Allows you to retrieve any state property non-reactively | `() => GetState` | +| invalidate | Request a new render, given that `frameloop === 'demand'` | `() => void` | +| advance | Advance one tick, given that `frameloop === 'never'` | `(timestamp: number, runGlobalEffects?: boolean) => void` | +| setSize | Resize the canvas | `(width: number, height: number, top?: number, left?: number) => void` | +| setDpr | Set the pixel-ratio | `(dpr: number) => void` | +| setFrameloop | Shortcut to set the current render mode | `(frameloop?: 'always', 'demand', 'never') => void` | +| setEvents | Shortcut to setting the event layer | `(events: Partial>) => void` | +| onPointerMissed | Response for pointer clicks that have missed a target | `() => void` | +| events | Pointer-event handling | `{ connected: TargetNode, handlers: Events, connect: (target: TargetNode) => void, disconnect: () => void }` | ### Selector @@ -85,7 +85,7 @@ You can also select properties, this allows you to avoid needless re-render for // Will only trigger re-render when the default camera is exchanged const camera = useThree((state) => state.camera) // Will only re-render on resize changes -const { width, height } = useThree((state) => state.size) +const viewport = useThree((state) => state.viewport) // ❌ You cannot expect reactivity from three.js internals! const zoom = useThree((state) => state.camera.zoom) ``` diff --git a/example/src/demos/Gestures.tsx b/example/src/demos/Gestures.tsx index 3467829450..c24736e9cf 100644 --- a/example/src/demos/Gestures.tsx +++ b/example/src/demos/Gestures.tsx @@ -3,12 +3,12 @@ import { Canvas, useThree, useFrame } from '@react-three/fiber' import { useDrag } from '@use-gesture/react' function Obj({ scale = 1, z = 0, opacity = 1 }) { - const { size } = useThree() + const { viewport } = useThree() const [hovered, hover] = useState(false) const [position, set] = useState<[number, number, number]>([0, 0, z]) const bind = useDrag(({ event, offset: [x, y] }) => { event.stopPropagation() - const aspect = size.width / size.height + const aspect = viewport.getCurrentViewport().factor set([x / aspect, -y / aspect, z]) }) diff --git a/example/src/demos/ResetProps.tsx b/example/src/demos/ResetProps.tsx index a253e39bfc..f3e71f5914 100644 --- a/example/src/demos/ResetProps.tsx +++ b/example/src/demos/ResetProps.tsx @@ -6,21 +6,19 @@ import { OrbitControls } from '@react-three/drei' function AdaptivePixelRatio() { const gl = useThree((state) => state.gl) const current = useThree((state) => state.performance.current) - const initialDpr = useRef(1) - const dpr = useThree((state) => state.dpr) - initialDpr.current ??= dpr + const initialDpr = useThree((state) => state.viewport.initialDpr) const setDpr = useThree((state) => state.setDpr) // Restore initial pixelratio on unmount useEffect(() => { const domElement = gl.domElement return () => { - setDpr(initialDpr.current) + setDpr(initialDpr) domElement.style.imageRendering = 'auto' } }, []) // Set adaptive pixelratio useEffect(() => { - setDpr(current * initialDpr.current) + setDpr(current * initialDpr) gl.domElement.style.imageRendering = current === 1 ? 'auto' : 'pixelated' }, [current]) return null diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index e8cca14cf5..e3dc0aeb1f 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -30,6 +30,7 @@ export type { Subscription, Dpr, Size, + Viewport, RenderCallback, UpdateCallback, LegacyAlways, diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 3e10d72c06..30b1d7330d 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -415,7 +415,7 @@ export function createRoot( state.setSize(size.width, size.height, size.top, size.left) } // Check pixelratio - if (dpr && state.dpr !== calculateDpr(dpr)) state.setDpr(dpr) + if (dpr && state.viewport.dpr !== calculateDpr(dpr)) state.setDpr(dpr) // Check frameloop if (state.frameloop !== frameloop) state.setFrameloop(frameloop) // Check pointer missed @@ -551,8 +551,11 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { const [pointer] = React.useState(() => new THREE.Vector2()) const inject = useMutableCallback((rootState: RootState, injectState: RootState) => { + let viewport if (injectState.camera && size) { const camera = injectState.camera + // Calculate the override viewport, if present + viewport = rootState.viewport.getCurrentViewport(camera, new THREE.Vector3(), size) // Update the portal camera, if it differs from the previous layer if (camera !== rootState.camera) updateCamera(camera, size) } @@ -569,9 +572,10 @@ function Portal({ state = {}, children, container }: PortalProps): JSX.Element { mouse: pointer, // Their previous root is the layer before it previousRoot, - // Events and size can be overridden by the inject layer + // Events, size and viewport can be overridden by the inject layer events: { ...rootState.events, ...injectState.events, ...events }, size: { ...rootState.size, ...size }, + viewport: { ...rootState.viewport, ...viewport }, // Layers are allowed to override events setEvents: (events: Partial>) => injectState.set((state) => ({ ...state, events: { ...state.events, ...events } })), diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 826d033199..ca14d93a6c 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -3,7 +3,7 @@ import * as React from 'react' import { type StoreApi } from 'zustand' import { createWithEqualityFn, type UseBoundStoreWithEqualityFn } from 'zustand/traditional' import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' -import { calculateDpr, type Camera, updateCamera } from './utils' +import { calculateDpr, type Camera, isOrthographicCamera, updateCamera } from './utils' import type { FixedStage, Stage } from './stages' export interface Intersection extends THREE.Intersection { @@ -23,6 +23,18 @@ export interface Size { top: number left: number } +export interface Viewport extends Size { + /** The initial pixel ratio */ + initialDpr: number + /** Current pixel ratio */ + dpr: number + /** size.width / viewport.width */ + factor: number + /** Camera distance */ + distance: number + /** Camera aspect ratio: width / height */ + aspect: number +} export type RenderCallback = (state: RootState, delta: number, frame?: XRFrame) => void export type UpdateCallback = RenderCallback @@ -113,10 +125,16 @@ export interface RootState { frameloop: FrameloopLegacy /** Adaptive performance interface */ performance: Performance - /** The current pixel ratio */ - dpr: number /** Reactive pixel-size of the canvas */ size: Size + /** Reactive size of the viewport in threejs units */ + viewport: Viewport & { + getCurrentViewport: ( + camera?: Camera, + target?: THREE.Vector3 | Parameters, + size?: Size, + ) => Omit + } /** Flags the canvas for render, but doesn't render in itself */ invalidate: (frames?: number) => void /** Advance (render) one step */ @@ -146,6 +164,29 @@ export const createStore = ( advance: (timestamp: number, runGlobalEffects?: boolean, state?: RootState, frame?: XRFrame) => void, ): RootStore => { const rootStore = createWithEqualityFn((set, get) => { + const position = new THREE.Vector3() + const defaultTarget = new THREE.Vector3() + const tempTarget = new THREE.Vector3() + function getCurrentViewport( + camera: Camera = get().camera, + target: THREE.Vector3 | Parameters = defaultTarget, + size: Size = get().size, + ): Omit { + const { width, height, top, left } = size + const aspect = width / height + if (target instanceof THREE.Vector3) tempTarget.copy(target) + else tempTarget.set(...target) + const distance = camera.getWorldPosition(position).distanceTo(tempTarget) + if (isOrthographicCamera(camera)) { + return { width: width / camera.zoom, height: height / camera.zoom, top, left, factor: 1, distance, aspect } + } else { + const fov = (camera.fov * Math.PI) / 180 // convert vertical fov to radians + const h = 2 * Math.tan(fov / 2) * distance // visible height + const w = h * (width / height) + return { width: w, height: h, top, left, factor: width / w, distance, aspect } + } + } + let performanceTimeout: ReturnType | undefined = undefined const setPerformanceCurrent = (current: number) => set((state) => ({ performance: { ...state.performance, current } })) @@ -198,15 +239,32 @@ export const createStore = ( }, }, - dpr: 1, size: { width: 0, height: 0, top: 0, left: 0 }, + viewport: { + initialDpr: 0, + dpr: 0, + width: 0, + height: 0, + top: 0, + left: 0, + aspect: 0, + distance: 0, + factor: 0, + getCurrentViewport, + }, setEvents: (events: Partial>) => set((state) => ({ ...state, events: { ...state.events, ...events } })), setSize: (width: number, height: number, top: number = 0, left: number = 0) => { - set({ size: { width, height, top, left } }) + const camera = get().camera + const size = { width, height, top, left } + set((state) => ({ size, viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) } })) }, - setDpr: (dpr: Dpr) => set({ dpr: calculateDpr(dpr) }), + setDpr: (dpr: Dpr) => + set((state) => { + const resolved = calculateDpr(dpr) + return { viewport: { ...state.viewport, dpr: resolved, initialDpr: state.viewport.initialDpr || resolved } } + }), setFrameloop: (frameloop: Frameloop) => { const state = get() const mode: FrameloopLegacy = @@ -287,19 +345,29 @@ export const createStore = ( const state = rootStore.getState() let oldSize = state.size - let oldDpr = state.dpr - rootStore.subscribe(({ camera, size, dpr, gl }) => { + let oldDpr = state.viewport.dpr + let oldCamera = state.camera + rootStore.subscribe(() => { + const { camera, size, viewport, gl, set } = rootStore.getState() + // Resize camera and renderer on changes to size and pixelratio - if (size !== oldSize || dpr !== oldDpr) { + if (size.width !== oldSize.width || size.height !== oldSize.height || viewport.dpr !== oldDpr) { oldSize = size - oldDpr = dpr + oldDpr = viewport.dpr // Update camera & renderer updateCamera(camera, size) - gl.setPixelRatio(dpr) + gl.setPixelRatio(viewport.dpr) const updateStyle = typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement gl.setSize(size.width, size.height, updateStyle) } + + // Update viewport once the camera changes + if (camera !== oldCamera) { + oldCamera = camera + // Update viewport + set((state) => ({ viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(camera) } })) + } }) // Invalidate on any change diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 64852f0b9e..ee3995d0f8 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -76,6 +76,7 @@ Array [ "Vector3", "Vector4", "VectorRepresentation", + "Viewport", "WithMathProps", "XRManager", "_roots", diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index eae81bd40e..bba208021b 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -51,11 +51,22 @@ describe('createRoot', () => { expect(camera.position.z).toEqual(5) }) - it('should handle any performance changing functions', async () => { - const store = await act(async () => root.configure({ performance: { min: 0.2 } }).render()) + it('should handle an performance changing functions', async () => { + let store: RootStore = null! + await act(async () => { + store = root.configure({ dpr: [1, 2], performance: { min: 0.2 } }).render() + }) + + expect(store.getState().viewport.initialDpr).toEqual(window.devicePixelRatio) expect(store.getState().performance.min).toEqual(0.2) expect(store.getState().performance.current).toEqual(1) + await act(async () => { + store.getState().setDpr(0.1) + }) + + expect(store.getState().viewport.dpr).toEqual(0.1) + jest.useFakeTimers() await act(async () => { @@ -74,20 +85,6 @@ describe('createRoot', () => { jest.useRealTimers() }) - it('should handle the DPR prop reactively', async () => { - // Initial clamp - const store = await act(async () => root.configure({ dpr: [1, 2] }).render()) - expect(store.getState().dpr).toEqual(window.devicePixelRatio) - - // Reactive update - await act(async () => store.getState().setDpr(0.1)) - expect(store.getState().dpr).toEqual(0.1) - - // Reactive clamp - await act(async () => store.getState().setDpr([1, 2])) - expect(store.getState().dpr).toEqual(window.devicePixelRatio) - }) - it('should set PCFSoftShadowMap as the default shadow map', async () => { const store = await act(async () => root.configure({ shadows: true }).render()) const { gl } = store.getState() From f6dea27f3425c371e707d40155c1ef75cea0eed6 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 4 May 2024 11:19:30 -0500 Subject: [PATCH 207/252] chore(tests): move dpr reactivity case --- packages/fiber/tests/index.test.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/fiber/tests/index.test.tsx b/packages/fiber/tests/index.test.tsx index bba208021b..a8cd26e23d 100644 --- a/packages/fiber/tests/index.test.tsx +++ b/packages/fiber/tests/index.test.tsx @@ -51,6 +51,7 @@ describe('createRoot', () => { expect(camera.position.z).toEqual(5) }) + // TODO: deprecate it('should handle an performance changing functions', async () => { let store: RootStore = null! await act(async () => { @@ -85,6 +86,20 @@ describe('createRoot', () => { jest.useRealTimers() }) + it('should handle the DPR prop reactively', async () => { + // Initial clamp + const store = await act(async () => root.configure({ dpr: [1, 2] }).render()) + expect(store.getState().viewport.dpr).toEqual(window.devicePixelRatio) + + // Reactive update + await act(async () => store.getState().setDpr(0.1)) + expect(store.getState().viewport.dpr).toEqual(0.1) + + // Reactive clamp + await act(async () => store.getState().setDpr([1, 2])) + expect(store.getState().viewport.dpr).toEqual(window.devicePixelRatio) + }) + it('should set PCFSoftShadowMap as the default shadow map', async () => { const store = await act(async () => root.configure({ shadows: true }).render()) const { gl } = store.getState() From 7cd62f7d3434a44b9766f1ed43967bb8be3a70f5 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 4 May 2024 11:33:38 -0500 Subject: [PATCH 208/252] RELEASING: Releasing 2 package(s) Releases: @react-three/fiber@9.0.0-alpha.5 @react-three/test-renderer@9.0.0-alpha.5 [skip ci] --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index afe8f56874..8a8168cae4 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.4", + "version": "9.0.0-alpha.5", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 7285df60f7..745e8d958d 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-alpha.4", + "version": "9.0.0-alpha.5", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-alpha.4", + "@react-three/fiber": "9.0.0-alpha.5", "three": ">=0.141" } } From 37e6499d9aa781d987dd4e69347f11f6928d59c5 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 8 May 2024 14:09:34 -0500 Subject: [PATCH 209/252] chore: resolve conflicts --- package.json | 2 +- packages/fiber/src/core/renderer.tsx | 6 +++--- packages/fiber/src/three-types.ts | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f0dfc2fe0a..ff1c7bd5a3 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "eslint:fix": "yarn run eslint --fix", "test": "jest --coverage", "test:watch": "jest --watchAll", - "typecheck": "tsc --noEmit --emitDeclarationOnly false --strict --jsx react", + "typecheck": "tsc --noEmit --emitDeclarationOnly false --strict", "validate": "preconstruct validate", "release": "yarn build && yarn changeset publish", "vers": "yarn changeset version", diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 30b1d7330d..a2aeb4bcc8 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -474,7 +474,7 @@ function Provider({ children, onCreated, rootElement, -}: ProviderProps): JSX.Element { +}: ProviderProps): React.JSX.Element { useIsomorphicLayoutEffect(() => { const state = store.getState() // Flag the canvas active, rendering will now begin @@ -529,7 +529,7 @@ export type InjectState = Partial< } > -export function createPortal(children: React.ReactNode, container: THREE.Object3D, state?: InjectState): JSX.Element { +export function createPortal(children: React.ReactNode, container: THREE.Object3D, state?: InjectState): React.JSX.Element { return } @@ -539,7 +539,7 @@ interface PortalProps { container: THREE.Object3D } -function Portal({ state = {}, children, container }: PortalProps): JSX.Element { +function Portal({ state = {}, children, container }: PortalProps): React.JSX.Element { /** This has to be a component because it would not be able to call useThree/useStore otherwise since * if this is our environment, then we are not in r3f's renderer but in react-dom, it would trigger * the "R3F hooks can only be used within the Canvas component!" warning: diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 89a05a014e..82a02f4e87 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -1,4 +1,7 @@ import type * as THREE from 'three' +import type {} from 'react' +import type {} from 'react/jsx-runtime' +import type {} from 'react/jsx-dev-runtime' import type { Args, EventHandlers, InstanceProps, ConstructorRepresentation } from './core' type NonFunctionKeys

    = { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] @@ -66,3 +69,15 @@ declare module 'react' { interface IntrinsicElements extends ThreeElements {} } } + +declare module 'react/jsx-runtime' { + namespace JSX { + interface IntrinsicElements extends ThreeElements {} + } +} + +declare module 'react/jsx-dev-runtime' { + namespace JSX { + interface IntrinsicElements extends ThreeElements {} + } +} From 50d43c2886442730304cfadfef2233914804ad32 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 8 May 2024 14:12:11 -0500 Subject: [PATCH 210/252] chore: lint --- packages/fiber/src/core/renderer.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index a2aeb4bcc8..7be30c8a0f 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -529,7 +529,11 @@ export type InjectState = Partial< } > -export function createPortal(children: React.ReactNode, container: THREE.Object3D, state?: InjectState): React.JSX.Element { +export function createPortal( + children: React.ReactNode, + container: THREE.Object3D, + state?: InjectState, +): React.JSX.Element { return } From eed92d809dddead74a17091d896b539c0a2ab20e Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 8 May 2024 14:12:57 -0500 Subject: [PATCH 211/252] chore: upgrade React beta --- package.json | 6 +-- packages/fiber/package.json | 4 +- yarn.lock | 78 +++++++++++++++++-------------------- 3 files changed, 40 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index ff1c7bd5a3..6e3e602c5a 100644 --- a/package.json +++ b/package.json @@ -76,10 +76,10 @@ "lint-staged": "^12.3.7", "prettier": "^2.6.1", "pretty-quick": "^3.1.3", - "react": "19.0.0-beta-94eed63c49-20240425", - "react-dom": "19.0.0-beta-94eed63c49-20240425", + "react": "19.0.0-beta-6946ebe620-20240508", + "react-dom": "19.0.0-beta-6946ebe620-20240508", "react-native": "0.69.3", - "react-test-renderer": "19.0.0-beta-94eed63c49-20240425", + "react-test-renderer": "19.0.0-beta-6946ebe620-20240508", "three": "^0.141.0", "three-stdlib": "^2.13.0", "ts-jest": "^29.1.2", diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 8a8168cae4..dab78d9951 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -47,9 +47,9 @@ "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^1.2.5", - "react-reconciler": "0.31.0-beta-94eed63c49-20240425", + "react-reconciler": "0.31.0-beta-6946ebe620-20240508", "react-use-measure": "^2.1.1", - "scheduler": "0.25.0-beta-94eed63c49-20240425", + "scheduler": "0.25.0-beta-6946ebe620-20240508", "suspend-react": "^0.1.3", "zustand": "^4.1.2" }, diff --git a/yarn.lock b/yarn.lock index b1c3870ef3..8f570cbd5d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8974,6 +8974,13 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" +react-dom@19.0.0-beta-6946ebe620-20240508: + version "19.0.0-beta-6946ebe620-20240508" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-beta-6946ebe620-20240508.tgz#1041f2f32efefe230d697efbeb4c82cab29153d5" + integrity sha512-ql+rmLSGnZljNdsDPPOIUOJ6le2Yycj/5Xmq6wQJiLjfYu7QgykcjyKlcldrLovhgvXjs4IV3HLlhOu9Bo/5fQ== + dependencies: + scheduler "0.25.0-beta-6946ebe620-20240508" + react-dom@19.0.0-beta-94eed63c49-20240425: version "19.0.0-beta-94eed63c49-20240425" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-beta-94eed63c49-20240425.tgz#5d10ac9f95f43f26130c2b8f59accc8f18485963" @@ -8981,10 +8988,10 @@ react-dom@19.0.0-beta-94eed63c49-20240425: dependencies: scheduler "0.25.0-beta-94eed63c49-20240425" -react-is@19.0.0-beta-94eed63c49-20240425: - version "19.0.0-beta-94eed63c49-20240425" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-beta-94eed63c49-20240425.tgz#e636ae331655ced5616a9ce252e827ed1b917eda" - integrity sha512-jG3jI4NjfbeH899/6kP16TUT+CeVUFNDTw8nPvUxaLSPZVY3s33PRbOOcrd3X4r5nlsyozOYEzkomUlLM3bZcw== +react-is@19.0.0-beta-6946ebe620-20240508: + version "19.0.0-beta-6946ebe620-20240508" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-beta-6946ebe620-20240508.tgz#a3be72ce1a9a6a80b47985d308fdbfa2d5a96a0d" + integrity sha512-upHlGCCy+c3Q6POQVa7siaoT2be+QOvNz5m3RGQIeAxwh6X6xixfGToQzMH1bsSN2K28ldWCHkuA2OTEQ1DLMg== "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: version "18.2.0" @@ -9055,12 +9062,12 @@ react-native@0.69.3: whatwg-fetch "^3.0.0" ws "^6.1.4" -react-reconciler@0.31.0-beta-94eed63c49-20240425: - version "0.31.0-beta-94eed63c49-20240425" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-beta-94eed63c49-20240425.tgz#c2d469ab0f933d82150ca871b8b2daae001fd0d7" - integrity sha512-1ffTu3lmFEjdSlHxGjb7ztGDdXtbhKSka8cTRB8/Cj99536qvLpohOfpEsdzkBo1x3I31Q4h+C8g/fZ54MZBxA== +react-reconciler@0.31.0-beta-6946ebe620-20240508: + version "0.31.0-beta-6946ebe620-20240508" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-beta-6946ebe620-20240508.tgz#f63d371e0210e3fc9ba31f399091de35a2754cfc" + integrity sha512-5YCRFs9FpTAKqSN0zzN3vHOqPjNITxTrPTqc+a6fFf97SMmQTgOS3DsGCSqtyf5xKLhu15alwdYUW/NUxmxuoQ== dependencies: - scheduler "0.25.0-beta-94eed63c49-20240425" + scheduler "0.25.0-beta-6946ebe620-20240508" react-refresh@^0.10.0: version "0.10.0" @@ -9085,13 +9092,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-94eed63c49-20240425: - version "19.0.0-beta-94eed63c49-20240425" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-beta-94eed63c49-20240425.tgz#458653f26e807c1b3b3c5fa3870ef5939d64afa5" - integrity sha512-lLAOO6Duvq6EHt3dGfn3pK8fBkJgHU2gqceje903/TDTlqlCrm+CXxCOsc6fjqWpD0RYkd1v8FpDEnusaQXijw== +react-test-renderer@19.0.0-beta-6946ebe620-20240508: + version "19.0.0-beta-6946ebe620-20240508" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-beta-6946ebe620-20240508.tgz#818f49cc562b2fddc9d6cc3db5adea3310b857c6" + integrity sha512-ogmcK2gkAKC5Fq6+kSQ+xQKdOld2y2N9KnOEwTh36B3MOOD/vyKFfXkxjUqIan0pKEwUvPSgkfpdn+lo9hOQ5g== dependencies: - react-is "19.0.0-beta-94eed63c49-20240425" - scheduler "0.25.0-beta-94eed63c49-20240425" + react-is "19.0.0-beta-6946ebe620-20240508" + scheduler "0.25.0-beta-6946ebe620-20240508" react-use-measure@^2.1.1: version "2.1.1" @@ -9105,6 +9112,11 @@ react-use-refs@^1.0.1: resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== +react@19.0.0-beta-6946ebe620-20240508: + version "19.0.0-beta-6946ebe620-20240508" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-6946ebe620-20240508.tgz#c46ce6118913346d857e1ab8566fb356f3439425" + integrity sha512-oopuXTmA4olWtL8p3jAobiFvYsljLkzAQL21YVc44qjz32WtGmbKFHYSe1EL6Dy/v8PEWlaGBQssJPv5RFVQcw== + react@19.0.0-beta-94eed63c49-20240425: version "19.0.0-beta-94eed63c49-20240425" resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-94eed63c49-20240425.tgz#7b30b64c9b3517240d47ac00184ae2d59554bb9b" @@ -9494,6 +9506,11 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +scheduler@0.25.0-beta-6946ebe620-20240508: + version "0.25.0-beta-6946ebe620-20240508" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-6946ebe620-20240508.tgz#a09f28879c076952033727b9644bcc3bf699099d" + integrity sha512-g4Lk1FLKQzMXms4675kO5c+D05d2Rol4QlCqoWuBUaMdON8xI0/eDXbVgQoq0EgOa1QWAGNBSrQ3DUT0r/LXNw== + scheduler@0.25.0-beta-94eed63c49-20240425: version "0.25.0-beta-94eed63c49-20240425" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-94eed63c49-20240425.tgz#db261000b28fa56d65fff2e9c17eb7bd094a669a" @@ -9938,16 +9955,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - 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== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -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== @@ -10025,7 +10033,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"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== @@ -10039,13 +10047,6 @@ 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== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10954,7 +10955,7 @@ wouter@^2.12.1: dependencies: use-sync-external-store "^1.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"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== @@ -10972,15 +10973,6 @@ 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== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 564c252cda7e598ad7b105621aa1a74168321ef1 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 8 May 2024 14:13:32 -0500 Subject: [PATCH 212/252] RELEASING: Releasing 2 package(s) Releases: @react-three/fiber@9.0.0-alpha.6 @react-three/test-renderer@9.0.0-alpha.6 [skip ci] --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index dab78d9951..227c7c9d44 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.5", + "version": "9.0.0-alpha.6", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 745e8d958d..050df7df41 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-alpha.5", + "version": "9.0.0-alpha.6", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-alpha.5", + "@react-three/fiber": "9.0.0-alpha.6", "three": ">=0.141" } } From 2207cec72b56515422959ee38e39e6131f9d36c1 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Fri, 10 May 2024 14:16:04 -0700 Subject: [PATCH 213/252] fix: remove useUpdate --- example/src/demos/Update.tsx | 121 -------------- example/src/demos/index.tsx | 2 - packages/fiber/src/core/hooks.tsx | 18 +- packages/fiber/src/core/index.tsx | 8 - packages/fiber/src/core/loop.ts | 23 ++- packages/fiber/src/core/renderer.tsx | 42 ----- packages/fiber/src/core/stages.ts | 154 ------------------ packages/fiber/src/core/store.ts | 56 +------ packages/fiber/src/native/Canvas.tsx | 2 - packages/fiber/src/web/Canvas.tsx | 1 - .../tests/__snapshots__/index.test.tsx.snap | 11 -- 11 files changed, 27 insertions(+), 411 deletions(-) delete mode 100644 example/src/demos/Update.tsx delete mode 100644 packages/fiber/src/core/stages.ts diff --git a/example/src/demos/Update.tsx b/example/src/demos/Update.tsx deleted file mode 100644 index af15651da9..0000000000 --- a/example/src/demos/Update.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import React, { useState, useRef, useEffect, useMemo, useLayoutEffect } from 'react' -import { Canvas, FixedStage, Stage, useFrame, useThree, useUpdate, Stages as Standard } from '@react-three/fiber' -import { a, useSpring } from '@react-spring/three' -import { OrbitControls } from '@react-three/drei' -import * as THREE from 'three' - -const colorA = new THREE.Color('#6246ea') -const colorB = new THREE.Color('#e45858') - -const InputStage = new Stage() -const PhysicsStage = new FixedStage(1 / 30) -const HudStage = new Stage() -const lifecycle = [ - Standard.Early, - InputStage, - Standard.Fixed, - PhysicsStage, - Standard.Update, - Standard.Late, - Standard.Render, - HudStage, - Standard.After, -] - -const Stages = { - Early: Standard.Early, - Input: InputStage, - Fixed: Standard.Fixed, - Physics: PhysicsStage, - Update: Standard.Update, - Late: Standard.Late, - Render: Standard.Render, - Hud: HudStage, - After: Standard.After, -} - -function Update() { - const groupRef = useRef(null!) - const matRef = useRef(null!) - const [fixed] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) - const [prev] = useState(() => ({ scale: new THREE.Vector3(), color: new THREE.Color() })) - - const interpolate = true - const [active, setActive] = useState(0) - - // create a common spring that will be used later to interpolate other values - const { spring } = useSpring({ - spring: active, - config: { mass: 5, tension: 400, friction: 50, precision: 0.0001 }, - }) - // interpolate values from common spring - const scale = spring.to([0, 1], [1, 2]) - const rotation = spring.to([0, 1], [0, Math.PI]) - - useUpdate(({ clock }) => { - if (groupRef.current) { - const t = clock.getElapsedTime() - const scalar = (Math.sin(t) + 2) / 2 - prev.scale.copy(fixed.scale) - fixed.scale.set(scalar, scalar, scalar) - } - - if (matRef.current) { - const t = clock.getElapsedTime() - const alpha = Math.sin(t) + 1 - prev.color.copy(fixed.color) - fixed.color.lerpColors(colorA, colorB, alpha) - } - }, Stages.Fixed) - - useUpdate((state) => { - // With interpolation of the fixed stage - const alpha = Stages.Fixed.alpha - - if (interpolate) { - groupRef.current.scale.lerpVectors(prev.scale, fixed.scale, alpha) - matRef.current.color.lerpColors(prev.color, fixed.color, alpha) - } else { - groupRef.current.scale.copy(fixed.scale) - matRef.current.color.copy(fixed.color) - } - }) - - // For backwards compatability, useFrame gets executed in the update stage - // A positive priority switches rendering to manual - useFrame(() => { - if (groupRef.current) { - groupRef.current.rotation.x = groupRef.current.rotation.y += 0.005 - } - }) - - // Use our own render function by setting render to 'manual' - useUpdate(({ gl, scene, camera }) => { - if (gl.autoClear) gl.autoClear = false - gl.clear() - gl.render(scene, camera) - }, Stages.Render) - - // Modify the fixed stage's step at runtime. - useEffect(() => { - Stages.Fixed.fixedStep = 1 / 15 - }, []) - - return ( - - setActive(Number(!active))}> - - - - - - ) -} - -export default function App() { - return ( - - - - ) -} diff --git a/example/src/demos/index.tsx b/example/src/demos/index.tsx index 42ae2d5f5b..e2c31327e7 100644 --- a/example/src/demos/index.tsx +++ b/example/src/demos/index.tsx @@ -24,7 +24,6 @@ const Test = { Component: lazy(() => import('./Test')) } const Viewcube = { Component: lazy(() => import('./Viewcube')) } const Portals = { Component: lazy(() => import('./Portals')) } const ViewTracking = { Component: lazy(() => import('./ViewTracking')) } -const Update = { Component: lazy(() => import('./Update')) } export { Animation, @@ -51,5 +50,4 @@ export { MultiView, Portals, ViewTracking, - Update, } diff --git a/packages/fiber/src/core/hooks.tsx b/packages/fiber/src/core/hooks.tsx index f5df469fe2..bada964a2d 100644 --- a/packages/fiber/src/core/hooks.tsx +++ b/packages/fiber/src/core/hooks.tsx @@ -1,9 +1,8 @@ import * as THREE from 'three' import * as React from 'react' import { suspend, preload, clear } from 'suspend-react' -import { context, RootState, RenderCallback, UpdateCallback, StageTypes, RootStore } from './store' +import { context, RootState, RenderCallback, RootStore } from './store' import { buildGraph, ObjectMap, is, useMutableCallback, useIsomorphicLayoutEffect, isObject3D } from './utils' -import { Stages } from './stages' import type { Instance } from './reconciler' /** @@ -54,21 +53,6 @@ export function useFrame(callback: RenderCallback, renderPriority: number = 0): return null } -/** - * Executes a callback in a given update stage. - * Uses the stage instance to identify which stage to target in the lifecycle. - */ -export function useUpdate(callback: UpdateCallback, stage: StageTypes = Stages.Update): void { - const store = useStore() - const stages = store.getState().internal.stages - // Memoize ref - const ref = useMutableCallback(callback) - // Throw an error if a stage does not exist in the lifecycle - if (!stages.includes(stage)) throw new Error(`An invoked stage does not exist in the lifecycle.`) - // Subscribe on mount, unsubscribe on unmount - useIsomorphicLayoutEffect(() => stage.add(ref, store), [stage]) -} - /** * Returns a node graph of an object with named nodes & materials. * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usegraph diff --git a/packages/fiber/src/core/index.tsx b/packages/fiber/src/core/index.tsx index e3dc0aeb1f..3708548008 100644 --- a/packages/fiber/src/core/index.tsx +++ b/packages/fiber/src/core/index.tsx @@ -24,23 +24,15 @@ export type { export { extend, reconciler } from './reconciler' export type { ReconcilerRoot, GLProps, CameraProps, RenderProps, InjectState } from './renderer' export { _roots, render, createRoot, unmountComponentAtNode, createPortal } from './renderer' -export type { UpdateSubscription } from './stages' -export { Stage, FixedStage, Stages } from './stages' export type { Subscription, Dpr, Size, Viewport, RenderCallback, - UpdateCallback, - LegacyAlways, - FrameloopMode, - FrameloopRender, - FrameloopLegacy, Frameloop, Performance, Renderer, - StageTypes, XRManager, RootState, RootStore, diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index 48d2502a74..ca96ac2c5b 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -1,5 +1,5 @@ import { _roots } from './renderer' -import type { RootState } from './store' +import type { RootState, Subscription } from './store' export type GlobalRenderCallback = (timestamp: number) => void interface SubItem { @@ -54,22 +54,31 @@ export function flushGlobalEffects(type: GlobalEffectType, timestamp: number): v } } +let subscribers: Subscription[] +let subscription: Subscription + function update(timestamp: number, state: RootState, frame?: XRFrame) { // Run local effects let delta = state.clock.getDelta() + // In frameloop='never' mode, clock times are updated using the provided timestamp if (state.frameloop === 'never' && typeof timestamp === 'number') { delta = timestamp - state.clock.elapsedTime state.clock.oldTime = state.clock.elapsedTime state.clock.elapsedTime = timestamp - } else { - delta = Math.max(Math.min(delta, state.internal.maxDelta), 0) } - // Call subscribers (useUpdate) - for (const stage of state.internal.stages) { - stage.frame(delta, frame) + + // Call subscribers (useFrame) + subscribers = state.internal.subscribers + for (let i = 0; i < subscribers.length; i++) { + subscription = subscribers[i] + subscription.ref.current(subscription.store.getState(), delta, frame) } + // Render content + if (!state.internal.priority && state.gl.render) state.gl.render(state.scene, state.camera) + + // Decrease frame count state.internal.frames = Math.max(0, state.internal.frames - 1) return state.frameloop === 'always' ? 1 : state.internal.frames } @@ -157,3 +166,5 @@ export function advance(timestamp: number, runGlobalEffects: boolean = true, sta else update(timestamp, state, frame) if (runGlobalEffects) flushGlobalEffects('after', timestamp) } + +console.log(globalEffects) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 7be30c8a0f..ea32a19a86 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -13,7 +13,6 @@ import { Size, Dpr, Performance, - Subscription, Frameloop, RootStore, } from './store' @@ -34,7 +33,6 @@ import { getColorManagement, } from './utils' import { useStore } from './hooks' -import { Stage, Lifecycle, Stages } from './stages' // Shim for OffscreenCanvas since it was removed from DOM types // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/54988 @@ -107,9 +105,6 @@ export interface RenderProps void /** Response for pointer clicks that have missed any target */ onPointerMissed?: (event: MouseEvent) => void - /** Create a custom lifecycle of stages */ - stages?: Stage[] - render?: 'auto' | 'manual' } const createRendererInstance = ( @@ -128,39 +123,6 @@ const createRendererInstance = { - const state = store.getState() - let subscribers: Subscription[] - let subscription: Subscription - - const _stages = stages ?? Lifecycle - - if (!_stages.includes(Stages.Update)) throw 'The Stages.Update stage is required for R3F.' - if (!_stages.includes(Stages.Render)) throw 'The Stages.Render stage is required for R3F.' - - state.set(({ internal }) => ({ internal: { ...internal, stages: _stages } })) - - // Add useFrame loop to update stage - const frameCallback = { - current(state: RootState, delta: number, frame?: XRFrame | undefined) { - subscribers = state.internal.subscribers - for (let i = 0; i < subscribers.length; i++) { - subscription = subscribers[i] - subscription.ref.current(subscription.store.getState(), delta, frame) - } - }, - } - Stages.Update.add(frameCallback, store) - - // Add render callback to render stage - const renderCallback = { - current(state: RootState) { - if (state.internal.render === 'auto' && state.gl.render) state.gl.render(state.scene, state.camera) - }, - } - Stages.Render.add(renderCallback, store) -} - export interface ReconcilerRoot { configure: (config?: RenderProps) => ReconcilerRoot render: (element: React.ReactNode) => RootStore @@ -247,7 +209,6 @@ export function createRoot( raycaster: raycastOptions, camera: cameraOptions, onPointerMissed, - stages, } = props let state = store.getState() @@ -424,9 +385,6 @@ export function createRoot( if (performance && !is.equ(performance, state.performance, shallowLoose)) state.set((state) => ({ performance: { ...state.performance, ...performance } })) - // Create update stages. Only do this once on init - if (state.internal.stages.length === 0) createStages(stages, store) - // Set locals onCreated = onCreatedCallback configured = true diff --git a/packages/fiber/src/core/stages.ts b/packages/fiber/src/core/stages.ts deleted file mode 100644 index cb8d812d13..0000000000 --- a/packages/fiber/src/core/stages.ts +++ /dev/null @@ -1,154 +0,0 @@ -import type { Subscription, RootStore } from './store' - -// TODO: Remove deprecated fields in `Subscription` -export type UpdateSubscription = Omit - -/** - * Class representing a stage that updates every frame. - * Stages are used to build a lifecycle of effects for an app's frameloop. - */ -export class Stage { - private subscribers: UpdateSubscription[] - private _frameTime: number - - constructor() { - this.subscribers = [] - this._frameTime = 0 - } - - /** - * Executes all callback subscriptions on the stage. - * @param delta - Delta time between frame calls. - * @param [frame] - The XR frame if it exists. - */ - frame(delta: number, frame?: XRFrame) { - const subs = this.subscribers - const initialTime = performance.now() - - for (let i = 0; i < subs.length; i++) { - subs[i].ref.current(subs[i].store.getState(), delta, frame) - } - - this._frameTime = performance.now() - initialTime - } - - /** - * Adds a callback subscriber to the stage. - * @param ref - The mutable callback reference. - * @param store - The store to be used with the callback execution. - * @returns A function to remove the subscription. - */ - add(ref: UpdateSubscription['ref'], store: RootStore) { - this.subscribers.push({ ref, store }) - - return () => { - this.subscribers = this.subscribers.filter((sub) => { - return sub.ref !== ref - }) - } - } - - get frameTime() { - return this._frameTime - } -} - -// Using Unity's fixedStep default. -const FPS_50 = 1 / 50 - -/** - * Class representing a stage that updates every frame at a fixed rate. - * @param name - Name of the stage. - * @param [fixedStep] - Fixed step rate. - * @param [maxSubsteps] - Maximum number of substeps. - */ -export class FixedStage extends Stage { - private _fixedStep: number - private _maxSubsteps: number - private _accumulator: number - private _alpha: number - private _fixedFrameTime: number - private _substepTimes: number[] - - constructor(fixedStep?: number, maxSubSteps?: number) { - super() - - this._fixedStep = fixedStep ?? FPS_50 - this._maxSubsteps = maxSubSteps ?? 6 - this._accumulator = 0 - this._alpha = 0 - this._fixedFrameTime = 0 - this._substepTimes = [] - } - - /** - * Executes all callback subscriptions on the stage. - * @param delta - Delta time between frame calls. - * @param [frame] - The XR frame if it exists. - */ - frame(delta: number, frame?: XRFrame) { - const initialTime = performance.now() - let substeps = 0 - this._substepTimes = [] - - this._accumulator += delta - - while (this._accumulator >= this._fixedStep && substeps < this._maxSubsteps) { - this._accumulator -= this._fixedStep - substeps++ - - super.frame(this._fixedStep, frame) - this._substepTimes.push(super.frameTime) - } - - this._fixedFrameTime = performance.now() - initialTime - - // The accumulator will only be larger than the fixed step if we had to - // bail early due to hitting the max substep limit or execution time lagging. - // In that case, we want to shave off the excess so we don't fall behind next frame. - this._accumulator = this._accumulator % this._fixedStep - this._alpha = this._accumulator / this._fixedStep - } - - get frameTime() { - return this._fixedFrameTime - } - - get substepTimes() { - return this._substepTimes - } - - get fixedStep() { - return this._fixedStep - } - - set fixedStep(fixedStep: number) { - this._fixedStep = fixedStep - } - - get maxSubsteps() { - return this._maxSubsteps - } - - set maxSubsteps(maxSubsteps: number) { - this._maxSubsteps = maxSubsteps - } - - get accumulator() { - return this._accumulator - } - - get alpha() { - return this._alpha - } -} - -const Early = /*#__PURE__*/ new Stage() -const Fixed = /*#__PURE__*/ new FixedStage() -const Update = /*#__PURE__*/ new Stage() -const Late = /*#__PURE__*/ new Stage() -const Render = /*#__PURE__*/ new Stage() -const After = /*#__PURE__*/ new Stage() - -export const Stages = { Early, Fixed, Update, Late, Render, After } -export const Lifecycle = [Early, Fixed, Update, Late, Render, After] diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index ca14d93a6c..c4f6d5a54e 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -4,7 +4,6 @@ import { type StoreApi } from 'zustand' import { createWithEqualityFn, type UseBoundStoreWithEqualityFn } from 'zustand/traditional' import type { DomEvent, EventManager, PointerCaptureTarget, ThreeEvent } from './events' import { calculateDpr, type Camera, isOrthographicCamera, updateCamera } from './utils' -import type { FixedStage, Stage } from './stages' export interface Intersection extends THREE.Intersection { eventObject: THREE.Object3D @@ -23,6 +22,7 @@ export interface Size { top: number left: number } +export type Frameloop = 'always' | 'demand' | 'never' export interface Viewport extends Size { /** The initial pixel ratio */ initialDpr: number @@ -37,13 +37,6 @@ export interface Viewport extends Size { } export type RenderCallback = (state: RootState, delta: number, frame?: XRFrame) => void -export type UpdateCallback = RenderCallback - -export type LegacyAlways = 'always' -export type FrameloopMode = LegacyAlways | 'auto' | 'demand' | 'never' -export type FrameloopRender = 'auto' | 'manual' -export type FrameloopLegacy = 'always' | 'demand' | 'never' -export type Frameloop = FrameloopLegacy | { mode?: FrameloopMode; render?: FrameloopRender; maxDelta?: number } export interface Performance { /** Current performance normal, between min and max */ @@ -63,8 +56,6 @@ export interface Renderer { } export const isRenderer = (def: any) => !!def?.render -export type StageTypes = Stage | FixedStage - export interface InternalState { interaction: THREE.Object3D[] hovered: Map> @@ -76,12 +67,6 @@ export interface InternalState { active: boolean priority: number frames: number - /** The ordered stages defining the lifecycle. */ - stages: StageTypes[] - /** Render function flags */ - render: 'auto' | 'manual' - /** The max delta time between two frames. */ - maxDelta: number subscribe: (callback: React.RefObject, priority: number, store: RootStore) => () => void } @@ -121,9 +106,8 @@ export interface RootState { linear: boolean /** Shortcut to gl.toneMapping = NoTonemapping */ flat: boolean - /** Update frame loop flags */ - frameloop: FrameloopLegacy - /** Adaptive performance interface */ + /** Render loop flags */ + frameloop: 'always' | 'demand' | 'never' performance: Performance /** Reactive pixel-size of the canvas */ size: Size @@ -265,20 +249,9 @@ export const createStore = ( const resolved = calculateDpr(dpr) return { viewport: { ...state.viewport, dpr: resolved, initialDpr: state.viewport.initialDpr || resolved } } }), - setFrameloop: (frameloop: Frameloop) => { - const state = get() - const mode: FrameloopLegacy = - typeof frameloop === 'string' - ? frameloop - : frameloop?.mode === 'auto' - ? 'always' - : frameloop?.mode ?? state.frameloop - const render = - typeof frameloop === 'string' ? state.internal.render : frameloop?.render ?? state.internal.render - const maxDelta = - typeof frameloop === 'string' ? state.internal.maxDelta : frameloop?.maxDelta ?? state.internal.maxDelta - - const clock = state.clock + setFrameloop: (frameloop: 'always' | 'demand' | 'never' = 'always') => { + const clock = get().clock + // if frameloop === "never" clock.elapsedTime is updated using advance(timestamp) clock.stop() clock.elapsedTime = 0 @@ -287,7 +260,7 @@ export const createStore = ( clock.start() clock.elapsedTime = 0 } - set(() => ({ frameloop: mode, internal: { ...state.internal, render, maxDelta } })) + set(() => ({ frameloop })) }, previousRoot: undefined, internal: { @@ -303,34 +276,23 @@ export const createStore = ( // Updates active: false, frames: 0, - stages: [], - render: 'auto', - maxDelta: 1 / 10, priority: 0, subscribe: (ref: React.RefObject, priority: number, store: RootStore) => { - const state = get() - const internal = state.internal + const internal = get().internal // If this subscription was given a priority, it takes rendering into its own hands // For that reason we switch off automatic rendering and increase the manual flag // As long as this flag is positive there can be no internal rendering at all // because there could be multiple render subscriptions internal.priority = internal.priority + (priority > 0 ? 1 : 0) - // We use the render flag and deprecate priority - if (internal.priority && state.internal.render === 'auto') - set(() => ({ internal: { ...state.internal, render: 'manual' } })) internal.subscribers.push({ ref, priority, store }) // Register subscriber and sort layers from lowest to highest, meaning, // highest priority renders last (on top of the other frames) internal.subscribers = internal.subscribers.sort((a, b) => a.priority - b.priority) return () => { - const state = get() - const internal = state.internal + const internal = get().internal if (internal?.subscribers) { // Decrease manual flag if this subscription had a priority internal.priority = internal.priority - (priority > 0 ? 1 : 0) - // We use the render flag and deprecate priority - if (!internal.priority && state.internal.render === 'manual') - set(() => ({ internal: { ...state.internal, render: 'auto' } })) // Remove subscriber from list internal.subscribers = internal.subscribers.filter((s) => s.ref !== ref) } diff --git a/packages/fiber/src/native/Canvas.tsx b/packages/fiber/src/native/Canvas.tsx index e4bcd8e20b..a3ae0752de 100644 --- a/packages/fiber/src/native/Canvas.tsx +++ b/packages/fiber/src/native/Canvas.tsx @@ -41,7 +41,6 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( scene, onPointerMissed, onCreated, - stages, ...props }, forwardedRef, @@ -110,7 +109,6 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef( performance, raycaster, camera, - stages, scene, // expo-gl can only render at native dpr/resolution // https://github.com/expo/expo-three/issues/39 diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index 89c5934c45..b88e0e4995 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -58,7 +58,6 @@ const CanvasImpl = /*#__PURE__*/ React.forwardRef(func scene, onPointerMissed, onCreated, - stages, ...props }, forwardedRef, diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index ee3995d0f8..5c2aaab5bd 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -25,11 +25,7 @@ Array [ "Events", "Extensions", "FilterFunction", - "FixedStage", "Frameloop", - "FrameloopLegacy", - "FrameloopMode", - "FrameloopRender", "GLProps", "GlobalEffectType", "GlobalRenderCallback", @@ -38,7 +34,6 @@ Array [ "InstanceProps", "Intersection", "Layers", - "LegacyAlways", "Loader", "LoaderProto", "LoaderResult", @@ -63,15 +58,10 @@ Array [ "RootState", "RootStore", "Size", - "Stage", - "StageTypes", - "Stages", "Subscription", "ThreeElement", "ThreeElements", "ThreeEvent", - "UpdateCallback", - "UpdateSubscription", "Vector2", "Vector3", "Vector4", @@ -106,6 +96,5 @@ Array [ "useLoader", "useStore", "useThree", - "useUpdate", ] `; From 684d89e3cf0760be7361b0b7ba0199412d70bbd5 Mon Sep 17 00:00:00 2001 From: Kris Baumgarter Date: Sat, 11 May 2024 10:21:17 -0700 Subject: [PATCH 214/252] Update packages/fiber/src/core/loop.ts Co-authored-by: Cody Bennett --- packages/fiber/src/core/loop.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/fiber/src/core/loop.ts b/packages/fiber/src/core/loop.ts index ca96ac2c5b..ac68dd9251 100644 --- a/packages/fiber/src/core/loop.ts +++ b/packages/fiber/src/core/loop.ts @@ -166,5 +166,3 @@ export function advance(timestamp: number, runGlobalEffects: boolean = true, sta else update(timestamp, state, frame) if (runGlobalEffects) flushGlobalEffects('after', timestamp) } - -console.log(globalEffects) From a196f202b71473bb223a09d9ed40958f63a79715 Mon Sep 17 00:00:00 2001 From: Kris Baumgarter Date: Sat, 11 May 2024 10:21:24 -0700 Subject: [PATCH 215/252] Update packages/fiber/src/core/store.ts Co-authored-by: Cody Bennett --- packages/fiber/src/core/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index c4f6d5a54e..45d48e61ca 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -107,7 +107,7 @@ export interface RootState { /** Shortcut to gl.toneMapping = NoTonemapping */ flat: boolean /** Render loop flags */ - frameloop: 'always' | 'demand' | 'never' + frameloop: Frameloop performance: Performance /** Reactive pixel-size of the canvas */ size: Size From 687f90e5fa9f2fd245d9f759bdba16e4787c43b1 Mon Sep 17 00:00:00 2001 From: Kris Baumgarter Date: Sat, 11 May 2024 10:21:29 -0700 Subject: [PATCH 216/252] Update packages/fiber/src/core/store.ts Co-authored-by: Cody Bennett --- packages/fiber/src/core/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/store.ts b/packages/fiber/src/core/store.ts index 45d48e61ca..b3c51e2b29 100644 --- a/packages/fiber/src/core/store.ts +++ b/packages/fiber/src/core/store.ts @@ -249,7 +249,7 @@ export const createStore = ( const resolved = calculateDpr(dpr) return { viewport: { ...state.viewport, dpr: resolved, initialDpr: state.viewport.initialDpr || resolved } } }), - setFrameloop: (frameloop: 'always' | 'demand' | 'never' = 'always') => { + setFrameloop: (frameloop: Frameloop = 'always') => { const clock = get().clock // if frameloop === "never" clock.elapsedTime is updated using advance(timestamp) From aa0957e847e2fceda84352af31799ba173c5ffdf Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 15 May 2024 13:29:29 -0500 Subject: [PATCH 217/252] chore: upgrade to 19-rc --- example/package.json | 4 +- package.json | 6 +-- packages/fiber/package.json | 4 +- yarn.lock | 73 ++++++++++++++----------------------- 4 files changed, 35 insertions(+), 52 deletions(-) diff --git a/example/package.json b/example/package.json index e8296077ee..cac4f80e88 100644 --- a/example/package.json +++ b/example/package.json @@ -11,8 +11,8 @@ "@react-spring/three": "^9.7.3", "@react-three/drei": "^9.105.5", "@use-gesture/react": "latest", - "react": "19.0.0-beta-94eed63c49-20240425", - "react-dom": "19.0.0-beta-94eed63c49-20240425", + "react": "19.0.0-rc-915b914b3a-20240515", + "react-dom": "19.0.0-rc-915b914b3a-20240515", "react-use-refs": "^1.0.1", "three": "^0.160.0", "three-stdlib": "^2.29.9", diff --git a/package.json b/package.json index 6e3e602c5a..8cb6bb3974 100644 --- a/package.json +++ b/package.json @@ -76,10 +76,10 @@ "lint-staged": "^12.3.7", "prettier": "^2.6.1", "pretty-quick": "^3.1.3", - "react": "19.0.0-beta-6946ebe620-20240508", - "react-dom": "19.0.0-beta-6946ebe620-20240508", + "react": "19.0.0-rc-915b914b3a-20240515", + "react-dom": "19.0.0-rc-915b914b3a-20240515", "react-native": "0.69.3", - "react-test-renderer": "19.0.0-beta-6946ebe620-20240508", + "react-test-renderer": "19.0.0-rc-915b914b3a-20240515", "three": "^0.141.0", "three-stdlib": "^2.13.0", "ts-jest": "^29.1.2", diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 227c7c9d44..d4a38dbe65 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -47,9 +47,9 @@ "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^1.2.5", - "react-reconciler": "0.31.0-beta-6946ebe620-20240508", + "react-reconciler": "0.31.0-rc-915b914b3a-20240515", "react-use-measure": "^2.1.1", - "scheduler": "0.25.0-beta-6946ebe620-20240508", + "scheduler": "0.25.0-rc-915b914b3a-20240515", "suspend-react": "^0.1.3", "zustand": "^4.1.2" }, diff --git a/yarn.lock b/yarn.lock index 8f570cbd5d..4f70058766 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8974,24 +8974,17 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" -react-dom@19.0.0-beta-6946ebe620-20240508: - version "19.0.0-beta-6946ebe620-20240508" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-beta-6946ebe620-20240508.tgz#1041f2f32efefe230d697efbeb4c82cab29153d5" - integrity sha512-ql+rmLSGnZljNdsDPPOIUOJ6le2Yycj/5Xmq6wQJiLjfYu7QgykcjyKlcldrLovhgvXjs4IV3HLlhOu9Bo/5fQ== +react-dom@19.0.0-rc-915b914b3a-20240515: + version "19.0.0-rc-915b914b3a-20240515" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-915b914b3a-20240515.tgz#01d92b86fe37aa673da22fdd789ed24ff1248026" + integrity sha512-Njv9p2b7/3ZEk7hcWAzgxbLfYbYJfI01bwI0V+a1WKbhhxwth1o2mQejIsUtnDwkXZ34Oej8rIY5Z93pUfSCdQ== dependencies: - scheduler "0.25.0-beta-6946ebe620-20240508" + scheduler "0.25.0-rc-915b914b3a-20240515" -react-dom@19.0.0-beta-94eed63c49-20240425: - version "19.0.0-beta-94eed63c49-20240425" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-beta-94eed63c49-20240425.tgz#5d10ac9f95f43f26130c2b8f59accc8f18485963" - integrity sha512-V0uHW7Xd0u/LDlmFO8sJ9TTNizAESS+pexJNOi3KbOU1taf2gUO5J8YIWis60xcQbh7YBqSklyYIIq3DfiKz3Q== - dependencies: - scheduler "0.25.0-beta-94eed63c49-20240425" - -react-is@19.0.0-beta-6946ebe620-20240508: - version "19.0.0-beta-6946ebe620-20240508" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-beta-6946ebe620-20240508.tgz#a3be72ce1a9a6a80b47985d308fdbfa2d5a96a0d" - integrity sha512-upHlGCCy+c3Q6POQVa7siaoT2be+QOvNz5m3RGQIeAxwh6X6xixfGToQzMH1bsSN2K28ldWCHkuA2OTEQ1DLMg== +react-is@19.0.0-rc-915b914b3a-20240515: + version "19.0.0-rc-915b914b3a-20240515" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-rc-915b914b3a-20240515.tgz#2967f33ca8b66746a0b50ac63b1d8e104fafada2" + integrity sha512-rSje5quK1l2qD4AvOWK7evWh4AQnXPNzpv7plZqnbl/oS4AEIT/FsZauyoLRMzXyleGXPJY0xnMnNXhPN+5HRw== "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: version "18.2.0" @@ -9062,12 +9055,12 @@ react-native@0.69.3: whatwg-fetch "^3.0.0" ws "^6.1.4" -react-reconciler@0.31.0-beta-6946ebe620-20240508: - version "0.31.0-beta-6946ebe620-20240508" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-beta-6946ebe620-20240508.tgz#f63d371e0210e3fc9ba31f399091de35a2754cfc" - integrity sha512-5YCRFs9FpTAKqSN0zzN3vHOqPjNITxTrPTqc+a6fFf97SMmQTgOS3DsGCSqtyf5xKLhu15alwdYUW/NUxmxuoQ== +react-reconciler@0.31.0-rc-915b914b3a-20240515: + version "0.31.0-rc-915b914b3a-20240515" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc-915b914b3a-20240515.tgz#00d9333185f1ac35edc280795d88aebfdf34a9d2" + integrity sha512-btg0Y7joiHUCy0AVIbIdv7XuXddfZ7AHvHlEHZnBhspTxBAuxYaQp4ksEWa0hrLfrJQr9R4sPpz2LtcPypMGHA== dependencies: - scheduler "0.25.0-beta-6946ebe620-20240508" + scheduler "0.25.0-rc-915b914b3a-20240515" react-refresh@^0.10.0: version "0.10.0" @@ -9092,13 +9085,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-6946ebe620-20240508: - version "19.0.0-beta-6946ebe620-20240508" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-beta-6946ebe620-20240508.tgz#818f49cc562b2fddc9d6cc3db5adea3310b857c6" - integrity sha512-ogmcK2gkAKC5Fq6+kSQ+xQKdOld2y2N9KnOEwTh36B3MOOD/vyKFfXkxjUqIan0pKEwUvPSgkfpdn+lo9hOQ5g== +react-test-renderer@19.0.0-rc-915b914b3a-20240515: + version "19.0.0-rc-915b914b3a-20240515" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-rc-915b914b3a-20240515.tgz#1e6dc5f53042cf4cd62721b4d08ac0a3d4f4dccb" + integrity sha512-IgyR9ZMJceFkGCMvhV3E+aZEHuXvUmmA5DQzkaksdm9JPkP2q1bbAFyZBFIJ2fFr5HZJVmxMqyc5LxPcq4Qk6g== dependencies: - react-is "19.0.0-beta-6946ebe620-20240508" - scheduler "0.25.0-beta-6946ebe620-20240508" + react-is "19.0.0-rc-915b914b3a-20240515" + scheduler "0.25.0-rc-915b914b3a-20240515" react-use-measure@^2.1.1: version "2.1.1" @@ -9112,15 +9105,10 @@ react-use-refs@^1.0.1: resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== -react@19.0.0-beta-6946ebe620-20240508: - version "19.0.0-beta-6946ebe620-20240508" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-6946ebe620-20240508.tgz#c46ce6118913346d857e1ab8566fb356f3439425" - integrity sha512-oopuXTmA4olWtL8p3jAobiFvYsljLkzAQL21YVc44qjz32WtGmbKFHYSe1EL6Dy/v8PEWlaGBQssJPv5RFVQcw== - -react@19.0.0-beta-94eed63c49-20240425: - version "19.0.0-beta-94eed63c49-20240425" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-beta-94eed63c49-20240425.tgz#7b30b64c9b3517240d47ac00184ae2d59554bb9b" - integrity sha512-BPPKh5bZwcpw/Dgfh3A0MoU1GSl2edR2JggCq3QPdghQsrFg1aBuMkul5YB4rpII400RYq9VC5eF5Nm3spx0gA== +react@19.0.0-rc-915b914b3a-20240515: + version "19.0.0-rc-915b914b3a-20240515" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-915b914b3a-20240515.tgz#4542c3da2227de3f426d314e7065766de220a0af" + integrity sha512-/XKPm2pbDBheMbNUV/uRoL0/RZXg+CCyen3YBjDetySqGZjsRBQKKtK9sWMjQO8J6y8PoC02HzjAP4/OQ2Wmow== read-pkg-up@^7.0.1: version "7.0.1" @@ -9506,15 +9494,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@0.25.0-beta-6946ebe620-20240508: - version "0.25.0-beta-6946ebe620-20240508" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-6946ebe620-20240508.tgz#a09f28879c076952033727b9644bcc3bf699099d" - integrity sha512-g4Lk1FLKQzMXms4675kO5c+D05d2Rol4QlCqoWuBUaMdON8xI0/eDXbVgQoq0EgOa1QWAGNBSrQ3DUT0r/LXNw== - -scheduler@0.25.0-beta-94eed63c49-20240425: - version "0.25.0-beta-94eed63c49-20240425" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-beta-94eed63c49-20240425.tgz#db261000b28fa56d65fff2e9c17eb7bd094a669a" - integrity sha512-U8hoOV7uut5E8cMvRSMikEBBqLXfv2BpdxUsG45euaOfnqEgFrCdLLh6ydM+YBJ36+28olXMNmK2PFFzeg4UdQ== +scheduler@0.25.0-rc-915b914b3a-20240515: + version "0.25.0-rc-915b914b3a-20240515" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-915b914b3a-20240515.tgz#31e542d20dcdf4e71c00379318314e34b1a0fa5a" + integrity sha512-NeqcaiiRfnXjrrtI8CxyU9FlT9UTdRvpSCy/fnAK+hwwrMjk6BhtCmdziCOkCat5bI3p6uUIwR2NNCK2F/1bZg== scheduler@^0.21.0: version "0.21.0" From 2c267dcdf369f285f9f65bb35a23d5c55ea75a55 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 15 May 2024 14:34:34 -0500 Subject: [PATCH 218/252] fix(types): add shell types for react-reconciler changes (#3242) --- packages/fiber/src/core/reconciler.tsx | 114 +++++++++++++++++++++++-- 1 file changed, 106 insertions(+), 8 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 06d05f2522..cd8ebc7168 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -2,7 +2,6 @@ import * as THREE from 'three' import * as React from 'react' import Reconciler from 'react-reconciler' import { - // @ts-expect-error NoEventPriority, ContinuousEventPriority, DiscreteEventPriority, @@ -23,6 +22,103 @@ import type { RootStore } from './store' import { removeInteractivity, type EventHandlers } from './events' import type { ThreeElement } from '../three-types' +// TODO: upstream to DefinitelyTyped for React 19 +// https://github.com/facebook/react/issues/28956 +type EventPriority = number + +const createReconciler = Reconciler as unknown as < + 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 + // 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 + + /** + * 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 + +declare module 'react-reconciler/constants' { + const NoEventPriority = 0 +} + export interface Root { fiber: Reconciler.FiberRoot store: RootStore @@ -77,12 +173,13 @@ interface HostConfig { textInstance: void suspenseInstance: Instance hydratableInstance: never + formInstance: never publicInstance: Instance['object'] hostContext: {} - updatePayload: null | [true] | [false, Instance['props']] // NOTE: removed with React 19 childSet: never timeoutHandle: number | undefined noTimeout: -1 + TransitionStatus: null } export const catalogue: Catalogue = {} @@ -370,7 +467,7 @@ const NO_CONTEXT: HostConfig['hostContext'] = {} let currentUpdatePriority: number = NoEventPriority -export const reconciler = Reconciler< +export const reconciler = createReconciler< HostConfig['type'], HostConfig['props'], HostConfig['container'], @@ -378,12 +475,13 @@ export const reconciler = Reconciler< HostConfig['textInstance'], HostConfig['suspenseInstance'], HostConfig['hydratableInstance'], + HostConfig['formInstance'], HostConfig['publicInstance'], HostConfig['hostContext'], - HostConfig['updatePayload'], HostConfig['childSet'], HostConfig['timeoutHandle'], - HostConfig['noTimeout'] + HostConfig['noTimeout'], + HostConfig['TransitionStatus'] >({ isPrimaryRenderer: false, warnsIfNotActing: false, @@ -417,7 +515,6 @@ export const reconciler = Reconciler< }, getRootHostContext: () => NO_CONTEXT, getChildHostContext: () => NO_CONTEXT, - // @ts-expect-error prepareUpdate and updatePayload removed with React 19 commitUpdate( instance: HostConfig['instance'], type: HostConfig['type'], @@ -466,8 +563,8 @@ export const reconciler = Reconciler< beforeActiveInstanceBlur() {}, afterActiveInstanceBlur() {}, detachDeletedInstance() {}, - // TODO: add shell types for these and upstream to DefinitelyTyped - // https://github.com/facebook/react/blob/main/packages/react-art/src/ReactFiberConfigART.js + prepareScopeUpdate() {}, + getInstanceFromScope: () => null, shouldAttemptEagerTransition() { return false }, @@ -512,4 +609,5 @@ export const reconciler = Reconciler< return DefaultEventPriority } }, + resetFormInstance() {}, }) From 1db781dce8cb8cfca85a12fc13b98339f09b6445 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 21 May 2024 13:04:35 -0500 Subject: [PATCH 219/252] fix: don't set initial frustum for manual camera --- packages/fiber/src/core/renderer.tsx | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 7be30c8a0f..e6e7968b70 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -281,15 +281,17 @@ export function createRoot( applyProps(camera, cameraOptions as any) // Preserve user-defined frustum if possible // https://github.com/pmndrs/react-three-fiber/issues/3160 - if ( - 'aspect' in cameraOptions || - 'left' in cameraOptions || - 'right' in cameraOptions || - 'bottom' in cameraOptions || - 'top' in cameraOptions - ) { - ;(camera as any).manual = true - camera.updateProjectionMatrix() + if (!(camera as any).manual) { + if ( + 'aspect' in cameraOptions || + 'left' in cameraOptions || + 'right' in cameraOptions || + 'bottom' in cameraOptions || + 'top' in cameraOptions + ) { + ;(camera as any).manual = true + camera.updateProjectionMatrix() + } } } // Always look at center by default From 566c66062b6713d319172745b6a339107b3c204b Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 21 May 2024 22:27:03 -0500 Subject: [PATCH 220/252] fix(createPortal): preserve injected state --- packages/fiber/src/core/renderer.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index e6e7968b70..f3b084b47d 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -557,7 +557,7 @@ function Portal({ state = {}, children, container }: PortalProps): React.JSX.Ele const [pointer] = React.useState(() => new THREE.Vector2()) const inject = useMutableCallback((rootState: RootState, injectState: RootState) => { - let viewport + let viewport = undefined if (injectState.camera && size) { const camera = injectState.camera // Calculate the override viewport, if present @@ -569,8 +569,7 @@ function Portal({ state = {}, children, container }: PortalProps): React.JSX.Ele return { // The intersect consists of the previous root state ...rootState, - get: injectState.get, - set: injectState.set, + ...injectState, // Portals have their own scene, which forms the root, a raycaster and a pointer scene: container as THREE.Scene, raycaster, @@ -589,6 +588,7 @@ function Portal({ state = {}, children, container }: PortalProps): React.JSX.Ele }) const usePortalStore = React.useMemo(() => { + // Create a mirrored store, based on the previous root with a few overrides ... const store = createWithEqualityFn((set, get) => ({ ...rest, set, get } as RootState)) // Subscribe to previous root-state and copy changes over to the mirrored portal-state From 09637a23ac28c50d5e182494cb9b91c62879c02a Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 21 May 2024 22:29:51 -0500 Subject: [PATCH 221/252] RELEASING: Releasing 2 package(s) Releases: @react-three/fiber@9.0.0-alpha.7 @react-three/test-renderer@9.0.0-alpha.7 [skip ci] --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index d4a38dbe65..dd9ebf0060 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.6", + "version": "9.0.0-alpha.7", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 050df7df41..3c59694c53 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-alpha.6", + "version": "9.0.0-alpha.7", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-alpha.6", + "@react-three/fiber": "9.0.0-alpha.7", "three": ">=0.141" } } From b1b0198f9b81202c8cc7c58e4f956fef393bc4a4 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 25 May 2024 14:29:14 -0500 Subject: [PATCH 222/252] chore: update rc --- example/package.json | 4 +-- package.json | 6 ++-- packages/fiber/package.json | 4 +-- yarn.lock | 56 ++++++++++++++++++------------------- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/example/package.json b/example/package.json index cac4f80e88..d0c2ab150c 100644 --- a/example/package.json +++ b/example/package.json @@ -11,8 +11,8 @@ "@react-spring/three": "^9.7.3", "@react-three/drei": "^9.105.5", "@use-gesture/react": "latest", - "react": "19.0.0-rc-915b914b3a-20240515", - "react-dom": "19.0.0-rc-915b914b3a-20240515", + "react": "19.0.0-rc-935180c7e0-20240524", + "react-dom": "19.0.0-rc-935180c7e0-20240524", "react-use-refs": "^1.0.1", "three": "^0.160.0", "three-stdlib": "^2.29.9", diff --git a/package.json b/package.json index 8cb6bb3974..1db207aef8 100644 --- a/package.json +++ b/package.json @@ -76,10 +76,10 @@ "lint-staged": "^12.3.7", "prettier": "^2.6.1", "pretty-quick": "^3.1.3", - "react": "19.0.0-rc-915b914b3a-20240515", - "react-dom": "19.0.0-rc-915b914b3a-20240515", + "react": "19.0.0-rc-935180c7e0-20240524", + "react-dom": "19.0.0-rc-935180c7e0-20240524", "react-native": "0.69.3", - "react-test-renderer": "19.0.0-rc-915b914b3a-20240515", + "react-test-renderer": "19.0.0-rc-935180c7e0-20240524", "three": "^0.141.0", "three-stdlib": "^2.13.0", "ts-jest": "^29.1.2", diff --git a/packages/fiber/package.json b/packages/fiber/package.json index dd9ebf0060..744405795a 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -47,9 +47,9 @@ "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^1.2.5", - "react-reconciler": "0.31.0-rc-915b914b3a-20240515", + "react-reconciler": "0.31.0-rc-935180c7e0-20240524", "react-use-measure": "^2.1.1", - "scheduler": "0.25.0-rc-915b914b3a-20240515", + "scheduler": "0.25.0-rc-935180c7e0-20240524", "suspend-react": "^0.1.3", "zustand": "^4.1.2" }, diff --git a/yarn.lock b/yarn.lock index 4f70058766..b2d54cf8a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8974,17 +8974,17 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" -react-dom@19.0.0-rc-915b914b3a-20240515: - version "19.0.0-rc-915b914b3a-20240515" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-915b914b3a-20240515.tgz#01d92b86fe37aa673da22fdd789ed24ff1248026" - integrity sha512-Njv9p2b7/3ZEk7hcWAzgxbLfYbYJfI01bwI0V+a1WKbhhxwth1o2mQejIsUtnDwkXZ34Oej8rIY5Z93pUfSCdQ== +react-dom@19.0.0-rc-935180c7e0-20240524: + version "19.0.0-rc-935180c7e0-20240524" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-935180c7e0-20240524.tgz#47e1a2f87fc9e27de50a72840e0b71f42effabf6" + integrity sha512-17SL+9qxiLUZnaBWr+mO3hpz5ncP5NbJp6jnbA6cFbsWNdV3p4s8iMVALIcfZF1zPIiWQeYrZQK/Z8GY3xjihg== dependencies: - scheduler "0.25.0-rc-915b914b3a-20240515" + scheduler "0.25.0-rc-935180c7e0-20240524" -react-is@19.0.0-rc-915b914b3a-20240515: - version "19.0.0-rc-915b914b3a-20240515" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-rc-915b914b3a-20240515.tgz#2967f33ca8b66746a0b50ac63b1d8e104fafada2" - integrity sha512-rSje5quK1l2qD4AvOWK7evWh4AQnXPNzpv7plZqnbl/oS4AEIT/FsZauyoLRMzXyleGXPJY0xnMnNXhPN+5HRw== +react-is@19.0.0-rc-935180c7e0-20240524: + version "19.0.0-rc-935180c7e0-20240524" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-rc-935180c7e0-20240524.tgz#be584496b91087fde1b3144192a3bf869a85e2bb" + integrity sha512-qXK31jhhFSbr1NqdflxXgp90oJzjwefw5XOCRkoT2dY9ny8vMkWegyVfgloFTJtzgYgs0dFzPz1MSVMAwia7GA== "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: version "18.2.0" @@ -9055,12 +9055,12 @@ react-native@0.69.3: whatwg-fetch "^3.0.0" ws "^6.1.4" -react-reconciler@0.31.0-rc-915b914b3a-20240515: - version "0.31.0-rc-915b914b3a-20240515" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc-915b914b3a-20240515.tgz#00d9333185f1ac35edc280795d88aebfdf34a9d2" - integrity sha512-btg0Y7joiHUCy0AVIbIdv7XuXddfZ7AHvHlEHZnBhspTxBAuxYaQp4ksEWa0hrLfrJQr9R4sPpz2LtcPypMGHA== +react-reconciler@0.31.0-rc-935180c7e0-20240524: + version "0.31.0-rc-935180c7e0-20240524" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc-935180c7e0-20240524.tgz#2ceed9744e9a7e0119155993f5672e0914e211ce" + integrity sha512-qM2ilapJ/g050GdXEzy3SzbkGhw7Odda6Js6w/3sVBYcdbFYyfsJp5b/Y/o6v7hISAa2e1HNQ7sus/p4u8XD0Q== dependencies: - scheduler "0.25.0-rc-915b914b3a-20240515" + scheduler "0.25.0-rc-935180c7e0-20240524" react-refresh@^0.10.0: version "0.10.0" @@ -9085,13 +9085,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-rc-915b914b3a-20240515: - version "19.0.0-rc-915b914b3a-20240515" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-rc-915b914b3a-20240515.tgz#1e6dc5f53042cf4cd62721b4d08ac0a3d4f4dccb" - integrity sha512-IgyR9ZMJceFkGCMvhV3E+aZEHuXvUmmA5DQzkaksdm9JPkP2q1bbAFyZBFIJ2fFr5HZJVmxMqyc5LxPcq4Qk6g== +react-test-renderer@19.0.0-rc-935180c7e0-20240524: + version "19.0.0-rc-935180c7e0-20240524" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-rc-935180c7e0-20240524.tgz#cb227ebf0ff40bfa7d177a138bf70ca827f9c974" + integrity sha512-lBhhLO5viTRkh1AgWbCsaLLqn5L8c0ssCe7EzdE3BbuqzGxgFkuJM4RyDqgByfw7S7+TvhOcnXtsNKn6ykh/ag== dependencies: - react-is "19.0.0-rc-915b914b3a-20240515" - scheduler "0.25.0-rc-915b914b3a-20240515" + react-is "19.0.0-rc-935180c7e0-20240524" + scheduler "0.25.0-rc-935180c7e0-20240524" react-use-measure@^2.1.1: version "2.1.1" @@ -9105,10 +9105,10 @@ react-use-refs@^1.0.1: resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== -react@19.0.0-rc-915b914b3a-20240515: - version "19.0.0-rc-915b914b3a-20240515" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-915b914b3a-20240515.tgz#4542c3da2227de3f426d314e7065766de220a0af" - integrity sha512-/XKPm2pbDBheMbNUV/uRoL0/RZXg+CCyen3YBjDetySqGZjsRBQKKtK9sWMjQO8J6y8PoC02HzjAP4/OQ2Wmow== +react@19.0.0-rc-935180c7e0-20240524: + version "19.0.0-rc-935180c7e0-20240524" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-935180c7e0-20240524.tgz#6403d07b38f0cb8cdb7eadbe0e8226a13a4e0730" + integrity sha512-UDaKY7FXO4A2tg4srdLTlkdj5WQCKS9JSrqs21qQvyD4s4qwm3sah5zhfnDHBumzZ3f+PVTcF9PrfDnmu/qKpA== read-pkg-up@^7.0.1: version "7.0.1" @@ -9494,10 +9494,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@0.25.0-rc-915b914b3a-20240515: - version "0.25.0-rc-915b914b3a-20240515" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-915b914b3a-20240515.tgz#31e542d20dcdf4e71c00379318314e34b1a0fa5a" - integrity sha512-NeqcaiiRfnXjrrtI8CxyU9FlT9UTdRvpSCy/fnAK+hwwrMjk6BhtCmdziCOkCat5bI3p6uUIwR2NNCK2F/1bZg== +scheduler@0.25.0-rc-935180c7e0-20240524: + version "0.25.0-rc-935180c7e0-20240524" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-935180c7e0-20240524.tgz#f07f6d7a18effbbde008da638380507f2037e964" + integrity sha512-YfkorLQDTfVArSlFsSmTFMWW2CoUtNhkveeEzfbyqi5bShsEyQxAPLBGOUoBxaXEcQSJ2bXhkz3ZSTJCO/Th8A== scheduler@^0.21.0: version "0.21.0" From 00d4f0f36867e1759211cec7db728f8025e9476d Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 25 May 2024 14:55:42 -0500 Subject: [PATCH 223/252] fix: use new ref signature --- packages/fiber/src/core/reconciler.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index cd8ebc7168..0ceda24e3d 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -396,8 +396,14 @@ function removeChild( function setFiberInstance(fiber: Reconciler.Fiber | null, instance: HostConfig['instance']): void { if (fiber !== null) { fiber.stateNode = instance - if (typeof fiber.ref === 'function') fiber.ref(instance.object) - else if (fiber.ref) fiber.ref.current = instance.object + if (typeof fiber.ref === 'function') { + // @ts-expect-error + fiber.refCleanup?.() + // @ts-expect-error + fiber.refCleanup = fiber.ref(instance.object) + } else if (fiber.ref) { + fiber.ref.current = instance.object + } } } From 486ba41cb07d4cde01198dacb4627b83b1c38a82 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 25 May 2024 22:48:05 -0500 Subject: [PATCH 224/252] [v9] fix: swap instances in reverse (#3272) --- packages/fiber/src/core/reconciler.tsx | 231 ++++++++++-------- .../__snapshots__/RTTR.core.test.tsx.snap | 14 +- 2 files changed, 133 insertions(+), 112 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 0ceda24e3d..8ebf7d757c 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -26,6 +26,8 @@ import type { ThreeElement } from '../three-types' // https://github.com/facebook/react/issues/28956 type EventPriority = number +type Fiber = Omit & { refCleanup: null | (() => void); alternate: Fiber | null } + const createReconciler = Reconciler as unknown as < Type, Props, @@ -162,7 +164,6 @@ export interface Instance { attach?: AttachType previousAttach?: any isHidden: boolean - autoRemovedBeforeAppend?: boolean } interface HostConfig { @@ -201,12 +202,7 @@ export const extend = ( } } -function createInstance( - type: string, - props: HostConfig['props'], - root: RootStore, - flushPrimitive = true, -): HostConfig['instance'] { +function validateInstance(type: string, props: HostConfig['props']): void { // Get target from catalogue const name = `${type[0].toUpperCase()}${type.slice(1)}` const target = catalogue[name] @@ -222,14 +218,15 @@ function createInstance( // Throw if an object or literal was passed for args if (props.args !== undefined && !Array.isArray(props.args)) throw new Error('R3F: The args prop must be an array!') +} - // Regenerate the R3F instance for primitives to simulate a new object - if (flushPrimitive && type === 'primitive' && props.object?.__r3f) delete props.object.__r3f +function createInstance(type: string, props: HostConfig['props'], root: RootStore): HostConfig['instance'] { + validateInstance(type, props) - // Create instance - const instance = prepare(props.object, root, type, props) + // Regenerate the R3F instance for primitives to simulate a new object + if (type === 'primitive' && props.object?.__r3f) delete props.object.__r3f - return instance + return prepare(props.object, root, type, props) } function hideInstance(instance: HostConfig['instance']): void { @@ -330,20 +327,34 @@ function insertBefore( handleContainerEffects(parent, child, beforeChild) } +function disposeOnIdle(object: any) { + if (typeof object.dispose === 'function') { + const handleDispose = () => { + try { + object.dispose() + } catch { + // no-op + } + } + + // In a testing environment, cleanup immediately + if (typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined') handleDispose() + // Otherwise, using a real GPU so schedule cleanup to prevent stalls + else scheduleCallback(idlePriority, handleDispose) + } +} + function removeChild( parent: HostConfig['instance'], child: HostConfig['instance'] | HostConfig['textInstance'], dispose?: boolean, - recursive?: boolean, ) { if (!child) return // Unlink instances child.parent = null - if (recursive === undefined) { - const childIndex = parent.children.indexOf(child) - if (childIndex !== -1) parent.children.splice(childIndex, 1) - } + const childIndex = parent.children.indexOf(child) + if (childIndex !== -1) parent.children.splice(childIndex, 1) // Eagerly tear down tree if (child.props.attach) { @@ -357,10 +368,11 @@ function removeChild( const shouldDispose = child.props.dispose !== null && dispose !== false // Recursively remove instance children - if (recursive !== false) { - for (const node of child.children) removeChild(child, node, shouldDispose, true) - child.children.length = 0 + for (let i = child.children.length - 1; i >= 0; i--) { + const node = child.children[i] + removeChild(child, node, shouldDispose) } + child.children.length = 0 // Unlink instance object delete child.object.__r3f @@ -372,97 +384,98 @@ function removeChild( // - cannot be a // - cannot be a THREE.Scene, because three has broken its own API if (shouldDispose && child.type !== 'primitive' && child.object.type !== 'Scene') { - if (typeof child.object.dispose === 'function') { - const dispose = child.object.dispose.bind(child.object) - const handleDispose = () => { - try { - dispose() - } catch (e) { - // no-op - } - } - - // In a testing environment, cleanup immediately - if (typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined') handleDispose() - // Otherwise, using a real GPU so schedule cleanup to prevent stalls - else scheduleCallback(idlePriority, handleDispose) - } + disposeOnIdle(child.object) } // Tree was updated, request a frame for top-level instance if (dispose === undefined) invalidateInstance(child) } -function setFiberInstance(fiber: Reconciler.Fiber | null, instance: HostConfig['instance']): void { - if (fiber !== null) { - fiber.stateNode = instance - if (typeof fiber.ref === 'function') { - // @ts-expect-error - fiber.refCleanup?.() - // @ts-expect-error - fiber.refCleanup = fiber.ref(instance.object) - } else if (fiber.ref) { - fiber.ref.current = instance.object +function setFiberRef(fiber: Fiber, publicInstance: HostConfig['publicInstance']): void { + for (const _fiber of [fiber, fiber.alternate]) { + if (_fiber !== null) { + if (typeof _fiber.ref === 'function') { + _fiber.refCleanup?.() + const cleanup = _fiber.ref(publicInstance) + if (typeof cleanup === 'function') _fiber.refCleanup = cleanup + } else if (_fiber.ref) { + _fiber.ref.current = publicInstance + } } } } -function switchInstance( - oldInstance: HostConfig['instance'], - type: HostConfig['type'], - props: HostConfig['props'], - fiber: Reconciler.Fiber, -) { - // If the old instance is hidden, we need to unhide it. - // React assumes it can discard instances since they're pure for DOM. - // This isn't true for us since our lifetimes are impure and longliving. - // So, we manually check if an instance was hidden and unhide it. - if (oldInstance.isHidden) unhideInstance(oldInstance) - - // Create a new instance - const newInstance = createInstance(type, props, oldInstance.root, false) - - // Update attach props for primitives since we don't flush them - if (type === 'primitive') { - newInstance.props.attach = props.attach - } +const reconstructed: [oldInstance: HostConfig['instance'], props: HostConfig['props'], fiber: Fiber][] = [] + +function swapInstances(): void { + // Detach instance + for (const [instance] of reconstructed) { + const parent = instance.parent + if (parent) { + if (instance.props.attach) { + detach(parent, instance) + } else if (isObject3D(instance.object) && isObject3D(parent.object)) { + parent.object.remove(instance.object) + } - // Move children to new instance - for (const child of oldInstance.children) { - removeChild(oldInstance, child, false, false) - appendChild(newInstance, child) + for (const child of instance.children) { + if (child.props.attach) { + detach(instance, child) + } else if (isObject3D(child.object) && isObject3D(instance.object)) { + instance.object.remove(child.object) + } + } + } + + // If the old instance is hidden, we need to unhide it. + // React assumes it can discard instances since they're pure for DOM. + // This isn't true for us since our lifetimes are impure and longliving. + // So, we manually check if an instance was hidden and unhide it. + if (instance.isHidden) unhideInstance(instance) + + // Dispose of old object if able + if (instance.object.__r3f) delete instance.object.__r3f + if (instance.type !== 'primitive') disposeOnIdle(instance.object) } - oldInstance.children.length = 0 - // Link up new instance - const parent = oldInstance.parent - if (parent) { - // Manually handle replace https://github.com/pmndrs/react-three-fiber/pull/2680 + // Update instance + for (const [instance, props, fiber] of reconstructed) { + instance.props = props - newInstance.autoRemovedBeforeAppend = !!newInstance.parent + const parent = instance.parent + if (parent) { + // Get target from catalogue + const name = `${instance.type[0].toUpperCase()}${instance.type.slice(1)}` + const target = catalogue[name] - if (!oldInstance.autoRemovedBeforeAppend) removeChild(parent, oldInstance) - appendChild(parent, newInstance) + // Create object + instance.object = instance.props.object ?? new target(...(instance.props.args ?? [])) + instance.object.__r3f = instance + setFiberRef(fiber, instance.object) - // if (!oldInstance.autoRemovedBeforeAppend) { - // insertBefore(parent, newInstance, oldInstance) - // removeChild(parent, oldInstance) - // } else { - // appendChild(parent, newInstance) - // } - } + // Set initial props + applyProps(instance.object, instance.props) - // This evil hack switches the react-internal fiber instance - // https://github.com/facebook/react/issues/14983 - // TODO: investigate scheduling key prop change instead of switchInstance entirely - // https://github.com/facebook/react/pull/15021#issuecomment-480185369 - setFiberInstance(fiber, newInstance) - setFiberInstance(fiber.alternate, newInstance) + if (instance.props.attach) { + attach(parent, instance) + } else if (isObject3D(instance.object) && isObject3D(parent.object)) { + parent.object.add(instance.object) + } - // Tree was updated, request a frame - invalidateInstance(newInstance) + for (const child of instance.children) { + if (child.props.attach) { + attach(instance, child) + } else if (isObject3D(child.object) && isObject3D(instance.object)) { + instance.object.add(child.object) + } + } - return newInstance + // Tree was updated, request a frame + invalidateInstance(instance) + } + } + + reconstructed.length = 0 } // Don't handle text instances, warn on undefined behavior @@ -473,6 +486,10 @@ const NO_CONTEXT: HostConfig['hostContext'] = {} let currentUpdatePriority: number = NoEventPriority +// https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberFlags.js +const NoFlags = 0 +const Update = 4 + export const reconciler = createReconciler< HostConfig['type'], HostConfig['props'], @@ -494,9 +511,7 @@ export const reconciler = createReconciler< supportsMutation: true, supportsPersistence: false, supportsHydration: false, - createInstance(type, props, root) { - return createInstance(type, props, root) - }, + createInstance, removeChild, appendChild, appendInitialChild: appendChild, @@ -526,28 +541,34 @@ export const reconciler = createReconciler< type: HostConfig['type'], oldProps: HostConfig['props'], newProps: HostConfig['props'], - fiber: any, + fiber: Fiber, ) { + validateInstance(type, newProps) + let reconstruct = false // Reconstruct primitives if object prop changes if (instance.type === 'primitive' && oldProps.object !== newProps.object) reconstruct = true - // Reconstruct instance if args was changed to an invalid value - else if (newProps.args !== undefined && !Array.isArray(newProps.args)) reconstruct = true // Reconstruct instance if args were added or removed else if (newProps.args?.length !== oldProps.args?.length) reconstruct = true // Reconstruct instance if args were changed else if (newProps.args?.some((value, index) => value !== oldProps.args?.[index])) reconstruct = true // Reconstruct when args or false, commitMount() {}, diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index 6d7b8f81dc..6832a2d939 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -386,13 +386,6 @@ Array [ }, Object { "children": Array [ - Object { - "children": Array [], - "props": Object { - "attach": "material", - }, - "type": "meshBasicMaterial", - }, Object { "children": Array [], "props": Object { @@ -404,6 +397,13 @@ Array [ }, "type": "boxGeometry", }, + Object { + "children": Array [], + "props": Object { + "attach": "material", + }, + "type": "meshBasicMaterial", + }, ], "props": Object { "position-x": 12, From b0b2a1fd41a17e5ded17ad344e78050cfc6c92e1 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Sat, 25 May 2024 23:20:54 -0700 Subject: [PATCH 225/252] fix: color types --- packages/fiber/src/three-types.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 82a02f4e87..e43a0c1225 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -15,8 +15,9 @@ export interface MathRepresentation { export interface VectorRepresentation extends MathRepresentation { setScalar(s: number): any } +export type MathTypes = MathRepresentation | THREE.Euler | THREE.Color -export type MathType = T extends THREE.Color +export type MathType = T extends THREE.Color ? Args | THREE.ColorRepresentation : T extends VectorRepresentation | THREE.Layers | THREE.Euler ? T | Parameters | number @@ -32,7 +33,9 @@ export type Euler = MathType export type Matrix3 = MathType export type Matrix4 = MathType -export type WithMathProps

    = { [K in keyof P]: P[K] extends MathRepresentation | THREE.Euler ? MathType : P[K] } +export type WithMathProps

    = { + [K in keyof P]: P[K] extends MathTypes ? MathType : P[K] +} export interface RaycastableRepresentation { raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void From b355536d14ce230b4edc7d3f9928ae3332ee1e0e Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 04:40:19 -0500 Subject: [PATCH 226/252] chore: update snapshot --- packages/fiber/tests/__snapshots__/index.test.tsx.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 5c2aaab5bd..8781c51628 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -39,6 +39,7 @@ Array [ "LoaderResult", "MathRepresentation", "MathType", + "MathTypes", "Matrix3", "Matrix4", "Mutable", From fad0496efd2ef89530be501dc4ce30f3e5247ede Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 05:09:12 -0500 Subject: [PATCH 227/252] chore(types): cleanup --- packages/fiber/src/core/events.ts | 3 +- packages/fiber/src/core/renderer.tsx | 3 +- packages/fiber/src/core/utils.tsx | 5 +++ packages/fiber/src/three-types.ts | 37 +++++++++---------- .../tests/__snapshots__/index.test.tsx.snap | 11 ------ 5 files changed, 25 insertions(+), 34 deletions(-) diff --git a/packages/fiber/src/core/events.ts b/packages/fiber/src/core/events.ts index 2854b0372d..f7e2a767a3 100644 --- a/packages/fiber/src/core/events.ts +++ b/packages/fiber/src/core/events.ts @@ -1,8 +1,7 @@ import * as THREE from 'three' -import { getRootState } from './utils' +import { type Properties, getRootState } from './utils' import type { Instance } from './reconciler' import type { RootState, RootStore } from './store' -import type { Properties } from '../three-types' export interface Intersection extends THREE.Intersection { /** The event source (the object which registered the handler) */ diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index 736df94d28..d6231b6827 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { ConcurrentRoot } from 'react-reconciler/constants' import { createWithEqualityFn } from 'zustand/traditional' -import type { Properties, ThreeElement } from '../three-types' +import type { ThreeElement } from '../three-types' import { Renderer, createStore, @@ -20,6 +20,7 @@ import { reconciler, Root } from './reconciler' import { invalidate, advance } from './loop' import { EventManager, ComputeFunction } from './events' import { + type Properties, is, dispose, calculateDpr, diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 78b6cb5351..7b21eb75ee 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -6,6 +6,11 @@ import type { Fiber } from 'react-reconciler' import type { EventHandlers } from './events' import type { Dpr, Renderer, RootStore, Size } from './store' +export type NonFunctionKeys

    = { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] +export type Overwrite = Omit> & O +export type Properties = Pick> +export type Mutable

    = { [K in keyof P]: P[K] | Readonly } + /** * Returns the instance's initial (outmost) root. */ diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index e43a0c1225..981d084086 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -3,26 +3,27 @@ import type {} from 'react' import type {} from 'react/jsx-runtime' import type {} from 'react/jsx-dev-runtime' import type { Args, EventHandlers, InstanceProps, ConstructorRepresentation } from './core' +import type { Overwrite, Mutable } from './core/utils' -type NonFunctionKeys

    = { [K in keyof P]-?: P[K] extends Function ? never : K }[keyof P] -export type Overwrite = Omit> & O -export type Properties = Pick> -export type Mutable

    = { [K in keyof P]: P[K] | Readonly } - -export interface MathRepresentation { - set(...args: number[]): any +interface MathRepresentation { + set(...args: any[]): any } -export interface VectorRepresentation extends MathRepresentation { - setScalar(s: number): any +interface VectorRepresentation extends MathRepresentation { + setScalar(value: number): any } -export type MathTypes = MathRepresentation | THREE.Euler | THREE.Color -export type MathType = T extends THREE.Color +export type MathType = T extends THREE.Color ? Args | THREE.ColorRepresentation : T extends VectorRepresentation | THREE.Layers | THREE.Euler ? T | Parameters | number : T | Parameters +type MathProps

    = { + [K in keyof P as P[K] extends MathRepresentation ? K : never]: P[K] extends MathRepresentation + ? MathType + : never +} + export type Vector2 = MathType export type Vector3 = MathType export type Vector4 = MathType @@ -33,23 +34,19 @@ export type Euler = MathType export type Matrix3 = MathType export type Matrix4 = MathType -export type WithMathProps

    = { - [K in keyof P]: P[K] extends MathTypes ? MathType : P[K] -} - -export interface RaycastableRepresentation { +interface RaycastableRepresentation { raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void } -export type EventProps

    = P extends RaycastableRepresentation ? Partial : {} +type EventProps

    = P extends RaycastableRepresentation ? Partial : {} -export interface ReactProps

    { +interface ReactProps

    { children?: React.ReactNode ref?: React.Ref

    key?: React.Key } -export type ElementProps> = Partial< - Overwrite, ReactProps

    & EventProps

    > +type ElementProps> = Partial< + Overwrite & ReactProps

    & EventProps

    > > export type ThreeElement = Mutable< diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 8781c51628..ec6afa6a52 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -17,11 +17,9 @@ Array [ "Disposable", "DomEvent", "Dpr", - "ElementProps", "Euler", "EventHandlers", "EventManager", - "EventProps", "Events", "Extensions", "FilterFunction", @@ -37,20 +35,13 @@ Array [ "Loader", "LoaderProto", "LoaderResult", - "MathRepresentation", "MathType", - "MathTypes", "Matrix3", "Matrix4", - "Mutable", "ObjectMap", - "Overwrite", "Performance", - "Properties", "Props", "Quaternion", - "RaycastableRepresentation", - "ReactProps", "ReactThreeFiber", "ReconcilerRoot", "RenderCallback", @@ -66,9 +57,7 @@ Array [ "Vector2", "Vector3", "Vector4", - "VectorRepresentation", "Viewport", - "WithMathProps", "XRManager", "_roots", "act", From 5ac7a71320a1874d9f7873ad57ca3cd6329d95da Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 05:12:15 -0500 Subject: [PATCH 228/252] fix: export constraint types --- packages/fiber/src/three-types.ts | 6 +++--- packages/fiber/tests/__snapshots__/index.test.tsx.snap | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index 981d084086..cd2d99c87d 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -5,10 +5,10 @@ import type {} from 'react/jsx-dev-runtime' import type { Args, EventHandlers, InstanceProps, ConstructorRepresentation } from './core' import type { Overwrite, Mutable } from './core/utils' -interface MathRepresentation { +export interface MathRepresentation { set(...args: any[]): any } -interface VectorRepresentation extends MathRepresentation { +export interface VectorRepresentation extends MathRepresentation { setScalar(value: number): any } @@ -34,7 +34,7 @@ export type Euler = MathType export type Matrix3 = MathType export type Matrix4 = MathType -interface RaycastableRepresentation { +export interface RaycastableRepresentation { raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void } type EventProps

    = P extends RaycastableRepresentation ? Partial : {} diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index ec6afa6a52..a5c247d1ce 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -35,6 +35,7 @@ Array [ "Loader", "LoaderProto", "LoaderResult", + "MathRepresentation", "MathType", "Matrix3", "Matrix4", @@ -42,6 +43,7 @@ Array [ "Performance", "Props", "Quaternion", + "RaycastableRepresentation", "ReactThreeFiber", "ReconcilerRoot", "RenderCallback", @@ -57,6 +59,7 @@ Array [ "Vector2", "Vector3", "Vector4", + "VectorRepresentation", "Viewport", "XRManager", "_roots", From c2c6169d2a0302e1897520de70d83ed1e058cb63 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 05:13:38 -0500 Subject: [PATCH 229/252] fix: restore exports --- packages/fiber/src/three-types.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index cd2d99c87d..ede2fe761a 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -18,7 +18,7 @@ export type MathType = T extends THREE.Color ? T | Parameters | number : T | Parameters -type MathProps

    = { +export type MathProps

    = { [K in keyof P as P[K] extends MathRepresentation ? K : never]: P[K] extends MathRepresentation ? MathType : never @@ -37,15 +37,15 @@ export type Matrix4 = MathType export interface RaycastableRepresentation { raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void } -type EventProps

    = P extends RaycastableRepresentation ? Partial : {} +export type EventProps

    = P extends RaycastableRepresentation ? Partial : {} -interface ReactProps

    { +export interface ReactProps

    { children?: React.ReactNode ref?: React.Ref

    key?: React.Key } -type ElementProps> = Partial< +export type ElementProps> = Partial< Overwrite & ReactProps

    & EventProps

    > > From 8f7366a6c8bf234640ceb31f9fc4e71412ed8f43 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 05:14:00 -0500 Subject: [PATCH 230/252] chore: update snapshot --- packages/fiber/tests/__snapshots__/index.test.tsx.snap | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index a5c247d1ce..946c1613f4 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -17,9 +17,11 @@ Array [ "Disposable", "DomEvent", "Dpr", + "ElementProps", "Euler", "EventHandlers", "EventManager", + "EventProps", "Events", "Extensions", "FilterFunction", @@ -35,6 +37,7 @@ Array [ "Loader", "LoaderProto", "LoaderResult", + "MathProps", "MathRepresentation", "MathType", "Matrix3", @@ -44,6 +47,7 @@ Array [ "Props", "Quaternion", "RaycastableRepresentation", + "ReactProps", "ReactThreeFiber", "ReconcilerRoot", "RenderCallback", From 4ab5ef035e89fd11b9a8274c49b014c64a583b2b Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 06:36:09 -0500 Subject: [PATCH 231/252] fix(extend): don't use deprecated forwardRef --- packages/fiber/src/core/reconciler.tsx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 8ebf7d757c..d5f00f6054 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -187,18 +187,19 @@ export const catalogue: Catalogue = {} let i = 0 -export const extend = ( +const isConstructor = (object: unknown): object is ConstructorRepresentation => typeof object === 'function' + +export function extend(objects: T): React.ExoticComponent> +export function extend(objects: T): void +export function extend( objects: T, -): T extends ConstructorRepresentation ? React.ExoticComponent> : void => { - if (typeof objects === 'function') { +): React.ExoticComponent> | void { + if (isConstructor(objects)) { const Component = `${i++}` catalogue[Component] = objects - - // Returns a component whose name will be inferred in devtools - // @ts-expect-error - return React.forwardRef({ [objects.name]: (props, ref) => }[objects.name]) + return Component as any } else { - return void Object.assign(catalogue, objects) as any + Object.assign(catalogue, objects) } } From 7da614202ecb46596f8ac262594e3beab16b4a43 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 06:39:59 -0500 Subject: [PATCH 232/252] docs: use new CanvasProps --- docs/tutorials/typescript.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/typescript.mdx b/docs/tutorials/typescript.mdx index 95fac31027..05ca6a9fde 100644 --- a/docs/tutorials/typescript.mdx +++ b/docs/tutorials/typescript.mdx @@ -48,6 +48,8 @@ class CustomElement extends GridHelper {} // Extend so the reconciler will learn about it extend({ CustomElement }) + + ``` The catalogue teaches the underlying reconciler how to create fibers for these elements and treat them within the scene. @@ -107,7 +109,7 @@ Viewport Camera // Canvas props -Props +CanvasProps // Supported events Events From 8294bdbc19f4f78a467d760974b5377cb6989819 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 07:35:05 -0500 Subject: [PATCH 233/252] fix: restore onUpdate --- docs/API/events.mdx | 3 +++ docs/tutorials/events-and-interaction.mdx | 1 + packages/fiber/src/core/reconciler.tsx | 1 + packages/fiber/src/core/utils.tsx | 4 ++++ 4 files changed, 9 insertions(+) diff --git a/docs/API/events.mdx b/docs/API/events.mdx index d9c9da2b3d..03eacb92e4 100644 --- a/docs/API/events.mdx +++ b/docs/API/events.mdx @@ -6,6 +6,8 @@ nav: 8 `three.js` objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on them. We support pointer events, clicks and wheel-scroll. Events contain the browser event as well as the `three.js` event data (object, point, distance, etc). You may want to [polyfill](https://github.com/jquery/PEP) them, if that's a concern. +Additionally, there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`. + Also notice the `onPointerMissed` on the canvas element, which fires on clicks that haven't hit _any_ meshes. ```jsx @@ -22,6 +24,7 @@ Also notice the `onPointerMissed` on the canvas element, which fires on clicks t onPointerLeave={(e) => console.log('leave')} // see note 1 onPointerMove={(e) => console.log('move')} onPointerMissed={() => console.log('missed')} + onUpdate={(self) => console.log('props have been updated')} /> ``` diff --git a/docs/tutorials/events-and-interaction.mdx b/docs/tutorials/events-and-interaction.mdx index d61a4fa84c..cfa1464689 100644 --- a/docs/tutorials/events-and-interaction.mdx +++ b/docs/tutorials/events-and-interaction.mdx @@ -26,6 +26,7 @@ Any Object3D that has a raycast method can receive a large number of events, for onPointerLeave={(e) => console.log('leave')} onPointerMove={(e) => console.log('move')} onPointerMissed={() => console.log('missed')} + onUpdate={(self) => console.log('props have been updated')} /> ``` diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index d5f00f6054..e6a2f3c531 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -150,6 +150,7 @@ export interface InstanceProps { visible?: boolean dispose?: null attach?: AttachType + onUpdate?: (self: T) => void } export interface Instance { diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 7b21eb75ee..813c63fa61 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -512,6 +512,10 @@ export function applyProps(object: Instance['object'], props: Instan } export function invalidateInstance(instance: Instance): void { + if (!instance.parent) return + + instance.props.onUpdate?.(instance.object) + const state = instance.root?.getState?.() if (state && state.internal.frames === 0) state.invalidate() } From cbebe98877c69690ac232f35d8e06b8b6dc37248 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 07:36:03 -0500 Subject: [PATCH 234/252] fix: don't write behavior props --- packages/fiber/src/core/utils.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 813c63fa61..595ac6a241 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -313,6 +313,7 @@ export const RESERVED_PROPS = [ 'dispose', 'attach', 'object', + 'onUpdate', // Behavior flags 'dispose', ] From 24a7485e90978def0ea3fb201d9d33ab6ba36a01 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 07:58:53 -0500 Subject: [PATCH 235/252] chore(docs): WIP v9 upgrade guide --- docs/tutorials/v8-migration-guide.mdx | 506 -------------------------- docs/tutorials/v9-migration-guide.mdx | 187 ++++++++++ 2 files changed, 187 insertions(+), 506 deletions(-) delete mode 100644 docs/tutorials/v8-migration-guide.mdx create mode 100644 docs/tutorials/v9-migration-guide.mdx diff --git a/docs/tutorials/v8-migration-guide.mdx b/docs/tutorials/v8-migration-guide.mdx deleted file mode 100644 index 5dded0e883..0000000000 --- a/docs/tutorials/v8-migration-guide.mdx +++ /dev/null @@ -1,506 +0,0 @@ ---- -title: 'v8 Migration Guide' -description: Changes and new features with v8 and react 18 -nav: 12 ---- - -Work on version 8 has begun 3 Sep 2021 and is perhaps the biggest update to Fiber yet. We've tried our best to keep breaking-changes to a minimum, they mostly affect rarely used api's like `attach`. This release brings a ton of performance related fixes, but also includes some new and ground breaking features. - -We would like to express our gratitude to the community for their continued support, as well as to all our contributors. 🎉 - -## React Native support - -With React 18 and Expo 43, you can now ship threejs goodness across web and native. These apps are not confined to a web-view, they are truly native OpenGLES. - -Now expo-gl, which does the hard lifting, has existed for a while, but we've addressed some of the common concerns related to interop and making the three eco system readily work in the native space. For instance, you handle assets the same exact way you'd treat them in a web app. - -See [installation](/react-three-fiber/getting-started/installation#react-native) to get started with managed Expo or bare React Native apps. - -```diff -- import { Canvas, useLoader } from '@react-three/fiber' -+ import { Canvas, useLoader } from '@react-three/fiber/native' - -- import { useGLTF } from '@react-three/drei' -+ import { useGLTF } from '@react-three/drei/native' -``` - -This is complete with support for Pressability events and native threejs loaders. See [events](/react-three-fiber/api/events) for a complete list of events. - -```jsx - console.log('onPress')} - onPointerDown={(e) => console.log('onPressIn')} - onPointerUp={(e) => console.log('onPressOut')} - onDoubleClick={(e) => console.log('onLongPress')} - onPointerOver={(e) => console.log('onHoverIn')} - onPointerOut={(e) => console.log('onHoverOut')} - onPointerMove={(e) => console.log('onPressMove')} - // Not implemented - // onContextMenu={(e) => console.log('context menu')} - // onWheel={(e) => console.log('wheel spins')} -/> -``` - -```jsx -import React, { Suspense } from 'react' -import { useGLTF } from '@react-three/drei/native' -import { Canvas } from '@react-three/fiber/native' -import modelPath from './assets/model.glb' - -function Model(props) { - const { scene } = useGLTF(modelPath) - return -} - -export default function App() { - return ( - - - - - - ) -} -``` - -React Native support was submitted by [@Cody_J_Bennett](https://twitter.com/Cody_J_Bennett). 🎉 - -## Zustand and suspend-react - -Fiber uses [zustand](https://zustand.js.org/) to manage state. It's a simple, powerful, and performant state management library for React. And [suspend-react](https://github.com/pmndrs/suspend-react) to manage async ops and suspense (useLoader for instance). You can use these in your projects as well as they are to get closer interop with Fiber. - -## New pixel ratio default - -The default DPR has changed from `1` to `[1, 2]`, which will clamp between 1 and 2, but prefer 2, depending on the screen's native pixel ratio. - -This was the most common setting in the wild, so it was brought in as a better default. - -```diff -- -+ -``` - -## Color management - -Color management is now being handled by Three R139. Therefore we set `THREE.ColorManagement.enabled` to `true` and cede to touch colors and textures since everything will now be converted from sRGB to linear color space by Three itself. - -You can manipulate this yourself with the `legacy` prop: - -```jsx -// sets THREE.ColorManagement.enabled = false - -``` - -While you can of course use Fiber with any Three version you like we recommend updating to R139. - -Check out https://threejs.org/docs/#manual/en/introduction/Color-management for information. - -## Automatic concurrency - -Concurrency is now part of React 18, which automatically switches between blocking (default) and concurrent (async). - -```diff -- -+ -``` - -React 18 introduces the `startTransition` and `useTransition` APIs to defer and schedule expensive operations and state updates. Use these to de-prioritize expensive operations. - -```jsx -import { startTransition } from 'react' -import { Points } from '@react-three/drei' - -const [radius, setRadius] = useState(1) -const positions = calculatePositions(radius) -const colors = calculateColors(radius) -const sizes = calculateSizes(radius) - - startTransition(() => setRadius(prev => prev + 1))} -> - - -``` - -### Examples - -Please be careful, this is an extreme stress test. It creates so much load that without React the browser will freeze or crash. - -

    - - View splitting - -

    - -## Conditional rendering with frameloop - -`frameloop` can now be toggled to render conditionally. This is useful to toggle on user interaction or while in frame. - -```jsx -const [frameloop, setFrameloop] = useState('never') - - setFrameloop('always')} -/> -``` - -Another usecase would be using intersection observers to stop the canvas when it's out of view. - -```jsx -const canvasRef = useRef() -const [frameloop, setFrameloop] = useState('never') - -useEffect(() => { - const observer = new IntersectionObserver(([{ isIntersecting }]) => { - setFrameloop(isIntersecting ? 'always' : 'never') - }, {}) - - observer.observe(canvasRef.current) - return () => observer.disconnect() -}, []) - - -``` - -## Expanded gl prop - -The `gl` prop can now accept both constructor args and renderer properties like the `camera` prop. - -```jsx - -``` - -It can also accept a synchronous callback to manually create a renderer. This allows you to use any custom renderer you want. - -```jsx - new Renderer({ canvas })} /> -``` - -## Improved WebXR handling - -### Automatic WebXR switching - -The `vr` prop was removed in favor of automatic WebXR switching. Whenever a session is requested, XR features are enabled, and the renderer will render at the native refresh rate. The inverse is true when exiting a session. - -> `frameloop` will not be respected while in a session. - -```diff -- -+ -``` - -### Extended useFrame - -In addition to the automatic rendering, useFrame will expose the current [`XRFrame`](https://developer.mozilla.org/en-US/docs/Web/API/XRFrame) obtained via [XRSession#requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/XRSession/requestAnimationFrame). - -```ts -useFrame((state: RootState, delta: number, frame?: XRFrame) => { ... }) -``` - -This removes the need for custom rendering loops when using WebXR pose data and abstractions like `useXRFrame` of [@react-three/xr](https://github.com/pmndrs/react-xr). - -## Manual camera manipulation - -By default Fiber is responsive and will set up cameras properly on resize (aspect ratio etc). - -Cameras can be controlled manually by setting `manual` to true in `camera`. This will opt out of projection matrix recalculation when the drawing area resizes. - -```jsx - -``` - -This is also supported by all cameras that you create, be it a THREE.PerspectiveCamera or drei/cameras, put `manual` on it and Fiber will not touch it. - -```jsx -import { PerspectiveCamera } from '@react-three/drei' - - - -``` - -## Unified attach API - -Previously, attach had multiple signatures: - -- `attach="name"` -- `attachObject={["name", "attribute"]}` -- `attachArray="name"` -- `attachFns={["add", "remove"]}` -- `attachFns={[(self, parent) => parent.add(self), (self, parent) => parent.remove(self)]}` - -This is now a single, unified signature with support for piercing and named attach functions or custom handlers. - -```jsx -// Attach foo to parent.a - - -// Attach foo to parent.a.b and a.b.c (nested object attach) - - - -// Attach foo to parent.a[0] and [1] (array attach is just object attach) - - - -// Attach foo to parent via explicit add/remove functions - { - parent.add(self) - return () => parent.remove(self) -} /> - -// The same as a one liner - (parent.add(self), () => parent.remove(self))} /> -``` - -### Real-world use-cases: - -Attaching to nested objects: - -```diff -- -+ -+ -+ -``` - -```diff - -- -+ - -``` - -Arrays must be explcit now: - -```diff - -- {colors.map((color, index) => )} -+ {colors.map((color, index) => )} - -``` - -## Spread Canvas props - -The `` can now accept non-render props to spread as native props: styles, classes, events, a11y, ... - -```diff --
    -- --
    -+ -``` - -## New createRoot API - -`render` is depreciated in v8 for the new `createRoot` signature. - -```diff -import { -- render, -+ createRoot, - events -} from '@react-three/fiber' - -- render(, canvas, { event }) -+ createRoot(canvas).configure({ events }).render() -``` - -Here is a typical setup: - -```jsx -import * as THREE from 'three' -import { extend, createRoot, events } from '@react-three/fiber' - -extend(THREE) - -const root = createRoot(document.querySelector('#root')) - -window.addEventListener('resize', () => { - root.configure({ - events, - camera: { position: [0, 0, 50], fov: 50 }, - size: { width: window.innerWidth, height: window.innerHeight }, - }) - root.render() -}) -window.dispatchEvent(new Event('resize')) - -// This is how you would unmount the root -// root.unmount() -``` - -### Examples - -This is a custom-renderer example using the createRoot api: - -

    - - View splitting - -

    - -## Tree-shaking via extend - -The underlying reconciler no longer pulls in the THREE namespace automatically. - -This enables a granular catalogue and tree-shaking via the `extend` API: - -```jsx -import { extend, createRoot } from '@react-three/fiber' -import { Mesh, BoxGeometry, MeshStandardMaterial } from 'three' - -extend({ Mesh, BoxGeometry, MeshStandardMaterial }) - -createRoot(canvas).render( - - - - , -) -``` - -There's an [official babel plugin](https://github.com/pmndrs/react-three-babel) which will do this for you automatically: - -```jsx -// In: - -import { createRoot } from '@react-three/fiber' - -createRoot(canvasNode).render( - - - - , -) - -// Out: - -import { createRoot, extend } from '@react-three/fiber' -import { Mesh as _Mesh, BoxGeometry as _BoxGeometry, MeshStandardMaterial as _MeshStandardMaterial } from 'three' - -extend({ - Mesh: _Mesh, - BoxGeometry: _BoxGeometry, - MeshStandardMaterial: _MeshStandardMaterial, -}) - -createRoot(canvasNode).render( - - - - , -) -``` - -No changes are necessary for `@react-three/test-renderer` as THREE is extended automatically. - -## createPortal creates a state enclave - -`createPortal` allows you to write a declarative JSX scene into a pre-existing, foreign object. This has been very useful for portals, heads-up displays, view-cubes, view splitting, etc. - -But these things were very limited and lacked event support as well as support for eco-system packages (for instance putting OrbitControls into a split view). - -With this release `createPortal` creates a virtual state-model in which everything keeps functioning. Events work, you can use any 3rd party eco-system control and throw it in there. - -The event layering part of this was submitted by [@theatre_js](https://twitter.com/theatre_js) and [@AndrewPrifer](https://twitter.com/AndrewPrifer) 🎉. - -```jsx -import { createPortal } from '@react-three/fiber' - -function HeadsUpDisplay({ children }) { - const [scene] = useState(() => new THREE.Scene()) - return createPortal(children, scene, { - /* Override RootState here */ - }) -} -``` - -The event system in particular can now be layered, so that you can have portals inside portals with event priority. You can also inject objects into RootState right away, these will become the defaults inside the portalled state world and anything using `useThree` inside will receive these objects. - -Here is an example of a layered portal: - -```jsx -createPortal(children, scene, { - camera: myCustomCamera, - events: { - priority: previousPriority - 1, - compute: (event, state, previous) => { - // First we call the previous state-onion-layers compute, this is what makes it possible to nest portals - if (!previous.raycaster.camera) previous.events.compute(event, previous, previous.previousRoot.getState()) - // We run a quick check against the textured plane itself, if it isn't hit there's no need to raycast at all - const [intersection] = previous.raycaster.intersectObject(ref.current) - if (!intersection) return false - // We take that hits uv coords, set up this layers raycaster, et voilà, we have raycasting with perspective shift - const uv = intersection.uv - state.raycaster.setFromCamera(state.pointer.set(uv.x * 2 - 1, uv.y * 2 - 1), camera) - }, - }, -}) -``` - -`createPortal` can still be considered low-level and the exact API for `compute` is still experimental at this point. Expect ready-made components for portals, hud's and view-splitting to come to drei soon. - -### Examples - -

    - - View splitting - - - Portals - - - Heads-up displays - -

    - -## RTTR Regex Matchers - -test-renderer's `findByProps` and `findAllByProps` now accept RegExp matchers to search for variable or computed properties. - -```ts -testInstance.findByProps(props) - -// Also accepts RegExp matchers -testInstance.findByProps({ [prop]: /^match/i }) -``` - -```ts -testInstance.findAllByProps(props) - -// Also accepts RegExp matchers -testInstance.findAllByProps({ [prop]: /^matches/i }) -``` - -React-three-test-renderer was submitted by [@_josh_ellis_](https://twitter.com/_josh_ellis_) 🎉. - -## Deprecated - -```diff -useFrame((state) => { -- state.mouse -+ state.pointer -``` - -```diff -onClick={(event) => { -- event.sourceEvent -+ event.nativeEvent - -- event.spaceX -- event.spaceY -+ event.pointer -``` diff --git a/docs/tutorials/v9-migration-guide.mdx b/docs/tutorials/v9-migration-guide.mdx new file mode 100644 index 0000000000..3385dab5eb --- /dev/null +++ b/docs/tutorials/v9-migration-guide.mdx @@ -0,0 +1,187 @@ +--- +title: 'v9 Migration Guide' +description: Changes and new features with v9 and react 19 +nav: 12 +--- + +This release is a compatability release for React 19, which brings further performance, stability, and type improvements. You can check out the React 19 changelog [here](https://react.dev/blog/2024/04/25/react-19). + +We would like to express our gratitude to the community for their continued support, as well as to all our contributors, including the React team at Meta and Vercel, for ensuring this upgrade went smoothly. 🎉 + +## Performance + +// TODO: JSX, React Compiler (if not explicitly clear), react-native Hermes profile +// Also, PoC for improvements with OffscreenCanvas support + +## Features + +### useLoader Accepts Loader Instance + +`useLoader` now supports re-use of external loader instances for more controlled pooling and setup. + +```jsx +import { GLTFLoader } from 'three/addons' +import { useLoader } from '@react-three/fiber' + +function Model() { + const gltf = useLoader(GLTFLoader, '/path/to/model.glb') +} + +// or, + +const loader = new GLTFLoader() +function Model() { + const gltf = useLoader(loader, '/path/to/model.glb') +} +``` + +### Factory extend Signature + +`extend` can now produce a component when a three.js class is passed to it individually instead of a catalog of named classes. This is backwards compatible and reduces TypeScript boilerplate and JSX collisions. We recommend libraries migrate to this signature so internal components don't clash with user-land declarations. + +```tsx +import { OrbitControls } from 'three/addons' +import { type ThreeElement, type ThreeElements } from '@react-three/fiber' + +declare module '@react-three/fiber' { + interface ThreeElements { + orbitControls: ThreeElement + } +} + +extend({ OrbitControls }) + + + +// or, + +const Controls = extend(OrbitControls) + +``` + +## Fixes + +### Color Management of Textures + +Automatic sRGB conversion of all textures was removed, and color textures are handled explicitly for built-in materials. This fixes hard-to-debug errors where data textures like normals or displacement are corrupted or made non-linear and aligns with vanilla three behavior. For custom materials or shaders, make sure to annotate color textures with `texture.colorSpace = THREE.SRGBColorSpace`. + +For more details, see https://threejs.org/docs/#manual/en/introduction/Color-management. + +### Suspense and Side-Effects + +The correctness and handling of `Suspense` and fallback content have improved between both React and R3F. Side-effects like `attach` and constructor side-effects (e.g., controls, which may add event listeners) will no longer fire repeatedly without cleanup while a tree is suspending. This required a major rearchitecture over the last 2 years to mend React philosophical incompatibilities from the pure document model. + +```jsx +import { OrbitControls } from 'three/addons' + +extend({ OrbitControls }) + +function Controls() { + const camera = useThree((state) => state.camera) + const gl = useThree((state) => state.gl) + + // Will only initialize when tree is connected to screen + return +} + + + + + +``` + +### Swapping with args and primitives + +Internal handling of swapping elements when changing the `args` or primitive `object` prop has improved for structured children like an array or iterator (yes, React supports iterators and async iterators). Previously, primitives who shared an `object` could be updated out-of-order or removed from the scene along with their children. + +```jsx +// ✅ Mounts a,b,c,d +[a, b, c, d].map((object, i) => ) + +// ❌ Updates undefined,undefined,c,d +[d, c, b, a].map((object, i) => ) +``` + +## TypeScript Changes + +### Props renamed to CanvasProps + +### Hardcoded Element Props + +// TODO: Removed, dynamically mapped + +### Node Helpers + +Specialized `Node` type helpers for extending JSX (`Node`, `Object3DNode`, `BufferGeometryNode`, `MaterialNode`, `LightNode`) were removed and combined into 'ThreeElement', which accepts a single type representing the extended element. + +```tsx +import { type ThreeElement } from '@react-three/fiber' + +declare module '@react-three/fiber' { + interface ThreeElements { + customElement: ThreeElement + } +} +``` + +### ThreeElements + +`ThreeElements` was added as an interface since v8.1.0 and is the current way of declaring or accessing JSX within R3F since the depreciation of `global` JSX (see https://react.dev/blog/2024/04/25/react-19-upgrade-guide#the-jsx-namespace-in-typescript). All JSX types belonging to R3F will be accessible within `ThreeElements`. + +```diff +-import { type Node } from '@react-three/fiber' +-declare global { +- namespace JSX { +- interface IntrinsicElements { +- customElement: Node +- } +- } +-} + +-import { type Node } from '@react-three/fiber' +-declare module '@react-three/fiber' { +- interface ThreeElements { +- customElement: Node +- } +-} + ++import { type ThreeElement } from '@react-three/fiber' ++declare module '@react-three/fiber' { ++ interface ThreeElements { ++ customElement: ThreeElement ++ } ++} +``` + +## Testing + +### StrictMode + +`StrictMode` is now correctly inherited from a parent renderer like react-dom. Previously, `` mounted outside of the R3F Canvas would not affect its children, so it had to be redeclared within as well. + +```diff + + +- +- // ... +- ++ // ... + + +``` + +### Act + +`act` is now exported from React itself and can be used for all renderers. It will return the contents of a passed async callback like before and recursively flush async effects to synchronously test React output. + +```tsx +import { act } from 'react' +import { createRoot } from '@react-three/fiber' + +const store = await act(async () => createRoot(canvas).render()) +console.log(store.getState()) +``` + +## Deprecated + +// TODO: onUpdate? From b4adc172f86e0d438612a30dfca486b98b89b1f2 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 09:16:50 -0500 Subject: [PATCH 236/252] RELEASING: Releasing 2 package(s) Releases: @react-three/fiber@9.0.0-alpha.8 @react-three/test-renderer@9.0.0-alpha.8 [skip ci] --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 744405795a..5540cb612d 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.7", + "version": "9.0.0-alpha.8", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 3c59694c53..66a915ab81 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-alpha.7", + "version": "9.0.0-alpha.8", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-alpha.7", + "@react-three/fiber": "9.0.0-alpha.8", "three": ">=0.141" } } From 973a182c992904b6f26ca511b8f530a20e3df40c Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 26 May 2024 09:18:11 -0500 Subject: [PATCH 237/252] chore: cleanup --- .changeset/lemon-glasses-kneel.md | 5 ----- .changeset/new-moles-eat.md | 5 ----- .changeset/slow-days-relax.md | 5 ----- 3 files changed, 15 deletions(-) delete mode 100644 .changeset/lemon-glasses-kneel.md delete mode 100644 .changeset/new-moles-eat.md delete mode 100644 .changeset/slow-days-relax.md diff --git a/.changeset/lemon-glasses-kneel.md b/.changeset/lemon-glasses-kneel.md deleted file mode 100644 index 33cfc3d10e..0000000000 --- a/.changeset/lemon-glasses-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@react-three/fiber': major ---- - -**Breaking Change:** Renamed the props interfaces exported by `web/Canvas.tsx` and `mobile/Canvas.tsx` from the generic `Props` to the more specific `CanvasProps`. diff --git a/.changeset/new-moles-eat.md b/.changeset/new-moles-eat.md deleted file mode 100644 index 631b79d4dd..0000000000 --- a/.changeset/new-moles-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@react-three/fiber': patch ---- - -fix: portal events, update examples diff --git a/.changeset/slow-days-relax.md b/.changeset/slow-days-relax.md deleted file mode 100644 index b5ffb30593..0000000000 --- a/.changeset/slow-days-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@react-three/fiber': patch ---- - -fix(native): use MSAA for antialias on iOS From 86a8ff4c67a47d07c806095478ac518b4c023104 Mon Sep 17 00:00:00 2001 From: Kris Baumgartner Date: Mon, 27 May 2024 00:16:23 -0700 Subject: [PATCH 238/252] feat: args prop requirement matches constructor params --- packages/fiber/src/core/reconciler.tsx | 10 ++++++++-- packages/fiber/src/core/utils.tsx | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index e6a2f3c531..837a7b186d 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -17,6 +17,7 @@ import { prepare, isObject3D, findInitialRoot, + IsAllOptional, } from './utils' import type { RootStore } from './store' import { removeInteractivity, type EventHandlers } from './events' @@ -144,8 +145,13 @@ export type Args = T extends ConstructorRepresentation : ConstructorParameters : any[] -export interface InstanceProps { - args?: Args

    +type ArgsProp

    = P extends ConstructorRepresentation + ? IsAllOptional> extends true + ? { args?: Args

    } + : { args: Args

    } + : { args: unknown[] } + +export type InstanceProps = ArgsProp

    & { object?: T visible?: boolean dispose?: null diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 595ac6a241..ffc81139c2 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -10,6 +10,12 @@ export type NonFunctionKeys

    = { [K in keyof P]-?: P[K] extends Function ? nev export type Overwrite = Omit> & O export type Properties = Pick> export type Mutable

    = { [K in keyof P]: P[K] | Readonly } +export type IsOptional = undefined extends T ? true : false +export type IsAllOptional = T extends [infer First, ...infer Rest] + ? IsOptional extends true + ? IsAllOptional + : false + : true /** * Returns the instance's initial (outmost) root. From 4afe441e308cd37d0a276d84babf989e9880d69f Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 27 May 2024 08:23:33 -0500 Subject: [PATCH 239/252] chore: fix use of bufferAttribute args --- docs/API/objects.mdx | 2 +- example/src/demos/Lines.tsx | 2 +- example/src/demos/Pointcloud.tsx | 4 ++-- packages/test-renderer/src/__tests__/RTTR.core.test.tsx | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/API/objects.mdx b/docs/API/objects.mdx index e3f32464ee..3275bc215e 100644 --- a/docs/API/objects.mdx +++ b/docs/API/objects.mdx @@ -109,7 +109,7 @@ You can also deeply nest attach through piercing. The following adds a buffer-at ```jsx - + ``` #### More examples diff --git a/example/src/demos/Lines.tsx b/example/src/demos/Lines.tsx index 2ea176b747..85cc902a22 100644 --- a/example/src/demos/Lines.tsx +++ b/example/src/demos/Lines.tsx @@ -82,7 +82,7 @@ function Line({ defaultStart, defaultEnd }: any) { <> - + diff --git a/example/src/demos/Pointcloud.tsx b/example/src/demos/Pointcloud.tsx index 57870cf450..51d58df1c2 100644 --- a/example/src/demos/Pointcloud.tsx +++ b/example/src/demos/Pointcloud.tsx @@ -45,8 +45,8 @@ function Particles({ pointCount }: any) { return ( - - + + diff --git a/packages/test-renderer/src/__tests__/RTTR.core.test.tsx b/packages/test-renderer/src/__tests__/RTTR.core.test.tsx index e3a12784ef..c5bef5ae3b 100644 --- a/packages/test-renderer/src/__tests__/RTTR.core.test.tsx +++ b/packages/test-renderer/src/__tests__/RTTR.core.test.tsx @@ -309,7 +309,7 @@ describe('ReactThreeTestRenderer Core', () => { return ( - + From a5a9553610050d17d43af3b09508edc7975203dd Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 27 May 2024 08:41:21 -0500 Subject: [PATCH 240/252] chore: update snapshot --- .../__snapshots__/RTTR.core.test.tsx.snap | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap index 6832a2d939..9bc3b5fc58 100644 --- a/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap +++ b/packages/test-renderer/src/__tests__/__snapshots__/RTTR.core.test.tsx.snap @@ -55,29 +55,30 @@ Array [ Object { "children": Array [], "props": Object { - "array": Float32Array [ - -1, - -1, - 1, - 1, - -1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - -1, - 1, - 1, - -1, - -1, - 1, + "args": Array [ + Float32Array [ + -1, + -1, + 1, + 1, + -1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + -1, + 1, + 1, + -1, + -1, + 1, + ], + 3, ], "attach": "attributes-position", - "count": 6, - "itemSize": 3, }, "type": "bufferAttribute", }, From 10c27461dbbe742882453a29104f4ad05d746a54 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Mon, 27 May 2024 08:47:25 -0500 Subject: [PATCH 241/252] fix: harden vector type --- packages/fiber/src/three-types.ts | 9 ++++----- packages/fiber/tests/__snapshots__/index.test.tsx.snap | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/fiber/src/three-types.ts b/packages/fiber/src/three-types.ts index ede2fe761a..6b0a56405c 100644 --- a/packages/fiber/src/three-types.ts +++ b/packages/fiber/src/three-types.ts @@ -6,22 +6,21 @@ import type { Args, EventHandlers, InstanceProps, ConstructorRepresentation } fr import type { Overwrite, Mutable } from './core/utils' export interface MathRepresentation { - set(...args: any[]): any + set(...args: number[]): any } export interface VectorRepresentation extends MathRepresentation { setScalar(value: number): any } +export type MathTypes = MathRepresentation | THREE.Euler | THREE.Color -export type MathType = T extends THREE.Color +export type MathType = T extends THREE.Color ? Args | THREE.ColorRepresentation : T extends VectorRepresentation | THREE.Layers | THREE.Euler ? T | Parameters | number : T | Parameters export type MathProps

    = { - [K in keyof P as P[K] extends MathRepresentation ? K : never]: P[K] extends MathRepresentation - ? MathType - : never + [K in keyof P as P[K] extends MathTypes ? K : never]: P[K] extends MathTypes ? MathType : never } export type Vector2 = MathType diff --git a/packages/fiber/tests/__snapshots__/index.test.tsx.snap b/packages/fiber/tests/__snapshots__/index.test.tsx.snap index 946c1613f4..13d237b30a 100644 --- a/packages/fiber/tests/__snapshots__/index.test.tsx.snap +++ b/packages/fiber/tests/__snapshots__/index.test.tsx.snap @@ -40,6 +40,7 @@ Array [ "MathProps", "MathRepresentation", "MathType", + "MathTypes", "Matrix3", "Matrix4", "ObjectMap", From e6eeac1f7bd98fe6f13910879e4b666b143bd55c Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 29 May 2024 22:46:16 -0500 Subject: [PATCH 242/252] chore: upgrade rc --- example/package.json | 4 +-- package.json | 6 ++-- packages/fiber/package.json | 4 +-- yarn.lock | 56 ++++++++++++++++++------------------- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/example/package.json b/example/package.json index d0c2ab150c..a0e344a67d 100644 --- a/example/package.json +++ b/example/package.json @@ -11,8 +11,8 @@ "@react-spring/three": "^9.7.3", "@react-three/drei": "^9.105.5", "@use-gesture/react": "latest", - "react": "19.0.0-rc-935180c7e0-20240524", - "react-dom": "19.0.0-rc-935180c7e0-20240524", + "react": "19.0.0-rc-38e3b23483-20240529", + "react-dom": "19.0.0-rc-38e3b23483-20240529", "react-use-refs": "^1.0.1", "three": "^0.160.0", "three-stdlib": "^2.29.9", diff --git a/package.json b/package.json index 1db207aef8..6181955f14 100644 --- a/package.json +++ b/package.json @@ -76,10 +76,10 @@ "lint-staged": "^12.3.7", "prettier": "^2.6.1", "pretty-quick": "^3.1.3", - "react": "19.0.0-rc-935180c7e0-20240524", - "react-dom": "19.0.0-rc-935180c7e0-20240524", + "react": "19.0.0-rc-38e3b23483-20240529", + "react-dom": "19.0.0-rc-38e3b23483-20240529", "react-native": "0.69.3", - "react-test-renderer": "19.0.0-rc-935180c7e0-20240524", + "react-test-renderer": "19.0.0-rc-38e3b23483-20240529", "three": "^0.141.0", "three-stdlib": "^2.13.0", "ts-jest": "^29.1.2", diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 5540cb612d..29c7bd5570 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -47,9 +47,9 @@ "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^1.2.5", - "react-reconciler": "0.31.0-rc-935180c7e0-20240524", + "react-reconciler": "0.31.0-rc-38e3b23483-20240529", "react-use-measure": "^2.1.1", - "scheduler": "0.25.0-rc-935180c7e0-20240524", + "scheduler": "0.25.0-rc-38e3b23483-20240529", "suspend-react": "^0.1.3", "zustand": "^4.1.2" }, diff --git a/yarn.lock b/yarn.lock index b2d54cf8a3..dc284eebd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8974,17 +8974,17 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" -react-dom@19.0.0-rc-935180c7e0-20240524: - version "19.0.0-rc-935180c7e0-20240524" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-935180c7e0-20240524.tgz#47e1a2f87fc9e27de50a72840e0b71f42effabf6" - integrity sha512-17SL+9qxiLUZnaBWr+mO3hpz5ncP5NbJp6jnbA6cFbsWNdV3p4s8iMVALIcfZF1zPIiWQeYrZQK/Z8GY3xjihg== +react-dom@19.0.0-rc-38e3b23483-20240529: + version "19.0.0-rc-38e3b23483-20240529" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-38e3b23483-20240529.tgz#b0a34e32f4b81b0067adaa67f923f1871e4be56c" + integrity sha512-vP90YBhTjAZhY17JiYmY82NnTOjYLEcw1JB12jcaee3YRg8yRtOaq7fNgD+xc7nFJhKhyV/BI7sHeN0SelVB+Q== dependencies: - scheduler "0.25.0-rc-935180c7e0-20240524" + scheduler "0.25.0-rc-38e3b23483-20240529" -react-is@19.0.0-rc-935180c7e0-20240524: - version "19.0.0-rc-935180c7e0-20240524" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-rc-935180c7e0-20240524.tgz#be584496b91087fde1b3144192a3bf869a85e2bb" - integrity sha512-qXK31jhhFSbr1NqdflxXgp90oJzjwefw5XOCRkoT2dY9ny8vMkWegyVfgloFTJtzgYgs0dFzPz1MSVMAwia7GA== +react-is@19.0.0-rc-38e3b23483-20240529: + version "19.0.0-rc-38e3b23483-20240529" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-rc-38e3b23483-20240529.tgz#50d4ebcf735f166701f1c466031fab63bb534f78" + integrity sha512-lbE0KBiS81mr3nIozqDEWqIXcBOKfdaLFoi76Fyj1Dp5WLhzD4Vd7xQpmlsU1iFPSQ70zU5Frz5Gf3z3WB6fAg== "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: version "18.2.0" @@ -9055,12 +9055,12 @@ react-native@0.69.3: whatwg-fetch "^3.0.0" ws "^6.1.4" -react-reconciler@0.31.0-rc-935180c7e0-20240524: - version "0.31.0-rc-935180c7e0-20240524" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc-935180c7e0-20240524.tgz#2ceed9744e9a7e0119155993f5672e0914e211ce" - integrity sha512-qM2ilapJ/g050GdXEzy3SzbkGhw7Odda6Js6w/3sVBYcdbFYyfsJp5b/Y/o6v7hISAa2e1HNQ7sus/p4u8XD0Q== +react-reconciler@0.31.0-rc-38e3b23483-20240529: + version "0.31.0-rc-38e3b23483-20240529" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc-38e3b23483-20240529.tgz#d8da6f86a74d31d638460b9673d9b1beaae22327" + integrity sha512-ch2q5azrRDyJXxfW5vCH1ddtPkI/ZtkCZwsxvpydbI6fMGKEw+W+2APxxSOWiqXQBAqbeu1/3tHz6aAAC3DUgw== dependencies: - scheduler "0.25.0-rc-935180c7e0-20240524" + scheduler "0.25.0-rc-38e3b23483-20240529" react-refresh@^0.10.0: version "0.10.0" @@ -9085,13 +9085,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-rc-935180c7e0-20240524: - version "19.0.0-rc-935180c7e0-20240524" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-rc-935180c7e0-20240524.tgz#cb227ebf0ff40bfa7d177a138bf70ca827f9c974" - integrity sha512-lBhhLO5viTRkh1AgWbCsaLLqn5L8c0ssCe7EzdE3BbuqzGxgFkuJM4RyDqgByfw7S7+TvhOcnXtsNKn6ykh/ag== +react-test-renderer@19.0.0-rc-38e3b23483-20240529: + version "19.0.0-rc-38e3b23483-20240529" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-rc-38e3b23483-20240529.tgz#3eb6adec2380ff9ca0760a9eb9766da09adc28ef" + integrity sha512-SHhro7rKQiyYu8paj8WBsNshUK4e7oA2QWIHMtMBuSi6N86a3z62/BQwlW7KGKcnFBAhV+yEq4NV2ONDCUjCFw== dependencies: - react-is "19.0.0-rc-935180c7e0-20240524" - scheduler "0.25.0-rc-935180c7e0-20240524" + react-is "19.0.0-rc-38e3b23483-20240529" + scheduler "0.25.0-rc-38e3b23483-20240529" react-use-measure@^2.1.1: version "2.1.1" @@ -9105,10 +9105,10 @@ react-use-refs@^1.0.1: resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== -react@19.0.0-rc-935180c7e0-20240524: - version "19.0.0-rc-935180c7e0-20240524" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-935180c7e0-20240524.tgz#6403d07b38f0cb8cdb7eadbe0e8226a13a4e0730" - integrity sha512-UDaKY7FXO4A2tg4srdLTlkdj5WQCKS9JSrqs21qQvyD4s4qwm3sah5zhfnDHBumzZ3f+PVTcF9PrfDnmu/qKpA== +react@19.0.0-rc-38e3b23483-20240529: + version "19.0.0-rc-38e3b23483-20240529" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-38e3b23483-20240529.tgz#e0a77b1fe8225046393cf8c393e2f1d0f7528ce4" + integrity sha512-dXOzxTGDUB29TnvoX53MwD9q0Zpn2Dc7nTKwn1uMYu//O2H4ogQTEG2wO4XCDozRDBsxLmIY51GGx078BJXrVg== read-pkg-up@^7.0.1: version "7.0.1" @@ -9494,10 +9494,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@0.25.0-rc-935180c7e0-20240524: - version "0.25.0-rc-935180c7e0-20240524" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-935180c7e0-20240524.tgz#f07f6d7a18effbbde008da638380507f2037e964" - integrity sha512-YfkorLQDTfVArSlFsSmTFMWW2CoUtNhkveeEzfbyqi5bShsEyQxAPLBGOUoBxaXEcQSJ2bXhkz3ZSTJCO/Th8A== +scheduler@0.25.0-rc-38e3b23483-20240529: + version "0.25.0-rc-38e3b23483-20240529" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-38e3b23483-20240529.tgz#aca0e1ab860d95261d7d8f5641b07199c35e3119" + integrity sha512-TSK1B30lsjPOWwibVSv4Ep58DPReIX4JSx1/fevNuGmMDM94n9/fdKVj4K26IETei3j+vJxRCdtddlM/rY0dIg== scheduler@^0.21.0: version "0.21.0" From a3db926f4271e400fae9b6984bc01d1045d1edf4 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 29 May 2024 22:48:56 -0500 Subject: [PATCH 243/252] chore(example): cleanup --- example/src/demos/Lines.tsx | 9 ++++++++- example/src/demos/Pointcloud.tsx | 20 ++++++++++++-------- example/typings/global.d.ts | 10 ---------- 3 files changed, 20 insertions(+), 19 deletions(-) delete mode 100644 example/typings/global.d.ts diff --git a/example/src/demos/Lines.tsx b/example/src/demos/Lines.tsx index 85cc902a22..9b42f44c67 100644 --- a/example/src/demos/Lines.tsx +++ b/example/src/demos/Lines.tsx @@ -1,6 +1,13 @@ import React, { useRef, useEffect, useState, useCallback, useContext, useMemo } from 'react' -import { extend, Canvas, useThree, ReactThreeFiber, ThreeEvent } from '@react-three/fiber' +import { ThreeElement, extend, Canvas, useThree, ThreeEvent } from '@react-three/fiber' import { OrbitControls } from 'three-stdlib' + +declare module '@react-three/fiber' { + interface ThreeElements { + orbitControls: ThreeElement + } +} + extend({ OrbitControls }) function useHover(stopPropagation = true) { diff --git a/example/src/demos/Pointcloud.tsx b/example/src/demos/Pointcloud.tsx index 51d58df1c2..238c4d56f9 100644 --- a/example/src/demos/Pointcloud.tsx +++ b/example/src/demos/Pointcloud.tsx @@ -1,8 +1,6 @@ -import React, { useRef, useEffect, useState, useCallback, useContext, useMemo } from 'react' -import { extend, Canvas, useThree } from '@react-three/fiber' +import React, { useRef, useCallback, useMemo } from 'react' +import { type ThreeElement, extend, Canvas, ThreeEvent } from '@react-three/fiber' import * as THREE from 'three' -import { OrbitControls } from 'three-stdlib' -extend({ OrbitControls }) export class DotMaterial extends THREE.ShaderMaterial { constructor() { @@ -19,6 +17,12 @@ export class DotMaterial extends THREE.ShaderMaterial { } } +declare module '@react-three/fiber' { + interface ThreeElements { + dotMaterial: ThreeElement + } +} + extend({ DotMaterial }) const white = new THREE.Color('white') @@ -31,14 +35,14 @@ function Particles({ pointCount }: any) { }, [pointCount]) const points = useRef(null!) - const hover = useCallback((e) => { + const hover = useCallback((e: ThreeEvent) => { e.stopPropagation() - white.toArray(points.current.geometry.attributes.color.array, e.index * 3) + white.toArray(points.current.geometry.attributes.color.array, e.index! * 3) points.current.geometry.attributes.color.needsUpdate = true }, []) - const unhover = useCallback((e) => { - hotpink.toArray(points.current.geometry.attributes.color.array, e.index * 3) + const unhover = useCallback((e: ThreeEvent) => { + hotpink.toArray(points.current.geometry.attributes.color.array, e.index! * 3) points.current.geometry.attributes.color.needsUpdate = true }, []) diff --git a/example/typings/global.d.ts b/example/typings/global.d.ts deleted file mode 100644 index ded4d63081..0000000000 --- a/example/typings/global.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ThreeElement } from '@react-three/fiber' -import { OrbitControls } from 'three-stdlib' -import { DotMaterial } from '../src/demos/Pointcloud' - -declare module '@react-three/fiber' { - interface ThreeElements { - orbitControls: ThreeElement - dotMaterial: ThreeElement - } -} From 2c1224bd19170c4f4f60ac3b54446e9e1cb87c70 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Wed, 29 May 2024 22:55:04 -0500 Subject: [PATCH 244/252] v9.0.0-beta.0 --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 29c7bd5570..da23308348 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-alpha.8", + "version": "9.0.0-beta.0", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 66a915ab81..c16cbf2ad6 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-alpha.8", + "version": "9.0.0-beta.0", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-alpha.8", + "@react-three/fiber": "9.0.0-beta.0", "three": ">=0.141" } } From 3ee709d47baad425aa23cb70fde37694d4bd0999 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Fri, 31 May 2024 18:18:20 -0500 Subject: [PATCH 245/252] fix(applyProps): use copy method if same implementation --- packages/fiber/src/core/utils.tsx | 11 +---------- packages/fiber/tests/utils.test.ts | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index ffc81139c2..10f668cf08 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -434,16 +434,7 @@ export function applyProps(object: Instance['object'], props: Instan } // Copy if properties match signatures - if ( - target?.copy && - // Some environments may break strict identity checks by duplicating versions of three.js. - // Loosen to unminified names, ignoring descendents. - // https://github.com/pmndrs/react-three-fiber/issues/2856 - // TODO: fix upstream and remove in v9 - (__DEV__ - ? target.constructor.name === (value as ClassConstructor).constructor.name - : target.constructor === (value as ClassConstructor).constructor) - ) { + if (typeof target?.copy === 'function' && target.copy === (value as any).copy) { target.copy(value) } // Layers have no copy function, we must therefore copy the mask property diff --git a/packages/fiber/tests/utils.test.ts b/packages/fiber/tests/utils.test.ts index 384e975183..eda8d7e41a 100644 --- a/packages/fiber/tests/utils.test.ts +++ b/packages/fiber/tests/utils.test.ts @@ -349,15 +349,23 @@ describe('applyProps', () => { }) it('should prefer to copy from external props', async () => { - const color = new THREE.Color() - color.copy = jest.fn() + const copyMock = jest.fn() + + class MockedColor extends THREE.Color { + override copy(other: MockedColor) { + copyMock() + return super.copy(other) + } + } + + const color = new MockedColor() const target = { color, layer: new THREE.Layers() } // Same constructor, copy - applyProps(target, { color: new THREE.Color() }) - expect(target.color).toBeInstanceOf(THREE.Color) - expect(color.copy).toHaveBeenCalledTimes(1) + applyProps(target, { color: new MockedColor() }) + expect(target.color).toBeInstanceOf(MockedColor) + expect(copyMock).toHaveBeenCalledTimes(1) // Same constructor, Layers const layer = new THREE.Layers() @@ -369,7 +377,7 @@ describe('applyProps', () => { // Different constructor, overwrite applyProps(target, { color: new THREE.Vector3() }) expect(target.color).toBeInstanceOf(THREE.Vector3) - expect(color.copy).toHaveBeenCalledTimes(1) + expect(copyMock).toHaveBeenCalledTimes(1) }) it('should prefer to set when props are an array', async () => { From 841338f4b143fe50a77d8228299e6d6799e6485b Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 4 Jun 2024 06:35:17 -0500 Subject: [PATCH 246/252] chore: resolve conflicts --- packages/fiber/src/core/utils.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fiber/src/core/utils.tsx b/packages/fiber/src/core/utils.tsx index 10f668cf08..d41157a1c1 100644 --- a/packages/fiber/src/core/utils.tsx +++ b/packages/fiber/src/core/utils.tsx @@ -166,7 +166,7 @@ export const is = { // Wrong type or one of the two undefined, doesn't match if (typeof a !== typeof b || !!a !== !!b) return false // Atomic, just compare a against b - if (is.str(a) || is.num(a)) return a === b + if (is.str(a) || is.num(a) || is.boo(a)) return a === b const isObj = is.obj(a) if (isObj && objects === 'reference') return a === b const isArr = is.arr(a) From 6887b2d4e089411d249bbdcfe5e3267ee03be072 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 13 Jun 2024 11:17:13 -0500 Subject: [PATCH 247/252] chore: upgrade React to rc.0 --- example/package.json | 4 +-- package.json | 6 ++-- packages/fiber/package.json | 4 +-- yarn.lock | 56 ++++++++++++++++++------------------- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/example/package.json b/example/package.json index a0e344a67d..a5a4e0152b 100644 --- a/example/package.json +++ b/example/package.json @@ -11,8 +11,8 @@ "@react-spring/three": "^9.7.3", "@react-three/drei": "^9.105.5", "@use-gesture/react": "latest", - "react": "19.0.0-rc-38e3b23483-20240529", - "react-dom": "19.0.0-rc-38e3b23483-20240529", + "react": "19.0.0-rc.0", + "react-dom": "19.0.0-rc.0", "react-use-refs": "^1.0.1", "three": "^0.160.0", "three-stdlib": "^2.29.9", diff --git a/package.json b/package.json index 6181955f14..10a75a2af7 100644 --- a/package.json +++ b/package.json @@ -76,10 +76,10 @@ "lint-staged": "^12.3.7", "prettier": "^2.6.1", "pretty-quick": "^3.1.3", - "react": "19.0.0-rc-38e3b23483-20240529", - "react-dom": "19.0.0-rc-38e3b23483-20240529", + "react": "19.0.0-rc.0", + "react-dom": "19.0.0-rc.0", "react-native": "0.69.3", - "react-test-renderer": "19.0.0-rc-38e3b23483-20240529", + "react-test-renderer": "19.0.0-rc.0", "three": "^0.141.0", "three-stdlib": "^2.13.0", "ts-jest": "^29.1.2", diff --git a/packages/fiber/package.json b/packages/fiber/package.json index da23308348..c0886fc62a 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -47,9 +47,9 @@ "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^1.2.5", - "react-reconciler": "0.31.0-rc-38e3b23483-20240529", + "react-reconciler": "0.31.0-rc.0", "react-use-measure": "^2.1.1", - "scheduler": "0.25.0-rc-38e3b23483-20240529", + "scheduler": "0.25.0-rc.0", "suspend-react": "^0.1.3", "zustand": "^4.1.2" }, diff --git a/yarn.lock b/yarn.lock index dc284eebd5..a449286ad5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8974,17 +8974,17 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" -react-dom@19.0.0-rc-38e3b23483-20240529: - version "19.0.0-rc-38e3b23483-20240529" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc-38e3b23483-20240529.tgz#b0a34e32f4b81b0067adaa67f923f1871e4be56c" - integrity sha512-vP90YBhTjAZhY17JiYmY82NnTOjYLEcw1JB12jcaee3YRg8yRtOaq7fNgD+xc7nFJhKhyV/BI7sHeN0SelVB+Q== +react-dom@19.0.0-rc.0: + version "19.0.0-rc.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0-rc.0.tgz#6ef81d293f3a3b366bb9cfa0d927a971479c1b3a" + integrity sha512-MhgN2RMYFUkZekkFbsXg9ycwEGaMBzATpTNvGGvWNA9BZZEkdzIL4pv7iDuZKn48YoGARk8ydu4S+Ehd8Yrc4g== dependencies: - scheduler "0.25.0-rc-38e3b23483-20240529" + scheduler "0.25.0-rc.0" -react-is@19.0.0-rc-38e3b23483-20240529: - version "19.0.0-rc-38e3b23483-20240529" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-rc-38e3b23483-20240529.tgz#50d4ebcf735f166701f1c466031fab63bb534f78" - integrity sha512-lbE0KBiS81mr3nIozqDEWqIXcBOKfdaLFoi76Fyj1Dp5WLhzD4Vd7xQpmlsU1iFPSQ70zU5Frz5Gf3z3WB6fAg== +react-is@19.0.0-rc.0: + version "19.0.0-rc.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0-rc.0.tgz#f22acc108348fe9d56c788e5b093e001c835b51e" + integrity sha512-Du6/ueMEZSgY66ssdMBnJFXvJ9ViCUKvRi0sBjxpxcyxlw/dcgSbIl0ahwCsyBEE5TECnymWrMGQ48Dc6VkvUQ== "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: version "18.2.0" @@ -9055,12 +9055,12 @@ react-native@0.69.3: whatwg-fetch "^3.0.0" ws "^6.1.4" -react-reconciler@0.31.0-rc-38e3b23483-20240529: - version "0.31.0-rc-38e3b23483-20240529" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc-38e3b23483-20240529.tgz#d8da6f86a74d31d638460b9673d9b1beaae22327" - integrity sha512-ch2q5azrRDyJXxfW5vCH1ddtPkI/ZtkCZwsxvpydbI6fMGKEw+W+2APxxSOWiqXQBAqbeu1/3tHz6aAAC3DUgw== +react-reconciler@0.31.0-rc.0: + version "0.31.0-rc.0" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.31.0-rc.0.tgz#1040969b0b86460eeeaae4116d6418f0c2fb4924" + integrity sha512-hOHzEH+aXLQGJjEoFkz2fX5ZQCDu0VjZfhyhIqRyJrz3bwkdEloH3y+xx8/HVr8oqcm65o9/9yaK97dH+tRP2A== dependencies: - scheduler "0.25.0-rc-38e3b23483-20240529" + scheduler "0.25.0-rc.0" react-refresh@^0.10.0: version "0.10.0" @@ -9085,13 +9085,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-rc-38e3b23483-20240529: - version "19.0.0-rc-38e3b23483-20240529" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-rc-38e3b23483-20240529.tgz#3eb6adec2380ff9ca0760a9eb9766da09adc28ef" - integrity sha512-SHhro7rKQiyYu8paj8WBsNshUK4e7oA2QWIHMtMBuSi6N86a3z62/BQwlW7KGKcnFBAhV+yEq4NV2ONDCUjCFw== +react-test-renderer@19.0.0-rc.0: + version "19.0.0-rc.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.0.0-rc.0.tgz#7b9fb94969d862c01b7bf0c68fbf6ff8c2b68680" + integrity sha512-RlAYJEfaOSu5tDrhWhdWWCg/nv+1DQzPYVDhdfqscVyXu340G5YU0i3wl8PxaA+hBe0Dq0L3KNgAoGz4i0au4Q== dependencies: - react-is "19.0.0-rc-38e3b23483-20240529" - scheduler "0.25.0-rc-38e3b23483-20240529" + react-is "19.0.0-rc.0" + scheduler "0.25.0-rc.0" react-use-measure@^2.1.1: version "2.1.1" @@ -9105,10 +9105,10 @@ react-use-refs@^1.0.1: resolved "https://registry.yarnpkg.com/react-use-refs/-/react-use-refs-1.0.1.tgz#44cab5f4764b3fa4a112189c0058fc8752d1eb2c" integrity sha512-zVmPRY5DJhzjGgmlIWw9pkdCNlIdrfsEXgdzcSau3MSpKPVuwRQU6DoviwH5f9n5Hc+M2HWW7mkRWbX+4eyC8w== -react@19.0.0-rc-38e3b23483-20240529: - version "19.0.0-rc-38e3b23483-20240529" - resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-38e3b23483-20240529.tgz#e0a77b1fe8225046393cf8c393e2f1d0f7528ce4" - integrity sha512-dXOzxTGDUB29TnvoX53MwD9q0Zpn2Dc7nTKwn1uMYu//O2H4ogQTEG2wO4XCDozRDBsxLmIY51GGx078BJXrVg== +react@19.0.0-rc.0: + version "19.0.0-rc.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc.0.tgz#9f1e9965c30948b472adcf5ba5184413375e4a40" + integrity sha512-8nrDCl5uE54FHeKqKrEO0TS+10bT4cxutJGb2okiJc0FHMQ6I3FeItaqly/1nbijlhSO3HmAVyPIexIQQWYAtQ== read-pkg-up@^7.0.1: version "7.0.1" @@ -9494,10 +9494,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@0.25.0-rc-38e3b23483-20240529: - version "0.25.0-rc-38e3b23483-20240529" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc-38e3b23483-20240529.tgz#aca0e1ab860d95261d7d8f5641b07199c35e3119" - integrity sha512-TSK1B30lsjPOWwibVSv4Ep58DPReIX4JSx1/fevNuGmMDM94n9/fdKVj4K26IETei3j+vJxRCdtddlM/rY0dIg== +scheduler@0.25.0-rc.0: + version "0.25.0-rc.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0-rc.0.tgz#52ca287c10710479feb395665b4b8a4a8db003bf" + integrity sha512-B3aSqMfoRkucM94MztZD1CyNyf68W9A3dL/TT453G6uNcxMBqGQ+rhFKyxNnWH/mfRHlGBr0tF0F472JCETH4g== scheduler@^0.21.0: version "0.21.0" From 79e02475bd9aace6c22ea9433791b267bd375c52 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Thu, 13 Jun 2024 11:20:32 -0500 Subject: [PATCH 248/252] RELEASING: Releasing 2 package(s) Releases: @react-three/test-renderer@9.0.0-beta.1 @react-three/fiber@9.0.0-beta.1 [skip ci] --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index c0886fc62a..163ca204a0 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-beta.0", + "version": "9.0.0-beta.1", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index c16cbf2ad6..68c49f8450 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-beta.0", + "version": "9.0.0-beta.1", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-beta.0", + "@react-three/fiber": "9.0.0-beta.1", "three": ">=0.141" } } From 8fa636cf33c7f68621a2cbbf247f02c7618573d1 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sat, 17 Aug 2024 11:09:05 -0500 Subject: [PATCH 249/252] chore: cleanup migration guide --- docs/tutorials/v9-migration-guide.mdx | 35 ++++++++++++++++++--------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/docs/tutorials/v9-migration-guide.mdx b/docs/tutorials/v9-migration-guide.mdx index 3385dab5eb..be0e91192f 100644 --- a/docs/tutorials/v9-migration-guide.mdx +++ b/docs/tutorials/v9-migration-guide.mdx @@ -63,13 +63,13 @@ const Controls = extend(OrbitControls) ### Color Management of Textures -Automatic sRGB conversion of all textures was removed, and color textures are handled explicitly for built-in materials. This fixes hard-to-debug errors where data textures like normals or displacement are corrupted or made non-linear and aligns with vanilla three behavior. For custom materials or shaders, make sure to annotate color textures with `texture.colorSpace = THREE.SRGBColorSpace`. +Automatic sRGB conversion of texture props is removed, and color textures are handled automatically for known built-in materials. This aligns with vanilla three behavior and fixes hard-to-debug errors where data textures like normals or displacement are corrupted or made non-linear (math and interpolation must be done linearly). For custom materials or shaders, make sure to annotate color textures with `texture.colorSpace = THREE.SRGBColorSpace` or `texture-colorSpace={THREE.SRGBColorSpace}` with JSX. For more details, see https://threejs.org/docs/#manual/en/introduction/Color-management. ### Suspense and Side-Effects -The correctness and handling of `Suspense` and fallback content have improved between both React and R3F. Side-effects like `attach` and constructor side-effects (e.g., controls, which may add event listeners) will no longer fire repeatedly without cleanup while a tree is suspending. This required a major rearchitecture over the last 2 years to mend React philosophical incompatibilities from the pure document model. +Correctness and handling of `Suspense` and fallback content have improved between both React and R3F. Side-effects like `attach` and constructor side-effects (e.g., controls, which may add event listeners) will no longer fire repeatedly without cleanup while a tree is suspending. This required a major rearchitecture over the last 2 years and collaboration upstream to iterate towards a robust solution. ```jsx import { OrbitControls } from 'three/addons' @@ -106,13 +106,30 @@ Internal handling of swapping elements when changing the `args` or primitive `ob ### Props renamed to CanvasProps -### Hardcoded Element Props +Canvas `Props` is now called `CanvasProps` for clarity. These were aliased in v8 for forward compatibility, but `Props` is removed with v9. -// TODO: Removed, dynamically mapped +```diff +-function Canvas(props: Props) ++function Canvas(props: CanvasProps) +``` + +### Dynamic JSX Types + +Since R3F's creation, JSX types had to be maintained in accordance with additions to three core API. Although missing or future types could be ignored or resilient for forward and backwards compatibility, this was a major maintenance burden for us and those extending three. Furthermore, libraries which wrap or bind to the known catalog of elements (e.g. React Spring ``) had no way of knowing which elements belonged to a renderer. + +Since v8, we've added a catalog of known elements to a `ThreeElements` interface, and with v9 automatically map three API to JSX types. As types are now dynamically mapped, hardcoded exports like `MeshProps` have been removed, and can be accessed as `ThreeElements['mesh']`. Helper types like `Color` or `Vector3` remain to reflect the JSX `MathType` API for shorthand expression. + +```diff +-import { MeshProps } from '@react-three/fiber' +-type Props = MeshProps + ++import { ThreeElements } from '@react-three/fiber' ++type Props = ThreeElements['mesh'] +``` ### Node Helpers -Specialized `Node` type helpers for extending JSX (`Node`, `Object3DNode`, `BufferGeometryNode`, `MaterialNode`, `LightNode`) were removed and combined into 'ThreeElement', which accepts a single type representing the extended element. +Specialized `Node` type helpers for extending JSX (`Node`, `Object3DNode`, `BufferGeometryNode`, `MaterialNode`, `LightNode`) are removed and combined into 'ThreeElement', which accepts a single type representing the extended element instance. ```tsx import { type ThreeElement } from '@react-three/fiber' @@ -126,7 +143,7 @@ declare module '@react-three/fiber' { ### ThreeElements -`ThreeElements` was added as an interface since v8.1.0 and is the current way of declaring or accessing JSX within R3F since the depreciation of `global` JSX (see https://react.dev/blog/2024/04/25/react-19-upgrade-guide#the-jsx-namespace-in-typescript). All JSX types belonging to R3F will be accessible within `ThreeElements`. +`ThreeElements` was added as an interface since v8.1.0 and is the current way of declaring or accessing JSX within R3F since React's depreciation of `global` JSX (see https://react.dev/blog/2024/04/25/react-19-upgrade-guide#the-jsx-namespace-in-typescript). All JSX types belonging to R3F are accessible from `ThreeElements`. ```diff -import { type Node } from '@react-three/fiber' @@ -157,7 +174,7 @@ declare module '@react-three/fiber' { ### StrictMode -`StrictMode` is now correctly inherited from a parent renderer like react-dom. Previously, `` mounted outside of the R3F Canvas would not affect its children, so it had to be redeclared within as well. +`StrictMode` is now correctly inherited from a parent renderer like react-dom. Previously, `` mounted in another root such as react-dom would not affect the R3F canvas, so it had to be redeclared within the canvas as well. ```diff @@ -181,7 +198,3 @@ import { createRoot } from '@react-three/fiber' const store = await act(async () => createRoot(canvas).render()) console.log(store.getState()) ``` - -## Deprecated - -// TODO: onUpdate? From d3af6bd5bdb0e3fe288af59acd0878f662243c8f Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 3 Nov 2024 15:34:38 -0600 Subject: [PATCH 250/252] chore: resolve conflicts --- packages/fiber/src/core/reconciler.tsx | 5 ++--- packages/fiber/src/core/renderer.tsx | 11 +++++++++++ packages/fiber/src/web/Canvas.tsx | 3 +-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/fiber/src/core/reconciler.tsx b/packages/fiber/src/core/reconciler.tsx index 837a7b186d..566621bf6a 100644 --- a/packages/fiber/src/core/reconciler.tsx +++ b/packages/fiber/src/core/reconciler.tsx @@ -486,9 +486,8 @@ function swapInstances(): void { reconstructed.length = 0 } -// Don't handle text instances, warn on undefined behavior -const handleTextInstance = () => - console.warn('R3F: Text is not allowed in JSX! This could be stray whitespace or characters.') +// Don't handle text instances, make it no-op +const handleTextInstance = () => {} const NO_CONTEXT: HostConfig['hostContext'] = {} diff --git a/packages/fiber/src/core/renderer.tsx b/packages/fiber/src/core/renderer.tsx index d6231b6827..b6ba85ac84 100644 --- a/packages/fiber/src/core/renderer.tsx +++ b/packages/fiber/src/core/renderer.tsx @@ -570,6 +570,17 @@ function Portal({ state = {}, children, container }: PortalProps): React.JSX.Ele ) } +/** + * Force React to flush any updates inside the provided callback synchronously and immediately. + * All the same caveats documented for react-dom's `flushSync` apply here (see https://react.dev/reference/react-dom/flushSync). + * Nevertheless, sometimes one needs to render synchronously, for example to keep DOM and 3D changes in lock-step without + * having to revert to a non-React solution. + */ +export function flushSync(fn: () => R): R { + // `flushSync` implementation only takes one argument. I don't know what's up with the type declaration for it. + return reconciler.flushSync(fn) +} + reconciler.injectIntoDevTools({ bundleType: process.env.NODE_ENV === 'production' ? 0 : 1, rendererPackageName: '@react-three/fiber', diff --git a/packages/fiber/src/web/Canvas.tsx b/packages/fiber/src/web/Canvas.tsx index b88e0e4995..0fb9d20104 100644 --- a/packages/fiber/src/web/Canvas.tsx +++ b/packages/fiber/src/web/Canvas.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import * as THREE from 'three' -import useMeasure from 'react-use-measure' -import type { Options as ResizeOptions } from 'react-use-measure' +import { useMeasure, Options as ResizeOptions } from './use-measure' import { FiberProvider } from 'its-fine' import { isRef, From 18505d9f60fc6489b80e1b219268baf0a97d231f Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 3 Nov 2024 15:38:35 -0600 Subject: [PATCH 251/252] chore(tests): remove warning assertions for text --- packages/fiber/tests/renderer.test.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/fiber/tests/renderer.test.tsx b/packages/fiber/tests/renderer.test.tsx index 46f5d1f5a6..5dee27194f 100644 --- a/packages/fiber/tests/renderer.test.tsx +++ b/packages/fiber/tests/renderer.test.tsx @@ -546,9 +546,6 @@ describe('renderer', () => { }) it('should gracefully handle text', async () => { - const warn = console.warn - console.warn = jest.fn() - // Mount await act(async () => root.render(<>one)) // Update @@ -558,9 +555,6 @@ describe('renderer', () => { // Suspense const Test = () => suspend(async () => <>four, []) await act(async () => root.render()) - - expect(console.warn).toHaveBeenCalled() - console.warn = warn }) it('should gracefully interrupt when building up the tree', async () => { From 451d68dec5b0edd7fdac41f1d60829426611c737 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Sun, 3 Nov 2024 15:49:25 -0600 Subject: [PATCH 252/252] v9.0.0-rc.0 --- packages/fiber/package.json | 2 +- packages/test-renderer/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fiber/package.json b/packages/fiber/package.json index 714873ba02..c242b2838e 100644 --- a/packages/fiber/package.json +++ b/packages/fiber/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/fiber", - "version": "9.0.0-beta.1", + "version": "9.0.0-rc.0", "description": "A React renderer for Threejs", "keywords": [ "react", diff --git a/packages/test-renderer/package.json b/packages/test-renderer/package.json index 68c49f8450..3ad8bcec3f 100644 --- a/packages/test-renderer/package.json +++ b/packages/test-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@react-three/test-renderer", - "version": "9.0.0-beta.1", + "version": "9.0.0-rc.0", "description": "Test Renderer for react-three-fiber", "author": "Josh Ellis", "license": "MIT", @@ -23,7 +23,7 @@ }, "peerDependencies": { "react": ">=19.0", - "@react-three/fiber": "9.0.0-beta.1", + "@react-three/fiber": "9.0.0-rc.0", "three": ">=0.141" } }