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 fc80826678e23..8f67e12db1e1f 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 c9a5fb591bfd8..8271a62327aea 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 92ca7e00e2696..67438b7f817e8 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 d141c2855f66e..b2b53281b9234 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 86621f68480b8..7b1477fa25602 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 317a07262c5ad..ed9b822457a2b 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 0000000000000..7b9c730ba6537 --- /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 da1dff04820fc..0baee5a1f5098 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 e9428c3ba4074..6d69169261477 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 ab4a054b019be..b7d7959f21db3 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 296f45a27762b..17505024ffeac 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 3bbf2e9b5558c..0000000000000 --- 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 de3b01b0b05d3..bebbb0c4787a5 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 162d82591cb00..add42018a3879 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 8b75ce6ac5eb5..696bbd2559c11 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 206b98300be43..d8744c3ca9770 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 22f908e51bbdb..bf73c192c1152 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 52de6c0fa3e4c..3f55678edf15d 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 1751bd87e26c2..d2335687c2206 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 e67578c79bf17..6655efa274089 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 830fb594ca297..9edff1c7cacb3 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 44c1f101230cd..08aed45e0f33c 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 eb7fcfe2b7228..4f70dcef8abb6 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 9bf1bb0687baf..53f0d24db706f 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: