1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000 |
- /**
- * @license React
- * react-dom-server.browser.development.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
- typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
- (global = global || self, factory(global.ReactDOMServer = {}, global.React));
- }(this, (function (exports, React) { 'use strict';
- var ReactVersion = '18.2.0';
- var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
- // by calls to these methods by a Babel plugin.
- //
- // In PROD (or in packages without access to React internals),
- // they are left as they are instead.
- function warn(format) {
- {
- {
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- args[_key - 1] = arguments[_key];
- }
- printWarning('warn', format, args);
- }
- }
- }
- function error(format) {
- {
- {
- for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
- args[_key2 - 1] = arguments[_key2];
- }
- printWarning('error', format, args);
- }
- }
- }
- function printWarning(level, format, args) {
- // When changing this logic, you might want to also
- // update consoleWithStackDev.www.js as well.
- {
- var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
- var stack = ReactDebugCurrentFrame.getStackAddendum();
- if (stack !== '') {
- format += '%s';
- args = args.concat([stack]);
- } // eslint-disable-next-line react-internal/safe-string-coercion
- var argsWithFormat = args.map(function (item) {
- return String(item);
- }); // Careful: RN currently depends on this prefix
- argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
- // breaks IE9: https://github.com/facebook/react/issues/13610
- // eslint-disable-next-line react-internal/no-production-logging
- Function.prototype.apply.call(console[level], console, argsWithFormat);
- }
- }
- function scheduleWork(callback) {
- callback();
- }
- var VIEW_SIZE = 512;
- var currentView = null;
- var writtenBytes = 0;
- function beginWriting(destination) {
- currentView = new Uint8Array(VIEW_SIZE);
- writtenBytes = 0;
- }
- function writeChunk(destination, chunk) {
- if (chunk.length === 0) {
- return;
- }
- if (chunk.length > VIEW_SIZE) {
- // this chunk may overflow a single view which implies it was not
- // one that is cached by the streaming renderer. We will enqueu
- // it directly and expect it is not re-used
- if (writtenBytes > 0) {
- destination.enqueue(new Uint8Array(currentView.buffer, 0, writtenBytes));
- currentView = new Uint8Array(VIEW_SIZE);
- writtenBytes = 0;
- }
- destination.enqueue(chunk);
- return;
- }
- var bytesToWrite = chunk;
- var allowableBytes = currentView.length - writtenBytes;
- if (allowableBytes < bytesToWrite.length) {
- // this chunk would overflow the current view. We enqueue a full view
- // and start a new view with the remaining chunk
- if (allowableBytes === 0) {
- // the current view is already full, send it
- destination.enqueue(currentView);
- } else {
- // fill up the current view and apply the remaining chunk bytes
- // to a new view.
- currentView.set(bytesToWrite.subarray(0, allowableBytes), writtenBytes); // writtenBytes += allowableBytes; // this can be skipped because we are going to immediately reset the view
- destination.enqueue(currentView);
- bytesToWrite = bytesToWrite.subarray(allowableBytes);
- }
- currentView = new Uint8Array(VIEW_SIZE);
- writtenBytes = 0;
- }
- currentView.set(bytesToWrite, writtenBytes);
- writtenBytes += bytesToWrite.length;
- }
- function writeChunkAndReturn(destination, chunk) {
- writeChunk(destination, chunk); // in web streams there is no backpressure so we can alwas write more
- return true;
- }
- function completeWriting(destination) {
- if (currentView && writtenBytes > 0) {
- destination.enqueue(new Uint8Array(currentView.buffer, 0, writtenBytes));
- currentView = null;
- writtenBytes = 0;
- }
- }
- function close(destination) {
- destination.close();
- }
- var textEncoder = new TextEncoder();
- function stringToChunk(content) {
- return textEncoder.encode(content);
- }
- function stringToPrecomputedChunk(content) {
- return textEncoder.encode(content);
- }
- function closeWithError(destination, error) {
- if (typeof destination.error === 'function') {
- // $FlowFixMe: This is an Error object or the destination accepts other types.
- destination.error(error);
- } else {
- // Earlier implementations doesn't support this method. In that environment you're
- // supposed to throw from a promise returned but we don't return a promise in our
- // approach. We could fork this implementation but this is environment is an edge
- // case to begin with. It's even less common to run this in an older environment.
- // Even then, this is not where errors are supposed to happen and they get reported
- // to a global callback in addition to this anyway. So it's fine just to close this.
- destination.close();
- }
- }
- /*
- * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol
- * and Temporal.* types. See https://github.com/facebook/react/pull/22064.
- *
- * The functions in this module will throw an easier-to-understand,
- * easier-to-debug exception with a clear errors message message explaining the
- * problem. (Instead of a confusing exception thrown inside the implementation
- * of the `value` object).
- */
- // $FlowFixMe only called in DEV, so void return is not possible.
- function typeName(value) {
- {
- // toStringTag is needed for namespaced types like Temporal.Instant
- var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;
- var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';
- return type;
- }
- } // $FlowFixMe only called in DEV, so void return is not possible.
- function willCoercionThrow(value) {
- {
- try {
- testStringCoercion(value);
- return false;
- } catch (e) {
- return true;
- }
- }
- }
- function testStringCoercion(value) {
- // If you ended up here by following an exception call stack, here's what's
- // happened: you supplied an object or symbol value to React (as a prop, key,
- // DOM attribute, CSS property, string ref, etc.) and when React tried to
- // coerce it to a string using `'' + value`, an exception was thrown.
- //
- // The most common types that will cause this exception are `Symbol` instances
- // and Temporal objects like `Temporal.Instant`. But any object that has a
- // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this
- // exception. (Library authors do this to prevent users from using built-in
- // numeric operators like `+` or comparison operators like `>=` because custom
- // methods are needed to perform accurate arithmetic or comparison.)
- //
- // To fix the problem, coerce this object or symbol value to a string before
- // passing it to React. The most reliable way is usually `String(value)`.
- //
- // To find which value is throwing, check the browser or debugger console.
- // Before this exception was thrown, there should be `console.error` output
- // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the
- // problem and how that type was used: key, atrribute, input value prop, etc.
- // In most cases, this console output also shows the component and its
- // ancestor components where the exception happened.
- //
- // eslint-disable-next-line react-internal/safe-string-coercion
- return '' + value;
- }
- function checkAttributeStringCoercion(value, attributeName) {
- {
- if (willCoercionThrow(value)) {
- error('The provided `%s` attribute is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', attributeName, typeName(value));
- return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
- }
- }
- }
- function checkCSSPropertyStringCoercion(value, propName) {
- {
- if (willCoercionThrow(value)) {
- error('The provided `%s` CSS property is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value));
- return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
- }
- }
- }
- function checkHtmlStringCoercion(value) {
- {
- if (willCoercionThrow(value)) {
- error('The provided HTML markup uses a value of unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
- return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
- }
- }
- }
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- // A reserved attribute.
- // It is handled by React separately and shouldn't be written to the DOM.
- var RESERVED = 0; // A simple string attribute.
- // Attributes that aren't in the filter are presumed to have this type.
- var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
- // "enumerated" attributes with "true" and "false" as possible values.
- // When true, it should be set to a "true" string.
- // When false, it should be set to a "false" string.
- var BOOLEANISH_STRING = 2; // A real boolean attribute.
- // When true, it should be present (set either to an empty string or its name).
- // When false, it should be omitted.
- var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
- // When true, it should be present (set either to an empty string or its name).
- // When false, it should be omitted.
- // For any other value, should be present with that value.
- var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
- // When falsy, it should be removed.
- var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
- // When falsy, it should be removed.
- var POSITIVE_NUMERIC = 6;
- /* eslint-disable max-len */
- var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
- /* eslint-enable max-len */
- var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
- var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
- var illegalAttributeNameCache = {};
- var validatedAttributeNameCache = {};
- function isAttributeNameSafe(attributeName) {
- if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
- return true;
- }
- if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
- return false;
- }
- if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
- validatedAttributeNameCache[attributeName] = true;
- return true;
- }
- illegalAttributeNameCache[attributeName] = true;
- {
- error('Invalid attribute name: `%s`', attributeName);
- }
- return false;
- }
- function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
- if (propertyInfo !== null && propertyInfo.type === RESERVED) {
- return false;
- }
- switch (typeof value) {
- case 'function': // $FlowIssue symbol is perfectly valid here
- case 'symbol':
- // eslint-disable-line
- return true;
- case 'boolean':
- {
- if (isCustomComponentTag) {
- return false;
- }
- if (propertyInfo !== null) {
- return !propertyInfo.acceptsBooleans;
- } else {
- var prefix = name.toLowerCase().slice(0, 5);
- return prefix !== 'data-' && prefix !== 'aria-';
- }
- }
- default:
- return false;
- }
- }
- function getPropertyInfo(name) {
- return properties.hasOwnProperty(name) ? properties[name] : null;
- }
- function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) {
- this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
- this.attributeName = attributeName;
- this.attributeNamespace = attributeNamespace;
- this.mustUseProperty = mustUseProperty;
- this.propertyName = name;
- this.type = type;
- this.sanitizeURL = sanitizeURL;
- this.removeEmptyString = removeEmptyString;
- } // When adding attributes to this list, be sure to also add them to
- // the `possibleStandardNames` module to ensure casing and incorrect
- // name warnings.
- var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
- var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
- // elements (not just inputs). Now that ReactDOMInput assigns to the
- // defaultValue property -- do we need this?
- 'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];
- reservedProps.forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
- name, // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // A few React string attributes have a different name.
- // This is a mapping from React prop names to the attribute names.
- [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
- var name = _ref[0],
- attributeName = _ref[1];
- properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
- attributeName, // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These are "enumerated" HTML attributes that accept "true" and "false".
- // In React, we let users pass `true` and `false` even though technically
- // these aren't boolean attributes (they are coerced to strings).
- ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
- name.toLowerCase(), // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These are "enumerated" SVG attributes that accept "true" and "false".
- // In React, we let users pass `true` and `false` even though technically
- // these aren't boolean attributes (they are coerced to strings).
- // Since these are SVG attributes, their attribute names are case-sensitive.
- ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
- name, // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These are HTML boolean attributes.
- ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
- // on the client side because the browsers are inconsistent. Instead we call focus().
- 'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
- 'itemScope'].forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
- name.toLowerCase(), // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These are the few React props that we set as DOM properties
- // rather than attributes. These are all booleans.
- ['checked', // Note: `option.selected` is not updated if `select.multiple` is
- // disabled with `removeAttribute`. We have special logic for handling this.
- 'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,
- // you'll need to set attributeName to name.toLowerCase()
- // instead in the assignment below.
- ].forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
- name, // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These are HTML attributes that are "overloaded booleans": they behave like
- // booleans, but can also accept a string value.
- ['capture', 'download' // NOTE: if you add a camelCased prop to this list,
- // you'll need to set attributeName to name.toLowerCase()
- // instead in the assignment below.
- ].forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
- name, // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These are HTML attributes that must be positive numbers.
- ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,
- // you'll need to set attributeName to name.toLowerCase()
- // instead in the assignment below.
- ].forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
- name, // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These are HTML attributes that must be numbers.
- ['rowSpan', 'start'].forEach(function (name) {
- properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
- name.toLowerCase(), // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- });
- var CAMELIZE = /[\-\:]([a-z])/g;
- var capitalize = function (token) {
- return token[1].toUpperCase();
- }; // This is a list of all SVG attributes that need special casing, namespacing,
- // or boolean value assignment. Regular attributes that just accept strings
- // and have the same names are omitted, just like in the HTML attribute filter.
- // Some of these attributes can be hard to find. This list was created by
- // scraping the MDN documentation.
- ['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,
- // you'll need to set attributeName to name.toLowerCase()
- // instead in the assignment below.
- ].forEach(function (attributeName) {
- var name = attributeName.replace(CAMELIZE, capitalize);
- properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
- attributeName, null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // String SVG attributes with the xlink namespace.
- ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,
- // you'll need to set attributeName to name.toLowerCase()
- // instead in the assignment below.
- ].forEach(function (attributeName) {
- var name = attributeName.replace(CAMELIZE, capitalize);
- properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
- attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL
- false);
- }); // String SVG attributes with the xml namespace.
- ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,
- // you'll need to set attributeName to name.toLowerCase()
- // instead in the assignment below.
- ].forEach(function (attributeName) {
- var name = attributeName.replace(CAMELIZE, capitalize);
- properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
- attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL
- false);
- }); // These attribute exists both in HTML and SVG.
- // The attribute name is case-sensitive in SVG so we can't just use
- // the React name like we do for attributes that exist only in HTML.
- ['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
- properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
- attributeName.toLowerCase(), // attributeName
- null, // attributeNamespace
- false, // sanitizeURL
- false);
- }); // These attributes accept URLs. These must not allow javascript: URLS.
- // These will also need to accept Trusted Types object in the future.
- var xlinkHref = 'xlinkHref';
- properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
- 'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL
- false);
- ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
- properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
- attributeName.toLowerCase(), // attributeName
- null, // attributeNamespace
- true, // sanitizeURL
- true);
- });
- /**
- * CSS properties which accept numbers but are not in units of "px".
- */
- var isUnitlessNumber = {
- animationIterationCount: true,
- aspectRatio: true,
- borderImageOutset: true,
- borderImageSlice: true,
- borderImageWidth: true,
- boxFlex: true,
- boxFlexGroup: true,
- boxOrdinalGroup: true,
- columnCount: true,
- columns: true,
- flex: true,
- flexGrow: true,
- flexPositive: true,
- flexShrink: true,
- flexNegative: true,
- flexOrder: true,
- gridArea: true,
- gridRow: true,
- gridRowEnd: true,
- gridRowSpan: true,
- gridRowStart: true,
- gridColumn: true,
- gridColumnEnd: true,
- gridColumnSpan: true,
- gridColumnStart: true,
- fontWeight: true,
- lineClamp: true,
- lineHeight: true,
- opacity: true,
- order: true,
- orphans: true,
- tabSize: true,
- widows: true,
- zIndex: true,
- zoom: true,
- // SVG-related properties
- fillOpacity: true,
- floodOpacity: true,
- stopOpacity: true,
- strokeDasharray: true,
- strokeDashoffset: true,
- strokeMiterlimit: true,
- strokeOpacity: true,
- strokeWidth: true
- };
- /**
- * @param {string} prefix vendor-specific prefix, eg: Webkit
- * @param {string} key style name, eg: transitionDuration
- * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
- * WebkitTransitionDuration
- */
- function prefixKey(prefix, key) {
- return prefix + key.charAt(0).toUpperCase() + key.substring(1);
- }
- /**
- * Support style names that may come passed in prefixed by adding permutations
- * of vendor prefixes.
- */
- var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
- // infinite loop, because it iterates over the newly added props too.
- Object.keys(isUnitlessNumber).forEach(function (prop) {
- prefixes.forEach(function (prefix) {
- isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
- });
- });
- var hasReadOnlyValue = {
- button: true,
- checkbox: true,
- image: true,
- hidden: true,
- radio: true,
- reset: true,
- submit: true
- };
- function checkControlledValueProps(tagName, props) {
- {
- if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) {
- error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
- }
- if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) {
- error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
- }
- }
- }
- function isCustomComponent(tagName, props) {
- if (tagName.indexOf('-') === -1) {
- return typeof props.is === 'string';
- }
- switch (tagName) {
- // These are reserved SVG and MathML elements.
- // We don't mind this list too much because we expect it to never grow.
- // The alternative is to track the namespace in a few places which is convoluted.
- // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
- case 'annotation-xml':
- case 'color-profile':
- case 'font-face':
- case 'font-face-src':
- case 'font-face-uri':
- case 'font-face-format':
- case 'font-face-name':
- case 'missing-glyph':
- return false;
- default:
- return true;
- }
- }
- var ariaProperties = {
- 'aria-current': 0,
- // state
- 'aria-description': 0,
- 'aria-details': 0,
- 'aria-disabled': 0,
- // state
- 'aria-hidden': 0,
- // state
- 'aria-invalid': 0,
- // state
- 'aria-keyshortcuts': 0,
- 'aria-label': 0,
- 'aria-roledescription': 0,
- // Widget Attributes
- 'aria-autocomplete': 0,
- 'aria-checked': 0,
- 'aria-expanded': 0,
- 'aria-haspopup': 0,
- 'aria-level': 0,
- 'aria-modal': 0,
- 'aria-multiline': 0,
- 'aria-multiselectable': 0,
- 'aria-orientation': 0,
- 'aria-placeholder': 0,
- 'aria-pressed': 0,
- 'aria-readonly': 0,
- 'aria-required': 0,
- 'aria-selected': 0,
- 'aria-sort': 0,
- 'aria-valuemax': 0,
- 'aria-valuemin': 0,
- 'aria-valuenow': 0,
- 'aria-valuetext': 0,
- // Live Region Attributes
- 'aria-atomic': 0,
- 'aria-busy': 0,
- 'aria-live': 0,
- 'aria-relevant': 0,
- // Drag-and-Drop Attributes
- 'aria-dropeffect': 0,
- 'aria-grabbed': 0,
- // Relationship Attributes
- 'aria-activedescendant': 0,
- 'aria-colcount': 0,
- 'aria-colindex': 0,
- 'aria-colspan': 0,
- 'aria-controls': 0,
- 'aria-describedby': 0,
- 'aria-errormessage': 0,
- 'aria-flowto': 0,
- 'aria-labelledby': 0,
- 'aria-owns': 0,
- 'aria-posinset': 0,
- 'aria-rowcount': 0,
- 'aria-rowindex': 0,
- 'aria-rowspan': 0,
- 'aria-setsize': 0
- };
- var warnedProperties = {};
- var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
- var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
- function validateProperty(tagName, name) {
- {
- if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) {
- return true;
- }
- if (rARIACamel.test(name)) {
- var ariaName = 'aria-' + name.slice(4).toLowerCase();
- var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
- // DOM properties, then it is an invalid aria-* attribute.
- if (correctName == null) {
- error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
- warnedProperties[name] = true;
- return true;
- } // aria-* attributes should be lowercase; suggest the lowercase version.
- if (name !== correctName) {
- error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
- warnedProperties[name] = true;
- return true;
- }
- }
- if (rARIA.test(name)) {
- var lowerCasedName = name.toLowerCase();
- var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
- // DOM properties, then it is an invalid aria-* attribute.
- if (standardName == null) {
- warnedProperties[name] = true;
- return false;
- } // aria-* attributes should be lowercase; suggest the lowercase version.
- if (name !== standardName) {
- error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
- warnedProperties[name] = true;
- return true;
- }
- }
- }
- return true;
- }
- function warnInvalidARIAProps(type, props) {
- {
- var invalidProps = [];
- for (var key in props) {
- var isValid = validateProperty(type, key);
- if (!isValid) {
- invalidProps.push(key);
- }
- }
- var unknownPropString = invalidProps.map(function (prop) {
- return '`' + prop + '`';
- }).join(', ');
- if (invalidProps.length === 1) {
- error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
- } else if (invalidProps.length > 1) {
- error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
- }
- }
- }
- function validateProperties(type, props) {
- if (isCustomComponent(type, props)) {
- return;
- }
- warnInvalidARIAProps(type, props);
- }
- var didWarnValueNull = false;
- function validateProperties$1(type, props) {
- {
- if (type !== 'input' && type !== 'textarea' && type !== 'select') {
- return;
- }
- if (props != null && props.value === null && !didWarnValueNull) {
- didWarnValueNull = true;
- if (type === 'select' && props.multiple) {
- error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);
- } else {
- error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
- }
- }
- }
- }
- // When adding attributes to the HTML or SVG allowed attribute list, be sure to
- // also add them to this module to ensure casing and incorrect name
- // warnings.
- var possibleStandardNames = {
- // HTML
- accept: 'accept',
- acceptcharset: 'acceptCharset',
- 'accept-charset': 'acceptCharset',
- accesskey: 'accessKey',
- action: 'action',
- allowfullscreen: 'allowFullScreen',
- alt: 'alt',
- as: 'as',
- async: 'async',
- autocapitalize: 'autoCapitalize',
- autocomplete: 'autoComplete',
- autocorrect: 'autoCorrect',
- autofocus: 'autoFocus',
- autoplay: 'autoPlay',
- autosave: 'autoSave',
- capture: 'capture',
- cellpadding: 'cellPadding',
- cellspacing: 'cellSpacing',
- challenge: 'challenge',
- charset: 'charSet',
- checked: 'checked',
- children: 'children',
- cite: 'cite',
- class: 'className',
- classid: 'classID',
- classname: 'className',
- cols: 'cols',
- colspan: 'colSpan',
- content: 'content',
- contenteditable: 'contentEditable',
- contextmenu: 'contextMenu',
- controls: 'controls',
- controlslist: 'controlsList',
- coords: 'coords',
- crossorigin: 'crossOrigin',
- dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
- data: 'data',
- datetime: 'dateTime',
- default: 'default',
- defaultchecked: 'defaultChecked',
- defaultvalue: 'defaultValue',
- defer: 'defer',
- dir: 'dir',
- disabled: 'disabled',
- disablepictureinpicture: 'disablePictureInPicture',
- disableremoteplayback: 'disableRemotePlayback',
- download: 'download',
- draggable: 'draggable',
- enctype: 'encType',
- enterkeyhint: 'enterKeyHint',
- for: 'htmlFor',
- form: 'form',
- formmethod: 'formMethod',
- formaction: 'formAction',
- formenctype: 'formEncType',
- formnovalidate: 'formNoValidate',
- formtarget: 'formTarget',
- frameborder: 'frameBorder',
- headers: 'headers',
- height: 'height',
- hidden: 'hidden',
- high: 'high',
- href: 'href',
- hreflang: 'hrefLang',
- htmlfor: 'htmlFor',
- httpequiv: 'httpEquiv',
- 'http-equiv': 'httpEquiv',
- icon: 'icon',
- id: 'id',
- imagesizes: 'imageSizes',
- imagesrcset: 'imageSrcSet',
- innerhtml: 'innerHTML',
- inputmode: 'inputMode',
- integrity: 'integrity',
- is: 'is',
- itemid: 'itemID',
- itemprop: 'itemProp',
- itemref: 'itemRef',
- itemscope: 'itemScope',
- itemtype: 'itemType',
- keyparams: 'keyParams',
- keytype: 'keyType',
- kind: 'kind',
- label: 'label',
- lang: 'lang',
- list: 'list',
- loop: 'loop',
- low: 'low',
- manifest: 'manifest',
- marginwidth: 'marginWidth',
- marginheight: 'marginHeight',
- max: 'max',
- maxlength: 'maxLength',
- media: 'media',
- mediagroup: 'mediaGroup',
- method: 'method',
- min: 'min',
- minlength: 'minLength',
- multiple: 'multiple',
- muted: 'muted',
- name: 'name',
- nomodule: 'noModule',
- nonce: 'nonce',
- novalidate: 'noValidate',
- open: 'open',
- optimum: 'optimum',
- pattern: 'pattern',
- placeholder: 'placeholder',
- playsinline: 'playsInline',
- poster: 'poster',
- preload: 'preload',
- profile: 'profile',
- radiogroup: 'radioGroup',
- readonly: 'readOnly',
- referrerpolicy: 'referrerPolicy',
- rel: 'rel',
- required: 'required',
- reversed: 'reversed',
- role: 'role',
- rows: 'rows',
- rowspan: 'rowSpan',
- sandbox: 'sandbox',
- scope: 'scope',
- scoped: 'scoped',
- scrolling: 'scrolling',
- seamless: 'seamless',
- selected: 'selected',
- shape: 'shape',
- size: 'size',
- sizes: 'sizes',
- span: 'span',
- spellcheck: 'spellCheck',
- src: 'src',
- srcdoc: 'srcDoc',
- srclang: 'srcLang',
- srcset: 'srcSet',
- start: 'start',
- step: 'step',
- style: 'style',
- summary: 'summary',
- tabindex: 'tabIndex',
- target: 'target',
- title: 'title',
- type: 'type',
- usemap: 'useMap',
- value: 'value',
- width: 'width',
- wmode: 'wmode',
- wrap: 'wrap',
- // SVG
- about: 'about',
- accentheight: 'accentHeight',
- 'accent-height': 'accentHeight',
- accumulate: 'accumulate',
- additive: 'additive',
- alignmentbaseline: 'alignmentBaseline',
- 'alignment-baseline': 'alignmentBaseline',
- allowreorder: 'allowReorder',
- alphabetic: 'alphabetic',
- amplitude: 'amplitude',
- arabicform: 'arabicForm',
- 'arabic-form': 'arabicForm',
- ascent: 'ascent',
- attributename: 'attributeName',
- attributetype: 'attributeType',
- autoreverse: 'autoReverse',
- azimuth: 'azimuth',
- basefrequency: 'baseFrequency',
- baselineshift: 'baselineShift',
- 'baseline-shift': 'baselineShift',
- baseprofile: 'baseProfile',
- bbox: 'bbox',
- begin: 'begin',
- bias: 'bias',
- by: 'by',
- calcmode: 'calcMode',
- capheight: 'capHeight',
- 'cap-height': 'capHeight',
- clip: 'clip',
- clippath: 'clipPath',
- 'clip-path': 'clipPath',
- clippathunits: 'clipPathUnits',
- cliprule: 'clipRule',
- 'clip-rule': 'clipRule',
- color: 'color',
- colorinterpolation: 'colorInterpolation',
- 'color-interpolation': 'colorInterpolation',
- colorinterpolationfilters: 'colorInterpolationFilters',
- 'color-interpolation-filters': 'colorInterpolationFilters',
- colorprofile: 'colorProfile',
- 'color-profile': 'colorProfile',
- colorrendering: 'colorRendering',
- 'color-rendering': 'colorRendering',
- contentscripttype: 'contentScriptType',
- contentstyletype: 'contentStyleType',
- cursor: 'cursor',
- cx: 'cx',
- cy: 'cy',
- d: 'd',
- datatype: 'datatype',
- decelerate: 'decelerate',
- descent: 'descent',
- diffuseconstant: 'diffuseConstant',
- direction: 'direction',
- display: 'display',
- divisor: 'divisor',
- dominantbaseline: 'dominantBaseline',
- 'dominant-baseline': 'dominantBaseline',
- dur: 'dur',
- dx: 'dx',
- dy: 'dy',
- edgemode: 'edgeMode',
- elevation: 'elevation',
- enablebackground: 'enableBackground',
- 'enable-background': 'enableBackground',
- end: 'end',
- exponent: 'exponent',
- externalresourcesrequired: 'externalResourcesRequired',
- fill: 'fill',
- fillopacity: 'fillOpacity',
- 'fill-opacity': 'fillOpacity',
- fillrule: 'fillRule',
- 'fill-rule': 'fillRule',
- filter: 'filter',
- filterres: 'filterRes',
- filterunits: 'filterUnits',
- floodopacity: 'floodOpacity',
- 'flood-opacity': 'floodOpacity',
- floodcolor: 'floodColor',
- 'flood-color': 'floodColor',
- focusable: 'focusable',
- fontfamily: 'fontFamily',
- 'font-family': 'fontFamily',
- fontsize: 'fontSize',
- 'font-size': 'fontSize',
- fontsizeadjust: 'fontSizeAdjust',
- 'font-size-adjust': 'fontSizeAdjust',
- fontstretch: 'fontStretch',
- 'font-stretch': 'fontStretch',
- fontstyle: 'fontStyle',
- 'font-style': 'fontStyle',
- fontvariant: 'fontVariant',
- 'font-variant': 'fontVariant',
- fontweight: 'fontWeight',
- 'font-weight': 'fontWeight',
- format: 'format',
- from: 'from',
- fx: 'fx',
- fy: 'fy',
- g1: 'g1',
- g2: 'g2',
- glyphname: 'glyphName',
- 'glyph-name': 'glyphName',
- glyphorientationhorizontal: 'glyphOrientationHorizontal',
- 'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
- glyphorientationvertical: 'glyphOrientationVertical',
- 'glyph-orientation-vertical': 'glyphOrientationVertical',
- glyphref: 'glyphRef',
- gradienttransform: 'gradientTransform',
- gradientunits: 'gradientUnits',
- hanging: 'hanging',
- horizadvx: 'horizAdvX',
- 'horiz-adv-x': 'horizAdvX',
- horizoriginx: 'horizOriginX',
- 'horiz-origin-x': 'horizOriginX',
- ideographic: 'ideographic',
- imagerendering: 'imageRendering',
- 'image-rendering': 'imageRendering',
- in2: 'in2',
- in: 'in',
- inlist: 'inlist',
- intercept: 'intercept',
- k1: 'k1',
- k2: 'k2',
- k3: 'k3',
- k4: 'k4',
- k: 'k',
- kernelmatrix: 'kernelMatrix',
- kernelunitlength: 'kernelUnitLength',
- kerning: 'kerning',
- keypoints: 'keyPoints',
- keysplines: 'keySplines',
- keytimes: 'keyTimes',
- lengthadjust: 'lengthAdjust',
- letterspacing: 'letterSpacing',
- 'letter-spacing': 'letterSpacing',
- lightingcolor: 'lightingColor',
- 'lighting-color': 'lightingColor',
- limitingconeangle: 'limitingConeAngle',
- local: 'local',
- markerend: 'markerEnd',
- 'marker-end': 'markerEnd',
- markerheight: 'markerHeight',
- markermid: 'markerMid',
- 'marker-mid': 'markerMid',
- markerstart: 'markerStart',
- 'marker-start': 'markerStart',
- markerunits: 'markerUnits',
- markerwidth: 'markerWidth',
- mask: 'mask',
- maskcontentunits: 'maskContentUnits',
- maskunits: 'maskUnits',
- mathematical: 'mathematical',
- mode: 'mode',
- numoctaves: 'numOctaves',
- offset: 'offset',
- opacity: 'opacity',
- operator: 'operator',
- order: 'order',
- orient: 'orient',
- orientation: 'orientation',
- origin: 'origin',
- overflow: 'overflow',
- overlineposition: 'overlinePosition',
- 'overline-position': 'overlinePosition',
- overlinethickness: 'overlineThickness',
- 'overline-thickness': 'overlineThickness',
- paintorder: 'paintOrder',
- 'paint-order': 'paintOrder',
- panose1: 'panose1',
- 'panose-1': 'panose1',
- pathlength: 'pathLength',
- patterncontentunits: 'patternContentUnits',
- patterntransform: 'patternTransform',
- patternunits: 'patternUnits',
- pointerevents: 'pointerEvents',
- 'pointer-events': 'pointerEvents',
- points: 'points',
- pointsatx: 'pointsAtX',
- pointsaty: 'pointsAtY',
- pointsatz: 'pointsAtZ',
- prefix: 'prefix',
- preservealpha: 'preserveAlpha',
- preserveaspectratio: 'preserveAspectRatio',
- primitiveunits: 'primitiveUnits',
- property: 'property',
- r: 'r',
- radius: 'radius',
- refx: 'refX',
- refy: 'refY',
- renderingintent: 'renderingIntent',
- 'rendering-intent': 'renderingIntent',
- repeatcount: 'repeatCount',
- repeatdur: 'repeatDur',
- requiredextensions: 'requiredExtensions',
- requiredfeatures: 'requiredFeatures',
- resource: 'resource',
- restart: 'restart',
- result: 'result',
- results: 'results',
- rotate: 'rotate',
- rx: 'rx',
- ry: 'ry',
- scale: 'scale',
- security: 'security',
- seed: 'seed',
- shaperendering: 'shapeRendering',
- 'shape-rendering': 'shapeRendering',
- slope: 'slope',
- spacing: 'spacing',
- specularconstant: 'specularConstant',
- specularexponent: 'specularExponent',
- speed: 'speed',
- spreadmethod: 'spreadMethod',
- startoffset: 'startOffset',
- stddeviation: 'stdDeviation',
- stemh: 'stemh',
- stemv: 'stemv',
- stitchtiles: 'stitchTiles',
- stopcolor: 'stopColor',
- 'stop-color': 'stopColor',
- stopopacity: 'stopOpacity',
- 'stop-opacity': 'stopOpacity',
- strikethroughposition: 'strikethroughPosition',
- 'strikethrough-position': 'strikethroughPosition',
- strikethroughthickness: 'strikethroughThickness',
- 'strikethrough-thickness': 'strikethroughThickness',
- string: 'string',
- stroke: 'stroke',
- strokedasharray: 'strokeDasharray',
- 'stroke-dasharray': 'strokeDasharray',
- strokedashoffset: 'strokeDashoffset',
- 'stroke-dashoffset': 'strokeDashoffset',
- strokelinecap: 'strokeLinecap',
- 'stroke-linecap': 'strokeLinecap',
- strokelinejoin: 'strokeLinejoin',
- 'stroke-linejoin': 'strokeLinejoin',
- strokemiterlimit: 'strokeMiterlimit',
- 'stroke-miterlimit': 'strokeMiterlimit',
- strokewidth: 'strokeWidth',
- 'stroke-width': 'strokeWidth',
- strokeopacity: 'strokeOpacity',
- 'stroke-opacity': 'strokeOpacity',
- suppresscontenteditablewarning: 'suppressContentEditableWarning',
- suppresshydrationwarning: 'suppressHydrationWarning',
- surfacescale: 'surfaceScale',
- systemlanguage: 'systemLanguage',
- tablevalues: 'tableValues',
- targetx: 'targetX',
- targety: 'targetY',
- textanchor: 'textAnchor',
- 'text-anchor': 'textAnchor',
- textdecoration: 'textDecoration',
- 'text-decoration': 'textDecoration',
- textlength: 'textLength',
- textrendering: 'textRendering',
- 'text-rendering': 'textRendering',
- to: 'to',
- transform: 'transform',
- typeof: 'typeof',
- u1: 'u1',
- u2: 'u2',
- underlineposition: 'underlinePosition',
- 'underline-position': 'underlinePosition',
- underlinethickness: 'underlineThickness',
- 'underline-thickness': 'underlineThickness',
- unicode: 'unicode',
- unicodebidi: 'unicodeBidi',
- 'unicode-bidi': 'unicodeBidi',
- unicoderange: 'unicodeRange',
- 'unicode-range': 'unicodeRange',
- unitsperem: 'unitsPerEm',
- 'units-per-em': 'unitsPerEm',
- unselectable: 'unselectable',
- valphabetic: 'vAlphabetic',
- 'v-alphabetic': 'vAlphabetic',
- values: 'values',
- vectoreffect: 'vectorEffect',
- 'vector-effect': 'vectorEffect',
- version: 'version',
- vertadvy: 'vertAdvY',
- 'vert-adv-y': 'vertAdvY',
- vertoriginx: 'vertOriginX',
- 'vert-origin-x': 'vertOriginX',
- vertoriginy: 'vertOriginY',
- 'vert-origin-y': 'vertOriginY',
- vhanging: 'vHanging',
- 'v-hanging': 'vHanging',
- videographic: 'vIdeographic',
- 'v-ideographic': 'vIdeographic',
- viewbox: 'viewBox',
- viewtarget: 'viewTarget',
- visibility: 'visibility',
- vmathematical: 'vMathematical',
- 'v-mathematical': 'vMathematical',
- vocab: 'vocab',
- widths: 'widths',
- wordspacing: 'wordSpacing',
- 'word-spacing': 'wordSpacing',
- writingmode: 'writingMode',
- 'writing-mode': 'writingMode',
- x1: 'x1',
- x2: 'x2',
- x: 'x',
- xchannelselector: 'xChannelSelector',
- xheight: 'xHeight',
- 'x-height': 'xHeight',
- xlinkactuate: 'xlinkActuate',
- 'xlink:actuate': 'xlinkActuate',
- xlinkarcrole: 'xlinkArcrole',
- 'xlink:arcrole': 'xlinkArcrole',
- xlinkhref: 'xlinkHref',
- 'xlink:href': 'xlinkHref',
- xlinkrole: 'xlinkRole',
- 'xlink:role': 'xlinkRole',
- xlinkshow: 'xlinkShow',
- 'xlink:show': 'xlinkShow',
- xlinktitle: 'xlinkTitle',
- 'xlink:title': 'xlinkTitle',
- xlinktype: 'xlinkType',
- 'xlink:type': 'xlinkType',
- xmlbase: 'xmlBase',
- 'xml:base': 'xmlBase',
- xmllang: 'xmlLang',
- 'xml:lang': 'xmlLang',
- xmlns: 'xmlns',
- 'xml:space': 'xmlSpace',
- xmlnsxlink: 'xmlnsXlink',
- 'xmlns:xlink': 'xmlnsXlink',
- xmlspace: 'xmlSpace',
- y1: 'y1',
- y2: 'y2',
- y: 'y',
- ychannelselector: 'yChannelSelector',
- z: 'z',
- zoomandpan: 'zoomAndPan'
- };
- var validateProperty$1 = function () {};
- {
- var warnedProperties$1 = {};
- var EVENT_NAME_REGEX = /^on./;
- var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
- var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
- var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
- validateProperty$1 = function (tagName, name, value, eventRegistry) {
- if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
- return true;
- }
- var lowerCasedName = name.toLowerCase();
- if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
- error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');
- warnedProperties$1[name] = true;
- return true;
- } // We can't rely on the event system being injected on the server.
- if (eventRegistry != null) {
- var registrationNameDependencies = eventRegistry.registrationNameDependencies,
- possibleRegistrationNames = eventRegistry.possibleRegistrationNames;
- if (registrationNameDependencies.hasOwnProperty(name)) {
- return true;
- }
- var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
- if (registrationName != null) {
- error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
- warnedProperties$1[name] = true;
- return true;
- }
- if (EVENT_NAME_REGEX.test(name)) {
- error('Unknown event handler property `%s`. It will be ignored.', name);
- warnedProperties$1[name] = true;
- return true;
- }
- } else if (EVENT_NAME_REGEX.test(name)) {
- // If no event plugins have been injected, we are in a server environment.
- // So we can't tell if the event name is correct for sure, but we can filter
- // out known bad ones like `onclick`. We can't suggest a specific replacement though.
- if (INVALID_EVENT_NAME_REGEX.test(name)) {
- error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
- }
- warnedProperties$1[name] = true;
- return true;
- } // Let the ARIA attribute hook validate ARIA attributes
- if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
- return true;
- }
- if (lowerCasedName === 'innerhtml') {
- error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
- warnedProperties$1[name] = true;
- return true;
- }
- if (lowerCasedName === 'aria') {
- error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
- warnedProperties$1[name] = true;
- return true;
- }
- if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
- error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
- warnedProperties$1[name] = true;
- return true;
- }
- if (typeof value === 'number' && isNaN(value)) {
- error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
- warnedProperties$1[name] = true;
- return true;
- }
- var propertyInfo = getPropertyInfo(name);
- var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
- if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
- var standardName = possibleStandardNames[lowerCasedName];
- if (standardName !== name) {
- error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
- warnedProperties$1[name] = true;
- return true;
- }
- } else if (!isReserved && name !== lowerCasedName) {
- // Unknown attributes should have lowercase casing since that's how they
- // will be cased anyway with server rendering.
- error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);
- warnedProperties$1[name] = true;
- return true;
- }
- if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
- if (value) {
- error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name);
- } else {
- error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);
- }
- warnedProperties$1[name] = true;
- return true;
- } // Now that we've validated casing, do not validate
- // data types for reserved props
- if (isReserved) {
- return true;
- } // Warn when a known attribute is a bad type
- if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
- warnedProperties$1[name] = true;
- return false;
- } // Warn when passing the strings 'false' or 'true' into a boolean prop
- if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
- error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value);
- warnedProperties$1[name] = true;
- return true;
- }
- return true;
- };
- }
- var warnUnknownProperties = function (type, props, eventRegistry) {
- {
- var unknownProps = [];
- for (var key in props) {
- var isValid = validateProperty$1(type, key, props[key], eventRegistry);
- if (!isValid) {
- unknownProps.push(key);
- }
- }
- var unknownPropString = unknownProps.map(function (prop) {
- return '`' + prop + '`';
- }).join(', ');
- if (unknownProps.length === 1) {
- error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type);
- } else if (unknownProps.length > 1) {
- error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type);
- }
- }
- };
- function validateProperties$2(type, props, eventRegistry) {
- if (isCustomComponent(type, props)) {
- return;
- }
- warnUnknownProperties(type, props, eventRegistry);
- }
- var warnValidStyle = function () {};
- {
- // 'msTransform' is correct, but the other prefixes should be capitalized
- var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
- var msPattern = /^-ms-/;
- var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
- var badStyleValueWithSemicolonPattern = /;\s*$/;
- var warnedStyleNames = {};
- var warnedStyleValues = {};
- var warnedForNaNValue = false;
- var warnedForInfinityValue = false;
- var camelize = function (string) {
- return string.replace(hyphenPattern, function (_, character) {
- return character.toUpperCase();
- });
- };
- var warnHyphenatedStyleName = function (name) {
- if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
- return;
- }
- warnedStyleNames[name] = true;
- error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
- // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
- // is converted to lowercase `ms`.
- camelize(name.replace(msPattern, 'ms-')));
- };
- var warnBadVendoredStyleName = function (name) {
- if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
- return;
- }
- warnedStyleNames[name] = true;
- error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
- };
- var warnStyleValueWithSemicolon = function (name, value) {
- if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
- return;
- }
- warnedStyleValues[value] = true;
- error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
- };
- var warnStyleValueIsNaN = function (name, value) {
- if (warnedForNaNValue) {
- return;
- }
- warnedForNaNValue = true;
- error('`NaN` is an invalid value for the `%s` css style property.', name);
- };
- var warnStyleValueIsInfinity = function (name, value) {
- if (warnedForInfinityValue) {
- return;
- }
- warnedForInfinityValue = true;
- error('`Infinity` is an invalid value for the `%s` css style property.', name);
- };
- warnValidStyle = function (name, value) {
- if (name.indexOf('-') > -1) {
- warnHyphenatedStyleName(name);
- } else if (badVendoredStyleNamePattern.test(name)) {
- warnBadVendoredStyleName(name);
- } else if (badStyleValueWithSemicolonPattern.test(value)) {
- warnStyleValueWithSemicolon(name, value);
- }
- if (typeof value === 'number') {
- if (isNaN(value)) {
- warnStyleValueIsNaN(name, value);
- } else if (!isFinite(value)) {
- warnStyleValueIsInfinity(name, value);
- }
- }
- };
- }
- var warnValidStyle$1 = warnValidStyle;
- // code copied and modified from escape-html
- var matchHtmlRegExp = /["'&<>]/;
- /**
- * Escapes special characters and HTML entities in a given html string.
- *
- * @param {string} string HTML string to escape for later insertion
- * @return {string}
- * @public
- */
- function escapeHtml(string) {
- {
- checkHtmlStringCoercion(string);
- }
- var str = '' + string;
- var match = matchHtmlRegExp.exec(str);
- if (!match) {
- return str;
- }
- var escape;
- var html = '';
- var index;
- var lastIndex = 0;
- for (index = match.index; index < str.length; index++) {
- switch (str.charCodeAt(index)) {
- case 34:
- // "
- escape = '"';
- break;
- case 38:
- // &
- escape = '&';
- break;
- case 39:
- // '
- escape = '''; // modified from escape-html; used to be '''
- break;
- case 60:
- // <
- escape = '<';
- break;
- case 62:
- // >
- escape = '>';
- break;
- default:
- continue;
- }
- if (lastIndex !== index) {
- html += str.substring(lastIndex, index);
- }
- lastIndex = index + 1;
- html += escape;
- }
- return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
- } // end code copied and modified from escape-html
- /**
- * Escapes text to prevent scripting attacks.
- *
- * @param {*} text Text value to escape.
- * @return {string} An escaped string.
- */
- function escapeTextForBrowser(text) {
- if (typeof text === 'boolean' || typeof text === 'number') {
- // this shortcircuit helps perf for types that we know will never have
- // special characters, especially given that this function is used often
- // for numeric dom ids.
- return '' + text;
- }
- return escapeHtml(text);
- }
- var uppercasePattern = /([A-Z])/g;
- var msPattern$1 = /^ms-/;
- /**
- * Hyphenates a camelcased CSS property name, for example:
- *
- * > hyphenateStyleName('backgroundColor')
- * < "background-color"
- * > hyphenateStyleName('MozTransition')
- * < "-moz-transition"
- * > hyphenateStyleName('msTransition')
- * < "-ms-transition"
- *
- * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
- * is converted to `-ms-`.
- */
- function hyphenateStyleName(name) {
- return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern$1, '-ms-');
- }
- // and any newline or tab are filtered out as if they're not part of the URL.
- // https://url.spec.whatwg.org/#url-parsing
- // Tab or newline are defined as \r\n\t:
- // https://infra.spec.whatwg.org/#ascii-tab-or-newline
- // A C0 control is a code point in the range \u0000 NULL to \u001F
- // INFORMATION SEPARATOR ONE, inclusive:
- // https://infra.spec.whatwg.org/#c0-control-or-space
- /* eslint-disable max-len */
- var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;
- var didWarn = false;
- function sanitizeURL(url) {
- {
- if (!didWarn && isJavaScriptProtocol.test(url)) {
- didWarn = true;
- error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));
- }
- }
- }
- var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare
- function isArray(a) {
- return isArrayImpl(a);
- }
- var startInlineScript = stringToPrecomputedChunk('<script>');
- var endInlineScript = stringToPrecomputedChunk('</script>');
- var startScriptSrc = stringToPrecomputedChunk('<script src="');
- var startModuleSrc = stringToPrecomputedChunk('<script type="module" src="');
- var endAsyncScript = stringToPrecomputedChunk('" async=""></script>');
- /**
- * This escaping function is designed to work with bootstrapScriptContent only.
- * because we know we are escaping the entire script. We can avoid for instance
- * escaping html comment string sequences that are valid javascript as well because
- * if there are no sebsequent <script sequences the html parser will never enter
- * script data double escaped state (see: https://www.w3.org/TR/html53/syntax.html#script-data-double-escaped-state)
- *
- * While untrusted script content should be made safe before using this api it will
- * ensure that the script cannot be early terminated or never terminated state
- */
- function escapeBootstrapScriptContent(scriptText) {
- {
- checkHtmlStringCoercion(scriptText);
- }
- return ('' + scriptText).replace(scriptRegex, scriptReplacer);
- }
- var scriptRegex = /(<\/|<)(s)(cript)/gi;
- var scriptReplacer = function (match, prefix, s, suffix) {
- return "" + prefix + (s === 's' ? "\\u0073" : "\\u0053") + suffix;
- }; // Allows us to keep track of what we've already written so we can refer back to it.
- function createResponseState(identifierPrefix, nonce, bootstrapScriptContent, bootstrapScripts, bootstrapModules) {
- var idPrefix = identifierPrefix === undefined ? '' : identifierPrefix;
- var inlineScriptWithNonce = nonce === undefined ? startInlineScript : stringToPrecomputedChunk('<script nonce="' + escapeTextForBrowser(nonce) + '">');
- var bootstrapChunks = [];
- if (bootstrapScriptContent !== undefined) {
- bootstrapChunks.push(inlineScriptWithNonce, stringToChunk(escapeBootstrapScriptContent(bootstrapScriptContent)), endInlineScript);
- }
- if (bootstrapScripts !== undefined) {
- for (var i = 0; i < bootstrapScripts.length; i++) {
- bootstrapChunks.push(startScriptSrc, stringToChunk(escapeTextForBrowser(bootstrapScripts[i])), endAsyncScript);
- }
- }
- if (bootstrapModules !== undefined) {
- for (var _i = 0; _i < bootstrapModules.length; _i++) {
- bootstrapChunks.push(startModuleSrc, stringToChunk(escapeTextForBrowser(bootstrapModules[_i])), endAsyncScript);
- }
- }
- return {
- bootstrapChunks: bootstrapChunks,
- startInlineScript: inlineScriptWithNonce,
- placeholderPrefix: stringToPrecomputedChunk(idPrefix + 'P:'),
- segmentPrefix: stringToPrecomputedChunk(idPrefix + 'S:'),
- boundaryPrefix: idPrefix + 'B:',
- idPrefix: idPrefix,
- nextSuspenseID: 0,
- sentCompleteSegmentFunction: false,
- sentCompleteBoundaryFunction: false,
- sentClientRenderFunction: false
- };
- } // Constants for the insertion mode we're currently writing in. We don't encode all HTML5 insertion
- // modes. We only include the variants as they matter for the sake of our purposes.
- // We don't actually provide the namespace therefore we use constants instead of the string.
- var ROOT_HTML_MODE = 0; // Used for the root most element tag.
- var HTML_MODE = 1;
- var SVG_MODE = 2;
- var MATHML_MODE = 3;
- var HTML_TABLE_MODE = 4;
- var HTML_TABLE_BODY_MODE = 5;
- var HTML_TABLE_ROW_MODE = 6;
- var HTML_COLGROUP_MODE = 7; // We have a greater than HTML_TABLE_MODE check elsewhere. If you add more cases here, make sure it
- // still makes sense
- function createFormatContext(insertionMode, selectedValue) {
- return {
- insertionMode: insertionMode,
- selectedValue: selectedValue
- };
- }
- function createRootFormatContext(namespaceURI) {
- var insertionMode = namespaceURI === 'http://www.w3.org/2000/svg' ? SVG_MODE : namespaceURI === 'http://www.w3.org/1998/Math/MathML' ? MATHML_MODE : ROOT_HTML_MODE;
- return createFormatContext(insertionMode, null);
- }
- function getChildFormatContext(parentContext, type, props) {
- switch (type) {
- case 'select':
- return createFormatContext(HTML_MODE, props.value != null ? props.value : props.defaultValue);
- case 'svg':
- return createFormatContext(SVG_MODE, null);
- case 'math':
- return createFormatContext(MATHML_MODE, null);
- case 'foreignObject':
- return createFormatContext(HTML_MODE, null);
- // Table parents are special in that their children can only be created at all if they're
- // wrapped in a table parent. So we need to encode that we're entering this mode.
- case 'table':
- return createFormatContext(HTML_TABLE_MODE, null);
- case 'thead':
- case 'tbody':
- case 'tfoot':
- return createFormatContext(HTML_TABLE_BODY_MODE, null);
- case 'colgroup':
- return createFormatContext(HTML_COLGROUP_MODE, null);
- case 'tr':
- return createFormatContext(HTML_TABLE_ROW_MODE, null);
- }
- if (parentContext.insertionMode >= HTML_TABLE_MODE) {
- // Whatever tag this was, it wasn't a table parent or other special parent, so we must have
- // entered plain HTML again.
- return createFormatContext(HTML_MODE, null);
- }
- if (parentContext.insertionMode === ROOT_HTML_MODE) {
- // We've emitted the root and is now in plain HTML mode.
- return createFormatContext(HTML_MODE, null);
- }
- return parentContext;
- }
- var UNINITIALIZED_SUSPENSE_BOUNDARY_ID = null;
- function assignSuspenseBoundaryID(responseState) {
- var generatedID = responseState.nextSuspenseID++;
- return stringToPrecomputedChunk(responseState.boundaryPrefix + generatedID.toString(16));
- }
- function makeId(responseState, treeId, localId) {
- var idPrefix = responseState.idPrefix;
- var id = ':' + idPrefix + 'R' + treeId; // Unless this is the first id at this level, append a number at the end
- // that represents the position of this useId hook among all the useId
- // hooks for this fiber.
- if (localId > 0) {
- id += 'H' + localId.toString(32);
- }
- return id + ':';
- }
- function encodeHTMLTextNode(text) {
- return escapeTextForBrowser(text);
- }
- var textSeparator = stringToPrecomputedChunk('<!-- -->');
- function pushTextInstance(target, text, responseState, textEmbedded) {
- if (text === '') {
- // Empty text doesn't have a DOM node representation and the hydration is aware of this.
- return textEmbedded;
- }
- if (textEmbedded) {
- target.push(textSeparator);
- }
- target.push(stringToChunk(encodeHTMLTextNode(text)));
- return true;
- } // Called when Fizz is done with a Segment. Currently the only purpose is to conditionally
- // emit a text separator when we don't know for sure it is safe to omit
- function pushSegmentFinale(target, responseState, lastPushedText, textEmbedded) {
- if (lastPushedText && textEmbedded) {
- target.push(textSeparator);
- }
- }
- var styleNameCache = new Map();
- function processStyleName(styleName) {
- var chunk = styleNameCache.get(styleName);
- if (chunk !== undefined) {
- return chunk;
- }
- var result = stringToPrecomputedChunk(escapeTextForBrowser(hyphenateStyleName(styleName)));
- styleNameCache.set(styleName, result);
- return result;
- }
- var styleAttributeStart = stringToPrecomputedChunk(' style="');
- var styleAssign = stringToPrecomputedChunk(':');
- var styleSeparator = stringToPrecomputedChunk(';');
- function pushStyle(target, responseState, style) {
- if (typeof style !== 'object') {
- throw new Error('The `style` prop expects a mapping from style properties to values, ' + "not a string. For example, style={{marginRight: spacing + 'em'}} when " + 'using JSX.');
- }
- var isFirst = true;
- for (var styleName in style) {
- if (!hasOwnProperty.call(style, styleName)) {
- continue;
- } // If you provide unsafe user data here they can inject arbitrary CSS
- // which may be problematic (I couldn't repro this):
- // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
- // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
- // This is not an XSS hole but instead a potential CSS injection issue
- // which has lead to a greater discussion about how we're going to
- // trust URLs moving forward. See #2115901
- var styleValue = style[styleName];
- if (styleValue == null || typeof styleValue === 'boolean' || styleValue === '') {
- // TODO: We used to set empty string as a style with an empty value. Does that ever make sense?
- continue;
- }
- var nameChunk = void 0;
- var valueChunk = void 0;
- var isCustomProperty = styleName.indexOf('--') === 0;
- if (isCustomProperty) {
- nameChunk = stringToChunk(escapeTextForBrowser(styleName));
- {
- checkCSSPropertyStringCoercion(styleValue, styleName);
- }
- valueChunk = stringToChunk(escapeTextForBrowser(('' + styleValue).trim()));
- } else {
- {
- warnValidStyle$1(styleName, styleValue);
- }
- nameChunk = processStyleName(styleName);
- if (typeof styleValue === 'number') {
- if (styleValue !== 0 && !hasOwnProperty.call(isUnitlessNumber, styleName)) {
- valueChunk = stringToChunk(styleValue + 'px'); // Presumes implicit 'px' suffix for unitless numbers
- } else {
- valueChunk = stringToChunk('' + styleValue);
- }
- } else {
- {
- checkCSSPropertyStringCoercion(styleValue, styleName);
- }
- valueChunk = stringToChunk(escapeTextForBrowser(('' + styleValue).trim()));
- }
- }
- if (isFirst) {
- isFirst = false; // If it's first, we don't need any separators prefixed.
- target.push(styleAttributeStart, nameChunk, styleAssign, valueChunk);
- } else {
- target.push(styleSeparator, nameChunk, styleAssign, valueChunk);
- }
- }
- if (!isFirst) {
- target.push(attributeEnd);
- }
- }
- var attributeSeparator = stringToPrecomputedChunk(' ');
- var attributeAssign = stringToPrecomputedChunk('="');
- var attributeEnd = stringToPrecomputedChunk('"');
- var attributeEmptyString = stringToPrecomputedChunk('=""');
- function pushAttribute(target, responseState, name, value) {
- switch (name) {
- case 'style':
- {
- pushStyle(target, responseState, value);
- return;
- }
- case 'defaultValue':
- case 'defaultChecked': // These shouldn't be set as attributes on generic HTML elements.
- case 'innerHTML': // Must use dangerouslySetInnerHTML instead.
- case 'suppressContentEditableWarning':
- case 'suppressHydrationWarning':
- // Ignored. These are built-in to React on the client.
- return;
- }
- if ( // shouldIgnoreAttribute
- // We have already filtered out null/undefined and reserved words.
- name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
- return;
- }
- var propertyInfo = getPropertyInfo(name);
- if (propertyInfo !== null) {
- // shouldRemoveAttribute
- switch (typeof value) {
- case 'function': // $FlowIssue symbol is perfectly valid here
- case 'symbol':
- // eslint-disable-line
- return;
- case 'boolean':
- {
- if (!propertyInfo.acceptsBooleans) {
- return;
- }
- }
- }
- var attributeName = propertyInfo.attributeName;
- var attributeNameChunk = stringToChunk(attributeName); // TODO: If it's known we can cache the chunk.
- switch (propertyInfo.type) {
- case BOOLEAN:
- if (value) {
- target.push(attributeSeparator, attributeNameChunk, attributeEmptyString);
- }
- return;
- case OVERLOADED_BOOLEAN:
- if (value === true) {
- target.push(attributeSeparator, attributeNameChunk, attributeEmptyString);
- } else if (value === false) ; else {
- target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
- }
- return;
- case NUMERIC:
- if (!isNaN(value)) {
- target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
- }
- break;
- case POSITIVE_NUMERIC:
- if (!isNaN(value) && value >= 1) {
- target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
- }
- break;
- default:
- if (propertyInfo.sanitizeURL) {
- {
- checkAttributeStringCoercion(value, attributeName);
- }
- value = '' + value;
- sanitizeURL(value);
- }
- target.push(attributeSeparator, attributeNameChunk, attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
- }
- } else if (isAttributeNameSafe(name)) {
- // shouldRemoveAttribute
- switch (typeof value) {
- case 'function': // $FlowIssue symbol is perfectly valid here
- case 'symbol':
- // eslint-disable-line
- return;
- case 'boolean':
- {
- var prefix = name.toLowerCase().slice(0, 5);
- if (prefix !== 'data-' && prefix !== 'aria-') {
- return;
- }
- }
- }
- target.push(attributeSeparator, stringToChunk(name), attributeAssign, stringToChunk(escapeTextForBrowser(value)), attributeEnd);
- }
- }
- var endOfStartTag = stringToPrecomputedChunk('>');
- var endOfStartTagSelfClosing = stringToPrecomputedChunk('/>');
- function pushInnerHTML(target, innerHTML, children) {
- if (innerHTML != null) {
- if (children != null) {
- throw new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
- }
- if (typeof innerHTML !== 'object' || !('__html' in innerHTML)) {
- throw new Error('`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://reactjs.org/link/dangerously-set-inner-html ' + 'for more information.');
- }
- var html = innerHTML.__html;
- if (html !== null && html !== undefined) {
- {
- checkHtmlStringCoercion(html);
- }
- target.push(stringToChunk('' + html));
- }
- }
- } // TODO: Move these to ResponseState so that we warn for every request.
- // It would help debugging in stateful servers (e.g. service worker).
- var didWarnDefaultInputValue = false;
- var didWarnDefaultChecked = false;
- var didWarnDefaultSelectValue = false;
- var didWarnDefaultTextareaValue = false;
- var didWarnInvalidOptionChildren = false;
- var didWarnInvalidOptionInnerHTML = false;
- var didWarnSelectedSetOnOption = false;
- function checkSelectProp(props, propName) {
- {
- var value = props[propName];
- if (value != null) {
- var array = isArray(value);
- if (props.multiple && !array) {
- error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.', propName);
- } else if (!props.multiple && array) {
- error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.', propName);
- }
- }
- }
- }
- function pushStartSelect(target, props, responseState) {
- {
- checkControlledValueProps('select', props);
- checkSelectProp(props, 'value');
- checkSelectProp(props, 'defaultValue');
- if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultSelectValue) {
- error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components');
- didWarnDefaultSelectValue = true;
- }
- }
- target.push(startChunkForTag('select'));
- var children = null;
- var innerHTML = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- children = propValue;
- break;
- case 'dangerouslySetInnerHTML':
- // TODO: This doesn't really make sense for select since it can't use the controlled
- // value in the innerHTML.
- innerHTML = propValue;
- break;
- case 'defaultValue':
- case 'value':
- // These are set on the Context instead and applied to the nested options.
- break;
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- target.push(endOfStartTag);
- pushInnerHTML(target, innerHTML, children);
- return children;
- }
- function flattenOptionChildren(children) {
- var content = ''; // Flatten children and warn if they aren't strings or numbers;
- // invalid types are ignored.
- React.Children.forEach(children, function (child) {
- if (child == null) {
- return;
- }
- content += child;
- {
- if (!didWarnInvalidOptionChildren && typeof child !== 'string' && typeof child !== 'number') {
- didWarnInvalidOptionChildren = true;
- error('Cannot infer the option value of complex children. ' + 'Pass a `value` prop or use a plain string as children to <option>.');
- }
- }
- });
- return content;
- }
- var selectedMarkerAttribute = stringToPrecomputedChunk(' selected=""');
- function pushStartOption(target, props, responseState, formatContext) {
- var selectedValue = formatContext.selectedValue;
- target.push(startChunkForTag('option'));
- var children = null;
- var value = null;
- var selected = null;
- var innerHTML = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- children = propValue;
- break;
- case 'selected':
- // ignore
- selected = propValue;
- {
- // TODO: Remove support for `selected` in <option>.
- if (!didWarnSelectedSetOnOption) {
- error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
- didWarnSelectedSetOnOption = true;
- }
- }
- break;
- case 'dangerouslySetInnerHTML':
- innerHTML = propValue;
- break;
- // eslint-disable-next-line-no-fallthrough
- case 'value':
- value = propValue;
- // We intentionally fallthrough to also set the attribute on the node.
- // eslint-disable-next-line-no-fallthrough
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- if (selectedValue != null) {
- var stringValue;
- if (value !== null) {
- {
- checkAttributeStringCoercion(value, 'value');
- }
- stringValue = '' + value;
- } else {
- {
- if (innerHTML !== null) {
- if (!didWarnInvalidOptionInnerHTML) {
- didWarnInvalidOptionInnerHTML = true;
- error('Pass a `value` prop if you set dangerouslyInnerHTML so React knows ' + 'which value should be selected.');
- }
- }
- }
- stringValue = flattenOptionChildren(children);
- }
- if (isArray(selectedValue)) {
- // multiple
- for (var i = 0; i < selectedValue.length; i++) {
- {
- checkAttributeStringCoercion(selectedValue[i], 'value');
- }
- var v = '' + selectedValue[i];
- if (v === stringValue) {
- target.push(selectedMarkerAttribute);
- break;
- }
- }
- } else {
- {
- checkAttributeStringCoercion(selectedValue, 'select.value');
- }
- if ('' + selectedValue === stringValue) {
- target.push(selectedMarkerAttribute);
- }
- }
- } else if (selected) {
- target.push(selectedMarkerAttribute);
- }
- target.push(endOfStartTag);
- pushInnerHTML(target, innerHTML, children);
- return children;
- }
- function pushInput(target, props, responseState) {
- {
- checkControlledValueProps('input', props);
- if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnDefaultChecked) {
- error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', 'A component', props.type);
- didWarnDefaultChecked = true;
- }
- if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultInputValue) {
- error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', 'A component', props.type);
- didWarnDefaultInputValue = true;
- }
- }
- target.push(startChunkForTag('input'));
- var value = null;
- var defaultValue = null;
- var checked = null;
- var defaultChecked = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- case 'dangerouslySetInnerHTML':
- throw new Error('input' + " is a self-closing tag and must neither have `children` nor " + 'use `dangerouslySetInnerHTML`.');
- // eslint-disable-next-line-no-fallthrough
- case 'defaultChecked':
- defaultChecked = propValue;
- break;
- case 'defaultValue':
- defaultValue = propValue;
- break;
- case 'checked':
- checked = propValue;
- break;
- case 'value':
- value = propValue;
- break;
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- if (checked !== null) {
- pushAttribute(target, responseState, 'checked', checked);
- } else if (defaultChecked !== null) {
- pushAttribute(target, responseState, 'checked', defaultChecked);
- }
- if (value !== null) {
- pushAttribute(target, responseState, 'value', value);
- } else if (defaultValue !== null) {
- pushAttribute(target, responseState, 'value', defaultValue);
- }
- target.push(endOfStartTagSelfClosing);
- return null;
- }
- function pushStartTextArea(target, props, responseState) {
- {
- checkControlledValueProps('textarea', props);
- if (props.value !== undefined && props.defaultValue !== undefined && !didWarnDefaultTextareaValue) {
- error('Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components');
- didWarnDefaultTextareaValue = true;
- }
- }
- target.push(startChunkForTag('textarea'));
- var value = null;
- var defaultValue = null;
- var children = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- children = propValue;
- break;
- case 'value':
- value = propValue;
- break;
- case 'defaultValue':
- defaultValue = propValue;
- break;
- case 'dangerouslySetInnerHTML':
- throw new Error('`dangerouslySetInnerHTML` does not make sense on <textarea>.');
- // eslint-disable-next-line-no-fallthrough
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- if (value === null && defaultValue !== null) {
- value = defaultValue;
- }
- target.push(endOfStartTag); // TODO (yungsters): Remove support for children content in <textarea>.
- if (children != null) {
- {
- error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
- }
- if (value != null) {
- throw new Error('If you supply `defaultValue` on a <textarea>, do not pass children.');
- }
- if (isArray(children)) {
- if (children.length > 1) {
- throw new Error('<textarea> can only have at most one child.');
- } // TODO: remove the coercion and the DEV check below because it will
- // always be overwritten by the coercion several lines below it. #22309
- {
- checkHtmlStringCoercion(children[0]);
- }
- value = '' + children[0];
- }
- {
- checkHtmlStringCoercion(children);
- }
- value = '' + children;
- }
- if (typeof value === 'string' && value[0] === '\n') {
- // text/html ignores the first character in these tags if it's a newline
- // Prefer to break application/xml over text/html (for now) by adding
- // a newline specifically to get eaten by the parser. (Alternately for
- // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
- // \r is normalized out by HTMLTextAreaElement#value.)
- // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
- // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
- // See: <http://www.w3.org/TR/html5/syntax.html#newlines>
- // See: Parsing of "textarea" "listing" and "pre" elements
- // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
- target.push(leadingNewline);
- } // ToString and push directly instead of recurse over children.
- // We don't really support complex children in the value anyway.
- // This also currently avoids a trailing comment node which breaks textarea.
- if (value !== null) {
- {
- checkAttributeStringCoercion(value, 'value');
- }
- target.push(stringToChunk(encodeHTMLTextNode('' + value)));
- }
- return null;
- }
- function pushSelfClosing(target, props, tag, responseState) {
- target.push(startChunkForTag(tag));
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- case 'dangerouslySetInnerHTML':
- throw new Error(tag + " is a self-closing tag and must neither have `children` nor " + 'use `dangerouslySetInnerHTML`.');
- // eslint-disable-next-line-no-fallthrough
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- target.push(endOfStartTagSelfClosing);
- return null;
- }
- function pushStartMenuItem(target, props, responseState) {
- target.push(startChunkForTag('menuitem'));
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- case 'dangerouslySetInnerHTML':
- throw new Error('menuitems cannot have `children` nor `dangerouslySetInnerHTML`.');
- // eslint-disable-next-line-no-fallthrough
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- target.push(endOfStartTag);
- return null;
- }
- function pushStartTitle(target, props, responseState) {
- target.push(startChunkForTag('title'));
- var children = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- children = propValue;
- break;
- case 'dangerouslySetInnerHTML':
- throw new Error('`dangerouslySetInnerHTML` does not make sense on <title>.');
- // eslint-disable-next-line-no-fallthrough
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- target.push(endOfStartTag);
- {
- var child = Array.isArray(children) && children.length < 2 ? children[0] || null : children;
- if (Array.isArray(children) && children.length > 1) {
- error('A title element received an array with more than 1 element as children. ' + 'In browsers title Elements can only have Text Nodes as children. If ' + 'the children being rendered output more than a single text node in aggregate the browser ' + 'will display markup and comments as text in the title and hydration will likely fail and ' + 'fall back to client rendering');
- } else if (child != null && child.$$typeof != null) {
- error('A title element received a React element for children. ' + 'In the browser title Elements can only have Text Nodes as children. If ' + 'the children being rendered output more than a single text node in aggregate the browser ' + 'will display markup and comments as text in the title and hydration will likely fail and ' + 'fall back to client rendering');
- } else if (child != null && typeof child !== 'string' && typeof child !== 'number') {
- error('A title element received a value that was not a string or number for children. ' + 'In the browser title Elements can only have Text Nodes as children. If ' + 'the children being rendered output more than a single text node in aggregate the browser ' + 'will display markup and comments as text in the title and hydration will likely fail and ' + 'fall back to client rendering');
- }
- }
- return children;
- }
- function pushStartGenericElement(target, props, tag, responseState) {
- target.push(startChunkForTag(tag));
- var children = null;
- var innerHTML = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- children = propValue;
- break;
- case 'dangerouslySetInnerHTML':
- innerHTML = propValue;
- break;
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- target.push(endOfStartTag);
- pushInnerHTML(target, innerHTML, children);
- if (typeof children === 'string') {
- // Special case children as a string to avoid the unnecessary comment.
- // TODO: Remove this special case after the general optimization is in place.
- target.push(stringToChunk(encodeHTMLTextNode(children)));
- return null;
- }
- return children;
- }
- function pushStartCustomElement(target, props, tag, responseState) {
- target.push(startChunkForTag(tag));
- var children = null;
- var innerHTML = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- children = propValue;
- break;
- case 'dangerouslySetInnerHTML':
- innerHTML = propValue;
- break;
- case 'style':
- pushStyle(target, responseState, propValue);
- break;
- case 'suppressContentEditableWarning':
- case 'suppressHydrationWarning':
- // Ignored. These are built-in to React on the client.
- break;
- default:
- if (isAttributeNameSafe(propKey) && typeof propValue !== 'function' && typeof propValue !== 'symbol') {
- target.push(attributeSeparator, stringToChunk(propKey), attributeAssign, stringToChunk(escapeTextForBrowser(propValue)), attributeEnd);
- }
- break;
- }
- }
- }
- target.push(endOfStartTag);
- pushInnerHTML(target, innerHTML, children);
- return children;
- }
- var leadingNewline = stringToPrecomputedChunk('\n');
- function pushStartPreformattedElement(target, props, tag, responseState) {
- target.push(startChunkForTag(tag));
- var children = null;
- var innerHTML = null;
- for (var propKey in props) {
- if (hasOwnProperty.call(props, propKey)) {
- var propValue = props[propKey];
- if (propValue == null) {
- continue;
- }
- switch (propKey) {
- case 'children':
- children = propValue;
- break;
- case 'dangerouslySetInnerHTML':
- innerHTML = propValue;
- break;
- default:
- pushAttribute(target, responseState, propKey, propValue);
- break;
- }
- }
- }
- target.push(endOfStartTag); // text/html ignores the first character in these tags if it's a newline
- // Prefer to break application/xml over text/html (for now) by adding
- // a newline specifically to get eaten by the parser. (Alternately for
- // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
- // \r is normalized out by HTMLTextAreaElement#value.)
- // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
- // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
- // See: <http://www.w3.org/TR/html5/syntax.html#newlines>
- // See: Parsing of "textarea" "listing" and "pre" elements
- // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
- // TODO: This doesn't deal with the case where the child is an array
- // or component that returns a string.
- if (innerHTML != null) {
- if (children != null) {
- throw new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
- }
- if (typeof innerHTML !== 'object' || !('__html' in innerHTML)) {
- throw new Error('`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://reactjs.org/link/dangerously-set-inner-html ' + 'for more information.');
- }
- var html = innerHTML.__html;
- if (html !== null && html !== undefined) {
- if (typeof html === 'string' && html.length > 0 && html[0] === '\n') {
- target.push(leadingNewline, stringToChunk(html));
- } else {
- {
- checkHtmlStringCoercion(html);
- }
- target.push(stringToChunk('' + html));
- }
- }
- }
- if (typeof children === 'string' && children[0] === '\n') {
- target.push(leadingNewline);
- }
- return children;
- } // We accept any tag to be rendered but since this gets injected into arbitrary
- // HTML, we want to make sure that it's a safe tag.
- // http://www.w3.org/TR/REC-xml/#NT-Name
- var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset
- var validatedTagCache = new Map();
- function startChunkForTag(tag) {
- var tagStartChunk = validatedTagCache.get(tag);
- if (tagStartChunk === undefined) {
- if (!VALID_TAG_REGEX.test(tag)) {
- throw new Error("Invalid tag: " + tag);
- }
- tagStartChunk = stringToPrecomputedChunk('<' + tag);
- validatedTagCache.set(tag, tagStartChunk);
- }
- return tagStartChunk;
- }
- var DOCTYPE = stringToPrecomputedChunk('<!DOCTYPE html>');
- function pushStartInstance(target, type, props, responseState, formatContext) {
- {
- validateProperties(type, props);
- validateProperties$1(type, props);
- validateProperties$2(type, props, null);
- if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
- error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');
- }
- if (formatContext.insertionMode !== SVG_MODE && formatContext.insertionMode !== MATHML_MODE) {
- if (type.indexOf('-') === -1 && typeof props.is !== 'string' && type.toLowerCase() !== type) {
- error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);
- }
- }
- }
- switch (type) {
- // Special tags
- case 'select':
- return pushStartSelect(target, props, responseState);
- case 'option':
- return pushStartOption(target, props, responseState, formatContext);
- case 'textarea':
- return pushStartTextArea(target, props, responseState);
- case 'input':
- return pushInput(target, props, responseState);
- case 'menuitem':
- return pushStartMenuItem(target, props, responseState);
- case 'title':
- return pushStartTitle(target, props, responseState);
- // Newline eating tags
- case 'listing':
- case 'pre':
- {
- return pushStartPreformattedElement(target, props, type, responseState);
- }
- // Omitted close tags
- case 'area':
- case 'base':
- case 'br':
- case 'col':
- case 'embed':
- case 'hr':
- case 'img':
- case 'keygen':
- case 'link':
- case 'meta':
- case 'param':
- case 'source':
- case 'track':
- case 'wbr':
- {
- return pushSelfClosing(target, props, type, responseState);
- }
- // These are reserved SVG and MathML elements, that are never custom elements.
- // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
- case 'annotation-xml':
- case 'color-profile':
- case 'font-face':
- case 'font-face-src':
- case 'font-face-uri':
- case 'font-face-format':
- case 'font-face-name':
- case 'missing-glyph':
- {
- return pushStartGenericElement(target, props, type, responseState);
- }
- case 'html':
- {
- if (formatContext.insertionMode === ROOT_HTML_MODE) {
- // If we're rendering the html tag and we're at the root (i.e. not in foreignObject)
- // then we also emit the DOCTYPE as part of the root content as a convenience for
- // rendering the whole document.
- target.push(DOCTYPE);
- }
- return pushStartGenericElement(target, props, type, responseState);
- }
- default:
- {
- if (type.indexOf('-') === -1 && typeof props.is !== 'string') {
- // Generic element
- return pushStartGenericElement(target, props, type, responseState);
- } else {
- // Custom element
- return pushStartCustomElement(target, props, type, responseState);
- }
- }
- }
- }
- var endTag1 = stringToPrecomputedChunk('</');
- var endTag2 = stringToPrecomputedChunk('>');
- function pushEndInstance(target, type, props) {
- switch (type) {
- // Omitted close tags
- // TODO: Instead of repeating this switch we could try to pass a flag from above.
- // That would require returning a tuple. Which might be ok if it gets inlined.
- case 'area':
- case 'base':
- case 'br':
- case 'col':
- case 'embed':
- case 'hr':
- case 'img':
- case 'input':
- case 'keygen':
- case 'link':
- case 'meta':
- case 'param':
- case 'source':
- case 'track':
- case 'wbr':
- {
- // No close tag needed.
- break;
- }
- default:
- {
- target.push(endTag1, stringToChunk(type), endTag2);
- }
- }
- }
- function writeCompletedRoot(destination, responseState) {
- var bootstrapChunks = responseState.bootstrapChunks;
- var i = 0;
- for (; i < bootstrapChunks.length - 1; i++) {
- writeChunk(destination, bootstrapChunks[i]);
- }
- if (i < bootstrapChunks.length) {
- return writeChunkAndReturn(destination, bootstrapChunks[i]);
- }
- return true;
- } // Structural Nodes
- // A placeholder is a node inside a hidden partial tree that can be filled in later, but before
- // display. It's never visible to users. We use the template tag because it can be used in every
- // type of parent. <script> tags also work in every other tag except <colgroup>.
- var placeholder1 = stringToPrecomputedChunk('<template id="');
- var placeholder2 = stringToPrecomputedChunk('"></template>');
- function writePlaceholder(destination, responseState, id) {
- writeChunk(destination, placeholder1);
- writeChunk(destination, responseState.placeholderPrefix);
- var formattedID = stringToChunk(id.toString(16));
- writeChunk(destination, formattedID);
- return writeChunkAndReturn(destination, placeholder2);
- } // Suspense boundaries are encoded as comments.
- var startCompletedSuspenseBoundary = stringToPrecomputedChunk('<!--$-->');
- var startPendingSuspenseBoundary1 = stringToPrecomputedChunk('<!--$?--><template id="');
- var startPendingSuspenseBoundary2 = stringToPrecomputedChunk('"></template>');
- var startClientRenderedSuspenseBoundary = stringToPrecomputedChunk('<!--$!-->');
- var endSuspenseBoundary = stringToPrecomputedChunk('<!--/$-->');
- var clientRenderedSuspenseBoundaryError1 = stringToPrecomputedChunk('<template');
- var clientRenderedSuspenseBoundaryErrorAttrInterstitial = stringToPrecomputedChunk('"');
- var clientRenderedSuspenseBoundaryError1A = stringToPrecomputedChunk(' data-dgst="');
- var clientRenderedSuspenseBoundaryError1B = stringToPrecomputedChunk(' data-msg="');
- var clientRenderedSuspenseBoundaryError1C = stringToPrecomputedChunk(' data-stck="');
- var clientRenderedSuspenseBoundaryError2 = stringToPrecomputedChunk('></template>');
- function writeStartCompletedSuspenseBoundary(destination, responseState) {
- return writeChunkAndReturn(destination, startCompletedSuspenseBoundary);
- }
- function writeStartPendingSuspenseBoundary(destination, responseState, id) {
- writeChunk(destination, startPendingSuspenseBoundary1);
- if (id === null) {
- throw new Error('An ID must have been assigned before we can complete the boundary.');
- }
- writeChunk(destination, id);
- return writeChunkAndReturn(destination, startPendingSuspenseBoundary2);
- }
- function writeStartClientRenderedSuspenseBoundary(destination, responseState, errorDigest, errorMesssage, errorComponentStack) {
- var result;
- result = writeChunkAndReturn(destination, startClientRenderedSuspenseBoundary);
- writeChunk(destination, clientRenderedSuspenseBoundaryError1);
- if (errorDigest) {
- writeChunk(destination, clientRenderedSuspenseBoundaryError1A);
- writeChunk(destination, stringToChunk(escapeTextForBrowser(errorDigest)));
- writeChunk(destination, clientRenderedSuspenseBoundaryErrorAttrInterstitial);
- }
- {
- if (errorMesssage) {
- writeChunk(destination, clientRenderedSuspenseBoundaryError1B);
- writeChunk(destination, stringToChunk(escapeTextForBrowser(errorMesssage)));
- writeChunk(destination, clientRenderedSuspenseBoundaryErrorAttrInterstitial);
- }
- if (errorComponentStack) {
- writeChunk(destination, clientRenderedSuspenseBoundaryError1C);
- writeChunk(destination, stringToChunk(escapeTextForBrowser(errorComponentStack)));
- writeChunk(destination, clientRenderedSuspenseBoundaryErrorAttrInterstitial);
- }
- }
- result = writeChunkAndReturn(destination, clientRenderedSuspenseBoundaryError2);
- return result;
- }
- function writeEndCompletedSuspenseBoundary(destination, responseState) {
- return writeChunkAndReturn(destination, endSuspenseBoundary);
- }
- function writeEndPendingSuspenseBoundary(destination, responseState) {
- return writeChunkAndReturn(destination, endSuspenseBoundary);
- }
- function writeEndClientRenderedSuspenseBoundary(destination, responseState) {
- return writeChunkAndReturn(destination, endSuspenseBoundary);
- }
- var startSegmentHTML = stringToPrecomputedChunk('<div hidden id="');
- var startSegmentHTML2 = stringToPrecomputedChunk('">');
- var endSegmentHTML = stringToPrecomputedChunk('</div>');
- var startSegmentSVG = stringToPrecomputedChunk('<svg aria-hidden="true" style="display:none" id="');
- var startSegmentSVG2 = stringToPrecomputedChunk('">');
- var endSegmentSVG = stringToPrecomputedChunk('</svg>');
- var startSegmentMathML = stringToPrecomputedChunk('<math aria-hidden="true" style="display:none" id="');
- var startSegmentMathML2 = stringToPrecomputedChunk('">');
- var endSegmentMathML = stringToPrecomputedChunk('</math>');
- var startSegmentTable = stringToPrecomputedChunk('<table hidden id="');
- var startSegmentTable2 = stringToPrecomputedChunk('">');
- var endSegmentTable = stringToPrecomputedChunk('</table>');
- var startSegmentTableBody = stringToPrecomputedChunk('<table hidden><tbody id="');
- var startSegmentTableBody2 = stringToPrecomputedChunk('">');
- var endSegmentTableBody = stringToPrecomputedChunk('</tbody></table>');
- var startSegmentTableRow = stringToPrecomputedChunk('<table hidden><tr id="');
- var startSegmentTableRow2 = stringToPrecomputedChunk('">');
- var endSegmentTableRow = stringToPrecomputedChunk('</tr></table>');
- var startSegmentColGroup = stringToPrecomputedChunk('<table hidden><colgroup id="');
- var startSegmentColGroup2 = stringToPrecomputedChunk('">');
- var endSegmentColGroup = stringToPrecomputedChunk('</colgroup></table>');
- function writeStartSegment(destination, responseState, formatContext, id) {
- switch (formatContext.insertionMode) {
- case ROOT_HTML_MODE:
- case HTML_MODE:
- {
- writeChunk(destination, startSegmentHTML);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, stringToChunk(id.toString(16)));
- return writeChunkAndReturn(destination, startSegmentHTML2);
- }
- case SVG_MODE:
- {
- writeChunk(destination, startSegmentSVG);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, stringToChunk(id.toString(16)));
- return writeChunkAndReturn(destination, startSegmentSVG2);
- }
- case MATHML_MODE:
- {
- writeChunk(destination, startSegmentMathML);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, stringToChunk(id.toString(16)));
- return writeChunkAndReturn(destination, startSegmentMathML2);
- }
- case HTML_TABLE_MODE:
- {
- writeChunk(destination, startSegmentTable);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, stringToChunk(id.toString(16)));
- return writeChunkAndReturn(destination, startSegmentTable2);
- }
- // TODO: For the rest of these, there will be extra wrapper nodes that never
- // get deleted from the document. We need to delete the table too as part
- // of the injected scripts. They are invisible though so it's not too terrible
- // and it's kind of an edge case to suspend in a table. Totally supported though.
- case HTML_TABLE_BODY_MODE:
- {
- writeChunk(destination, startSegmentTableBody);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, stringToChunk(id.toString(16)));
- return writeChunkAndReturn(destination, startSegmentTableBody2);
- }
- case HTML_TABLE_ROW_MODE:
- {
- writeChunk(destination, startSegmentTableRow);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, stringToChunk(id.toString(16)));
- return writeChunkAndReturn(destination, startSegmentTableRow2);
- }
- case HTML_COLGROUP_MODE:
- {
- writeChunk(destination, startSegmentColGroup);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, stringToChunk(id.toString(16)));
- return writeChunkAndReturn(destination, startSegmentColGroup2);
- }
- default:
- {
- throw new Error('Unknown insertion mode. This is a bug in React.');
- }
- }
- }
- function writeEndSegment(destination, formatContext) {
- switch (formatContext.insertionMode) {
- case ROOT_HTML_MODE:
- case HTML_MODE:
- {
- return writeChunkAndReturn(destination, endSegmentHTML);
- }
- case SVG_MODE:
- {
- return writeChunkAndReturn(destination, endSegmentSVG);
- }
- case MATHML_MODE:
- {
- return writeChunkAndReturn(destination, endSegmentMathML);
- }
- case HTML_TABLE_MODE:
- {
- return writeChunkAndReturn(destination, endSegmentTable);
- }
- case HTML_TABLE_BODY_MODE:
- {
- return writeChunkAndReturn(destination, endSegmentTableBody);
- }
- case HTML_TABLE_ROW_MODE:
- {
- return writeChunkAndReturn(destination, endSegmentTableRow);
- }
- case HTML_COLGROUP_MODE:
- {
- return writeChunkAndReturn(destination, endSegmentColGroup);
- }
- default:
- {
- throw new Error('Unknown insertion mode. This is a bug in React.');
- }
- }
- } // Instruction Set
- // The following code is the source scripts that we then minify and inline below,
- // with renamed function names that we hope don't collide:
- // const COMMENT_NODE = 8;
- // const SUSPENSE_START_DATA = '$';
- // const SUSPENSE_END_DATA = '/$';
- // const SUSPENSE_PENDING_START_DATA = '$?';
- // const SUSPENSE_FALLBACK_START_DATA = '$!';
- //
- // function clientRenderBoundary(suspenseBoundaryID, errorDigest, errorMsg, errorComponentStack) {
- // // Find the fallback's first element.
- // const suspenseIdNode = document.getElementById(suspenseBoundaryID);
- // if (!suspenseIdNode) {
- // // The user must have already navigated away from this tree.
- // // E.g. because the parent was hydrated.
- // return;
- // }
- // // Find the boundary around the fallback. This is always the previous node.
- // const suspenseNode = suspenseIdNode.previousSibling;
- // // Tag it to be client rendered.
- // suspenseNode.data = SUSPENSE_FALLBACK_START_DATA;
- // // assign error metadata to first sibling
- // let dataset = suspenseIdNode.dataset;
- // if (errorDigest) dataset.dgst = errorDigest;
- // if (errorMsg) dataset.msg = errorMsg;
- // if (errorComponentStack) dataset.stck = errorComponentStack;
- // // Tell React to retry it if the parent already hydrated.
- // if (suspenseNode._reactRetry) {
- // suspenseNode._reactRetry();
- // }
- // }
- //
- // function completeBoundary(suspenseBoundaryID, contentID) {
- // // Find the fallback's first element.
- // const suspenseIdNode = document.getElementById(suspenseBoundaryID);
- // const contentNode = document.getElementById(contentID);
- // // We'll detach the content node so that regardless of what happens next we don't leave in the tree.
- // // This might also help by not causing recalcing each time we move a child from here to the target.
- // contentNode.parentNode.removeChild(contentNode);
- // if (!suspenseIdNode) {
- // // The user must have already navigated away from this tree.
- // // E.g. because the parent was hydrated. That's fine there's nothing to do
- // // but we have to make sure that we already deleted the container node.
- // return;
- // }
- // // Find the boundary around the fallback. This is always the previous node.
- // const suspenseNode = suspenseIdNode.previousSibling;
- //
- // // Clear all the existing children. This is complicated because
- // // there can be embedded Suspense boundaries in the fallback.
- // // This is similar to clearSuspenseBoundary in ReactDOMHostConfig.
- // // TODO: We could avoid this if we never emitted suspense boundaries in fallback trees.
- // // They never hydrate anyway. However, currently we support incrementally loading the fallback.
- // const parentInstance = suspenseNode.parentNode;
- // let node = suspenseNode.nextSibling;
- // let depth = 0;
- // do {
- // if (node && node.nodeType === COMMENT_NODE) {
- // const data = node.data;
- // if (data === SUSPENSE_END_DATA) {
- // if (depth === 0) {
- // break;
- // } else {
- // depth--;
- // }
- // } else if (
- // data === SUSPENSE_START_DATA ||
- // data === SUSPENSE_PENDING_START_DATA ||
- // data === SUSPENSE_FALLBACK_START_DATA
- // ) {
- // depth++;
- // }
- // }
- //
- // const nextNode = node.nextSibling;
- // parentInstance.removeChild(node);
- // node = nextNode;
- // } while (node);
- //
- // const endOfBoundary = node;
- //
- // // Insert all the children from the contentNode between the start and end of suspense boundary.
- // while (contentNode.firstChild) {
- // parentInstance.insertBefore(contentNode.firstChild, endOfBoundary);
- // }
- // suspenseNode.data = SUSPENSE_START_DATA;
- // if (suspenseNode._reactRetry) {
- // suspenseNode._reactRetry();
- // }
- // }
- //
- // function completeSegment(containerID, placeholderID) {
- // const segmentContainer = document.getElementById(containerID);
- // const placeholderNode = document.getElementById(placeholderID);
- // // We always expect both nodes to exist here because, while we might
- // // have navigated away from the main tree, we still expect the detached
- // // tree to exist.
- // segmentContainer.parentNode.removeChild(segmentContainer);
- // while (segmentContainer.firstChild) {
- // placeholderNode.parentNode.insertBefore(
- // segmentContainer.firstChild,
- // placeholderNode,
- // );
- // }
- // placeholderNode.parentNode.removeChild(placeholderNode);
- // }
- var completeSegmentFunction = 'function $RS(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)}';
- var completeBoundaryFunction = 'function $RC(a,b){a=document.getElementById(a);b=document.getElementById(b);b.parentNode.removeChild(b);if(a){a=a.previousSibling;var f=a.parentNode,c=a.nextSibling,e=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d)if(0===e)break;else e--;else"$"!==d&&"$?"!==d&&"$!"!==d||e++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;b.firstChild;)f.insertBefore(b.firstChild,c);a.data="$";a._reactRetry&&a._reactRetry()}}';
- var clientRenderFunction = 'function $RX(b,c,d,e){var a=document.getElementById(b);a&&(b=a.previousSibling,b.data="$!",a=a.dataset,c&&(a.dgst=c),d&&(a.msg=d),e&&(a.stck=e),b._reactRetry&&b._reactRetry())}';
- var completeSegmentScript1Full = stringToPrecomputedChunk(completeSegmentFunction + ';$RS("');
- var completeSegmentScript1Partial = stringToPrecomputedChunk('$RS("');
- var completeSegmentScript2 = stringToPrecomputedChunk('","');
- var completeSegmentScript3 = stringToPrecomputedChunk('")</script>');
- function writeCompletedSegmentInstruction(destination, responseState, contentSegmentID) {
- writeChunk(destination, responseState.startInlineScript);
- if (!responseState.sentCompleteSegmentFunction) {
- // The first time we write this, we'll need to include the full implementation.
- responseState.sentCompleteSegmentFunction = true;
- writeChunk(destination, completeSegmentScript1Full);
- } else {
- // Future calls can just reuse the same function.
- writeChunk(destination, completeSegmentScript1Partial);
- }
- writeChunk(destination, responseState.segmentPrefix);
- var formattedID = stringToChunk(contentSegmentID.toString(16));
- writeChunk(destination, formattedID);
- writeChunk(destination, completeSegmentScript2);
- writeChunk(destination, responseState.placeholderPrefix);
- writeChunk(destination, formattedID);
- return writeChunkAndReturn(destination, completeSegmentScript3);
- }
- var completeBoundaryScript1Full = stringToPrecomputedChunk(completeBoundaryFunction + ';$RC("');
- var completeBoundaryScript1Partial = stringToPrecomputedChunk('$RC("');
- var completeBoundaryScript2 = stringToPrecomputedChunk('","');
- var completeBoundaryScript3 = stringToPrecomputedChunk('")</script>');
- function writeCompletedBoundaryInstruction(destination, responseState, boundaryID, contentSegmentID) {
- writeChunk(destination, responseState.startInlineScript);
- if (!responseState.sentCompleteBoundaryFunction) {
- // The first time we write this, we'll need to include the full implementation.
- responseState.sentCompleteBoundaryFunction = true;
- writeChunk(destination, completeBoundaryScript1Full);
- } else {
- // Future calls can just reuse the same function.
- writeChunk(destination, completeBoundaryScript1Partial);
- }
- if (boundaryID === null) {
- throw new Error('An ID must have been assigned before we can complete the boundary.');
- }
- var formattedContentID = stringToChunk(contentSegmentID.toString(16));
- writeChunk(destination, boundaryID);
- writeChunk(destination, completeBoundaryScript2);
- writeChunk(destination, responseState.segmentPrefix);
- writeChunk(destination, formattedContentID);
- return writeChunkAndReturn(destination, completeBoundaryScript3);
- }
- var clientRenderScript1Full = stringToPrecomputedChunk(clientRenderFunction + ';$RX("');
- var clientRenderScript1Partial = stringToPrecomputedChunk('$RX("');
- var clientRenderScript1A = stringToPrecomputedChunk('"');
- var clientRenderScript2 = stringToPrecomputedChunk(')</script>');
- var clientRenderErrorScriptArgInterstitial = stringToPrecomputedChunk(',');
- function writeClientRenderBoundaryInstruction(destination, responseState, boundaryID, errorDigest, errorMessage, errorComponentStack) {
- writeChunk(destination, responseState.startInlineScript);
- if (!responseState.sentClientRenderFunction) {
- // The first time we write this, we'll need to include the full implementation.
- responseState.sentClientRenderFunction = true;
- writeChunk(destination, clientRenderScript1Full);
- } else {
- // Future calls can just reuse the same function.
- writeChunk(destination, clientRenderScript1Partial);
- }
- if (boundaryID === null) {
- throw new Error('An ID must have been assigned before we can complete the boundary.');
- }
- writeChunk(destination, boundaryID);
- writeChunk(destination, clientRenderScript1A);
- if (errorDigest || errorMessage || errorComponentStack) {
- writeChunk(destination, clientRenderErrorScriptArgInterstitial);
- writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorDigest || '')));
- }
- if (errorMessage || errorComponentStack) {
- writeChunk(destination, clientRenderErrorScriptArgInterstitial);
- writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorMessage || '')));
- }
- if (errorComponentStack) {
- writeChunk(destination, clientRenderErrorScriptArgInterstitial);
- writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorComponentStack)));
- }
- return writeChunkAndReturn(destination, clientRenderScript2);
- }
- var regexForJSStringsInScripts = /[<\u2028\u2029]/g;
- function escapeJSStringsForInstructionScripts(input) {
- var escaped = JSON.stringify(input);
- return escaped.replace(regexForJSStringsInScripts, function (match) {
- switch (match) {
- // santizing breaking out of strings and script tags
- case '<':
- return "\\u003c";
- case "\u2028":
- return "\\u2028";
- case "\u2029":
- return "\\u2029";
- default:
- {
- // eslint-disable-next-line react-internal/prod-error-codes
- throw new Error('escapeJSStringsForInstructionScripts encountered a match it does not know how to replace. this means the match regex and the replacement characters are no longer in sync. This is a bug in React');
- }
- }
- });
- }
- var assign = Object.assign;
- // ATTENTION
- // When adding new symbols to this file,
- // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
- // The Symbol used to tag the ReactElement-like types.
- var REACT_ELEMENT_TYPE = Symbol.for('react.element');
- var REACT_PORTAL_TYPE = Symbol.for('react.portal');
- var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
- var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
- var REACT_PROFILER_TYPE = Symbol.for('react.profiler');
- var REACT_PROVIDER_TYPE = Symbol.for('react.provider');
- var REACT_CONTEXT_TYPE = Symbol.for('react.context');
- var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
- var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
- var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
- var REACT_MEMO_TYPE = Symbol.for('react.memo');
- var REACT_LAZY_TYPE = Symbol.for('react.lazy');
- var REACT_SCOPE_TYPE = Symbol.for('react.scope');
- var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for('react.debug_trace_mode');
- var REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden');
- var REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED = Symbol.for('react.default_value');
- var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
- var FAUX_ITERATOR_SYMBOL = '@@iterator';
- function getIteratorFn(maybeIterable) {
- if (maybeIterable === null || typeof maybeIterable !== 'object') {
- return null;
- }
- var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
- if (typeof maybeIterator === 'function') {
- return maybeIterator;
- }
- return null;
- }
- function getWrappedName(outerType, innerType, wrapperName) {
- var displayName = outerType.displayName;
- if (displayName) {
- return displayName;
- }
- var functionName = innerType.displayName || innerType.name || '';
- return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName;
- } // Keep in sync with react-reconciler/getComponentNameFromFiber
- function getContextName(type) {
- return type.displayName || 'Context';
- } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.
- function getComponentNameFromType(type) {
- if (type == null) {
- // Host root, text node or just invalid type.
- return null;
- }
- {
- if (typeof type.tag === 'number') {
- error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');
- }
- }
- if (typeof type === 'function') {
- return type.displayName || type.name || null;
- }
- if (typeof type === 'string') {
- return type;
- }
- switch (type) {
- case REACT_FRAGMENT_TYPE:
- return 'Fragment';
- case REACT_PORTAL_TYPE:
- return 'Portal';
- case REACT_PROFILER_TYPE:
- return 'Profiler';
- case REACT_STRICT_MODE_TYPE:
- return 'StrictMode';
- case REACT_SUSPENSE_TYPE:
- return 'Suspense';
- case REACT_SUSPENSE_LIST_TYPE:
- return 'SuspenseList';
- }
- if (typeof type === 'object') {
- switch (type.$$typeof) {
- case REACT_CONTEXT_TYPE:
- var context = type;
- return getContextName(context) + '.Consumer';
- case REACT_PROVIDER_TYPE:
- var provider = type;
- return getContextName(provider._context) + '.Provider';
- case REACT_FORWARD_REF_TYPE:
- return getWrappedName(type, type.render, 'ForwardRef');
- case REACT_MEMO_TYPE:
- var outerName = type.displayName || null;
- if (outerName !== null) {
- return outerName;
- }
- return getComponentNameFromType(type.type) || 'Memo';
- case REACT_LAZY_TYPE:
- {
- var lazyComponent = type;
- var payload = lazyComponent._payload;
- var init = lazyComponent._init;
- try {
- return getComponentNameFromType(init(payload));
- } catch (x) {
- return null;
- }
- }
- // eslint-disable-next-line no-fallthrough
- }
- }
- return null;
- }
- // Helpers to patch console.logs to avoid logging during side-effect free
- // replaying on render function. This currently only patches the object
- // lazily which won't cover if the log function was extracted eagerly.
- // We could also eagerly patch the method.
- var disabledDepth = 0;
- var prevLog;
- var prevInfo;
- var prevWarn;
- var prevError;
- var prevGroup;
- var prevGroupCollapsed;
- var prevGroupEnd;
- function disabledLog() {}
- disabledLog.__reactDisabledLog = true;
- function disableLogs() {
- {
- if (disabledDepth === 0) {
- /* eslint-disable react-internal/no-production-logging */
- prevLog = console.log;
- prevInfo = console.info;
- prevWarn = console.warn;
- prevError = console.error;
- prevGroup = console.group;
- prevGroupCollapsed = console.groupCollapsed;
- prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099
- var props = {
- configurable: true,
- enumerable: true,
- value: disabledLog,
- writable: true
- }; // $FlowFixMe Flow thinks console is immutable.
- Object.defineProperties(console, {
- info: props,
- log: props,
- warn: props,
- error: props,
- group: props,
- groupCollapsed: props,
- groupEnd: props
- });
- /* eslint-enable react-internal/no-production-logging */
- }
- disabledDepth++;
- }
- }
- function reenableLogs() {
- {
- disabledDepth--;
- if (disabledDepth === 0) {
- /* eslint-disable react-internal/no-production-logging */
- var props = {
- configurable: true,
- enumerable: true,
- writable: true
- }; // $FlowFixMe Flow thinks console is immutable.
- Object.defineProperties(console, {
- log: assign({}, props, {
- value: prevLog
- }),
- info: assign({}, props, {
- value: prevInfo
- }),
- warn: assign({}, props, {
- value: prevWarn
- }),
- error: assign({}, props, {
- value: prevError
- }),
- group: assign({}, props, {
- value: prevGroup
- }),
- groupCollapsed: assign({}, props, {
- value: prevGroupCollapsed
- }),
- groupEnd: assign({}, props, {
- value: prevGroupEnd
- })
- });
- /* eslint-enable react-internal/no-production-logging */
- }
- if (disabledDepth < 0) {
- error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');
- }
- }
- }
- var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
- var prefix;
- function describeBuiltInComponentFrame(name, source, ownerFn) {
- {
- if (prefix === undefined) {
- // Extract the VM specific prefix used by each line.
- try {
- throw Error();
- } catch (x) {
- var match = x.stack.trim().match(/\n( *(at )?)/);
- prefix = match && match[1] || '';
- }
- } // We use the prefix to ensure our stacks line up with native stack frames.
- return '\n' + prefix + name;
- }
- }
- var reentry = false;
- var componentFrameCache;
- {
- var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
- componentFrameCache = new PossiblyWeakMap();
- }
- function describeNativeComponentFrame(fn, construct) {
- // If something asked for a stack inside a fake render, it should get ignored.
- if ( !fn || reentry) {
- return '';
- }
- {
- var frame = componentFrameCache.get(fn);
- if (frame !== undefined) {
- return frame;
- }
- }
- var control;
- reentry = true;
- var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.
- Error.prepareStackTrace = undefined;
- var previousDispatcher;
- {
- previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function
- // for warnings.
- ReactCurrentDispatcher.current = null;
- disableLogs();
- }
- try {
- // This should throw.
- if (construct) {
- // Something should be setting the props in the constructor.
- var Fake = function () {
- throw Error();
- }; // $FlowFixMe
- Object.defineProperty(Fake.prototype, 'props', {
- set: function () {
- // We use a throwing setter instead of frozen or non-writable props
- // because that won't throw in a non-strict mode function.
- throw Error();
- }
- });
- if (typeof Reflect === 'object' && Reflect.construct) {
- // We construct a different control for this case to include any extra
- // frames added by the construct call.
- try {
- Reflect.construct(Fake, []);
- } catch (x) {
- control = x;
- }
- Reflect.construct(fn, [], Fake);
- } else {
- try {
- Fake.call();
- } catch (x) {
- control = x;
- }
- fn.call(Fake.prototype);
- }
- } else {
- try {
- throw Error();
- } catch (x) {
- control = x;
- }
- fn();
- }
- } catch (sample) {
- // This is inlined manually because closure doesn't do it for us.
- if (sample && control && typeof sample.stack === 'string') {
- // This extracts the first frame from the sample that isn't also in the control.
- // Skipping one frame that we assume is the frame that calls the two.
- var sampleLines = sample.stack.split('\n');
- var controlLines = control.stack.split('\n');
- var s = sampleLines.length - 1;
- var c = controlLines.length - 1;
- while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
- // We expect at least one stack frame to be shared.
- // Typically this will be the root most one. However, stack frames may be
- // cut off due to maximum stack limits. In this case, one maybe cut off
- // earlier than the other. We assume that the sample is longer or the same
- // and there for cut off earlier. So we should find the root most frame in
- // the sample somewhere in the control.
- c--;
- }
- for (; s >= 1 && c >= 0; s--, c--) {
- // Next we find the first one that isn't the same which should be the
- // frame that called our sample function and the control.
- if (sampleLines[s] !== controlLines[c]) {
- // In V8, the first line is describing the message but other VMs don't.
- // If we're about to return the first line, and the control is also on the same
- // line, that's a pretty good indicator that our sample threw at same line as
- // the control. I.e. before we entered the sample frame. So we ignore this result.
- // This can happen if you passed a class to function component, or non-function.
- if (s !== 1 || c !== 1) {
- do {
- s--;
- c--; // We may still have similar intermediate frames from the construct call.
- // The next one that isn't the same should be our match though.
- if (c < 0 || sampleLines[s] !== controlLines[c]) {
- // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier.
- var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "<anonymous>"
- // but we have a user-provided "displayName"
- // splice it in to make the stack more readable.
- if (fn.displayName && _frame.includes('<anonymous>')) {
- _frame = _frame.replace('<anonymous>', fn.displayName);
- }
- {
- if (typeof fn === 'function') {
- componentFrameCache.set(fn, _frame);
- }
- } // Return the line we found.
- return _frame;
- }
- } while (s >= 1 && c >= 0);
- }
- break;
- }
- }
- }
- } finally {
- reentry = false;
- {
- ReactCurrentDispatcher.current = previousDispatcher;
- reenableLogs();
- }
- Error.prepareStackTrace = previousPrepareStackTrace;
- } // Fallback to just using the name if we couldn't make it throw.
- var name = fn ? fn.displayName || fn.name : '';
- var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';
- {
- if (typeof fn === 'function') {
- componentFrameCache.set(fn, syntheticFrame);
- }
- }
- return syntheticFrame;
- }
- function describeClassComponentFrame(ctor, source, ownerFn) {
- {
- return describeNativeComponentFrame(ctor, true);
- }
- }
- function describeFunctionComponentFrame(fn, source, ownerFn) {
- {
- return describeNativeComponentFrame(fn, false);
- }
- }
- function shouldConstruct(Component) {
- var prototype = Component.prototype;
- return !!(prototype && prototype.isReactComponent);
- }
- function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
- if (type == null) {
- return '';
- }
- if (typeof type === 'function') {
- {
- return describeNativeComponentFrame(type, shouldConstruct(type));
- }
- }
- if (typeof type === 'string') {
- return describeBuiltInComponentFrame(type);
- }
- switch (type) {
- case REACT_SUSPENSE_TYPE:
- return describeBuiltInComponentFrame('Suspense');
- case REACT_SUSPENSE_LIST_TYPE:
- return describeBuiltInComponentFrame('SuspenseList');
- }
- if (typeof type === 'object') {
- switch (type.$$typeof) {
- case REACT_FORWARD_REF_TYPE:
- return describeFunctionComponentFrame(type.render);
- case REACT_MEMO_TYPE:
- // Memo may contain any component type so we recursively resolve it.
- return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
- case REACT_LAZY_TYPE:
- {
- var lazyComponent = type;
- var payload = lazyComponent._payload;
- var init = lazyComponent._init;
- try {
- // Lazy may contain any component type so we recursively resolve it.
- return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
- } catch (x) {}
- }
- }
- }
- return '';
- }
- var loggedTypeFailures = {};
- var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
- function setCurrentlyValidatingElement(element) {
- {
- if (element) {
- var owner = element._owner;
- var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
- ReactDebugCurrentFrame.setExtraStackFrame(stack);
- } else {
- ReactDebugCurrentFrame.setExtraStackFrame(null);
- }
- }
- }
- function checkPropTypes(typeSpecs, values, location, componentName, element) {
- {
- // $FlowFixMe This is okay but Flow doesn't know it.
- var has = Function.call.bind(hasOwnProperty);
- for (var typeSpecName in typeSpecs) {
- if (has(typeSpecs, typeSpecName)) {
- var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
- // fail the render phase where it didn't fail before. So we log it.
- // After these have been cleaned up, we'll let them throw.
- try {
- // This is intentionally an invariant that gets caught. It's the same
- // behavior as without this statement except with a better message.
- if (typeof typeSpecs[typeSpecName] !== 'function') {
- // eslint-disable-next-line react-internal/prod-error-codes
- var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
- err.name = 'Invariant Violation';
- throw err;
- }
- error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
- } catch (ex) {
- error$1 = ex;
- }
- if (error$1 && !(error$1 instanceof Error)) {
- setCurrentlyValidatingElement(element);
- error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
- setCurrentlyValidatingElement(null);
- }
- if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
- // Only monitor this failure once because there tends to be a lot of the
- // same error.
- loggedTypeFailures[error$1.message] = true;
- setCurrentlyValidatingElement(element);
- error('Failed %s type: %s', location, error$1.message);
- setCurrentlyValidatingElement(null);
- }
- }
- }
- }
- }
- var warnedAboutMissingGetChildContext;
- {
- warnedAboutMissingGetChildContext = {};
- }
- var emptyContextObject = {};
- {
- Object.freeze(emptyContextObject);
- }
- function getMaskedContext(type, unmaskedContext) {
- {
- var contextTypes = type.contextTypes;
- if (!contextTypes) {
- return emptyContextObject;
- }
- var context = {};
- for (var key in contextTypes) {
- context[key] = unmaskedContext[key];
- }
- {
- var name = getComponentNameFromType(type) || 'Unknown';
- checkPropTypes(contextTypes, context, 'context', name);
- }
- return context;
- }
- }
- function processChildContext(instance, type, parentContext, childContextTypes) {
- {
- // TODO (bvaughn) Replace this behavior with an invariant() in the future.
- // It has only been added in Fiber to match the (unintentional) behavior in Stack.
- if (typeof instance.getChildContext !== 'function') {
- {
- var componentName = getComponentNameFromType(type) || 'Unknown';
- if (!warnedAboutMissingGetChildContext[componentName]) {
- warnedAboutMissingGetChildContext[componentName] = true;
- error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);
- }
- }
- return parentContext;
- }
- var childContext = instance.getChildContext();
- for (var contextKey in childContext) {
- if (!(contextKey in childContextTypes)) {
- throw new Error((getComponentNameFromType(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes.");
- }
- }
- {
- var name = getComponentNameFromType(type) || 'Unknown';
- checkPropTypes(childContextTypes, childContext, 'child context', name);
- }
- return assign({}, parentContext, childContext);
- }
- }
- var rendererSigil;
- {
- // Use this to detect multiple renderers using the same context
- rendererSigil = {};
- } // Used to store the parent path of all context overrides in a shared linked list.
- // Forming a reverse tree.
- var rootContextSnapshot = null; // We assume that this runtime owns the "current" field on all ReactContext instances.
- // This global (actually thread local) state represents what state all those "current",
- // fields are currently in.
- var currentActiveSnapshot = null;
- function popNode(prev) {
- {
- prev.context._currentValue = prev.parentValue;
- }
- }
- function pushNode(next) {
- {
- next.context._currentValue = next.value;
- }
- }
- function popToNearestCommonAncestor(prev, next) {
- if (prev === next) ; else {
- popNode(prev);
- var parentPrev = prev.parent;
- var parentNext = next.parent;
- if (parentPrev === null) {
- if (parentNext !== null) {
- throw new Error('The stacks must reach the root at the same time. This is a bug in React.');
- }
- } else {
- if (parentNext === null) {
- throw new Error('The stacks must reach the root at the same time. This is a bug in React.');
- }
- popToNearestCommonAncestor(parentPrev, parentNext);
- } // On the way back, we push the new ones that weren't common.
- pushNode(next);
- }
- }
- function popAllPrevious(prev) {
- popNode(prev);
- var parentPrev = prev.parent;
- if (parentPrev !== null) {
- popAllPrevious(parentPrev);
- }
- }
- function pushAllNext(next) {
- var parentNext = next.parent;
- if (parentNext !== null) {
- pushAllNext(parentNext);
- }
- pushNode(next);
- }
- function popPreviousToCommonLevel(prev, next) {
- popNode(prev);
- var parentPrev = prev.parent;
- if (parentPrev === null) {
- throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.');
- }
- if (parentPrev.depth === next.depth) {
- // We found the same level. Now we just need to find a shared ancestor.
- popToNearestCommonAncestor(parentPrev, next);
- } else {
- // We must still be deeper.
- popPreviousToCommonLevel(parentPrev, next);
- }
- }
- function popNextToCommonLevel(prev, next) {
- var parentNext = next.parent;
- if (parentNext === null) {
- throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.');
- }
- if (prev.depth === parentNext.depth) {
- // We found the same level. Now we just need to find a shared ancestor.
- popToNearestCommonAncestor(prev, parentNext);
- } else {
- // We must still be deeper.
- popNextToCommonLevel(prev, parentNext);
- }
- pushNode(next);
- } // Perform context switching to the new snapshot.
- // To make it cheap to read many contexts, while not suspending, we make the switch eagerly by
- // updating all the context's current values. That way reads, always just read the current value.
- // At the cost of updating contexts even if they're never read by this subtree.
- function switchContext(newSnapshot) {
- // The basic algorithm we need to do is to pop back any contexts that are no longer on the stack.
- // We also need to update any new contexts that are now on the stack with the deepest value.
- // The easiest way to update new contexts is to just reapply them in reverse order from the
- // perspective of the backpointers. To avoid allocating a lot when switching, we use the stack
- // for that. Therefore this algorithm is recursive.
- // 1) First we pop which ever snapshot tree was deepest. Popping old contexts as we go.
- // 2) Then we find the nearest common ancestor from there. Popping old contexts as we go.
- // 3) Then we reapply new contexts on the way back up the stack.
- var prev = currentActiveSnapshot;
- var next = newSnapshot;
- if (prev !== next) {
- if (prev === null) {
- // $FlowFixMe: This has to be non-null since it's not equal to prev.
- pushAllNext(next);
- } else if (next === null) {
- popAllPrevious(prev);
- } else if (prev.depth === next.depth) {
- popToNearestCommonAncestor(prev, next);
- } else if (prev.depth > next.depth) {
- popPreviousToCommonLevel(prev, next);
- } else {
- popNextToCommonLevel(prev, next);
- }
- currentActiveSnapshot = next;
- }
- }
- function pushProvider(context, nextValue) {
- var prevValue;
- {
- prevValue = context._currentValue;
- context._currentValue = nextValue;
- {
- if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {
- error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
- }
- context._currentRenderer = rendererSigil;
- }
- }
- var prevNode = currentActiveSnapshot;
- var newNode = {
- parent: prevNode,
- depth: prevNode === null ? 0 : prevNode.depth + 1,
- context: context,
- parentValue: prevValue,
- value: nextValue
- };
- currentActiveSnapshot = newNode;
- return newNode;
- }
- function popProvider(context) {
- var prevSnapshot = currentActiveSnapshot;
- if (prevSnapshot === null) {
- throw new Error('Tried to pop a Context at the root of the app. This is a bug in React.');
- }
- {
- if (prevSnapshot.context !== context) {
- error('The parent context is not the expected context. This is probably a bug in React.');
- }
- }
- {
- var value = prevSnapshot.parentValue;
- if (value === REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED) {
- prevSnapshot.context._currentValue = prevSnapshot.context._defaultValue;
- } else {
- prevSnapshot.context._currentValue = value;
- }
- {
- if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {
- error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
- }
- context._currentRenderer = rendererSigil;
- }
- }
- return currentActiveSnapshot = prevSnapshot.parent;
- }
- function getActiveContext() {
- return currentActiveSnapshot;
- }
- function readContext(context) {
- var value = context._currentValue ;
- return value;
- }
- /**
- * `ReactInstanceMap` maintains a mapping from a public facing stateful
- * instance (key) and the internal representation (value). This allows public
- * methods to accept the user facing instance as an argument and map them back
- * to internal methods.
- *
- * Note that this module is currently shared and assumed to be stateless.
- * If this becomes an actual Map, that will break.
- */
- function get(key) {
- return key._reactInternals;
- }
- function set(key, value) {
- key._reactInternals = value;
- }
- var didWarnAboutNoopUpdateForComponent = {};
- var didWarnAboutDeprecatedWillMount = {};
- var didWarnAboutUninitializedState;
- var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
- var didWarnAboutLegacyLifecyclesAndDerivedState;
- var didWarnAboutUndefinedDerivedState;
- var warnOnUndefinedDerivedState;
- var warnOnInvalidCallback;
- var didWarnAboutDirectlyAssigningPropsToState;
- var didWarnAboutContextTypeAndContextTypes;
- var didWarnAboutInvalidateContextType;
- {
- didWarnAboutUninitializedState = new Set();
- didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
- didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
- didWarnAboutDirectlyAssigningPropsToState = new Set();
- didWarnAboutUndefinedDerivedState = new Set();
- didWarnAboutContextTypeAndContextTypes = new Set();
- didWarnAboutInvalidateContextType = new Set();
- var didWarnOnInvalidCallback = new Set();
- warnOnInvalidCallback = function (callback, callerName) {
- if (callback === null || typeof callback === 'function') {
- return;
- }
- var key = callerName + '_' + callback;
- if (!didWarnOnInvalidCallback.has(key)) {
- didWarnOnInvalidCallback.add(key);
- error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
- }
- };
- warnOnUndefinedDerivedState = function (type, partialState) {
- if (partialState === undefined) {
- var componentName = getComponentNameFromType(type) || 'Component';
- if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
- didWarnAboutUndefinedDerivedState.add(componentName);
- error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
- }
- }
- };
- }
- function warnNoop(publicInstance, callerName) {
- {
- var _constructor = publicInstance.constructor;
- var componentName = _constructor && getComponentNameFromType(_constructor) || 'ReactClass';
- var warningKey = componentName + '.' + callerName;
- if (didWarnAboutNoopUpdateForComponent[warningKey]) {
- return;
- }
- error('%s(...): Can only update a mounting component. ' + 'This usually means you called %s() outside componentWillMount() on the server. ' + 'This is a no-op.\n\nPlease check the code for the %s component.', callerName, callerName, componentName);
- didWarnAboutNoopUpdateForComponent[warningKey] = true;
- }
- }
- var classComponentUpdater = {
- isMounted: function (inst) {
- return false;
- },
- enqueueSetState: function (inst, payload, callback) {
- var internals = get(inst);
- if (internals.queue === null) {
- warnNoop(inst, 'setState');
- } else {
- internals.queue.push(payload);
- {
- if (callback !== undefined && callback !== null) {
- warnOnInvalidCallback(callback, 'setState');
- }
- }
- }
- },
- enqueueReplaceState: function (inst, payload, callback) {
- var internals = get(inst);
- internals.replace = true;
- internals.queue = [payload];
- {
- if (callback !== undefined && callback !== null) {
- warnOnInvalidCallback(callback, 'setState');
- }
- }
- },
- enqueueForceUpdate: function (inst, callback) {
- var internals = get(inst);
- if (internals.queue === null) {
- warnNoop(inst, 'forceUpdate');
- } else {
- {
- if (callback !== undefined && callback !== null) {
- warnOnInvalidCallback(callback, 'setState');
- }
- }
- }
- }
- };
- function applyDerivedStateFromProps(instance, ctor, getDerivedStateFromProps, prevState, nextProps) {
- var partialState = getDerivedStateFromProps(nextProps, prevState);
- {
- warnOnUndefinedDerivedState(ctor, partialState);
- } // Merge the partial state and the previous state.
- var newState = partialState === null || partialState === undefined ? prevState : assign({}, prevState, partialState);
- return newState;
- }
- function constructClassInstance(ctor, props, maskedLegacyContext) {
- var context = emptyContextObject;
- var contextType = ctor.contextType;
- {
- if ('contextType' in ctor) {
- var isValid = // Allow null for conditional declaration
- contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
- if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
- didWarnAboutInvalidateContextType.add(ctor);
- var addendum = '';
- if (contextType === undefined) {
- addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';
- } else if (typeof contextType !== 'object') {
- addendum = ' However, it is set to a ' + typeof contextType + '.';
- } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
- addendum = ' Did you accidentally pass the Context.Provider instead?';
- } else if (contextType._context !== undefined) {
- // <Context.Consumer>
- addendum = ' Did you accidentally pass the Context.Consumer instead?';
- } else {
- addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
- }
- error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentNameFromType(ctor) || 'Component', addendum);
- }
- }
- }
- if (typeof contextType === 'object' && contextType !== null) {
- context = readContext(contextType);
- } else {
- context = maskedLegacyContext;
- }
- var instance = new ctor(props, context);
- {
- if (typeof ctor.getDerivedStateFromProps === 'function' && (instance.state === null || instance.state === undefined)) {
- var componentName = getComponentNameFromType(ctor) || 'Component';
- if (!didWarnAboutUninitializedState.has(componentName)) {
- didWarnAboutUninitializedState.add(componentName);
- error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);
- }
- } // If new component APIs are defined, "unsafe" lifecycles won't be called.
- // Warn about these lifecycles if they are present.
- // Don't warn about react-lifecycles-compat polyfilled methods though.
- if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
- var foundWillMountName = null;
- var foundWillReceivePropsName = null;
- var foundWillUpdateName = null;
- if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
- foundWillMountName = 'componentWillMount';
- } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
- foundWillMountName = 'UNSAFE_componentWillMount';
- }
- if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
- foundWillReceivePropsName = 'componentWillReceiveProps';
- } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
- foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
- }
- if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
- foundWillUpdateName = 'componentWillUpdate';
- } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
- foundWillUpdateName = 'UNSAFE_componentWillUpdate';
- }
- if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
- var _componentName = getComponentNameFromType(ctor) || 'Component';
- var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
- if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
- didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
- error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://reactjs.org/link/unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n " + foundWillUpdateName : '');
- }
- }
- }
- }
- return instance;
- }
- function checkClassInstance(instance, ctor, newProps) {
- {
- var name = getComponentNameFromType(ctor) || 'Component';
- var renderPresent = instance.render;
- if (!renderPresent) {
- if (ctor.prototype && typeof ctor.prototype.render === 'function') {
- error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
- } else {
- error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
- }
- }
- if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {
- error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);
- }
- if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {
- error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);
- }
- if (instance.propTypes) {
- error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);
- }
- if (instance.contextType) {
- error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);
- }
- {
- if (instance.contextTypes) {
- error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);
- }
- if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
- didWarnAboutContextTypeAndContextTypes.add(ctor);
- error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
- }
- }
- if (typeof instance.componentShouldUpdate === 'function') {
- error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);
- }
- if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
- error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentNameFromType(ctor) || 'A pure component');
- }
- if (typeof instance.componentDidUnmount === 'function') {
- error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);
- }
- if (typeof instance.componentDidReceiveProps === 'function') {
- error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);
- }
- if (typeof instance.componentWillRecieveProps === 'function') {
- error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);
- }
- if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {
- error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);
- }
- var hasMutatedProps = instance.props !== newProps;
- if (instance.props !== undefined && hasMutatedProps) {
- error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name);
- }
- if (instance.defaultProps) {
- error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);
- }
- if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
- didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
- error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentNameFromType(ctor));
- }
- if (typeof instance.getDerivedStateFromProps === 'function') {
- error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
- }
- if (typeof instance.getDerivedStateFromError === 'function') {
- error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
- }
- if (typeof ctor.getSnapshotBeforeUpdate === 'function') {
- error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);
- }
- var _state = instance.state;
- if (_state && (typeof _state !== 'object' || isArray(_state))) {
- error('%s.state: must be set to an object or null', name);
- }
- if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {
- error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);
- }
- }
- }
- function callComponentWillMount(type, instance) {
- var oldState = instance.state;
- if (typeof instance.componentWillMount === 'function') {
- {
- if ( instance.componentWillMount.__suppressDeprecationWarning !== true) {
- var componentName = getComponentNameFromType(type) || 'Unknown';
- if (!didWarnAboutDeprecatedWillMount[componentName]) {
- warn( // keep this warning in sync with ReactStrictModeWarning.js
- 'componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code from componentWillMount to componentDidMount (preferred in most cases) ' + 'or the constructor.\n' + '\nPlease update the following components: %s', componentName);
- didWarnAboutDeprecatedWillMount[componentName] = true;
- }
- }
- }
- instance.componentWillMount();
- }
- if (typeof instance.UNSAFE_componentWillMount === 'function') {
- instance.UNSAFE_componentWillMount();
- }
- if (oldState !== instance.state) {
- {
- error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentNameFromType(type) || 'Component');
- }
- classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
- }
- }
- function processUpdateQueue(internalInstance, inst, props, maskedLegacyContext) {
- if (internalInstance.queue !== null && internalInstance.queue.length > 0) {
- var oldQueue = internalInstance.queue;
- var oldReplace = internalInstance.replace;
- internalInstance.queue = null;
- internalInstance.replace = false;
- if (oldReplace && oldQueue.length === 1) {
- inst.state = oldQueue[0];
- } else {
- var nextState = oldReplace ? oldQueue[0] : inst.state;
- var dontMutate = true;
- for (var i = oldReplace ? 1 : 0; i < oldQueue.length; i++) {
- var partial = oldQueue[i];
- var partialState = typeof partial === 'function' ? partial.call(inst, nextState, props, maskedLegacyContext) : partial;
- if (partialState != null) {
- if (dontMutate) {
- dontMutate = false;
- nextState = assign({}, nextState, partialState);
- } else {
- assign(nextState, partialState);
- }
- }
- }
- inst.state = nextState;
- }
- } else {
- internalInstance.queue = null;
- }
- } // Invokes the mount life-cycles on a previously never rendered instance.
- function mountClassInstance(instance, ctor, newProps, maskedLegacyContext) {
- {
- checkClassInstance(instance, ctor, newProps);
- }
- var initialState = instance.state !== undefined ? instance.state : null;
- instance.updater = classComponentUpdater;
- instance.props = newProps;
- instance.state = initialState; // We don't bother initializing the refs object on the server, since we're not going to resolve them anyway.
- // The internal instance will be used to manage updates that happen during this mount.
- var internalInstance = {
- queue: [],
- replace: false
- };
- set(instance, internalInstance);
- var contextType = ctor.contextType;
- if (typeof contextType === 'object' && contextType !== null) {
- instance.context = readContext(contextType);
- } else {
- instance.context = maskedLegacyContext;
- }
- {
- if (instance.state === newProps) {
- var componentName = getComponentNameFromType(ctor) || 'Component';
- if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
- didWarnAboutDirectlyAssigningPropsToState.add(componentName);
- error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName);
- }
- }
- }
- var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
- if (typeof getDerivedStateFromProps === 'function') {
- instance.state = applyDerivedStateFromProps(instance, ctor, getDerivedStateFromProps, initialState, newProps);
- } // In order to support react-lifecycles-compat polyfilled components,
- // Unsafe lifecycles should not be invoked for components using the new APIs.
- if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
- callComponentWillMount(ctor, instance); // If we had additional state updates during this life-cycle, let's
- // process them now.
- processUpdateQueue(internalInstance, instance, newProps, maskedLegacyContext);
- }
- }
- // Ids are base 32 strings whose binary representation corresponds to the
- // position of a node in a tree.
- // Every time the tree forks into multiple children, we add additional bits to
- // the left of the sequence that represent the position of the child within the
- // current level of children.
- //
- // 00101 00010001011010101
- // ╰─┬─╯ ╰───────┬───────╯
- // Fork 5 of 20 Parent id
- //
- // The leading 0s are important. In the above example, you only need 3 bits to
- // represent slot 5. However, you need 5 bits to represent all the forks at
- // the current level, so we must account for the empty bits at the end.
- //
- // For this same reason, slots are 1-indexed instead of 0-indexed. Otherwise,
- // the zeroth id at a level would be indistinguishable from its parent.
- //
- // If a node has only one child, and does not materialize an id (i.e. does not
- // contain a useId hook), then we don't need to allocate any space in the
- // sequence. It's treated as a transparent indirection. For example, these two
- // trees produce the same ids:
- //
- // <> <>
- // <Indirection> <A />
- // <A /> <B />
- // </Indirection> </>
- // <B />
- // </>
- //
- // However, we cannot skip any node that materializes an id. Otherwise, a parent
- // id that does not fork would be indistinguishable from its child id. For
- // example, this tree does not fork, but the parent and child must have
- // different ids.
- //
- // <Parent>
- // <Child />
- // </Parent>
- //
- // To handle this scenario, every time we materialize an id, we allocate a
- // new level with a single slot. You can think of this as a fork with only one
- // prong, or an array of children with length 1.
- //
- // It's possible for the size of the sequence to exceed 32 bits, the max
- // size for bitwise operations. When this happens, we make more room by
- // converting the right part of the id to a string and storing it in an overflow
- // variable. We use a base 32 string representation, because 32 is the largest
- // power of 2 that is supported by toString(). We want the base to be large so
- // that the resulting ids are compact, and we want the base to be a power of 2
- // because every log2(base) bits corresponds to a single character, i.e. every
- // log2(32) = 5 bits. That means we can lop bits off the end 5 at a time without
- // affecting the final result.
- var emptyTreeContext = {
- id: 1,
- overflow: ''
- };
- function getTreeId(context) {
- var overflow = context.overflow;
- var idWithLeadingBit = context.id;
- var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit);
- return id.toString(32) + overflow;
- }
- function pushTreeContext(baseContext, totalChildren, index) {
- var baseIdWithLeadingBit = baseContext.id;
- var baseOverflow = baseContext.overflow; // The leftmost 1 marks the end of the sequence, non-inclusive. It's not part
- // of the id; we use it to account for leading 0s.
- var baseLength = getBitLength(baseIdWithLeadingBit) - 1;
- var baseId = baseIdWithLeadingBit & ~(1 << baseLength);
- var slot = index + 1;
- var length = getBitLength(totalChildren) + baseLength; // 30 is the max length we can store without overflowing, taking into
- // consideration the leading 1 we use to mark the end of the sequence.
- if (length > 30) {
- // We overflowed the bitwise-safe range. Fall back to slower algorithm.
- // This branch assumes the length of the base id is greater than 5; it won't
- // work for smaller ids, because you need 5 bits per character.
- //
- // We encode the id in multiple steps: first the base id, then the
- // remaining digits.
- //
- // Each 5 bit sequence corresponds to a single base 32 character. So for
- // example, if the current id is 23 bits long, we can convert 20 of those
- // bits into a string of 4 characters, with 3 bits left over.
- //
- // First calculate how many bits in the base id represent a complete
- // sequence of characters.
- var numberOfOverflowBits = baseLength - baseLength % 5; // Then create a bitmask that selects only those bits.
- var newOverflowBits = (1 << numberOfOverflowBits) - 1; // Select the bits, and convert them to a base 32 string.
- var newOverflow = (baseId & newOverflowBits).toString(32); // Now we can remove those bits from the base id.
- var restOfBaseId = baseId >> numberOfOverflowBits;
- var restOfBaseLength = baseLength - numberOfOverflowBits; // Finally, encode the rest of the bits using the normal algorithm. Because
- // we made more room, this time it won't overflow.
- var restOfLength = getBitLength(totalChildren) + restOfBaseLength;
- var restOfNewBits = slot << restOfBaseLength;
- var id = restOfNewBits | restOfBaseId;
- var overflow = newOverflow + baseOverflow;
- return {
- id: 1 << restOfLength | id,
- overflow: overflow
- };
- } else {
- // Normal path
- var newBits = slot << baseLength;
- var _id = newBits | baseId;
- var _overflow = baseOverflow;
- return {
- id: 1 << length | _id,
- overflow: _overflow
- };
- }
- }
- function getBitLength(number) {
- return 32 - clz32(number);
- }
- function getLeadingBit(id) {
- return 1 << getBitLength(id) - 1;
- } // TODO: Math.clz32 is supported in Node 12+. Maybe we can drop the fallback.
- var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros.
- // Based on:
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
- var log = Math.log;
- var LN2 = Math.LN2;
- function clz32Fallback(x) {
- var asUint = x >>> 0;
- if (asUint === 0) {
- return 32;
- }
- return 31 - (log(asUint) / LN2 | 0) | 0;
- }
- /**
- * inlined Object.is polyfill to avoid requiring consumers ship their own
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
- */
- function is(x, y) {
- return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
- ;
- }
- var objectIs = typeof Object.is === 'function' ? Object.is : is;
- var currentlyRenderingComponent = null;
- var currentlyRenderingTask = null;
- var firstWorkInProgressHook = null;
- var workInProgressHook = null; // Whether the work-in-progress hook is a re-rendered hook
- var isReRender = false; // Whether an update was scheduled during the currently executing render pass.
- var didScheduleRenderPhaseUpdate = false; // Counts the number of useId hooks in this component
- var localIdCounter = 0; // Lazily created map of render-phase updates
- var renderPhaseUpdates = null; // Counter to prevent infinite loops.
- var numberOfReRenders = 0;
- var RE_RENDER_LIMIT = 25;
- var isInHookUserCodeInDev = false; // In DEV, this is the name of the currently executing primitive hook
- var currentHookNameInDev;
- function resolveCurrentlyRenderingComponent() {
- if (currentlyRenderingComponent === null) {
- throw new Error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.');
- }
- {
- if (isInHookUserCodeInDev) {
- error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://reactjs.org/link/rules-of-hooks');
- }
- }
- return currentlyRenderingComponent;
- }
- function areHookInputsEqual(nextDeps, prevDeps) {
- if (prevDeps === null) {
- {
- error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);
- }
- return false;
- }
- {
- // Don't bother comparing lengths in prod because these arrays should be
- // passed inline.
- if (nextDeps.length !== prevDeps.length) {
- error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + nextDeps.join(', ') + "]", "[" + prevDeps.join(', ') + "]");
- }
- }
- for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
- if (objectIs(nextDeps[i], prevDeps[i])) {
- continue;
- }
- return false;
- }
- return true;
- }
- function createHook() {
- if (numberOfReRenders > 0) {
- throw new Error('Rendered more hooks than during the previous render');
- }
- return {
- memoizedState: null,
- queue: null,
- next: null
- };
- }
- function createWorkInProgressHook() {
- if (workInProgressHook === null) {
- // This is the first hook in the list
- if (firstWorkInProgressHook === null) {
- isReRender = false;
- firstWorkInProgressHook = workInProgressHook = createHook();
- } else {
- // There's already a work-in-progress. Reuse it.
- isReRender = true;
- workInProgressHook = firstWorkInProgressHook;
- }
- } else {
- if (workInProgressHook.next === null) {
- isReRender = false; // Append to the end of the list
- workInProgressHook = workInProgressHook.next = createHook();
- } else {
- // There's already a work-in-progress. Reuse it.
- isReRender = true;
- workInProgressHook = workInProgressHook.next;
- }
- }
- return workInProgressHook;
- }
- function prepareToUseHooks(task, componentIdentity) {
- currentlyRenderingComponent = componentIdentity;
- currentlyRenderingTask = task;
- {
- isInHookUserCodeInDev = false;
- } // The following should have already been reset
- // didScheduleRenderPhaseUpdate = false;
- // localIdCounter = 0;
- // firstWorkInProgressHook = null;
- // numberOfReRenders = 0;
- // renderPhaseUpdates = null;
- // workInProgressHook = null;
- localIdCounter = 0;
- }
- function finishHooks(Component, props, children, refOrContext) {
- // This must be called after every function component to prevent hooks from
- // being used in classes.
- while (didScheduleRenderPhaseUpdate) {
- // Updates were scheduled during the render phase. They are stored in
- // the `renderPhaseUpdates` map. Call the component again, reusing the
- // work-in-progress hooks and applying the additional updates on top. Keep
- // restarting until no more updates are scheduled.
- didScheduleRenderPhaseUpdate = false;
- localIdCounter = 0;
- numberOfReRenders += 1; // Start over from the beginning of the list
- workInProgressHook = null;
- children = Component(props, refOrContext);
- }
- resetHooksState();
- return children;
- }
- function checkDidRenderIdHook() {
- // This should be called immediately after every finishHooks call.
- // Conceptually, it's part of the return value of finishHooks; it's only a
- // separate function to avoid using an array tuple.
- var didRenderIdHook = localIdCounter !== 0;
- return didRenderIdHook;
- } // Reset the internal hooks state if an error occurs while rendering a component
- function resetHooksState() {
- {
- isInHookUserCodeInDev = false;
- }
- currentlyRenderingComponent = null;
- currentlyRenderingTask = null;
- didScheduleRenderPhaseUpdate = false;
- firstWorkInProgressHook = null;
- numberOfReRenders = 0;
- renderPhaseUpdates = null;
- workInProgressHook = null;
- }
- function readContext$1(context) {
- {
- if (isInHookUserCodeInDev) {
- error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
- }
- }
- return readContext(context);
- }
- function useContext(context) {
- {
- currentHookNameInDev = 'useContext';
- }
- resolveCurrentlyRenderingComponent();
- return readContext(context);
- }
- function basicStateReducer(state, action) {
- // $FlowFixMe: Flow doesn't like mixed types
- return typeof action === 'function' ? action(state) : action;
- }
- function useState(initialState) {
- {
- currentHookNameInDev = 'useState';
- }
- return useReducer(basicStateReducer, // useReducer has a special case to support lazy useState initializers
- initialState);
- }
- function useReducer(reducer, initialArg, init) {
- {
- if (reducer !== basicStateReducer) {
- currentHookNameInDev = 'useReducer';
- }
- }
- currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
- workInProgressHook = createWorkInProgressHook();
- if (isReRender) {
- // This is a re-render. Apply the new render phase updates to the previous
- // current hook.
- var queue = workInProgressHook.queue;
- var dispatch = queue.dispatch;
- if (renderPhaseUpdates !== null) {
- // Render phase updates are stored in a map of queue -> linked list
- var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
- if (firstRenderPhaseUpdate !== undefined) {
- renderPhaseUpdates.delete(queue);
- var newState = workInProgressHook.memoizedState;
- var update = firstRenderPhaseUpdate;
- do {
- // Process this render phase update. We don't have to check the
- // priority because it will always be the same as the current
- // render's.
- var action = update.action;
- {
- isInHookUserCodeInDev = true;
- }
- newState = reducer(newState, action);
- {
- isInHookUserCodeInDev = false;
- }
- update = update.next;
- } while (update !== null);
- workInProgressHook.memoizedState = newState;
- return [newState, dispatch];
- }
- }
- return [workInProgressHook.memoizedState, dispatch];
- } else {
- {
- isInHookUserCodeInDev = true;
- }
- var initialState;
- if (reducer === basicStateReducer) {
- // Special case for `useState`.
- initialState = typeof initialArg === 'function' ? initialArg() : initialArg;
- } else {
- initialState = init !== undefined ? init(initialArg) : initialArg;
- }
- {
- isInHookUserCodeInDev = false;
- }
- workInProgressHook.memoizedState = initialState;
- var _queue = workInProgressHook.queue = {
- last: null,
- dispatch: null
- };
- var _dispatch = _queue.dispatch = dispatchAction.bind(null, currentlyRenderingComponent, _queue);
- return [workInProgressHook.memoizedState, _dispatch];
- }
- }
- function useMemo(nextCreate, deps) {
- currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
- workInProgressHook = createWorkInProgressHook();
- var nextDeps = deps === undefined ? null : deps;
- if (workInProgressHook !== null) {
- var prevState = workInProgressHook.memoizedState;
- if (prevState !== null) {
- if (nextDeps !== null) {
- var prevDeps = prevState[1];
- if (areHookInputsEqual(nextDeps, prevDeps)) {
- return prevState[0];
- }
- }
- }
- }
- {
- isInHookUserCodeInDev = true;
- }
- var nextValue = nextCreate();
- {
- isInHookUserCodeInDev = false;
- }
- workInProgressHook.memoizedState = [nextValue, nextDeps];
- return nextValue;
- }
- function useRef(initialValue) {
- currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
- workInProgressHook = createWorkInProgressHook();
- var previousRef = workInProgressHook.memoizedState;
- if (previousRef === null) {
- var ref = {
- current: initialValue
- };
- {
- Object.seal(ref);
- }
- workInProgressHook.memoizedState = ref;
- return ref;
- } else {
- return previousRef;
- }
- }
- function useLayoutEffect(create, inputs) {
- {
- currentHookNameInDev = 'useLayoutEffect';
- error('useLayoutEffect does nothing on the server, because its effect cannot ' + "be encoded into the server renderer's output format. This will lead " + 'to a mismatch between the initial, non-hydrated UI and the intended ' + 'UI. To avoid this, useLayoutEffect should only be used in ' + 'components that render exclusively on the client. ' + 'See https://reactjs.org/link/uselayouteffect-ssr for common fixes.');
- }
- }
- function dispatchAction(componentIdentity, queue, action) {
- if (numberOfReRenders >= RE_RENDER_LIMIT) {
- throw new Error('Too many re-renders. React limits the number of renders to prevent ' + 'an infinite loop.');
- }
- if (componentIdentity === currentlyRenderingComponent) {
- // This is a render phase update. Stash it in a lazily-created map of
- // queue -> linked list of updates. After this render pass, we'll restart
- // and apply the stashed updates on top of the work-in-progress hook.
- didScheduleRenderPhaseUpdate = true;
- var update = {
- action: action,
- next: null
- };
- if (renderPhaseUpdates === null) {
- renderPhaseUpdates = new Map();
- }
- var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
- if (firstRenderPhaseUpdate === undefined) {
- renderPhaseUpdates.set(queue, update);
- } else {
- // Append the update to the end of the list.
- var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
- while (lastRenderPhaseUpdate.next !== null) {
- lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
- }
- lastRenderPhaseUpdate.next = update;
- }
- }
- }
- function useCallback(callback, deps) {
- return useMemo(function () {
- return callback;
- }, deps);
- } // TODO Decide on how to implement this hook for server rendering.
- // If a mutation occurs during render, consider triggering a Suspense boundary
- // and falling back to client rendering.
- function useMutableSource(source, getSnapshot, subscribe) {
- resolveCurrentlyRenderingComponent();
- return getSnapshot(source._source);
- }
- function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
- if (getServerSnapshot === undefined) {
- throw new Error('Missing getServerSnapshot, which is required for ' + 'server-rendered content. Will revert to client rendering.');
- }
- return getServerSnapshot();
- }
- function useDeferredValue(value) {
- resolveCurrentlyRenderingComponent();
- return value;
- }
- function unsupportedStartTransition() {
- throw new Error('startTransition cannot be called during server rendering.');
- }
- function useTransition() {
- resolveCurrentlyRenderingComponent();
- return [false, unsupportedStartTransition];
- }
- function useId() {
- var task = currentlyRenderingTask;
- var treeId = getTreeId(task.treeContext);
- var responseState = currentResponseState;
- if (responseState === null) {
- throw new Error('Invalid hook call. Hooks can only be called inside of the body of a function component.');
- }
- var localId = localIdCounter++;
- return makeId(responseState, treeId, localId);
- }
- function noop() {}
- var Dispatcher = {
- readContext: readContext$1,
- useContext: useContext,
- useMemo: useMemo,
- useReducer: useReducer,
- useRef: useRef,
- useState: useState,
- useInsertionEffect: noop,
- useLayoutEffect: useLayoutEffect,
- useCallback: useCallback,
- // useImperativeHandle is not run in the server environment
- useImperativeHandle: noop,
- // Effects are not run in the server environment.
- useEffect: noop,
- // Debugging effect
- useDebugValue: noop,
- useDeferredValue: useDeferredValue,
- useTransition: useTransition,
- useId: useId,
- // Subscriptions are not setup in a server environment.
- useMutableSource: useMutableSource,
- useSyncExternalStore: useSyncExternalStore
- };
- var currentResponseState = null;
- function setCurrentResponseState(responseState) {
- currentResponseState = responseState;
- }
- function getStackByComponentStackNode(componentStack) {
- try {
- var info = '';
- var node = componentStack;
- do {
- switch (node.tag) {
- case 0:
- info += describeBuiltInComponentFrame(node.type, null, null);
- break;
- case 1:
- info += describeFunctionComponentFrame(node.type, null, null);
- break;
- case 2:
- info += describeClassComponentFrame(node.type, null, null);
- break;
- }
- node = node.parent;
- } while (node);
- return info;
- } catch (x) {
- return '\nError generating stack: ' + x.message + '\n' + x.stack;
- }
- }
- var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
- var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
- var PENDING = 0;
- var COMPLETED = 1;
- var FLUSHED = 2;
- var ABORTED = 3;
- var ERRORED = 4;
- var OPEN = 0;
- var CLOSING = 1;
- var CLOSED = 2;
- // This is a default heuristic for how to split up the HTML content into progressive
- // loading. Our goal is to be able to display additional new content about every 500ms.
- // Faster than that is unnecessary and should be throttled on the client. It also
- // adds unnecessary overhead to do more splits. We don't know if it's a higher or lower
- // end device but higher end suffer less from the overhead than lower end does from
- // not getting small enough pieces. We error on the side of low end.
- // We base this on low end 3G speeds which is about 500kbits per second. We assume
- // that there can be a reasonable drop off from max bandwidth which leaves you with
- // as little as 80%. We can receive half of that each 500ms - at best. In practice,
- // a little bandwidth is lost to processing and contention - e.g. CSS and images that
- // are downloaded along with the main content. So we estimate about half of that to be
- // the lower end throughput. In other words, we expect that you can at least show
- // about 12.5kb of content per 500ms. Not counting starting latency for the first
- // paint.
- // 500 * 1024 / 8 * .8 * 0.5 / 2
- var DEFAULT_PROGRESSIVE_CHUNK_SIZE = 12800;
- function defaultErrorHandler(error) {
- console['error'](error); // Don't transform to our wrapper
- return null;
- }
- function noop$1() {}
- function createRequest(children, responseState, rootFormatContext, progressiveChunkSize, onError, onAllReady, onShellReady, onShellError, onFatalError) {
- var pingedTasks = [];
- var abortSet = new Set();
- var request = {
- destination: null,
- responseState: responseState,
- progressiveChunkSize: progressiveChunkSize === undefined ? DEFAULT_PROGRESSIVE_CHUNK_SIZE : progressiveChunkSize,
- status: OPEN,
- fatalError: null,
- nextSegmentId: 0,
- allPendingTasks: 0,
- pendingRootTasks: 0,
- completedRootSegment: null,
- abortableTasks: abortSet,
- pingedTasks: pingedTasks,
- clientRenderedBoundaries: [],
- completedBoundaries: [],
- partialBoundaries: [],
- onError: onError === undefined ? defaultErrorHandler : onError,
- onAllReady: onAllReady === undefined ? noop$1 : onAllReady,
- onShellReady: onShellReady === undefined ? noop$1 : onShellReady,
- onShellError: onShellError === undefined ? noop$1 : onShellError,
- onFatalError: onFatalError === undefined ? noop$1 : onFatalError
- }; // This segment represents the root fallback.
- var rootSegment = createPendingSegment(request, 0, null, rootFormatContext, // Root segments are never embedded in Text on either edge
- false, false); // There is no parent so conceptually, we're unblocked to flush this segment.
- rootSegment.parentFlushed = true;
- var rootTask = createTask(request, children, null, rootSegment, abortSet, emptyContextObject, rootContextSnapshot, emptyTreeContext);
- pingedTasks.push(rootTask);
- return request;
- }
- function pingTask(request, task) {
- var pingedTasks = request.pingedTasks;
- pingedTasks.push(task);
- if (pingedTasks.length === 1) {
- scheduleWork(function () {
- return performWork(request);
- });
- }
- }
- function createSuspenseBoundary(request, fallbackAbortableTasks) {
- return {
- id: UNINITIALIZED_SUSPENSE_BOUNDARY_ID,
- rootSegmentID: -1,
- parentFlushed: false,
- pendingTasks: 0,
- forceClientRender: false,
- completedSegments: [],
- byteSize: 0,
- fallbackAbortableTasks: fallbackAbortableTasks,
- errorDigest: null
- };
- }
- function createTask(request, node, blockedBoundary, blockedSegment, abortSet, legacyContext, context, treeContext) {
- request.allPendingTasks++;
- if (blockedBoundary === null) {
- request.pendingRootTasks++;
- } else {
- blockedBoundary.pendingTasks++;
- }
- var task = {
- node: node,
- ping: function () {
- return pingTask(request, task);
- },
- blockedBoundary: blockedBoundary,
- blockedSegment: blockedSegment,
- abortSet: abortSet,
- legacyContext: legacyContext,
- context: context,
- treeContext: treeContext
- };
- {
- task.componentStack = null;
- }
- abortSet.add(task);
- return task;
- }
- function createPendingSegment(request, index, boundary, formatContext, lastPushedText, textEmbedded) {
- return {
- status: PENDING,
- id: -1,
- // lazily assigned later
- index: index,
- parentFlushed: false,
- chunks: [],
- children: [],
- formatContext: formatContext,
- boundary: boundary,
- lastPushedText: lastPushedText,
- textEmbedded: textEmbedded
- };
- } // DEV-only global reference to the currently executing task
- var currentTaskInDEV = null;
- function getCurrentStackInDEV() {
- {
- if (currentTaskInDEV === null || currentTaskInDEV.componentStack === null) {
- return '';
- }
- return getStackByComponentStackNode(currentTaskInDEV.componentStack);
- }
- }
- function pushBuiltInComponentStackInDEV(task, type) {
- {
- task.componentStack = {
- tag: 0,
- parent: task.componentStack,
- type: type
- };
- }
- }
- function pushFunctionComponentStackInDEV(task, type) {
- {
- task.componentStack = {
- tag: 1,
- parent: task.componentStack,
- type: type
- };
- }
- }
- function pushClassComponentStackInDEV(task, type) {
- {
- task.componentStack = {
- tag: 2,
- parent: task.componentStack,
- type: type
- };
- }
- }
- function popComponentStackInDEV(task) {
- {
- if (task.componentStack === null) {
- error('Unexpectedly popped too many stack frames. This is a bug in React.');
- } else {
- task.componentStack = task.componentStack.parent;
- }
- }
- } // stash the component stack of an unwinding error until it is processed
- var lastBoundaryErrorComponentStackDev = null;
- function captureBoundaryErrorDetailsDev(boundary, error) {
- {
- var errorMessage;
- if (typeof error === 'string') {
- errorMessage = error;
- } else if (error && typeof error.message === 'string') {
- errorMessage = error.message;
- } else {
- // eslint-disable-next-line react-internal/safe-string-coercion
- errorMessage = String(error);
- }
- var errorComponentStack = lastBoundaryErrorComponentStackDev || getCurrentStackInDEV();
- lastBoundaryErrorComponentStackDev = null;
- boundary.errorMessage = errorMessage;
- boundary.errorComponentStack = errorComponentStack;
- }
- }
- function logRecoverableError(request, error) {
- // If this callback errors, we intentionally let that error bubble up to become a fatal error
- // so that someone fixes the error reporting instead of hiding it.
- var errorDigest = request.onError(error);
- if (errorDigest != null && typeof errorDigest !== 'string') {
- // eslint-disable-next-line react-internal/prod-error-codes
- throw new Error("onError returned something with a type other than \"string\". onError should return a string and may return null or undefined but must not return anything else. It received something of type \"" + typeof errorDigest + "\" instead");
- }
- return errorDigest;
- }
- function fatalError(request, error) {
- // This is called outside error handling code such as if the root errors outside
- // a suspense boundary or if the root suspense boundary's fallback errors.
- // It's also called if React itself or its host configs errors.
- var onShellError = request.onShellError;
- onShellError(error);
- var onFatalError = request.onFatalError;
- onFatalError(error);
- if (request.destination !== null) {
- request.status = CLOSED;
- closeWithError(request.destination, error);
- } else {
- request.status = CLOSING;
- request.fatalError = error;
- }
- }
- function renderSuspenseBoundary(request, task, props) {
- pushBuiltInComponentStackInDEV(task, 'Suspense');
- var parentBoundary = task.blockedBoundary;
- var parentSegment = task.blockedSegment; // Each time we enter a suspense boundary, we split out into a new segment for
- // the fallback so that we can later replace that segment with the content.
- // This also lets us split out the main content even if it doesn't suspend,
- // in case it ends up generating a large subtree of content.
- var fallback = props.fallback;
- var content = props.children;
- var fallbackAbortSet = new Set();
- var newBoundary = createSuspenseBoundary(request, fallbackAbortSet);
- var insertionIndex = parentSegment.chunks.length; // The children of the boundary segment is actually the fallback.
- var boundarySegment = createPendingSegment(request, insertionIndex, newBoundary, parentSegment.formatContext, // boundaries never require text embedding at their edges because comment nodes bound them
- false, false);
- parentSegment.children.push(boundarySegment); // The parentSegment has a child Segment at this index so we reset the lastPushedText marker on the parent
- parentSegment.lastPushedText = false; // This segment is the actual child content. We can start rendering that immediately.
- var contentRootSegment = createPendingSegment(request, 0, null, parentSegment.formatContext, // boundaries never require text embedding at their edges because comment nodes bound them
- false, false); // We mark the root segment as having its parent flushed. It's not really flushed but there is
- // no parent segment so there's nothing to wait on.
- contentRootSegment.parentFlushed = true; // Currently this is running synchronously. We could instead schedule this to pingedTasks.
- // I suspect that there might be some efficiency benefits from not creating the suspended task
- // and instead just using the stack if possible.
- // TODO: Call this directly instead of messing with saving and restoring contexts.
- // We can reuse the current context and task to render the content immediately without
- // context switching. We just need to temporarily switch which boundary and which segment
- // we're writing to. If something suspends, it'll spawn new suspended task with that context.
- task.blockedBoundary = newBoundary;
- task.blockedSegment = contentRootSegment;
- try {
- // We use the safe form because we don't handle suspending here. Only error handling.
- renderNode(request, task, content);
- pushSegmentFinale(contentRootSegment.chunks, request.responseState, contentRootSegment.lastPushedText, contentRootSegment.textEmbedded);
- contentRootSegment.status = COMPLETED;
- queueCompletedSegment(newBoundary, contentRootSegment);
- if (newBoundary.pendingTasks === 0) {
- // This must have been the last segment we were waiting on. This boundary is now complete.
- // Therefore we won't need the fallback. We early return so that we don't have to create
- // the fallback.
- popComponentStackInDEV(task);
- return;
- }
- } catch (error) {
- contentRootSegment.status = ERRORED;
- newBoundary.forceClientRender = true;
- newBoundary.errorDigest = logRecoverableError(request, error);
- {
- captureBoundaryErrorDetailsDev(newBoundary, error);
- } // We don't need to decrement any task numbers because we didn't spawn any new task.
- // We don't need to schedule any task because we know the parent has written yet.
- // We do need to fallthrough to create the fallback though.
- } finally {
- task.blockedBoundary = parentBoundary;
- task.blockedSegment = parentSegment;
- } // We create suspended task for the fallback because we don't want to actually work
- // on it yet in case we finish the main content, so we queue for later.
- var suspendedFallbackTask = createTask(request, fallback, parentBoundary, boundarySegment, fallbackAbortSet, task.legacyContext, task.context, task.treeContext);
- {
- suspendedFallbackTask.componentStack = task.componentStack;
- } // TODO: This should be queued at a separate lower priority queue so that we only work
- // on preparing fallbacks if we don't have any more main content to task on.
- request.pingedTasks.push(suspendedFallbackTask);
- popComponentStackInDEV(task);
- }
- function renderHostElement(request, task, type, props) {
- pushBuiltInComponentStackInDEV(task, type);
- var segment = task.blockedSegment;
- var children = pushStartInstance(segment.chunks, type, props, request.responseState, segment.formatContext);
- segment.lastPushedText = false;
- var prevContext = segment.formatContext;
- segment.formatContext = getChildFormatContext(prevContext, type, props); // We use the non-destructive form because if something suspends, we still
- // need to pop back up and finish this subtree of HTML.
- renderNode(request, task, children); // We expect that errors will fatal the whole task and that we don't need
- // the correct context. Therefore this is not in a finally.
- segment.formatContext = prevContext;
- pushEndInstance(segment.chunks, type);
- segment.lastPushedText = false;
- popComponentStackInDEV(task);
- }
- function shouldConstruct$1(Component) {
- return Component.prototype && Component.prototype.isReactComponent;
- }
- function renderWithHooks(request, task, Component, props, secondArg) {
- var componentIdentity = {};
- prepareToUseHooks(task, componentIdentity);
- var result = Component(props, secondArg);
- return finishHooks(Component, props, result, secondArg);
- }
- function finishClassComponent(request, task, instance, Component, props) {
- var nextChildren = instance.render();
- {
- if (instance.props !== props) {
- if (!didWarnAboutReassigningProps) {
- error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentNameFromType(Component) || 'a component');
- }
- didWarnAboutReassigningProps = true;
- }
- }
- {
- var childContextTypes = Component.childContextTypes;
- if (childContextTypes !== null && childContextTypes !== undefined) {
- var previousContext = task.legacyContext;
- var mergedContext = processChildContext(instance, Component, previousContext, childContextTypes);
- task.legacyContext = mergedContext;
- renderNodeDestructive(request, task, nextChildren);
- task.legacyContext = previousContext;
- return;
- }
- }
- renderNodeDestructive(request, task, nextChildren);
- }
- function renderClassComponent(request, task, Component, props) {
- pushClassComponentStackInDEV(task, Component);
- var maskedContext = getMaskedContext(Component, task.legacyContext) ;
- var instance = constructClassInstance(Component, props, maskedContext);
- mountClassInstance(instance, Component, props, maskedContext);
- finishClassComponent(request, task, instance, Component, props);
- popComponentStackInDEV(task);
- }
- var didWarnAboutBadClass = {};
- var didWarnAboutModulePatternComponent = {};
- var didWarnAboutContextTypeOnFunctionComponent = {};
- var didWarnAboutGetDerivedStateOnFunctionComponent = {};
- var didWarnAboutReassigningProps = false;
- var didWarnAboutGenerators = false;
- var didWarnAboutMaps = false;
- var hasWarnedAboutUsingContextAsConsumer = false; // This would typically be a function component but we still support module pattern
- // components for some reason.
- function renderIndeterminateComponent(request, task, Component, props) {
- var legacyContext;
- {
- legacyContext = getMaskedContext(Component, task.legacyContext);
- }
- pushFunctionComponentStackInDEV(task, Component);
- {
- if (Component.prototype && typeof Component.prototype.render === 'function') {
- var componentName = getComponentNameFromType(Component) || 'Unknown';
- if (!didWarnAboutBadClass[componentName]) {
- error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);
- didWarnAboutBadClass[componentName] = true;
- }
- }
- }
- var value = renderWithHooks(request, task, Component, props, legacyContext);
- var hasId = checkDidRenderIdHook();
- {
- // Support for module components is deprecated and is removed behind a flag.
- // Whether or not it would crash later, we want to show a good message in DEV first.
- if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
- var _componentName = getComponentNameFromType(Component) || 'Unknown';
- if (!didWarnAboutModulePatternComponent[_componentName]) {
- error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);
- didWarnAboutModulePatternComponent[_componentName] = true;
- }
- }
- }
- if ( // Run these checks in production only if the flag is off.
- // Eventually we'll delete this branch altogether.
- typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
- {
- var _componentName2 = getComponentNameFromType(Component) || 'Unknown';
- if (!didWarnAboutModulePatternComponent[_componentName2]) {
- error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName2, _componentName2, _componentName2);
- didWarnAboutModulePatternComponent[_componentName2] = true;
- }
- }
- mountClassInstance(value, Component, props, legacyContext);
- finishClassComponent(request, task, value, Component, props);
- } else {
- {
- validateFunctionComponentInDev(Component);
- } // We're now successfully past this task, and we don't have to pop back to
- // the previous task every again, so we can use the destructive recursive form.
- if (hasId) {
- // This component materialized an id. We treat this as its own level, with
- // a single "child" slot.
- var prevTreeContext = task.treeContext;
- var totalChildren = 1;
- var index = 0;
- task.treeContext = pushTreeContext(prevTreeContext, totalChildren, index);
- try {
- renderNodeDestructive(request, task, value);
- } finally {
- task.treeContext = prevTreeContext;
- }
- } else {
- renderNodeDestructive(request, task, value);
- }
- }
- popComponentStackInDEV(task);
- }
- function validateFunctionComponentInDev(Component) {
- {
- if (Component) {
- if (Component.childContextTypes) {
- error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');
- }
- }
- if (typeof Component.getDerivedStateFromProps === 'function') {
- var _componentName3 = getComponentNameFromType(Component) || 'Unknown';
- if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) {
- error('%s: Function components do not support getDerivedStateFromProps.', _componentName3);
- didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true;
- }
- }
- if (typeof Component.contextType === 'object' && Component.contextType !== null) {
- var _componentName4 = getComponentNameFromType(Component) || 'Unknown';
- if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) {
- error('%s: Function components do not support contextType.', _componentName4);
- didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true;
- }
- }
- }
- }
- function resolveDefaultProps(Component, baseProps) {
- if (Component && Component.defaultProps) {
- // Resolve default props. Taken from ReactElement
- var props = assign({}, baseProps);
- var defaultProps = Component.defaultProps;
- for (var propName in defaultProps) {
- if (props[propName] === undefined) {
- props[propName] = defaultProps[propName];
- }
- }
- return props;
- }
- return baseProps;
- }
- function renderForwardRef(request, task, type, props, ref) {
- pushFunctionComponentStackInDEV(task, type.render);
- var children = renderWithHooks(request, task, type.render, props, ref);
- var hasId = checkDidRenderIdHook();
- if (hasId) {
- // This component materialized an id. We treat this as its own level, with
- // a single "child" slot.
- var prevTreeContext = task.treeContext;
- var totalChildren = 1;
- var index = 0;
- task.treeContext = pushTreeContext(prevTreeContext, totalChildren, index);
- try {
- renderNodeDestructive(request, task, children);
- } finally {
- task.treeContext = prevTreeContext;
- }
- } else {
- renderNodeDestructive(request, task, children);
- }
- popComponentStackInDEV(task);
- }
- function renderMemo(request, task, type, props, ref) {
- var innerType = type.type;
- var resolvedProps = resolveDefaultProps(innerType, props);
- renderElement(request, task, innerType, resolvedProps, ref);
- }
- function renderContextConsumer(request, task, context, props) {
- // The logic below for Context differs depending on PROD or DEV mode. In
- // DEV mode, we create a separate object for Context.Consumer that acts
- // like a proxy to Context. This proxy object adds unnecessary code in PROD
- // so we use the old behaviour (Context.Consumer references Context) to
- // reduce size and overhead. The separate object references context via
- // a property called "_context", which also gives us the ability to check
- // in DEV mode if this property exists or not and warn if it does not.
- {
- if (context._context === undefined) {
- // This may be because it's a Context (rather than a Consumer).
- // Or it may be because it's older React where they're the same thing.
- // We only want to warn if we're sure it's a new React.
- if (context !== context.Consumer) {
- if (!hasWarnedAboutUsingContextAsConsumer) {
- hasWarnedAboutUsingContextAsConsumer = true;
- error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
- }
- }
- } else {
- context = context._context;
- }
- }
- var render = props.children;
- {
- if (typeof render !== 'function') {
- error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');
- }
- }
- var newValue = readContext(context);
- var newChildren = render(newValue);
- renderNodeDestructive(request, task, newChildren);
- }
- function renderContextProvider(request, task, type, props) {
- var context = type._context;
- var value = props.value;
- var children = props.children;
- var prevSnapshot;
- {
- prevSnapshot = task.context;
- }
- task.context = pushProvider(context, value);
- renderNodeDestructive(request, task, children);
- task.context = popProvider(context);
- {
- if (prevSnapshot !== task.context) {
- error('Popping the context provider did not return back to the original snapshot. This is a bug in React.');
- }
- }
- }
- function renderLazyComponent(request, task, lazyComponent, props, ref) {
- pushBuiltInComponentStackInDEV(task, 'Lazy');
- var payload = lazyComponent._payload;
- var init = lazyComponent._init;
- var Component = init(payload);
- var resolvedProps = resolveDefaultProps(Component, props);
- renderElement(request, task, Component, resolvedProps, ref);
- popComponentStackInDEV(task);
- }
- function renderElement(request, task, type, props, ref) {
- if (typeof type === 'function') {
- if (shouldConstruct$1(type)) {
- renderClassComponent(request, task, type, props);
- return;
- } else {
- renderIndeterminateComponent(request, task, type, props);
- return;
- }
- }
- if (typeof type === 'string') {
- renderHostElement(request, task, type, props);
- return;
- }
- switch (type) {
- // TODO: LegacyHidden acts the same as a fragment. This only works
- // because we currently assume that every instance of LegacyHidden is
- // accompanied by a host component wrapper. In the hidden mode, the host
- // component is given a `hidden` attribute, which ensures that the
- // initial HTML is not visible. To support the use of LegacyHidden as a
- // true fragment, without an extra DOM node, we would have to hide the
- // initial HTML in some other way.
- // TODO: Add REACT_OFFSCREEN_TYPE here too with the same capability.
- case REACT_LEGACY_HIDDEN_TYPE:
- case REACT_DEBUG_TRACING_MODE_TYPE:
- case REACT_STRICT_MODE_TYPE:
- case REACT_PROFILER_TYPE:
- case REACT_FRAGMENT_TYPE:
- {
- renderNodeDestructive(request, task, props.children);
- return;
- }
- case REACT_SUSPENSE_LIST_TYPE:
- {
- pushBuiltInComponentStackInDEV(task, 'SuspenseList'); // TODO: SuspenseList should control the boundaries.
- renderNodeDestructive(request, task, props.children);
- popComponentStackInDEV(task);
- return;
- }
- case REACT_SCOPE_TYPE:
- {
- throw new Error('ReactDOMServer does not yet support scope components.');
- }
- // eslint-disable-next-line-no-fallthrough
- case REACT_SUSPENSE_TYPE:
- {
- {
- renderSuspenseBoundary(request, task, props);
- }
- return;
- }
- }
- if (typeof type === 'object' && type !== null) {
- switch (type.$$typeof) {
- case REACT_FORWARD_REF_TYPE:
- {
- renderForwardRef(request, task, type, props, ref);
- return;
- }
- case REACT_MEMO_TYPE:
- {
- renderMemo(request, task, type, props, ref);
- return;
- }
- case REACT_PROVIDER_TYPE:
- {
- renderContextProvider(request, task, type, props);
- return;
- }
- case REACT_CONTEXT_TYPE:
- {
- renderContextConsumer(request, task, type, props);
- return;
- }
- case REACT_LAZY_TYPE:
- {
- renderLazyComponent(request, task, type, props);
- return;
- }
- }
- }
- var info = '';
- {
- if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
- info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.';
- }
- }
- throw new Error('Element type is invalid: expected a string (for built-in ' + 'components) or a class/function (for composite components) ' + ("but got: " + (type == null ? type : typeof type) + "." + info));
- }
- function validateIterable(iterable, iteratorFn) {
- {
- // We don't support rendering Generators because it's a mutation.
- // See https://github.com/facebook/react/issues/12995
- if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag
- iterable[Symbol.toStringTag] === 'Generator') {
- if (!didWarnAboutGenerators) {
- error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');
- }
- didWarnAboutGenerators = true;
- } // Warn about using Maps as children
- if (iterable.entries === iteratorFn) {
- if (!didWarnAboutMaps) {
- error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');
- }
- didWarnAboutMaps = true;
- }
- }
- }
- function renderNodeDestructive(request, task, node) {
- {
- // In Dev we wrap renderNodeDestructiveImpl in a try / catch so we can capture
- // a component stack at the right place in the tree. We don't do this in renderNode
- // becuase it is not called at every layer of the tree and we may lose frames
- try {
- return renderNodeDestructiveImpl(request, task, node);
- } catch (x) {
- if (typeof x === 'object' && x !== null && typeof x.then === 'function') ; else {
- // This is an error, stash the component stack if it is null.
- lastBoundaryErrorComponentStackDev = lastBoundaryErrorComponentStackDev !== null ? lastBoundaryErrorComponentStackDev : getCurrentStackInDEV();
- } // rethrow so normal suspense logic can handle thrown value accordingly
- throw x;
- }
- }
- } // This function by it self renders a node and consumes the task by mutating it
- // to update the current execution state.
- function renderNodeDestructiveImpl(request, task, node) {
- // Stash the node we're working on. We'll pick up from this task in case
- // something suspends.
- task.node = node; // Handle object types
- if (typeof node === 'object' && node !== null) {
- switch (node.$$typeof) {
- case REACT_ELEMENT_TYPE:
- {
- var element = node;
- var type = element.type;
- var props = element.props;
- var ref = element.ref;
- renderElement(request, task, type, props, ref);
- return;
- }
- case REACT_PORTAL_TYPE:
- throw new Error('Portals are not currently supported by the server renderer. ' + 'Render them conditionally so that they only appear on the client render.');
- // eslint-disable-next-line-no-fallthrough
- case REACT_LAZY_TYPE:
- {
- var lazyNode = node;
- var payload = lazyNode._payload;
- var init = lazyNode._init;
- var resolvedNode;
- {
- try {
- resolvedNode = init(payload);
- } catch (x) {
- if (typeof x === 'object' && x !== null && typeof x.then === 'function') {
- // this Lazy initializer is suspending. push a temporary frame onto the stack so it can be
- // popped off in spawnNewSuspendedTask. This aligns stack behavior between Lazy in element position
- // vs Component position. We do not want the frame for Errors so we exclusively do this in
- // the wakeable branch
- pushBuiltInComponentStackInDEV(task, 'Lazy');
- }
- throw x;
- }
- }
- renderNodeDestructive(request, task, resolvedNode);
- return;
- }
- }
- if (isArray(node)) {
- renderChildrenArray(request, task, node);
- return;
- }
- var iteratorFn = getIteratorFn(node);
- if (iteratorFn) {
- {
- validateIterable(node, iteratorFn);
- }
- var iterator = iteratorFn.call(node);
- if (iterator) {
- // We need to know how many total children are in this set, so that we
- // can allocate enough id slots to acommodate them. So we must exhaust
- // the iterator before we start recursively rendering the children.
- // TODO: This is not great but I think it's inherent to the id
- // generation algorithm.
- var step = iterator.next(); // If there are not entries, we need to push an empty so we start by checking that.
- if (!step.done) {
- var children = [];
- do {
- children.push(step.value);
- step = iterator.next();
- } while (!step.done);
- renderChildrenArray(request, task, children);
- return;
- }
- return;
- }
- }
- var childString = Object.prototype.toString.call(node);
- throw new Error("Objects are not valid as a React child (found: " + (childString === '[object Object]' ? 'object with keys {' + Object.keys(node).join(', ') + '}' : childString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.');
- }
- if (typeof node === 'string') {
- var segment = task.blockedSegment;
- segment.lastPushedText = pushTextInstance(task.blockedSegment.chunks, node, request.responseState, segment.lastPushedText);
- return;
- }
- if (typeof node === 'number') {
- var _segment = task.blockedSegment;
- _segment.lastPushedText = pushTextInstance(task.blockedSegment.chunks, '' + node, request.responseState, _segment.lastPushedText);
- return;
- }
- {
- if (typeof node === 'function') {
- error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');
- }
- }
- }
- function renderChildrenArray(request, task, children) {
- var totalChildren = children.length;
- for (var i = 0; i < totalChildren; i++) {
- var prevTreeContext = task.treeContext;
- task.treeContext = pushTreeContext(prevTreeContext, totalChildren, i);
- try {
- // We need to use the non-destructive form so that we can safely pop back
- // up and render the sibling if something suspends.
- renderNode(request, task, children[i]);
- } finally {
- task.treeContext = prevTreeContext;
- }
- }
- }
- function spawnNewSuspendedTask(request, task, x) {
- // Something suspended, we'll need to create a new segment and resolve it later.
- var segment = task.blockedSegment;
- var insertionIndex = segment.chunks.length;
- var newSegment = createPendingSegment(request, insertionIndex, null, segment.formatContext, // Adopt the parent segment's leading text embed
- segment.lastPushedText, // Assume we are text embedded at the trailing edge
- true);
- segment.children.push(newSegment); // Reset lastPushedText for current Segment since the new Segment "consumed" it
- segment.lastPushedText = false;
- var newTask = createTask(request, task.node, task.blockedBoundary, newSegment, task.abortSet, task.legacyContext, task.context, task.treeContext);
- {
- if (task.componentStack !== null) {
- // We pop one task off the stack because the node that suspended will be tried again,
- // which will add it back onto the stack.
- newTask.componentStack = task.componentStack.parent;
- }
- }
- var ping = newTask.ping;
- x.then(ping, ping);
- } // This is a non-destructive form of rendering a node. If it suspends it spawns
- // a new task and restores the context of this task to what it was before.
- function renderNode(request, task, node) {
- // TODO: Store segment.children.length here and reset it in case something
- // suspended partially through writing something.
- // Snapshot the current context in case something throws to interrupt the
- // process.
- var previousFormatContext = task.blockedSegment.formatContext;
- var previousLegacyContext = task.legacyContext;
- var previousContext = task.context;
- var previousComponentStack = null;
- {
- previousComponentStack = task.componentStack;
- }
- try {
- return renderNodeDestructive(request, task, node);
- } catch (x) {
- resetHooksState();
- if (typeof x === 'object' && x !== null && typeof x.then === 'function') {
- spawnNewSuspendedTask(request, task, x); // Restore the context. We assume that this will be restored by the inner
- // functions in case nothing throws so we don't use "finally" here.
- task.blockedSegment.formatContext = previousFormatContext;
- task.legacyContext = previousLegacyContext;
- task.context = previousContext; // Restore all active ReactContexts to what they were before.
- switchContext(previousContext);
- {
- task.componentStack = previousComponentStack;
- }
- return;
- } else {
- // Restore the context. We assume that this will be restored by the inner
- // functions in case nothing throws so we don't use "finally" here.
- task.blockedSegment.formatContext = previousFormatContext;
- task.legacyContext = previousLegacyContext;
- task.context = previousContext; // Restore all active ReactContexts to what they were before.
- switchContext(previousContext);
- {
- task.componentStack = previousComponentStack;
- } // We assume that we don't need the correct context.
- // Let's terminate the rest of the tree and don't render any siblings.
- throw x;
- }
- }
- }
- function erroredTask(request, boundary, segment, error) {
- // Report the error to a global handler.
- var errorDigest = logRecoverableError(request, error);
- if (boundary === null) {
- fatalError(request, error);
- } else {
- boundary.pendingTasks--;
- if (!boundary.forceClientRender) {
- boundary.forceClientRender = true;
- boundary.errorDigest = errorDigest;
- {
- captureBoundaryErrorDetailsDev(boundary, error);
- } // Regardless of what happens next, this boundary won't be displayed,
- // so we can flush it, if the parent already flushed.
- if (boundary.parentFlushed) {
- // We don't have a preference where in the queue this goes since it's likely
- // to error on the client anyway. However, intentionally client-rendered
- // boundaries should be flushed earlier so that they can start on the client.
- // We reuse the same queue for errors.
- request.clientRenderedBoundaries.push(boundary);
- }
- }
- }
- request.allPendingTasks--;
- if (request.allPendingTasks === 0) {
- var onAllReady = request.onAllReady;
- onAllReady();
- }
- }
- function abortTaskSoft(task) {
- // This aborts task without aborting the parent boundary that it blocks.
- // It's used for when we didn't need this task to complete the tree.
- // If task was needed, then it should use abortTask instead.
- var request = this;
- var boundary = task.blockedBoundary;
- var segment = task.blockedSegment;
- segment.status = ABORTED;
- finishedTask(request, boundary, segment);
- }
- function abortTask(task, request, reason) {
- // This aborts the task and aborts the parent that it blocks, putting it into
- // client rendered mode.
- var boundary = task.blockedBoundary;
- var segment = task.blockedSegment;
- segment.status = ABORTED;
- if (boundary === null) {
- request.allPendingTasks--; // We didn't complete the root so we have nothing to show. We can close
- // the request;
- if (request.status !== CLOSED) {
- request.status = CLOSED;
- if (request.destination !== null) {
- close(request.destination);
- }
- }
- } else {
- boundary.pendingTasks--;
- if (!boundary.forceClientRender) {
- boundary.forceClientRender = true;
- var _error = reason === undefined ? new Error('The render was aborted by the server without a reason.') : reason;
- boundary.errorDigest = request.onError(_error);
- {
- var errorPrefix = 'The server did not finish this Suspense boundary: ';
- if (_error && typeof _error.message === 'string') {
- _error = errorPrefix + _error.message;
- } else {
- // eslint-disable-next-line react-internal/safe-string-coercion
- _error = errorPrefix + String(_error);
- }
- var previousTaskInDev = currentTaskInDEV;
- currentTaskInDEV = task;
- try {
- captureBoundaryErrorDetailsDev(boundary, _error);
- } finally {
- currentTaskInDEV = previousTaskInDev;
- }
- }
- if (boundary.parentFlushed) {
- request.clientRenderedBoundaries.push(boundary);
- }
- } // If this boundary was still pending then we haven't already cancelled its fallbacks.
- // We'll need to abort the fallbacks, which will also error that parent boundary.
- boundary.fallbackAbortableTasks.forEach(function (fallbackTask) {
- return abortTask(fallbackTask, request, reason);
- });
- boundary.fallbackAbortableTasks.clear();
- request.allPendingTasks--;
- if (request.allPendingTasks === 0) {
- var onAllReady = request.onAllReady;
- onAllReady();
- }
- }
- }
- function queueCompletedSegment(boundary, segment) {
- if (segment.chunks.length === 0 && segment.children.length === 1 && segment.children[0].boundary === null) {
- // This is an empty segment. There's nothing to write, so we can instead transfer the ID
- // to the child. That way any existing references point to the child.
- var childSegment = segment.children[0];
- childSegment.id = segment.id;
- childSegment.parentFlushed = true;
- if (childSegment.status === COMPLETED) {
- queueCompletedSegment(boundary, childSegment);
- }
- } else {
- var completedSegments = boundary.completedSegments;
- completedSegments.push(segment);
- }
- }
- function finishedTask(request, boundary, segment) {
- if (boundary === null) {
- if (segment.parentFlushed) {
- if (request.completedRootSegment !== null) {
- throw new Error('There can only be one root segment. This is a bug in React.');
- }
- request.completedRootSegment = segment;
- }
- request.pendingRootTasks--;
- if (request.pendingRootTasks === 0) {
- // We have completed the shell so the shell can't error anymore.
- request.onShellError = noop$1;
- var onShellReady = request.onShellReady;
- onShellReady();
- }
- } else {
- boundary.pendingTasks--;
- if (boundary.forceClientRender) ; else if (boundary.pendingTasks === 0) {
- // This must have been the last segment we were waiting on. This boundary is now complete.
- if (segment.parentFlushed) {
- // Our parent segment already flushed, so we need to schedule this segment to be emitted.
- // If it is a segment that was aborted, we'll write other content instead so we don't need
- // to emit it.
- if (segment.status === COMPLETED) {
- queueCompletedSegment(boundary, segment);
- }
- }
- if (boundary.parentFlushed) {
- // The segment might be part of a segment that didn't flush yet, but if the boundary's
- // parent flushed, we need to schedule the boundary to be emitted.
- request.completedBoundaries.push(boundary);
- } // We can now cancel any pending task on the fallback since we won't need to show it anymore.
- // This needs to happen after we read the parentFlushed flags because aborting can finish
- // work which can trigger user code, which can start flushing, which can change those flags.
- boundary.fallbackAbortableTasks.forEach(abortTaskSoft, request);
- boundary.fallbackAbortableTasks.clear();
- } else {
- if (segment.parentFlushed) {
- // Our parent already flushed, so we need to schedule this segment to be emitted.
- // If it is a segment that was aborted, we'll write other content instead so we don't need
- // to emit it.
- if (segment.status === COMPLETED) {
- queueCompletedSegment(boundary, segment);
- var completedSegments = boundary.completedSegments;
- if (completedSegments.length === 1) {
- // This is the first time since we last flushed that we completed anything.
- // We can schedule this boundary to emit its partially completed segments early
- // in case the parent has already been flushed.
- if (boundary.parentFlushed) {
- request.partialBoundaries.push(boundary);
- }
- }
- }
- }
- }
- }
- request.allPendingTasks--;
- if (request.allPendingTasks === 0) {
- // This needs to be called at the very end so that we can synchronously write the result
- // in the callback if needed.
- var onAllReady = request.onAllReady;
- onAllReady();
- }
- }
- function retryTask(request, task) {
- var segment = task.blockedSegment;
- if (segment.status !== PENDING) {
- // We completed this by other means before we had a chance to retry it.
- return;
- } // We restore the context to what it was when we suspended.
- // We don't restore it after we leave because it's likely that we'll end up
- // needing a very similar context soon again.
- switchContext(task.context);
- var prevTaskInDEV = null;
- {
- prevTaskInDEV = currentTaskInDEV;
- currentTaskInDEV = task;
- }
- try {
- // We call the destructive form that mutates this task. That way if something
- // suspends again, we can reuse the same task instead of spawning a new one.
- renderNodeDestructive(request, task, task.node);
- pushSegmentFinale(segment.chunks, request.responseState, segment.lastPushedText, segment.textEmbedded);
- task.abortSet.delete(task);
- segment.status = COMPLETED;
- finishedTask(request, task.blockedBoundary, segment);
- } catch (x) {
- resetHooksState();
- if (typeof x === 'object' && x !== null && typeof x.then === 'function') {
- // Something suspended again, let's pick it back up later.
- var ping = task.ping;
- x.then(ping, ping);
- } else {
- task.abortSet.delete(task);
- segment.status = ERRORED;
- erroredTask(request, task.blockedBoundary, segment, x);
- }
- } finally {
- {
- currentTaskInDEV = prevTaskInDEV;
- }
- }
- }
- function performWork(request) {
- if (request.status === CLOSED) {
- return;
- }
- var prevContext = getActiveContext();
- var prevDispatcher = ReactCurrentDispatcher$1.current;
- ReactCurrentDispatcher$1.current = Dispatcher;
- var prevGetCurrentStackImpl;
- {
- prevGetCurrentStackImpl = ReactDebugCurrentFrame$1.getCurrentStack;
- ReactDebugCurrentFrame$1.getCurrentStack = getCurrentStackInDEV;
- }
- var prevResponseState = currentResponseState;
- setCurrentResponseState(request.responseState);
- try {
- var pingedTasks = request.pingedTasks;
- var i;
- for (i = 0; i < pingedTasks.length; i++) {
- var task = pingedTasks[i];
- retryTask(request, task);
- }
- pingedTasks.splice(0, i);
- if (request.destination !== null) {
- flushCompletedQueues(request, request.destination);
- }
- } catch (error) {
- logRecoverableError(request, error);
- fatalError(request, error);
- } finally {
- setCurrentResponseState(prevResponseState);
- ReactCurrentDispatcher$1.current = prevDispatcher;
- {
- ReactDebugCurrentFrame$1.getCurrentStack = prevGetCurrentStackImpl;
- }
- if (prevDispatcher === Dispatcher) {
- // This means that we were in a reentrant work loop. This could happen
- // in a renderer that supports synchronous work like renderToString,
- // when it's called from within another renderer.
- // Normally we don't bother switching the contexts to their root/default
- // values when leaving because we'll likely need the same or similar
- // context again. However, when we're inside a synchronous loop like this
- // we'll to restore the context to what it was before returning.
- switchContext(prevContext);
- }
- }
- }
- function flushSubtree(request, destination, segment) {
- segment.parentFlushed = true;
- switch (segment.status) {
- case PENDING:
- {
- // We're emitting a placeholder for this segment to be filled in later.
- // Therefore we'll need to assign it an ID - to refer to it by.
- var segmentID = segment.id = request.nextSegmentId++; // When this segment finally completes it won't be embedded in text since it will flush separately
- segment.lastPushedText = false;
- segment.textEmbedded = false;
- return writePlaceholder(destination, request.responseState, segmentID);
- }
- case COMPLETED:
- {
- segment.status = FLUSHED;
- var r = true;
- var chunks = segment.chunks;
- var chunkIdx = 0;
- var children = segment.children;
- for (var childIdx = 0; childIdx < children.length; childIdx++) {
- var nextChild = children[childIdx]; // Write all the chunks up until the next child.
- for (; chunkIdx < nextChild.index; chunkIdx++) {
- writeChunk(destination, chunks[chunkIdx]);
- }
- r = flushSegment(request, destination, nextChild);
- } // Finally just write all the remaining chunks
- for (; chunkIdx < chunks.length - 1; chunkIdx++) {
- writeChunk(destination, chunks[chunkIdx]);
- }
- if (chunkIdx < chunks.length) {
- r = writeChunkAndReturn(destination, chunks[chunkIdx]);
- }
- return r;
- }
- default:
- {
- throw new Error('Aborted, errored or already flushed boundaries should not be flushed again. This is a bug in React.');
- }
- }
- }
- function flushSegment(request, destination, segment) {
- var boundary = segment.boundary;
- if (boundary === null) {
- // Not a suspense boundary.
- return flushSubtree(request, destination, segment);
- }
- boundary.parentFlushed = true; // This segment is a Suspense boundary. We need to decide whether to
- // emit the content or the fallback now.
- if (boundary.forceClientRender) {
- // Emit a client rendered suspense boundary wrapper.
- // We never queue the inner boundary so we'll never emit its content or partial segments.
- writeStartClientRenderedSuspenseBoundary(destination, request.responseState, boundary.errorDigest, boundary.errorMessage, boundary.errorComponentStack); // Flush the fallback.
- flushSubtree(request, destination, segment);
- return writeEndClientRenderedSuspenseBoundary(destination, request.responseState);
- } else if (boundary.pendingTasks > 0) {
- // This boundary is still loading. Emit a pending suspense boundary wrapper.
- // Assign an ID to refer to the future content by.
- boundary.rootSegmentID = request.nextSegmentId++;
- if (boundary.completedSegments.length > 0) {
- // If this is at least partially complete, we can queue it to be partially emitted early.
- request.partialBoundaries.push(boundary);
- } /// This is the first time we should have referenced this ID.
- var id = boundary.id = assignSuspenseBoundaryID(request.responseState);
- writeStartPendingSuspenseBoundary(destination, request.responseState, id); // Flush the fallback.
- flushSubtree(request, destination, segment);
- return writeEndPendingSuspenseBoundary(destination, request.responseState);
- } else if (boundary.byteSize > request.progressiveChunkSize) {
- // This boundary is large and will be emitted separately so that we can progressively show
- // other content. We add it to the queue during the flush because we have to ensure that
- // the parent flushes first so that there's something to inject it into.
- // We also have to make sure that it's emitted into the queue in a deterministic slot.
- // I.e. we can't insert it here when it completes.
- // Assign an ID to refer to the future content by.
- boundary.rootSegmentID = request.nextSegmentId++;
- request.completedBoundaries.push(boundary); // Emit a pending rendered suspense boundary wrapper.
- writeStartPendingSuspenseBoundary(destination, request.responseState, boundary.id); // Flush the fallback.
- flushSubtree(request, destination, segment);
- return writeEndPendingSuspenseBoundary(destination, request.responseState);
- } else {
- // We can inline this boundary's content as a complete boundary.
- writeStartCompletedSuspenseBoundary(destination, request.responseState);
- var completedSegments = boundary.completedSegments;
- if (completedSegments.length !== 1) {
- throw new Error('A previously unvisited boundary must have exactly one root segment. This is a bug in React.');
- }
- var contentSegment = completedSegments[0];
- flushSegment(request, destination, contentSegment);
- return writeEndCompletedSuspenseBoundary(destination, request.responseState);
- }
- }
- function flushClientRenderedBoundary(request, destination, boundary) {
- return writeClientRenderBoundaryInstruction(destination, request.responseState, boundary.id, boundary.errorDigest, boundary.errorMessage, boundary.errorComponentStack);
- }
- function flushSegmentContainer(request, destination, segment) {
- writeStartSegment(destination, request.responseState, segment.formatContext, segment.id);
- flushSegment(request, destination, segment);
- return writeEndSegment(destination, segment.formatContext);
- }
- function flushCompletedBoundary(request, destination, boundary) {
- var completedSegments = boundary.completedSegments;
- var i = 0;
- for (; i < completedSegments.length; i++) {
- var segment = completedSegments[i];
- flushPartiallyCompletedSegment(request, destination, boundary, segment);
- }
- completedSegments.length = 0;
- return writeCompletedBoundaryInstruction(destination, request.responseState, boundary.id, boundary.rootSegmentID);
- }
- function flushPartialBoundary(request, destination, boundary) {
- var completedSegments = boundary.completedSegments;
- var i = 0;
- for (; i < completedSegments.length; i++) {
- var segment = completedSegments[i];
- if (!flushPartiallyCompletedSegment(request, destination, boundary, segment)) {
- i++;
- completedSegments.splice(0, i); // Only write as much as the buffer wants. Something higher priority
- // might want to write later.
- return false;
- }
- }
- completedSegments.splice(0, i);
- return true;
- }
- function flushPartiallyCompletedSegment(request, destination, boundary, segment) {
- if (segment.status === FLUSHED) {
- // We've already flushed this inline.
- return true;
- }
- var segmentID = segment.id;
- if (segmentID === -1) {
- // This segment wasn't previously referred to. This happens at the root of
- // a boundary. We make kind of a leap here and assume this is the root.
- var rootSegmentID = segment.id = boundary.rootSegmentID;
- if (rootSegmentID === -1) {
- throw new Error('A root segment ID must have been assigned by now. This is a bug in React.');
- }
- return flushSegmentContainer(request, destination, segment);
- } else {
- flushSegmentContainer(request, destination, segment);
- return writeCompletedSegmentInstruction(destination, request.responseState, segmentID);
- }
- }
- function flushCompletedQueues(request, destination) {
- beginWriting();
- try {
- // The structure of this is to go through each queue one by one and write
- // until the sink tells us to stop. When we should stop, we still finish writing
- // that item fully and then yield. At that point we remove the already completed
- // items up until the point we completed them.
- // TODO: Emit preloading.
- // TODO: It's kind of unfortunate to keep checking this array after we've already
- // emitted the root.
- var completedRootSegment = request.completedRootSegment;
- if (completedRootSegment !== null && request.pendingRootTasks === 0) {
- flushSegment(request, destination, completedRootSegment);
- request.completedRootSegment = null;
- writeCompletedRoot(destination, request.responseState);
- } // We emit client rendering instructions for already emitted boundaries first.
- // This is so that we can signal to the client to start client rendering them as
- // soon as possible.
- var clientRenderedBoundaries = request.clientRenderedBoundaries;
- var i;
- for (i = 0; i < clientRenderedBoundaries.length; i++) {
- var boundary = clientRenderedBoundaries[i];
- if (!flushClientRenderedBoundary(request, destination, boundary)) {
- request.destination = null;
- i++;
- clientRenderedBoundaries.splice(0, i);
- return;
- }
- }
- clientRenderedBoundaries.splice(0, i); // Next we emit any complete boundaries. It's better to favor boundaries
- // that are completely done since we can actually show them, than it is to emit
- // any individual segments from a partially complete boundary.
- var completedBoundaries = request.completedBoundaries;
- for (i = 0; i < completedBoundaries.length; i++) {
- var _boundary = completedBoundaries[i];
- if (!flushCompletedBoundary(request, destination, _boundary)) {
- request.destination = null;
- i++;
- completedBoundaries.splice(0, i);
- return;
- }
- }
- completedBoundaries.splice(0, i); // Allow anything written so far to flush to the underlying sink before
- // we continue with lower priorities.
- completeWriting(destination);
- beginWriting(destination); // TODO: Here we'll emit data used by hydration.
- // Next we emit any segments of any boundaries that are partially complete
- // but not deeply complete.
- var partialBoundaries = request.partialBoundaries;
- for (i = 0; i < partialBoundaries.length; i++) {
- var _boundary2 = partialBoundaries[i];
- if (!flushPartialBoundary(request, destination, _boundary2)) {
- request.destination = null;
- i++;
- partialBoundaries.splice(0, i);
- return;
- }
- }
- partialBoundaries.splice(0, i); // Next we check the completed boundaries again. This may have had
- // boundaries added to it in case they were too larged to be inlined.
- // New ones might be added in this loop.
- var largeBoundaries = request.completedBoundaries;
- for (i = 0; i < largeBoundaries.length; i++) {
- var _boundary3 = largeBoundaries[i];
- if (!flushCompletedBoundary(request, destination, _boundary3)) {
- request.destination = null;
- i++;
- largeBoundaries.splice(0, i);
- return;
- }
- }
- largeBoundaries.splice(0, i);
- } finally {
- completeWriting(destination);
- if (request.allPendingTasks === 0 && request.pingedTasks.length === 0 && request.clientRenderedBoundaries.length === 0 && request.completedBoundaries.length === 0 // We don't need to check any partially completed segments because
- // either they have pending task or they're complete.
- ) {
- {
- if (request.abortableTasks.size !== 0) {
- error('There was still abortable task at the root when we closed. This is a bug in React.');
- }
- } // We're done.
- close(destination);
- }
- }
- }
- function startWork(request) {
- scheduleWork(function () {
- return performWork(request);
- });
- }
- function startFlowing(request, destination) {
- if (request.status === CLOSING) {
- request.status = CLOSED;
- closeWithError(destination, request.fatalError);
- return;
- }
- if (request.status === CLOSED) {
- return;
- }
- if (request.destination !== null) {
- // We're already flowing.
- return;
- }
- request.destination = destination;
- try {
- flushCompletedQueues(request, destination);
- } catch (error) {
- logRecoverableError(request, error);
- fatalError(request, error);
- }
- } // This is called to early terminate a request. It puts all pending boundaries in client rendered state.
- function abort(request, reason) {
- try {
- var abortableTasks = request.abortableTasks;
- abortableTasks.forEach(function (task) {
- return abortTask(task, request, reason);
- });
- abortableTasks.clear();
- if (request.destination !== null) {
- flushCompletedQueues(request, request.destination);
- }
- } catch (error) {
- logRecoverableError(request, error);
- fatalError(request, error);
- }
- }
- function renderToReadableStream(children, options) {
- return new Promise(function (resolve, reject) {
- var onFatalError;
- var onAllReady;
- var allReady = new Promise(function (res, rej) {
- onAllReady = res;
- onFatalError = rej;
- });
- function onShellReady() {
- var stream = new ReadableStream({
- type: 'bytes',
- pull: function (controller) {
- startFlowing(request, controller);
- },
- cancel: function (reason) {
- abort(request);
- }
- }, // $FlowFixMe size() methods are not allowed on byte streams.
- {
- highWaterMark: 0
- }); // TODO: Move to sub-classing ReadableStream.
- stream.allReady = allReady;
- resolve(stream);
- }
- function onShellError(error) {
- // If the shell errors the caller of `renderToReadableStream` won't have access to `allReady`.
- // However, `allReady` will be rejected by `onFatalError` as well.
- // So we need to catch the duplicate, uncatchable fatal error in `allReady` to prevent a `UnhandledPromiseRejection`.
- allReady.catch(function () {});
- reject(error);
- }
- var request = createRequest(children, createResponseState(options ? options.identifierPrefix : undefined, options ? options.nonce : undefined, options ? options.bootstrapScriptContent : undefined, options ? options.bootstrapScripts : undefined, options ? options.bootstrapModules : undefined), createRootFormatContext(options ? options.namespaceURI : undefined), options ? options.progressiveChunkSize : undefined, options ? options.onError : undefined, onAllReady, onShellReady, onShellError, onFatalError);
- if (options && options.signal) {
- var signal = options.signal;
- var listener = function () {
- abort(request, signal.reason);
- signal.removeEventListener('abort', listener);
- };
- signal.addEventListener('abort', listener);
- }
- startWork(request);
- });
- }
- exports.renderToReadableStream = renderToReadableStream;
- exports.version = ReactVersion;
- })));
|