From ad578aa01fcd08488b8378c7538d802e7a1e8b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Markb=C3=A5ge?= Date: Thu, 18 Sep 2025 15:25:41 -0400 Subject: [PATCH 1/3] Log Suspended startViewTransition Phase (#34511) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stacked on #34510. The "Commit" phase for a View Transition starts before the snapshot phase (before mutation) and then stretches into the async gap of `startViewTransition`, encompasses the mutation phase inside of its update callback and finally the layout phase. However, between the mutation phase and the layout phase we may suspend the start of the view transition on fonts and/or images. In that case we now split the Commit phase into first one before we suspend and then we log "Waiting for Images and/or Fonts" and then another Commit phase around the layout effects. Screenshot 2025-09-16 at 11 37 26 PM --- .../src/client/ReactFiberConfigDOM.js | 13 ++++++- .../src/ReactFiberConfigNative.js | 1 + .../src/ReactFiberPerformanceTrack.js | 39 +++++++++++++++++++ .../src/ReactFiberWorkLoop.js | 37 ++++++++++++++++++ .../src/ReactFiberConfigTestHost.js | 1 + 5 files changed, 90 insertions(+), 1 deletion(-) diff --git a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js index fc80826678e..8f67e12db1e 100644 --- a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js +++ b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js @@ -125,6 +125,7 @@ import { enableViewTransition, enableHydrationChangeEvent, enableFragmentRefsScrollIntoView, + enableProfilerTimer, } from 'shared/ReactFeatureFlags'; import { HostComponent, @@ -2098,6 +2099,7 @@ export function startViewTransition( spawnedWorkCallback: () => void, passiveCallback: () => mixed, errorCallback: mixed => void, + blockedCallback: string => void, // Profiling-only ): null | RunningViewTransition { const ownerDocument: Document = rootContainer.nodeType === DOCUMENT_NODE @@ -2131,10 +2133,10 @@ export function startViewTransition( blockingPromises.push(ownerDocument.fonts.ready); } } + const blockingIndexSnapshot = blockingPromises.length; if (suspendedState !== null) { // Suspend on any images that still haven't loaded and are in the viewport. const suspenseyImages = suspendedState.suspenseyImages; - const blockingIndexSnapshot = blockingPromises.length; let imgBytes = 0; for (let i = 0; i < suspenseyImages.length; i++) { const suspenseyImage = suspenseyImages[i]; @@ -2162,6 +2164,15 @@ export function startViewTransition( } } if (blockingPromises.length > 0) { + if (enableProfilerTimer) { + const blockedReason = + blockingIndexSnapshot > 0 + ? blockingPromises.length > blockingIndexSnapshot + ? 'Waiting on Fonts and Images' + : 'Waiting on Fonts' + : 'Waiting on Images'; + blockedCallback(blockedReason); + } const blockingReady = Promise.race([ Promise.all(blockingPromises), new Promise(resolve => diff --git a/packages/react-native-renderer/src/ReactFiberConfigNative.js b/packages/react-native-renderer/src/ReactFiberConfigNative.js index c9a5fb591bf..8271a62327a 100644 --- a/packages/react-native-renderer/src/ReactFiberConfigNative.js +++ b/packages/react-native-renderer/src/ReactFiberConfigNative.js @@ -673,6 +673,7 @@ export function startViewTransition( spawnedWorkCallback: () => void, passiveCallback: () => mixed, errorCallback: mixed => void, + blockedCallback: string => void, // Profiling-only ): null | RunningViewTransition { mutationCallback(); layoutCallback(); diff --git a/packages/react-reconciler/src/ReactFiberPerformanceTrack.js b/packages/react-reconciler/src/ReactFiberPerformanceTrack.js index 92ca7e00e26..67438b7f817 100644 --- a/packages/react-reconciler/src/ReactFiberPerformanceTrack.js +++ b/packages/react-reconciler/src/ReactFiberPerformanceTrack.js @@ -1254,6 +1254,45 @@ export function logSuspendedCommitPhase( } } +export function logSuspendedViewTransitionPhase( + startTime: number, + endTime: number, + reason: string, + debugTask: null | ConsoleTask, +): void { + // This means the commit was suspended on CSS or images. + if (supportsUserTiming) { + if (endTime <= startTime) { + return; + } + // TODO: Include the exact reason and URLs of what resources suspended. + // TODO: This might also be Suspended while waiting on a View Transition. + if (__DEV__ && debugTask) { + debugTask.run( + // $FlowFixMe[method-unbinding] + console.timeStamp.bind( + console, + reason, + startTime, + endTime, + currentTrack, + LANES_TRACK_GROUP, + 'secondary-light', + ), + ); + } else { + console.timeStamp( + reason, + startTime, + endTime, + currentTrack, + LANES_TRACK_GROUP, + 'secondary-light', + ); + } + } +} + export function logCommitErrored( startTime: number, endTime: number, diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.js b/packages/react-reconciler/src/ReactFiberWorkLoop.js index d141c2855f6..b2b53281b92 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.js @@ -81,6 +81,7 @@ import { logSuspendedWithDelayPhase, logSuspenseThrottlePhase, logSuspendedCommitPhase, + logSuspendedViewTransitionPhase, logCommitPhase, logPaintYieldPhase, logStartViewTransitionYieldPhase, @@ -704,6 +705,7 @@ let pendingTransitionTypes: null | TransitionTypes = null; let pendingDidIncludeRenderPhaseUpdate: boolean = false; let pendingSuspendedCommitReason: SuspendedCommitReason = IMMEDIATE_COMMIT; // Profiling-only let pendingDelayedCommitReason: DelayedCommitReason = IMMEDIATE_COMMIT; // Profiling-only +let pendingSuspendedViewTransitionReason: null | string = null; // Profiling-only // Use these to prevent an infinite loop of nested updates const NESTED_UPDATE_LIMIT = 50; @@ -3445,6 +3447,7 @@ function commitRoot( pendingEffectsRenderEndTime = completedRenderEndTime; pendingSuspendedCommitReason = suspendedCommitReason; pendingDelayedCommitReason = IMMEDIATE_COMMIT; + pendingSuspendedViewTransitionReason = null; } if (enableGestureTransition && isGestureRender(lanes)) { @@ -3604,6 +3607,7 @@ function commitRoot( flushSpawnedWork, flushPassiveEffects, reportViewTransitionError, + enableProfilerTimer ? suspendedViewTransition : (null: any), ); } else { // Flush synchronously. @@ -3624,6 +3628,24 @@ function reportViewTransitionError(error: mixed) { onRecoverableError(error, makeErrorInfo(null)); } +function suspendedViewTransition(reason: string): void { + if (enableProfilerTimer && enableComponentPerformanceTrack) { + // We'll split the commit into two phases, because we're suspended in the middle. + recordCommitEndTime(); + logCommitPhase( + pendingSuspendedCommitReason === IMMEDIATE_COMMIT + ? pendingEffectsRenderEndTime + : commitStartTime, + commitEndTime, + commitErrors, + pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT, + workInProgressUpdateTask, + ); + pendingSuspendedViewTransitionReason = reason; + pendingSuspendedCommitReason = SUSPENDED_COMMIT; + } +} + function flushAfterMutationEffects(): void { if (pendingEffectsStatus !== PENDING_AFTER_MUTATION_PHASE) { return; @@ -3688,6 +3710,21 @@ function flushLayoutEffects(): void { } pendingEffectsStatus = NO_PENDING_EFFECTS; + if (enableProfilerTimer && enableComponentPerformanceTrack) { + const suspendedViewTransitionReason = pendingSuspendedViewTransitionReason; + if (suspendedViewTransitionReason !== null) { + // We suspended in the middle of the commit for the view transition. + // We'll start a new commit track now. + recordCommitTime(); + logSuspendedViewTransitionPhase( + commitEndTime, // The start is the end of the first commit part. + commitStartTime, // The end is the start of the second commit part. + suspendedViewTransitionReason, + workInProgressUpdateTask, + ); + } + } + const root = pendingEffectsRoot; const finishedWork = pendingFinishedWork; const lanes = pendingEffectsLanes; diff --git a/packages/react-test-renderer/src/ReactFiberConfigTestHost.js b/packages/react-test-renderer/src/ReactFiberConfigTestHost.js index 86621f68480..7b1477fa256 100644 --- a/packages/react-test-renderer/src/ReactFiberConfigTestHost.js +++ b/packages/react-test-renderer/src/ReactFiberConfigTestHost.js @@ -423,6 +423,7 @@ export function startViewTransition( spawnedWorkCallback: () => void, passiveCallback: () => mixed, errorCallback: mixed => void, + blockedCallback: string => void, // Profiling-only ): null | RunningViewTransition { mutationCallback(); layoutCallback(); From c03a51d8361b0c861f0343ab46c8bb2e8f0af3b0 Mon Sep 17 00:00:00 2001 From: Hendrik Liebau Date: Thu, 18 Sep 2025 21:32:36 +0200 Subject: [PATCH 2/3] Move `getDebugInfo` test util function to `internal-test-utils` (#34523) In an upstack PR, I need `getDebugInfo` in another test file, so I'm moving it to `internal-test-utils` so it can be shared. --- .../ReactInternalTestUtils.js | 1 + packages/internal-test-utils/debugInfo.js | 131 ++++ .../src/__tests__/ReactFlight-test.js | 49 +- .../__tests__/ReactFlightDebugChannel-test.js | 45 +- .../ReactFlightAsyncDebugInfo-test.js | 655 ++++++++---------- 5 files changed, 426 insertions(+), 455 deletions(-) create mode 100644 packages/internal-test-utils/debugInfo.js diff --git a/packages/internal-test-utils/ReactInternalTestUtils.js b/packages/internal-test-utils/ReactInternalTestUtils.js index 317a07262c5..ed9b822457a 100644 --- a/packages/internal-test-utils/ReactInternalTestUtils.js +++ b/packages/internal-test-utils/ReactInternalTestUtils.js @@ -16,6 +16,7 @@ import { clearErrors, createLogAssertion, } from './consoleMock'; +export {getDebugInfo} from './debugInfo'; export {act, serverAct} from './internalAct'; const {assertConsoleLogsCleared} = require('internal-test-utils/consoleMock'); diff --git a/packages/internal-test-utils/debugInfo.js b/packages/internal-test-utils/debugInfo.js new file mode 100644 index 00000000000..7b9c730ba65 --- /dev/null +++ b/packages/internal-test-utils/debugInfo.js @@ -0,0 +1,131 @@ +'use strict'; + +const path = require('path'); + +const repoRoot = path.resolve(__dirname, '../../'); + +type DebugInfoConfig = { + ignoreProps?: boolean, + ignoreRscStreamInfo?: boolean, + useFixedTime?: boolean, + useV8Stack?: boolean, +}; + +function formatV8Stack(stack) { + let v8StyleStack = ''; + if (stack) { + for (let i = 0; i < stack.length; i++) { + const [name] = stack[i]; + if (v8StyleStack !== '') { + v8StyleStack += '\n'; + } + v8StyleStack += ' in ' + name + ' (at **)'; + } + } + return v8StyleStack; +} + +function normalizeStack(stack) { + if (!stack) { + return stack; + } + const copy = []; + for (let i = 0; i < stack.length; i++) { + const [name, file, line, col, enclosingLine, enclosingCol] = stack[i]; + copy.push([ + name, + file.replace(repoRoot, ''), + line, + col, + enclosingLine, + enclosingCol, + ]); + } + return copy; +} + +function normalizeIOInfo(config: DebugInfoConfig, ioInfo) { + const {debugTask, debugStack, debugLocation, ...copy} = ioInfo; + if (ioInfo.stack) { + copy.stack = config.useV8Stack + ? formatV8Stack(ioInfo.stack) + : normalizeStack(ioInfo.stack); + } + if (ioInfo.owner) { + copy.owner = normalizeDebugInfo(config, ioInfo.owner); + } + if (typeof ioInfo.start === 'number' && config.useFixedTime) { + copy.start = 0; + } + if (typeof ioInfo.end === 'number' && config.useFixedTime) { + copy.end = 0; + } + const promise = ioInfo.value; + if (promise) { + promise.then(); // init + if (promise.status === 'fulfilled') { + if (ioInfo.name === 'RSC stream') { + copy.byteSize = 0; + copy.value = { + value: 'stream', + }; + } else { + copy.value = { + value: promise.value, + }; + } + } else if (promise.status === 'rejected') { + copy.value = { + reason: promise.reason, + }; + } else { + copy.value = { + status: promise.status, + }; + } + } + return copy; +} + +function normalizeDebugInfo(config: DebugInfoConfig, original) { + const {debugTask, debugStack, debugLocation, ...debugInfo} = original; + if (original.owner) { + debugInfo.owner = normalizeDebugInfo(config, original.owner); + } + if (original.awaited) { + debugInfo.awaited = normalizeIOInfo(config, original.awaited); + } + if (debugInfo.props && config.ignoreProps) { + debugInfo.props = {}; + } + if (Array.isArray(debugInfo.stack)) { + debugInfo.stack = config.useV8Stack + ? formatV8Stack(debugInfo.stack) + : normalizeStack(debugInfo.stack); + return debugInfo; + } else if (typeof debugInfo.time === 'number' && config.useFixedTime) { + return {...debugInfo, time: 0}; + } else { + return debugInfo; + } +} + +export function getDebugInfo(config: DebugInfoConfig, obj) { + const debugInfo = obj._debugInfo; + if (debugInfo) { + const copy = []; + for (let i = 0; i < debugInfo.length; i++) { + if ( + debugInfo[i].awaited && + debugInfo[i].awaited.name === 'RSC stream' && + config.ignoreRscStreamInfo + ) { + // Ignore RSC stream I/O info. + } else { + copy.push(normalizeDebugInfo(config, debugInfo[i])); + } + } + return copy; + } + return debugInfo; +} diff --git a/packages/react-client/src/__tests__/ReactFlight-test.js b/packages/react-client/src/__tests__/ReactFlight-test.js index da1dff04820..0baee5a1f50 100644 --- a/packages/react-client/src/__tests__/ReactFlight-test.js +++ b/packages/react-client/src/__tests__/ReactFlight-test.js @@ -33,20 +33,6 @@ function normalizeCodeLocInfo(str) { ); } -function formatV8Stack(stack) { - let v8StyleStack = ''; - if (stack) { - for (let i = 0; i < stack.length; i++) { - const [name] = stack[i]; - if (v8StyleStack !== '') { - v8StyleStack += '\n'; - } - v8StyleStack += ' in ' + name + ' (at **)'; - } - } - return v8StyleStack; -} - const repoRoot = path.resolve(__dirname, '../../../../'); function normalizeReactCodeLocInfo(str) { const repoRootForRegexp = repoRoot.replace(/\//g, '\\/'); @@ -67,35 +53,6 @@ function getErrorForJestMatcher(error) { }; } -function normalizeComponentInfo(debugInfo) { - if (Array.isArray(debugInfo.stack)) { - const {debugTask, debugStack, debugLocation, ...copy} = debugInfo; - copy.stack = formatV8Stack(debugInfo.stack); - if (debugInfo.owner) { - copy.owner = normalizeComponentInfo(debugInfo.owner); - } - return copy; - } else { - return debugInfo; - } -} - -function getDebugInfo(obj) { - const debugInfo = obj._debugInfo; - if (debugInfo) { - const copy = []; - for (let i = 0; i < debugInfo.length; i++) { - if (debugInfo[i].awaited && debugInfo[i].awaited.name === 'RSC stream') { - // Ignore RSC stream I/O info. - } else { - copy.push(normalizeComponentInfo(debugInfo[i])); - } - } - return copy; - } - return debugInfo; -} - const finalizationRegistries = []; function FinalizationRegistryMock(callback) { this._heldValues = []; @@ -132,6 +89,7 @@ let NoErrorExpected; let Scheduler; let assertLog; let assertConsoleErrorDev; +let getDebugInfo; describe('ReactFlight', () => { beforeEach(() => { @@ -169,6 +127,11 @@ describe('ReactFlight', () => { assertLog = InternalTestUtils.assertLog; assertConsoleErrorDev = InternalTestUtils.assertConsoleErrorDev; + getDebugInfo = InternalTestUtils.getDebugInfo.bind(null, { + useV8Stack: true, + ignoreRscStreamInfo: true, + }); + ErrorBoundary = class extends React.Component { state = {hasError: false, error: null}; static getDerivedStateFromError(error) { diff --git a/packages/react-client/src/__tests__/ReactFlightDebugChannel-test.js b/packages/react-client/src/__tests__/ReactFlightDebugChannel-test.js index e9428c3ba40..6d691692614 100644 --- a/packages/react-client/src/__tests__/ReactFlightDebugChannel-test.js +++ b/packages/react-client/src/__tests__/ReactFlightDebugChannel-test.js @@ -18,50 +18,12 @@ if (typeof File === 'undefined' || typeof FormData === 'undefined') { global.FormData = require('undici').FormData; } -function formatV8Stack(stack) { - let v8StyleStack = ''; - if (stack) { - for (let i = 0; i < stack.length; i++) { - const [name] = stack[i]; - if (v8StyleStack !== '') { - v8StyleStack += '\n'; - } - v8StyleStack += ' in ' + name + ' (at **)'; - } - } - return v8StyleStack; -} - -function normalizeComponentInfo(debugInfo) { - if (Array.isArray(debugInfo.stack)) { - const {debugTask, debugStack, ...copy} = debugInfo; - copy.stack = formatV8Stack(debugInfo.stack); - if (debugInfo.owner) { - copy.owner = normalizeComponentInfo(debugInfo.owner); - } - return copy; - } else { - return debugInfo; - } -} - -function getDebugInfo(obj) { - const debugInfo = obj._debugInfo; - if (debugInfo) { - const copy = []; - for (let i = 0; i < debugInfo.length; i++) { - copy.push(normalizeComponentInfo(debugInfo[i])); - } - return copy; - } - return debugInfo; -} - let act; let React; let ReactNoop; let ReactNoopFlightServer; let ReactNoopFlightClient; +let getDebugInfo; describe('ReactFlight', () => { beforeEach(() => { @@ -91,6 +53,11 @@ describe('ReactFlight', () => { ReactNoop = require('react-noop-renderer'); ReactNoopFlightClient = require('react-noop-renderer/flight-client'); act = require('internal-test-utils').act; + + getDebugInfo = require('internal-test-utils').getDebugInfo.bind(null, { + useV8Stack: true, + ignoreRscStreamInfo: true, + }); }); afterEach(() => { diff --git a/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js b/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js index ab4a054b019..b7d7959f21d 100644 --- a/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js +++ b/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js @@ -3,8 +3,6 @@ */ 'use strict'; -const path = require('path'); - import {patchSetImmediate} from '../../../../scripts/jest/patchSetImmediate'; let React; @@ -14,106 +12,12 @@ let ReactServerDOMServer; let ReactServerDOMClient; let Stream; let observer; +let getDebugInfo; const streamOptions = { objectMode: true, }; -const repoRoot = path.resolve(__dirname, '../../../../'); - -function normalizeStack(stack) { - if (!stack) { - return stack; - } - const copy = []; - for (let i = 0; i < stack.length; i++) { - const [name, file, line, col, enclosingLine, enclosingCol] = stack[i]; - copy.push([ - name, - file.replace(repoRoot, ''), - line, - col, - enclosingLine, - enclosingCol, - ]); - } - return copy; -} - -function normalizeIOInfo(ioInfo) { - const {debugTask, debugStack, debugLocation, ...copy} = ioInfo; - if (ioInfo.stack) { - copy.stack = normalizeStack(ioInfo.stack); - } - if (ioInfo.owner) { - copy.owner = normalizeDebugInfo(ioInfo.owner); - } - if (typeof ioInfo.start === 'number') { - copy.start = 0; - } - if (typeof ioInfo.end === 'number') { - copy.end = 0; - } - const promise = ioInfo.value; - if (promise) { - promise.then(); // init - if (promise.status === 'fulfilled') { - if (ioInfo.name === 'RSC stream') { - copy.byteSize = 0; - copy.value = { - value: 'stream', - }; - } else { - copy.value = { - value: promise.value, - }; - } - } else if (promise.status === 'rejected') { - copy.value = { - reason: promise.reason, - }; - } else { - copy.value = { - status: promise.status, - }; - } - } - return copy; -} - -function normalizeDebugInfo(original) { - const {debugTask, debugStack, debugLocation, ...debugInfo} = original; - if (original.owner) { - debugInfo.owner = normalizeDebugInfo(original.owner); - } - if (original.awaited) { - debugInfo.awaited = normalizeIOInfo(original.awaited); - } - if (debugInfo.props) { - debugInfo.props = {}; - } - if (Array.isArray(debugInfo.stack)) { - debugInfo.stack = normalizeStack(debugInfo.stack); - return debugInfo; - } else if (typeof debugInfo.time === 'number') { - return {...debugInfo, time: 0}; - } else { - return debugInfo; - } -} - -function getDebugInfo(obj) { - const debugInfo = obj._debugInfo; - if (debugInfo) { - const copy = []; - for (let i = 0; i < debugInfo.length; i++) { - copy.push(normalizeDebugInfo(debugInfo[i])); - } - return copy; - } - return debugInfo; -} - function filterStackFrame(filename, functionName) { return ( !filename.startsWith('node:') && @@ -153,6 +57,11 @@ describe('ReactFlightAsyncDebugInfo', () => { React = require('react'); ReactServerDOMClient = require('react-server-dom-webpack/client'); Stream = require('stream'); + + getDebugInfo = require('internal-test-utils').getDebugInfo.bind(null, { + ignoreProps: true, + useFixedTime: true, + }); }); afterEach(() => { @@ -247,9 +156,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 216, + 125, 109, - 196, + 105, 50, ], ], @@ -271,9 +180,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 216, + 125, 109, - 196, + 105, 50, ], ], @@ -282,25 +191,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 198, + 107, 13, - 197, + 106, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 205, + 114, 26, - 204, + 113, 5, ], ], @@ -319,9 +228,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 216, + 125, 109, - 196, + 105, 50, ], ], @@ -330,17 +239,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 198, + 107, 13, - 197, + 106, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 205, + 114, 26, - 204, + 113, 5, ], ], @@ -365,9 +274,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 216, + 125, 109, - 196, + 105, 50, ], ], @@ -376,25 +285,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 199, + 108, 21, - 197, + 106, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 205, + 114, 20, - 204, + 113, 5, ], ], @@ -413,9 +322,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 216, + 125, 109, - 196, + 105, 50, ], ], @@ -424,17 +333,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 200, + 109, 21, - 197, + 106, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 205, + 114, 20, - 204, + 113, 5, ], ], @@ -454,9 +363,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 207, + 116, 60, - 204, + 113, 5, ], ], @@ -478,9 +387,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 216, + 125, 109, - 196, + 105, 50, ], ], @@ -489,17 +398,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 199, + 108, 21, - 197, + 106, 5, ], ], @@ -518,9 +427,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 207, + 116, 60, - 204, + 113, 5, ], ], @@ -529,9 +438,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "InnerComponent", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 213, + 122, 35, - 210, + 119, 5, ], ], @@ -712,9 +621,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 676, + 585, 40, - 657, + 566, 49, ], [ @@ -744,9 +653,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 676, + 585, 40, - 657, + 566, 49, ], [ @@ -763,25 +672,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 659, + 568, 13, - 658, + 567, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 664, + 573, 36, - 663, + 572, 5, ], ], @@ -800,9 +709,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 676, + 585, 40, - 657, + 566, 49, ], [ @@ -819,17 +728,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 659, + 568, 13, - 658, + 567, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 664, + 573, 36, - 663, + 572, 5, ], ], @@ -849,9 +758,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 666, + 575, 60, - 663, + 572, 5, ], ], @@ -870,9 +779,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 676, + 585, 40, - 657, + 566, 49, ], [ @@ -889,25 +798,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 659, + 568, 13, - 658, + 567, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 665, + 574, 22, - 663, + 572, 5, ], ], @@ -926,9 +835,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 666, + 575, 60, - 663, + 572, 5, ], ], @@ -937,9 +846,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "InnerComponent", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 672, + 581, 40, - 669, + 578, 5, ], ], @@ -1014,9 +923,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 983, + 892, 109, - 970, + 879, 80, ], ], @@ -1035,9 +944,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 983, + 892, 109, - 970, + 879, 80, ], ], @@ -1054,9 +963,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 983, + 892, 109, - 970, + 879, 80, ], ], @@ -1128,9 +1037,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1097, + 1006, 109, - 1088, + 997, 94, ], ], @@ -1213,9 +1122,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1182, + 1091, 109, - 1158, + 1067, 50, ], ], @@ -1309,9 +1218,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1278, + 1187, 109, - 1261, + 1170, 63, ], ], @@ -1328,17 +1237,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "fetchThirdParty", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 181, + 90, 40, - 179, + 88, 3, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1274, + 1183, 24, - 1273, + 1182, 5, ], ], @@ -1360,17 +1269,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "fetchThirdParty", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 181, + 90, 40, - 179, + 88, 3, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1274, + 1183, 24, - 1273, + 1182, 5, ], ], @@ -1379,25 +1288,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1263, + 1172, 13, - 1262, + 1171, 5, ], [ "ThirdPartyComponent", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1269, + 1178, 24, - 1268, + 1177, 5, ], ], @@ -1416,17 +1325,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "fetchThirdParty", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 181, + 90, 40, - 179, + 88, 3, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1274, + 1183, 24, - 1273, + 1182, 5, ], ], @@ -1435,17 +1344,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1263, + 1172, 13, - 1262, + 1171, 5, ], [ "ThirdPartyComponent", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1269, + 1178, 24, - 1268, + 1177, 5, ], ], @@ -1470,17 +1379,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "fetchThirdParty", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 181, + 90, 40, - 179, + 88, 3, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1274, + 1183, 24, - 1273, + 1182, 5, ], ], @@ -1489,25 +1398,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1264, + 1173, 13, - 1262, + 1171, 5, ], [ "ThirdPartyComponent", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1269, + 1178, 18, - 1268, + 1177, 5, ], ], @@ -1526,17 +1435,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "fetchThirdParty", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 181, + 90, 40, - 179, + 88, 3, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1274, + 1183, 24, - 1273, + 1182, 5, ], ], @@ -1545,17 +1454,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1264, + 1173, 13, - 1262, + 1171, 5, ], [ "ThirdPartyComponent", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1269, + 1178, 18, - 1268, + 1177, 5, ], ], @@ -1653,9 +1562,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1617, + 1526, 40, - 1600, + 1509, 62, ], [ @@ -1685,9 +1594,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1617, + 1526, 40, - 1600, + 1509, 62, ], [ @@ -1704,25 +1613,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1602, + 1511, 13, - 1601, + 1510, 25, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1612, + 1521, 13, - 1611, + 1520, 5, ], ], @@ -1741,9 +1650,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1617, + 1526, 40, - 1600, + 1509, 62, ], [ @@ -1760,17 +1669,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1602, + 1511, 13, - 1601, + 1510, 25, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1612, + 1521, 13, - 1611, + 1520, 5, ], ], @@ -1790,9 +1699,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1613, + 1522, 60, - 1611, + 1520, 5, ], ], @@ -1814,9 +1723,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1617, + 1526, 40, - 1600, + 1509, 62, ], [ @@ -1833,25 +1742,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1602, + 1511, 13, - 1601, + 1510, 25, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1612, + 1521, 13, - 1611, + 1520, 5, ], ], @@ -1870,9 +1779,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1613, + 1522, 60, - 1611, + 1520, 5, ], ], @@ -1881,9 +1790,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Child", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1607, + 1516, 28, - 1606, + 1515, 5, ], ], @@ -1966,9 +1875,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1930, + 1839, 40, - 1914, + 1823, 57, ], [ @@ -1998,9 +1907,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1930, + 1839, 40, - 1914, + 1823, 57, ], [ @@ -2017,25 +1926,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1916, + 1825, 13, - 1915, + 1824, 25, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1925, + 1834, 23, - 1924, + 1833, 5, ], ], @@ -2054,9 +1963,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1930, + 1839, 40, - 1914, + 1823, 57, ], [ @@ -2073,17 +1982,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1916, + 1825, 13, - 1915, + 1824, 25, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1925, + 1834, 23, - 1924, + 1833, 5, ], ], @@ -2103,9 +2012,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1926, + 1835, 60, - 1924, + 1833, 5, ], ], @@ -2124,9 +2033,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1930, + 1839, 40, - 1914, + 1823, 57, ], [ @@ -2143,25 +2052,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1916, + 1825, 13, - 1915, + 1824, 25, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1925, + 1834, 23, - 1924, + 1833, 5, ], ], @@ -2175,9 +2084,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 1926, + 1835, 60, - 1924, + 1833, 5, ], ], @@ -2262,9 +2171,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2226, + 2135, 40, - 2208, + 2117, 80, ], [ @@ -2294,9 +2203,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2226, + 2135, 40, - 2208, + 2117, 80, ], [ @@ -2313,25 +2222,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "delayTrice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2216, + 2125, 13, - 2214, + 2123, 5, ], [ "Bar", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2221, + 2130, 13, - 2220, + 2129, 5, ], ], @@ -2350,9 +2259,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2226, + 2135, 40, - 2208, + 2117, 80, ], [ @@ -2369,17 +2278,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delayTrice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2216, + 2125, 13, - 2214, + 2123, 5, ], [ "Bar", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2221, + 2130, 13, - 2220, + 2129, 5, ], ], @@ -2401,9 +2310,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2226, + 2135, 40, - 2208, + 2117, 80, ], [ @@ -2420,33 +2329,33 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "delayTwice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2210, + 2119, 13, - 2209, + 2118, 5, ], [ "delayTrice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2215, + 2124, 15, - 2214, + 2123, 5, ], [ "Bar", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2221, + 2130, 13, - 2220, + 2129, 5, ], ], @@ -2465,9 +2374,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2226, + 2135, 40, - 2208, + 2117, 80, ], [ @@ -2484,25 +2393,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delayTwice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2210, + 2119, 13, - 2209, + 2118, 5, ], [ "delayTrice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2215, + 2124, 15, - 2214, + 2123, 5, ], [ "Bar", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2221, + 2130, 13, - 2220, + 2129, 5, ], ], @@ -2524,9 +2433,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2226, + 2135, 40, - 2208, + 2117, 80, ], [ @@ -2543,17 +2452,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "delayTwice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2211, + 2120, 13, - 2209, + 2118, 5, ], ], @@ -2572,9 +2481,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2226, + 2135, 40, - 2208, + 2117, 80, ], [ @@ -2591,9 +2500,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delayTwice", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2211, + 2120, 13, - 2209, + 2118, 5, ], ], @@ -2666,9 +2575,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2635, + 2544, 109, - 2624, + 2533, 58, ], ], @@ -2690,9 +2599,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2635, + 2544, 109, - 2624, + 2533, 58, ], ], @@ -2701,25 +2610,25 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2626, + 2535, 14, - 2625, + 2534, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2632, + 2541, 20, - 2631, + 2540, 5, ], ], @@ -2738,9 +2647,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2635, + 2544, 109, - 2624, + 2533, 58, ], ], @@ -2749,17 +2658,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "getData", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2626, + 2535, 23, - 2625, + 2534, 5, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2632, + 2541, 20, - 2631, + 2540, 5, ], ], @@ -2838,9 +2747,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2802, + 2711, 40, - 2790, + 2699, 56, ], [ @@ -2870,9 +2779,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2802, + 2711, 40, - 2790, + 2699, 56, ], [ @@ -2889,17 +2798,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "delay", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 174, + 83, 12, - 173, + 82, 3, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2798, + 2707, 20, - 2797, + 2706, 5, ], ], @@ -2918,9 +2827,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2802, + 2711, 40, - 2790, + 2699, 56, ], [ @@ -2937,9 +2846,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2798, + 2707, 20, - 2797, + 2706, 5, ], ], @@ -3032,9 +2941,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2991, + 2900, 40, - 2970, + 2879, 42, ], [ @@ -3064,9 +2973,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2991, + 2900, 40, - 2970, + 2879, 42, ], [ @@ -3083,17 +2992,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2977, + 2886, 15, - 2976, + 2885, 15, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2986, + 2895, 19, - 2985, + 2894, 5, ], ], @@ -3112,9 +3021,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2991, + 2900, 40, - 2970, + 2879, 42, ], [ @@ -3131,17 +3040,17 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2977, + 2886, 15, - 2976, + 2885, 15, ], [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2986, + 2895, 19, - 2985, + 2894, 5, ], ], @@ -3163,9 +3072,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2991, + 2900, 40, - 2970, + 2879, 42, ], [ @@ -3182,9 +3091,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2986, + 2895, 25, - 2985, + 2894, 5, ], ], @@ -3203,9 +3112,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Object.", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2991, + 2900, 40, - 2970, + 2879, 42, ], [ @@ -3222,9 +3131,9 @@ describe('ReactFlightAsyncDebugInfo', () => { [ "Component", "/packages/react-server/src/__tests__/ReactFlightAsyncDebugInfo-test.js", - 2986, + 2895, 25, - 2985, + 2894, 5, ], ], From 6eda534718d09a26d58d65c0a376e05d7e2a3358 Mon Sep 17 00:00:00 2001 From: Eugene Choi <4eugenechoi@gmail.com> Date: Thu, 18 Sep 2025 15:44:25 -0400 Subject: [PATCH 3/3] [playground] bug fixes & UX improvements (#34499) ## Summary Made many small changes to the compiler playground to improve user experience. Removed any "Loading" indicators that would flash in before a component would finish loading in. Additionally, before users would see the "Show Internals" button toggling from false to true if they had set it at true previously. I was able to refactor the URL/local storage loading so that the `Store` would be fully initialized before the components would load in. Attempted to integrate `` into showing/hiding these different editors, but the current state of [monaco editors](https://github.com/suren-atoyan/monaco-react) does not allow for this. I created an issue for them to address: https://github.com/suren-atoyan/monaco-react/issues/753 Added a debounce to the config editor so every key type wouldn't cause the output panel to respond instantly. Users can type for 500 ms before an error is thrown at them. ## How did you test this change? Here is what loading the page would look like before (not sure why its so blurry): https://github.com/user-attachments/assets/58f4281a-cc02-4141-b9b5-f70d6ace12a2 Here is how it looks now: https://github.com/user-attachments/assets/40535165-fc7c-44fb-9282-9c7fa76e7d53 Here is the debouncing: https://github.com/user-attachments/assets/e4ab29e4-1afd-4249-beca-671fb6542f5e --- .../playground/__tests__/e2e/page.spec.ts | 6 +- compiler/apps/playground/app/index.tsx | 56 --------- .../playground/components/AccordionWindow.tsx | 9 -- .../components/Editor/ConfigEditor.tsx | 57 ++++++--- .../components/Editor/EditorImpl.tsx | 42 +------ .../playground/components/Editor/Input.tsx | 40 ++---- .../playground/components/Editor/Output.tsx | 2 + .../components/Editor/monacoOptions.ts | 2 + .../playground/components/StoreContext.tsx | 26 +++- .../playground/components/TabbedWindow.tsx | 7 -- compiler/apps/playground/lib/stores/store.ts | 2 +- compiler/apps/playground/next-env.d.ts | 2 +- compiler/apps/playground/package.json | 4 +- compiler/apps/playground/tsconfig.json | 5 +- compiler/apps/playground/yarn.lock | 119 +++++++++--------- 15 files changed, 149 insertions(+), 230 deletions(-) delete mode 100644 compiler/apps/playground/app/index.tsx diff --git a/compiler/apps/playground/__tests__/e2e/page.spec.ts b/compiler/apps/playground/__tests__/e2e/page.spec.ts index 296f45a2776..17505024ffe 100644 --- a/compiler/apps/playground/__tests__/e2e/page.spec.ts +++ b/compiler/apps/playground/__tests__/e2e/page.spec.ts @@ -136,7 +136,7 @@ test('editor should compile from hash successfully', async ({page}) => { path: 'test-results/01-compiles-from-hash.png', }); const text = - (await page.locator('.monaco-editor').nth(1).allInnerTexts()) ?? []; + (await page.locator('.monaco-editor').nth(3).allInnerTexts()) ?? []; const output = await formatPrint(text); expect(output).not.toEqual(''); @@ -162,7 +162,7 @@ test('reset button works', async ({page}) => { path: 'test-results/02-reset-button-works.png', }); const text = - (await page.locator('.monaco-editor').nth(1).allInnerTexts()) ?? []; + (await page.locator('.monaco-editor').nth(3).allInnerTexts()) ?? []; const output = await formatPrint(text); expect(output).not.toEqual(''); @@ -183,7 +183,7 @@ TEST_CASE_INPUTS.forEach((t, idx) => }); const text = - (await page.locator('.monaco-editor').nth(1).allInnerTexts()) ?? []; + (await page.locator('.monaco-editor').nth(3).allInnerTexts()) ?? []; let output: string; if (t.noFormat) { output = text.join(''); diff --git a/compiler/apps/playground/app/index.tsx b/compiler/apps/playground/app/index.tsx deleted file mode 100644 index 3bbf2e9b555..00000000000 --- a/compiler/apps/playground/app/index.tsx +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import type {NextPage} from 'next'; -import Head from 'next/head'; -import {SnackbarProvider} from 'notistack'; -import {Editor, Header, StoreProvider} from '../components'; -import MessageSnackbar from '../components/Message'; - -const Home: NextPage = () => { - return ( -
- - - {process.env.NODE_ENV === 'development' - ? '[DEV] React Compiler Playground' - : 'React Compiler Playground'} - - - - - - - - - -
- - - -
- ); -}; - -export default Home; diff --git a/compiler/apps/playground/components/AccordionWindow.tsx b/compiler/apps/playground/components/AccordionWindow.tsx index de3b01b0b05..bebbb0c4787 100644 --- a/compiler/apps/playground/components/AccordionWindow.tsx +++ b/compiler/apps/playground/components/AccordionWindow.tsx @@ -17,15 +17,6 @@ export default function AccordionWindow(props: { setTabsOpen: (newTab: Set) => void; changedPasses: Set; }): React.ReactElement { - if (props.tabs.size === 0) { - return ( -
- No compiler output detected, see errors below -
- ); - } return (
{Array.from(props.tabs.keys()).map(name => { diff --git a/compiler/apps/playground/components/Editor/ConfigEditor.tsx b/compiler/apps/playground/components/Editor/ConfigEditor.tsx index 162d82591cb..add42018a38 100644 --- a/compiler/apps/playground/components/Editor/ConfigEditor.tsx +++ b/compiler/apps/playground/components/Editor/ConfigEditor.tsx @@ -9,7 +9,7 @@ import MonacoEditor, {loader, type Monaco} from '@monaco-editor/react'; import {PluginOptions} from 'babel-plugin-react-compiler'; import type {editor} from 'monaco-editor'; import * as monaco from 'monaco-editor'; -import React, {useState} from 'react'; +import React, {useState, useRef, useEffect} from 'react'; import {Resizable} from 're-resizable'; import {useStore, useStoreDispatch} from '../StoreContext'; import {monacoOptions} from './monacoOptions'; @@ -28,10 +28,25 @@ export default function ConfigEditor({ }): React.ReactElement { const [isExpanded, setIsExpanded] = useState(false); - return isExpanded ? ( - - ) : ( - + return ( + // TODO: Use when it is compatible with Monaco: https://github.com/suren-atoyan/monaco-react/issues/753 + <> +
+ +
+
+ +
+ ); } @@ -44,16 +59,25 @@ function ExpandedEditor({ }): React.ReactElement { const store = useStore(); const dispatchStore = useStoreDispatch(); + const debounceTimerRef = useRef(null); - const handleChange: (value: string | undefined) => void = value => { + const handleChange: (value: string | undefined) => void = ( + value: string | undefined, + ) => { if (value === undefined) return; - dispatchStore({ - type: 'updateConfig', - payload: { - config: value, - }, - }); + if (debounceTimerRef.current) { + clearTimeout(debounceTimerRef.current); + } + + debounceTimerRef.current = setTimeout(() => { + dispatchStore({ + type: 'updateConfig', + payload: { + config: value, + }, + }); + }, 500); // 500ms debounce delay }; const handleMount: ( @@ -77,12 +101,6 @@ function ExpandedEditor({ allowSyntheticDefaultImports: true, jsx: monaco.languages.typescript.JsxEmit.React, }); - - const uri = monaco.Uri.parse(`file:///config.ts`); - const model = monaco.editor.getModel(uri); - if (model) { - model.updateOptions({tabSize: 2}); - } }; const formattedAppliedOptions = appliedOptions @@ -126,6 +144,7 @@ function ExpandedEditor({ value={store.config} onMount={handleMount} onChange={handleChange} + loading={''} options={{ ...monacoOptions, lineNumbers: 'off', @@ -139,7 +158,6 @@ function ExpandedEditor({ />
-

@@ -151,6 +169,7 @@ function ExpandedEditor({ path={'applied-config.js'} language={'javascript'} value={formattedAppliedOptions} + loading={''} options={{ ...monacoOptions, lineNumbers: 'off', diff --git a/compiler/apps/playground/components/Editor/EditorImpl.tsx b/compiler/apps/playground/components/Editor/EditorImpl.tsx index 8b75ce6ac5e..696bbd2559c 100644 --- a/compiler/apps/playground/components/Editor/EditorImpl.tsx +++ b/compiler/apps/playground/components/Editor/EditorImpl.tsx @@ -24,19 +24,8 @@ import BabelPluginReactCompiler, { printFunctionWithOutlined, type LoggerEvent, } from 'babel-plugin-react-compiler'; -import invariant from 'invariant'; -import {useSnackbar} from 'notistack'; import {useDeferredValue, useMemo} from 'react'; -import {useMountEffect} from '../../hooks'; -import {defaultStore} from '../../lib/defaultStore'; -import { - createMessage, - initStoreFromUrlOrLocalStorage, - MessageLevel, - MessageSource, - type Store, -} from '../../lib/stores'; -import {useStore, useStoreDispatch} from '../StoreContext'; +import {useStore} from '../StoreContext'; import ConfigEditor from './ConfigEditor'; import Input from './Input'; import { @@ -174,7 +163,6 @@ function parseOptions( // Parse config overrides from config editor let configOverrideOptions: any = {}; const configMatch = configOverrides.match(/^\s*import.*?\n\n\((.*)\)/s); - // TODO: initialize store with URL params, not empty store if (configOverrides.trim()) { if (configMatch && configMatch[1]) { const configString = configMatch[1].replace(/satisfies.*$/, '').trim(); @@ -327,8 +315,6 @@ function compile( export default function Editor(): JSX.Element { const store = useStore(); const deferredStore = useDeferredValue(store); - const dispatchStore = useStoreDispatch(); - const {enqueueSnackbar} = useSnackbar(); const [compilerOutput, language, appliedOptions] = useMemo( () => compile(deferredStore.source, 'compiler', deferredStore.config), [deferredStore.source, deferredStore.config], @@ -338,32 +324,6 @@ export default function Editor(): JSX.Element { [deferredStore.source, deferredStore.config], ); - useMountEffect(() => { - // Initialize store - let mountStore: Store; - try { - mountStore = initStoreFromUrlOrLocalStorage(); - } catch (e) { - invariant(e instanceof Error, 'Only Error may be caught.'); - enqueueSnackbar(e.message, { - variant: 'warning', - ...createMessage( - 'Bad URL - fell back to the default Playground.', - MessageLevel.Info, - MessageSource.Playground, - ), - }); - mountStore = defaultStore; - } - - dispatchStore({ - type: 'setStore', - payload: { - store: mountStore, - }, - }); - }); - let mergedOutput: CompilerOutput; let errors: Array; if (compilerOutput.kind === 'ok') { diff --git a/compiler/apps/playground/components/Editor/Input.tsx b/compiler/apps/playground/components/Editor/Input.tsx index 206b98300be..d8744c3ca97 100644 --- a/compiler/apps/playground/components/Editor/Input.tsx +++ b/compiler/apps/playground/components/Editor/Input.tsx @@ -13,7 +13,6 @@ import { import invariant from 'invariant'; import type {editor} from 'monaco-editor'; import * as monaco from 'monaco-editor'; -import {Resizable} from 're-resizable'; import {useEffect, useState} from 'react'; import {renderReactCompilerMarkers} from '../../lib/reactCompilerMonacoDiagnostics'; import {useStore, useStoreDispatch} from '../StoreContext'; @@ -46,11 +45,6 @@ export default function Input({errors, language}: Props): JSX.Element { details: errors, source: store.source, }); - /** - * N.B. that `tabSize` is a model property, not an editor property. - * So, the tab size has to be set per model. - */ - model.updateOptions({tabSize: 2}); }, [monaco, errors, store.source]); useEffect(() => { @@ -152,38 +146,24 @@ export default function Input({errors, language}: Props): JSX.Element { onMount={handleMount} onChange={handleChange} options={monacoOptions} + loading={''} /> ); const tabs = new Map([['Input', editorContent]]); const [activeTab, setActiveTab] = useState('Input'); - const tabbedContent = ( -
- -
- ); - return (
- {store.showInternals ? ( - - {tabbedContent} - - ) : ( -
{tabbedContent}
- )} +
+
+ +
+
); } diff --git a/compiler/apps/playground/components/Editor/Output.tsx b/compiler/apps/playground/components/Editor/Output.tsx index 22f908e51bb..bf73c192c11 100644 --- a/compiler/apps/playground/components/Editor/Output.tsx +++ b/compiler/apps/playground/components/Editor/Output.tsx @@ -324,6 +324,7 @@ function TextTabContent({ = { automaticLayout: true, wordWrap: 'on', wrappingIndent: 'same', + + tabSize: 2, }; diff --git a/compiler/apps/playground/components/StoreContext.tsx b/compiler/apps/playground/components/StoreContext.tsx index 52de6c0fa3e..3f55678edf1 100644 --- a/compiler/apps/playground/components/StoreContext.tsx +++ b/compiler/apps/playground/components/StoreContext.tsx @@ -6,10 +6,14 @@ */ import type {Dispatch, ReactNode} from 'react'; -import {useEffect, useReducer} from 'react'; +import {useState, useEffect, useReducer} from 'react'; import createContext from '../lib/createContext'; -import {emptyStore} from '../lib/defaultStore'; -import {saveStore, type Store} from '../lib/stores'; +import {emptyStore, defaultStore} from '../lib/defaultStore'; +import { + saveStore, + initStoreFromUrlOrLocalStorage, + type Store, +} from '../lib/stores'; const StoreContext = createContext(); @@ -30,6 +34,20 @@ export const useStoreDispatch = StoreDispatchContext.useContext; */ export function StoreProvider({children}: {children: ReactNode}): JSX.Element { const [store, dispatch] = useReducer(storeReducer, emptyStore); + const [isPageReady, setIsPageReady] = useState(false); + + useEffect(() => { + let mountStore: Store; + try { + mountStore = initStoreFromUrlOrLocalStorage(); + } catch (e) { + console.error('Failed to initialize store from URL or local storage', e); + mountStore = defaultStore; + } + dispatch({type: 'setStore', payload: {store: mountStore}}); + setIsPageReady(true); + }, []); + useEffect(() => { if (store !== emptyStore) { saveStore(store); @@ -39,7 +57,7 @@ export function StoreProvider({children}: {children: ReactNode}): JSX.Element { return ( - {children} + {isPageReady ? children : null} ); diff --git a/compiler/apps/playground/components/TabbedWindow.tsx b/compiler/apps/playground/components/TabbedWindow.tsx index 1751bd87e26..d2335687c22 100644 --- a/compiler/apps/playground/components/TabbedWindow.tsx +++ b/compiler/apps/playground/components/TabbedWindow.tsx @@ -16,13 +16,6 @@ export default function TabbedWindow({ activeTab: string; onTabChange: (tab: string) => void; }): React.ReactElement { - if (tabs.size === 0) { - return ( -
- No compiler output detected, see errors below -
- ); - } return (
diff --git a/compiler/apps/playground/lib/stores/store.ts b/compiler/apps/playground/lib/stores/store.ts index e67578c79bf..6655efa2740 100644 --- a/compiler/apps/playground/lib/stores/store.ts +++ b/compiler/apps/playground/lib/stores/store.ts @@ -71,7 +71,7 @@ export function initStoreFromUrlOrLocalStorage(): Store { // Make sure all properties are populated return { source: raw.source, - config: 'config' in raw ? raw.config : defaultConfig, + config: 'config' in raw && raw['config'] ? raw.config : defaultConfig, showInternals: 'showInternals' in raw ? raw.showInternals : false, }; } diff --git a/compiler/apps/playground/next-env.d.ts b/compiler/apps/playground/next-env.d.ts index 830fb594ca2..9edff1c7cac 100644 --- a/compiler/apps/playground/next-env.d.ts +++ b/compiler/apps/playground/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -/// +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/compiler/apps/playground/package.json b/compiler/apps/playground/package.json index 44c1f101230..08aed45e0f3 100644 --- a/compiler/apps/playground/package.json +++ b/compiler/apps/playground/package.json @@ -34,7 +34,7 @@ "invariant": "^2.2.4", "lz-string": "^1.5.0", "monaco-editor": "^0.52.0", - "next": "15.5.2", + "next": "15.6.0-canary.7", "notistack": "^3.0.0-alpha.7", "prettier": "^3.3.3", "pretty-format": "^29.3.1", @@ -44,7 +44,7 @@ }, "devDependencies": { "@types/node": "18.11.9", - "@types/react": "19.1.12", + "@types/react": "19.1.13", "@types/react-dom": "19.1.9", "autoprefixer": "^10.4.13", "clsx": "^1.2.1", diff --git a/compiler/apps/playground/tsconfig.json b/compiler/apps/playground/tsconfig.json index eb7fcfe2b72..4f70dcef8ab 100644 --- a/compiler/apps/playground/tsconfig.json +++ b/compiler/apps/playground/tsconfig.json @@ -6,6 +6,9 @@ "dom.iterable", "esnext" ], + "types": [ + "react/experimental" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -16,7 +19,7 @@ "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { diff --git a/compiler/apps/playground/yarn.lock b/compiler/apps/playground/yarn.lock index 9bf1bb0687b..53f0d24db70 100644 --- a/compiler/apps/playground/yarn.lock +++ b/compiler/apps/playground/yarn.lock @@ -715,10 +715,10 @@ dependencies: "@monaco-editor/loader" "^1.4.0" -"@next/env@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-15.5.2.tgz#0c6b959313cd6e71afb69bf0deb417237f1d2f8a" - integrity sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg== +"@next/env@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.6.0-canary.7.tgz#cdbf2967a9437ef09eef755e203f315acc4d8d8f" + integrity sha512-LNZ7Yd3Cl9rKvjYdeJmszf2HmSDP76SQmfafKep2Ux16ZXKoN5OjwVHFTltKNdsB3vt2t+XJzLP2rhw5lBoFBA== "@next/eslint-plugin-next@15.5.2": version "15.5.2" @@ -727,45 +727,45 @@ dependencies: fast-glob "3.3.1" -"@next/swc-darwin-arm64@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz#f69713326fc08f2eff3726fe19165cdb429d67c7" - integrity sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ== - -"@next/swc-darwin-x64@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz#560a9da4126bae75cbbd6899646ad7a2e4fdcc9b" - integrity sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ== - -"@next/swc-linux-arm64-gnu@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz#80b2be276e775e5a9286369ae54e536b0cdf8c3a" - integrity sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA== - -"@next/swc-linux-arm64-musl@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz#68cf676301755fd99aca11a7ebdb5eae88d7c2e4" - integrity sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g== - -"@next/swc-linux-x64-gnu@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz#209d9a79d0f2333544f863b0daca3f7e29f2eaff" - integrity sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q== - -"@next/swc-linux-x64-musl@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz#d4ad1cfb5e99e51db669fe2145710c1abeadbd7f" - integrity sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g== - -"@next/swc-win32-arm64-msvc@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz#070e10e370a5447a198c2db100389646aca2c496" - integrity sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg== - -"@next/swc-win32-x64-msvc@15.5.2": - version "15.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz#9237d40b82eaf2efc88baeba15b784d4126caf4a" - integrity sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q== +"@next/swc-darwin-arm64@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.6.0-canary.7.tgz#628cd34ce9120000f1cb5b08963426431174fc57" + integrity sha512-POsBrxhrR3qvqXV+JZ6ZoBc8gJf8rhYe+OedceI1piPVqtJYOJa3EB4eaqcc+kMsllKRrH/goNlhLwtyhE+0Qg== + +"@next/swc-darwin-x64@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.6.0-canary.7.tgz#37d4ebab14da74a2f8028daf6d76aab410153e06" + integrity sha512-lmk9ysBuSiPlAJZTCo/3O4mXNFosg6EDIf4GrmynIwCG2as6/KxzyD1WqFp56Exp8eFDjP7SFapD10sV43vCsA== + +"@next/swc-linux-arm64-gnu@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.6.0-canary.7.tgz#ce700cc0e0d24763136838223105a524b36694fa" + integrity sha512-why8k6d0SBm3AKoOD5S7ir3g+BF34l9oFKIoZrLaZaKBvNGpFcjc7Ovc2TunNMeaMJzv9k1dHYSap0EI5oSuzg== + +"@next/swc-linux-arm64-musl@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.6.0-canary.7.tgz#c791b8e15bf2c338b4cc0387fe7afb3ef83ecfcf" + integrity sha512-HzvTRsKvYj32Va4YuJN3n3xOxvk+6QwB63d/EsgmdkeA/vrqciUAmJDYpuzZEvRc3Yp2nyPq8KZxtHAr6ISZ2Q== + +"@next/swc-linux-x64-gnu@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.6.0-canary.7.tgz#c01c3a3d8e71660c49298dd053d078379b6b5919" + integrity sha512-6yRFrg2qWXOqa+1BI53J9EmHWFzKg9U2r+5R7n7BFUp8PH5SC92WBsmYTnh/RkvAYvdupiVzMervwwswCs6kFg== + +"@next/swc-linux-x64-musl@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.6.0-canary.7.tgz#3f4b39faef4a5f88b13e4c726b008ddc9717f819" + integrity sha512-O/JjvOvNK/Wao/OIQaA6evDkxkmFFQgJ1/hI1dVk6/PAeKmW2/Q+6Dodh97eAkOwedS1ZdQl2mojf87TzLvzdQ== + +"@next/swc-win32-arm64-msvc@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.6.0-canary.7.tgz#9bc5da0907b7ce67eedda02a6d56a09d9a539ccf" + integrity sha512-p9DvrDgnePofZCtiWVY7qZtwXxiOGJlAyy2LoGPYSGOUDhjbTG8j6XMUFXpV9UwpH+l7st522psO1BVzbpT8IQ== + +"@next/swc-win32-x64-msvc@15.6.0-canary.7": + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.6.0-canary.7.tgz#5b271c591ccbe67d5fa966dd22db86c547414fd1" + integrity sha512-f1ywT3xWu4StWKA1mZRyGfelu/h+W0OEEyBxQNXzXyYa0VGZb9LyCNb5cYoNKBm0Bw18Hp1PVe0bHuusemGCcw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -866,6 +866,13 @@ dependencies: csstype "^3.0.2" +"@types/react@19.1.13": + version "19.1.13" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.13.tgz#fc650ffa680d739a25a530f5d7ebe00cdd771883" + integrity sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ== + dependencies: + csstype "^3.0.2" + "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": version "8.10.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz#9c8218ed62f9a322df10ded7c34990f014df44f2" @@ -3199,25 +3206,25 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next@15.5.2: - version "15.5.2" - resolved "https://registry.yarnpkg.com/next/-/next-15.5.2.tgz#5e50102443fb0328a9dfcac2d82465c7bac93693" - integrity sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q== +next@15.6.0-canary.7: + version "15.6.0-canary.7" + resolved "https://registry.yarnpkg.com/next/-/next-15.6.0-canary.7.tgz#bfc2ac3c9a78e23d550c303d18247a263e6b5bc1" + integrity sha512-4ukX2mxat9wWT6E0Gw/3TOR9ULV1q399E42F86cwsPSFgTWa04ABhcTqO0r9J/QR1YWPR8WEgh9qUzmWA/1yEw== dependencies: - "@next/env" "15.5.2" + "@next/env" "15.6.0-canary.7" "@swc/helpers" "0.5.15" caniuse-lite "^1.0.30001579" postcss "8.4.31" styled-jsx "5.1.6" optionalDependencies: - "@next/swc-darwin-arm64" "15.5.2" - "@next/swc-darwin-x64" "15.5.2" - "@next/swc-linux-arm64-gnu" "15.5.2" - "@next/swc-linux-arm64-musl" "15.5.2" - "@next/swc-linux-x64-gnu" "15.5.2" - "@next/swc-linux-x64-musl" "15.5.2" - "@next/swc-win32-arm64-msvc" "15.5.2" - "@next/swc-win32-x64-msvc" "15.5.2" + "@next/swc-darwin-arm64" "15.6.0-canary.7" + "@next/swc-darwin-x64" "15.6.0-canary.7" + "@next/swc-linux-arm64-gnu" "15.6.0-canary.7" + "@next/swc-linux-arm64-musl" "15.6.0-canary.7" + "@next/swc-linux-x64-gnu" "15.6.0-canary.7" + "@next/swc-linux-x64-musl" "15.6.0-canary.7" + "@next/swc-win32-arm64-msvc" "15.6.0-canary.7" + "@next/swc-win32-x64-msvc" "15.6.0-canary.7" sharp "^0.34.3" node-releases@^2.0.18: