@@ -19,7 +19,7 @@ if (__DEV__) {
1919var  React  =  require ( "react" ) ; 
2020var  ReactDOM  =  require ( "react-dom" ) ; 
2121
22- var  ReactVersion  =  "18.3.0-www-classic-b66d17d9 " ; 
22+ var  ReactVersion  =  "18.3.0-www-classic-b794beee " ; 
2323
2424// This refers to a WWW module. 
2525var  warningWWW  =  require ( "warning" ) ; 
@@ -9789,14 +9789,14 @@ function getStackByComponentStackNode(componentStack) {
97899789var  ReactCurrentDispatcher  =  ReactSharedInternals . ReactCurrentDispatcher ; 
97909790var  ReactCurrentCache  =  ReactSharedInternals . ReactCurrentCache ; 
97919791var  ReactDebugCurrentFrame  =  ReactSharedInternals . ReactDebugCurrentFrame ;  // Linked list representing the identity of a component given the component/tag name and key. 
9792- // The name might be minified but we assume that it's going to be the same generated name. Typically 
9793- // because it's just the same compiled output in practice. 
9792+ var  CLIENT_RENDERED  =  4 ;  // if it errors or infinitely suspends 
97949793
97959794var  PENDING  =  0 ; 
97969795var  COMPLETED  =  1 ; 
97979796var  FLUSHED  =  2 ; 
97989797var  ABORTED  =  3 ; 
97999798var  ERRORED  =  4 ; 
9799+ var  POSTPONED  =  5 ; 
98009800var  OPEN  =  0 ; 
98019801var  CLOSING  =  1 ; 
98029802var  CLOSED  =  2 ;  // This is a default heuristic for how to split up the HTML content into progressive 
@@ -9846,6 +9846,7 @@ function createRequest(
98469846    flushScheduled : false , 
98479847    resumableState : resumableState , 
98489848    renderState : renderState , 
9849+     rootFormatContext : rootFormatContext , 
98499850    progressiveChunkSize :
98509851      progressiveChunkSize  ===  undefined 
98519852        ? DEFAULT_PROGRESSIVE_CHUNK_SIZE 
@@ -9861,6 +9862,7 @@ function createRequest(
98619862    clientRenderedBoundaries : [ ] , 
98629863    completedBoundaries : [ ] , 
98639864    partialBoundaries : [ ] , 
9865+     trackedPostpones : null , 
98649866    onError : onError  ===  undefined  ? defaultErrorHandler  : onError , 
98659867    onPostpone : onPostpone  ===  undefined  ? noop  : onPostpone , 
98669868    onAllReady : onAllReady  ===  undefined  ? noop  : onAllReady , 
@@ -9913,18 +9915,19 @@ function pingTask(request, task) {
99139915  } 
99149916} 
99159917
9916- function  createSuspenseBoundary ( request ,  fallbackAbortableTasks )  { 
9918+ function  createSuspenseBoundary ( request ,  fallbackAbortableTasks ,   keyPath )  { 
99179919  return  { 
9920+     status : PENDING , 
99189921    id : UNINITIALIZED_SUSPENSE_BOUNDARY_ID , 
99199922    rootSegmentID : - 1 , 
99209923    parentFlushed : false , 
99219924    pendingTasks : 0 , 
9922-     forceClientRender : false , 
99239925    completedSegments : [ ] , 
99249926    byteSize : 0 , 
99259927    fallbackAbortableTasks : fallbackAbortableTasks , 
99269928    errorDigest : null , 
9927-     resources : createBoundaryResources ( ) 
9929+     resources : createBoundaryResources ( ) , 
9930+     keyPath : keyPath 
99289931  } ; 
99299932} 
99309933
@@ -10117,7 +10120,11 @@ function renderSuspenseBoundary(request, task, props) {
1011710120  var  fallback  =  props . fallback ; 
1011810121  var  content  =  props . children ; 
1011910122  var  fallbackAbortSet  =  new  Set ( ) ; 
10120-   var  newBoundary  =  createSuspenseBoundary ( request ,  fallbackAbortSet ) ; 
10123+   var  newBoundary  =  createSuspenseBoundary ( 
10124+     request , 
10125+     fallbackAbortSet , 
10126+     task . keyPath 
10127+   ) ; 
1012110128  var  insertionIndex  =  parentSegment . chunks . length ;  // The children of the boundary segment is actually the fallback. 
1012210129
1012310130  var  boundarySegment  =  createPendingSegment ( 
@@ -10172,16 +10179,17 @@ function renderSuspenseBoundary(request, task, props) {
1017210179    contentRootSegment . status  =  COMPLETED ; 
1017310180    queueCompletedSegment ( newBoundary ,  contentRootSegment ) ; 
1017410181
10175-     if  ( newBoundary . pendingTasks  ===  0 )  { 
10176-       // This must have been the last segment we were waiting on. This boundary is now complete. 
10182+     if  ( newBoundary . pendingTasks  ===  0   &&   newBoundary . status   ===   PENDING )  { 
10183+       newBoundary . status   =   COMPLETED ;   // This must have been the last segment we were waiting on. This boundary is now complete. 
1017710184      // Therefore we won't need the fallback. We early return so that we don't have to create 
1017810185      // the fallback. 
10186+ 
1017910187      popComponentStackInDEV ( task ) ; 
1018010188      return ; 
1018110189    } 
1018210190  }  catch  ( error )  { 
1018310191    contentRootSegment . status  =  ERRORED ; 
10184-     newBoundary . forceClientRender  =  true ; 
10192+     newBoundary . status  =  CLIENT_RENDERED ; 
1018510193    var  errorDigest ; 
1018610194
1018710195    { 
@@ -11134,43 +11142,45 @@ function renderNode(request, task, node, childIndex) {
1113411142          // (unstable) API for suspending. This implementation detail can change 
1113511143          // later, once we deprecate the old API in favor of `use`. 
1113611144          getSuspendedThenable ( ) 
11137-         : thrownValue ;   // $FlowFixMe[method-unbinding] 
11145+         : thrownValue ; 
1113811146
11139-     if  ( typeof  x  ===  "object"  &&  x  !==  null  &&  typeof  x . then  ===  "function" )  { 
11140-       var  wakeable  =  x ; 
11141-       var  thenableState  =  getThenableStateAfterSuspending ( ) ; 
11142-       spawnNewSuspendedTask ( request ,  task ,  thenableState ,  wakeable ) ;  // Restore the context. We assume that this will be restored by the inner 
11143-       // functions in case nothing throws so we don't use "finally" here. 
11147+     if  ( typeof  x  ===  "object"  &&  x  !==  null )  { 
11148+       // $FlowFixMe[method-unbinding] 
11149+       if  ( typeof  x . then  ===  "function" )  { 
11150+         var  wakeable  =  x ; 
11151+         var  thenableState  =  getThenableStateAfterSuspending ( ) ; 
11152+         spawnNewSuspendedTask ( request ,  task ,  thenableState ,  wakeable ) ;  // Restore the context. We assume that this will be restored by the inner 
11153+         // functions in case nothing throws so we don't use "finally" here. 
1114411154
11145-       task . blockedSegment . formatContext  =  previousFormatContext ; 
11146-       task . legacyContext  =  previousLegacyContext ; 
11147-       task . context  =  previousContext ; 
11148-       task . keyPath  =  previousKeyPath ;  // Restore all active ReactContexts to what they were before. 
11155+          task . blockedSegment . formatContext  =  previousFormatContext ; 
11156+          task . legacyContext  =  previousLegacyContext ; 
11157+          task . context  =  previousContext ; 
11158+          task . keyPath  =  previousKeyPath ;  // Restore all active ReactContexts to what they were before. 
1114911159
11150-       switchContext ( previousContext ) ; 
11160+          switchContext ( previousContext ) ; 
1115111161
11152-       { 
11153-         task . componentStack  =  previousComponentStack ; 
11162+         { 
11163+           task . componentStack  =  previousComponentStack ; 
11164+         } 
11165+ 
11166+         return ; 
1115411167      } 
11168+     }  // Restore the context. We assume that this will be restored by the inner 
11169+     // functions in case nothing throws so we don't use "finally" here. 
1115511170
11156-       return ; 
11157-     }  else  { 
11158-       // Restore the context. We assume that this will be restored by the inner 
11159-       // functions in case nothing throws so we don't use "finally" here. 
11160-       task . blockedSegment . formatContext  =  previousFormatContext ; 
11161-       task . legacyContext  =  previousLegacyContext ; 
11162-       task . context  =  previousContext ; 
11163-       task . keyPath  =  previousKeyPath ;  // Restore all active ReactContexts to what they were before. 
11171+     task . blockedSegment . formatContext  =  previousFormatContext ; 
11172+     task . legacyContext  =  previousLegacyContext ; 
11173+     task . context  =  previousContext ; 
11174+     task . keyPath  =  previousKeyPath ;  // Restore all active ReactContexts to what they were before. 
1116411175
11165-        switchContext ( previousContext ) ; 
11176+     switchContext ( previousContext ) ; 
1116611177
11167-        { 
11168-          task . componentStack  =  previousComponentStack ; 
11169-        }  // We assume that we don't need the correct context. 
11170-        // Let's terminate the rest of the tree and don't render any siblings. 
11178+     { 
11179+       task . componentStack  =  previousComponentStack ; 
11180+     }  // We assume that we don't need the correct context. 
11181+     // Let's terminate the rest of the tree and don't render any siblings. 
1117111182
11172-       throw  x ; 
11173-     } 
11183+     throw  x ; 
1117411184  } 
1117511185} 
1117611186
@@ -11187,8 +11197,8 @@ function erroredTask(request, boundary, segment, error) {
1118711197  }  else  { 
1118811198    boundary . pendingTasks -- ; 
1118911199
11190-     if  ( ! boundary . forceClientRender )  { 
11191-       boundary . forceClientRender  =  true ; 
11200+     if  ( boundary . status   !==   CLIENT_RENDERED )  { 
11201+       boundary . status  =  CLIENT_RENDERED ; 
1119211202      boundary . errorDigest  =  errorDigest ; 
1119311203
1119411204      { 
@@ -11243,8 +11253,8 @@ function abortTask(task, request, error) {
1124311253  }  else  { 
1124411254    boundary . pendingTasks -- ; 
1124511255
11246-     if  ( ! boundary . forceClientRender )  { 
11247-       boundary . forceClientRender  =  true ; 
11256+     if  ( boundary . status   !==   CLIENT_RENDERED )  { 
11257+       boundary . status  =  CLIENT_RENDERED ; 
1124811258      boundary . errorDigest  =  request . onError ( error ) ; 
1124911259
1125011260      { 
@@ -11331,9 +11341,12 @@ function finishedTask(request, boundary, segment) {
1133111341  }  else  { 
1133211342    boundary . pendingTasks -- ; 
1133311343
11334-     if  ( boundary . forceClientRender ) ; 
11344+     if  ( boundary . status   ===   CLIENT_RENDERED ) ; 
1133511345    else  if  ( boundary . pendingTasks  ===  0 )  { 
11336-       // This must have been the last segment we were waiting on. This boundary is now complete. 
11346+       if  ( boundary . status  ===  PENDING )  { 
11347+         boundary . status  =  COMPLETED ; 
11348+       }  // This must have been the last segment we were waiting on. This boundary is now complete. 
11349+ 
1133711350      if  ( segment . parentFlushed )  { 
1133811351        // Our parent segment already flushed, so we need to schedule this segment to be emitted. 
1133911352        // If it is a segment that was aborted, we'll write other content instead so we don't need 
@@ -11444,18 +11457,23 @@ function retryTask(request, task) {
1144411457          // (unstable) API for suspending. This implementation detail can change 
1144511458          // later, once we deprecate the old API in favor of `use`. 
1144611459          getSuspendedThenable ( ) 
11447-         : thrownValue ;   // $FlowFixMe[method-unbinding] 
11448- 
11449-     if  ( typeof  x  ===  "object"  &&  x  !==  null   &&   typeof   x . then   ===   "function" )  { 
11450-       // Something suspended again, let's pick it back up later.  
11451-       var   ping   =   task . ping ; 
11452-       x . then ( ping ,   ping ) ; 
11453-       task . thenableState   =   getThenableStateAfterSuspending ( ) ; 
11454-     }   else   { 
11455-       task . abortSet . delete ( task ) ; 
11456-       segment . status   =   ERRORED ; 
11457-       erroredTask ( request ,   task . blockedBoundary ,   segment ,   x ) ; 
11460+         : thrownValue ; 
11461+ 
11462+     if  ( typeof  x  ===  "object"  &&  x  !==  null )  { 
11463+       // $FlowFixMe[method-unbinding]  
11464+       if   ( typeof   x . then   ===   "function" )   { 
11465+          // Something suspended again, let's pick it back up later. 
11466+          var   ping   =   task . ping ; 
11467+          x . then ( ping ,   ping ) ; 
11468+          task . thenableState   =   getThenableStateAfterSuspending ( ) ; 
11469+          return ; 
11470+       } 
1145811471    } 
11472+ 
11473+     task . abortSet . delete ( task ) ; 
11474+     segment . status  =  ERRORED ; 
11475+     erroredTask ( request ,  task . blockedBoundary ,  segment ,  x ) ; 
11476+     return ; 
1145911477  }  finally  { 
1146011478    { 
1146111479      setCurrentlyRenderingBoundaryResourcesTarget ( request . renderState ,  null ) ; 
@@ -11545,7 +11563,11 @@ function flushSubtree(request, destination, segment) {
1154511563    case  PENDING : { 
1154611564      // We're emitting a placeholder for this segment to be filled in later. 
1154711565      // Therefore we'll need to assign it an ID - to refer to it by. 
11548-       var  segmentID  =  ( segment . id  =  request . nextSegmentId ++ ) ;  // When this segment finally completes it won't be embedded in text since it will flush separately 
11566+       segment . id  =  request . nextSegmentId ++ ;  // Fallthrough 
11567+     } 
11568+ 
11569+     case  POSTPONED : { 
11570+       var  segmentID  =  segment . id ;  // When this segment finally completes it won't be embedded in text since it will flush separately 
1154911571
1155011572      segment . lastPushedText  =  false ; 
1155111573      segment . textEmbedded  =  false ; 
@@ -11599,7 +11621,7 @@ function flushSegment(request, destination, segment) {
1159911621  boundary . parentFlushed  =  true ;  // This segment is a Suspense boundary. We need to decide whether to 
1160011622  // emit the content or the fallback now. 
1160111623
11602-   if  ( boundary . forceClientRender )  { 
11624+   if  ( boundary . status   ===   CLIENT_RENDERED )  { 
1160311625    // Emit a client rendered suspense boundary wrapper. 
1160411626    // We never queue the inner boundary so we'll never emit its content or partial segments. 
1160511627    writeStartClientRenderedSuspenseBoundary ( 
@@ -11615,20 +11637,23 @@ function flushSegment(request, destination, segment) {
1161511637      destination , 
1161611638      request . renderState 
1161711639    ) ; 
11618-   }  else  if  ( boundary . pendingTasks  >  0 )  { 
11619-     // This boundary is still loading. Emit a pending suspense boundary wrapper. 
11640+   }  else  if  ( boundary . status  !==  COMPLETED )  { 
11641+     if  ( boundary . status  ===  PENDING )  { 
11642+       boundary . id  =  assignSuspenseBoundaryID ( 
11643+         request . renderState , 
11644+         request . resumableState 
11645+       ) ; 
11646+     }  // This boundary is still loading. Emit a pending suspense boundary wrapper. 
1162011647    // Assign an ID to refer to the future content by. 
11648+ 
1162111649    boundary . rootSegmentID  =  request . nextSegmentId ++ ; 
1162211650
1162311651    if  ( boundary . completedSegments . length  >  0 )  { 
1162411652      // If this is at least partially complete, we can queue it to be partially emitted early. 
1162511653      request . partialBoundaries . push ( boundary ) ; 
1162611654    }  /// This is the first time we should have referenced this ID. 
1162711655
11628-     var  id  =  ( boundary . id  =  assignSuspenseBoundaryID ( 
11629-       request . renderState , 
11630-       request . resumableState 
11631-     ) ) ; 
11656+     var  id  =  boundary . id ; 
1163211657    writeStartPendingSuspenseBoundary ( destination ,  request . renderState ,  id ) ;  // Flush the fallback. 
1163311658
1163411659    flushSubtree ( request ,  destination ,  segment ) ; 
@@ -11924,7 +11949,11 @@ function flushCompletedQueues(request, destination) {
1192411949      request . flushScheduled  =  false ; 
1192511950
1192611951      { 
11927-         writePostamble ( destination ,  request . resumableState ) ; 
11952+         // We write the trailing tags but only if don't have any data to resume. 
11953+         // If we need to resume we'll write the postamble in the resume instead. 
11954+         { 
11955+           writePostamble ( destination ,  request . resumableState ) ; 
11956+         } 
1192811957      } 
1192911958
1193011959      { 
@@ -11940,7 +11969,7 @@ function flushCompletedQueues(request, destination) {
1194011969  } 
1194111970} 
1194211971
11943- function  startWork ( request )  { 
11972+ function  startRender ( request )  { 
1194411973  request . flushScheduled  =  request . destination  !==  null ; 
1194511974
1194611975  { 
@@ -12019,7 +12048,7 @@ function flushResources(request) {
1201912048} 
1202012049function  getResumableState ( request )  { 
1202112050  return  request . resumableState ; 
12022- }   // Returns the state of a postponed request or null if nothing was postponed. 
12051+ } 
1202312052
1202412053function  onError ( )  { 
1202512054  // Non-fatal errors are ignored. 
@@ -12076,7 +12105,7 @@ function renderToStringImpl(
1207612105    undefined , 
1207712106    undefined 
1207812107  ) ; 
12079-   startWork ( request ) ;  // If anything suspended and is still pending, we'll abort it before writing. 
12108+   startRender ( request ) ;  // If anything suspended and is still pending, we'll abort it before writing. 
1208012109  // That way we write only client-rendered boundaries from the start. 
1208112110
1208212111  abort ( request ,  abortReason ) ; 
0 commit comments