[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"projectName\": \"react-testing-library\",\n  \"projectOwner\": \"testing-library\",\n  \"repoType\": \"github\",\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"skipCi\": false,\n  \"contributors\": [\n    {\n      \"login\": \"kentcdodds\",\n      \"name\": \"Kent C. Dodds\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1500684?v=3\",\n      \"profile\": \"https://kentcdodds.com\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"infra\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"audiolion\",\n      \"name\": \"Ryan Castner\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/2430381?v=4\",\n      \"profile\": \"http://audiolion.github.io\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"dnlsandiego\",\n      \"name\": \"Daniel Sandiego\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/8008023?v=4\",\n      \"profile\": \"https://www.dnlsandiego.com\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Miklet\",\n      \"name\": \"Paweł Mikołajczyk\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/12592677?v=4\",\n      \"profile\": \"https://github.com/Miklet\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"alejandronanez\",\n      \"name\": \"Alejandro Ñáñez Ortiz\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/464978?v=4\",\n      \"profile\": \"http://co.linkedin.com/in/alejandronanez/\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"pbomb\",\n      \"name\": \"Matt Parrish\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1402095?v=4\",\n      \"profile\": \"https://github.com/pbomb\",\n      \"contributions\": [\n        \"bug\",\n        \"code\",\n        \"doc\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"wKovacs64\",\n      \"name\": \"Justin Hall\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/1288694?v=4\",\n      \"profile\": \"https://github.com/wKovacs64\",\n      \"contributions\": [\n        \"platform\"\n      ]\n    },\n    {\n      \"login\": \"antoaravinth\",\n      \"name\": \"Anto Aravinth\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/1241511?s=460&v=4\",\n      \"profile\": \"https://github.com/antoaravinth\",\n      \"contributions\": [\n        \"code\",\n        \"test\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"JonahMoses\",\n      \"name\": \"Jonah Moses\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/3462296?v=4\",\n      \"profile\": \"https://github.com/JonahMoses\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"lgandecki\",\n      \"name\": \"Łukasz Gandecki\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/4002543?v=4\",\n      \"profile\": \"http://team.thebrain.pro\",\n      \"contributions\": [\n        \"code\",\n        \"test\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"sompylasar\",\n      \"name\": \"Ivan Babak\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/498274?v=4\",\n      \"profile\": \"https://sompylasar.github.io\",\n      \"contributions\": [\n        \"bug\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"jday3\",\n      \"name\": \"Jesse Day\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/4439618?v=4\",\n      \"profile\": \"https://github.com/jday3\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"gnapse\",\n      \"name\": \"Ernesto García\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/15199?v=4\",\n      \"profile\": \"http://gnapse.github.io\",\n      \"contributions\": [\n        \"question\",\n        \"code\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"jomaxx\",\n      \"name\": \"Josef Maxx Blake\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/2747424?v=4\",\n      \"profile\": \"http://jomaxx.com\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"mbaranovski\",\n      \"name\": \"Michal Baranowski\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/29602306?v=4\",\n      \"profile\": \"https://twitter.com/baranovskim\",\n      \"contributions\": [\n        \"blog\",\n        \"tutorial\"\n      ]\n    },\n    {\n      \"login\": \"aputhin\",\n      \"name\": \"Arthur Puthin\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/13985684?v=4\",\n      \"profile\": \"https://github.com/aputhin\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"thchia\",\n      \"name\": \"Thomas Chia\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/21194045?v=4\",\n      \"profile\": \"https://github.com/thchia\",\n      \"contributions\": [\n        \"code\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"thiagopaiva99\",\n      \"name\": \"Thiago Galvani\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/20430611?v=4\",\n      \"profile\": \"http://ilegra.com/\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"ChrisWcs\",\n      \"name\": \"Christian\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/19828824?v=4\",\n      \"profile\": \"http://Chriswcs.github.io\",\n      \"contributions\": [\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"alexkrolick\",\n      \"name\": \"Alex Krolick\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/1571667?v=4\",\n      \"profile\": \"https://alexkrolick.com\",\n      \"contributions\": [\n        \"question\",\n        \"doc\",\n        \"example\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"johann-sonntagbauer\",\n      \"name\": \"Johann Hubert Sonntagbauer\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/1239401?v=4\",\n      \"profile\": \"https://github.com/johann-sonntagbauer\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"maddijoyce\",\n      \"name\": \"Maddi Joyce\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/2224291?v=4\",\n      \"profile\": \"http://www.maddijoyce.com\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"RyanAtViceSoftware\",\n      \"name\": \"Ryan Vice\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/10080111?v=4\",\n      \"profile\": \"http://www.vicesoftware.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"iwilsonq\",\n      \"name\": \"Ian Wilson\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/7942604?v=4\",\n      \"profile\": \"https://ianwilson.io\",\n      \"contributions\": [\n        \"blog\",\n        \"tutorial\"\n      ]\n    },\n    {\n      \"login\": \"InExtremaRes\",\n      \"name\": \"Daniel\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/1635491?v=4\",\n      \"profile\": \"https://github.com/InExtremaRes\",\n      \"contributions\": [\n        \"bug\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Gpx\",\n      \"name\": \"Giorgio Polvara\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/767959?v=4\",\n      \"profile\": \"https://twitter.com/Gpx\",\n      \"contributions\": [\n        \"bug\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"jgoz\",\n      \"name\": \"John Gozde\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/132233?v=4\",\n      \"profile\": \"https://github.com/jgoz\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"SavePointSam\",\n      \"name\": \"Sam Horton\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/8203211?v=4\",\n      \"profile\": \"https://twitter.com/SavePointSam\",\n      \"contributions\": [\n        \"doc\",\n        \"example\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"rkotze\",\n      \"name\": \"Richard Kotze (mobile)\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/10452163?v=4\",\n      \"profile\": \"http://www.richardkotze.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"sotobuild\",\n      \"name\": \"Brahian E. Soto Mercedes\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/10819833?v=4\",\n      \"profile\": \"https://github.com/sotobuild\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"bdelaforest\",\n      \"name\": \"Benoit de La Forest\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/7151559?v=4\",\n      \"profile\": \"https://github.com/bdelaforest\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"thesalah\",\n      \"name\": \"Salah\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/6624197?v=4\",\n      \"profile\": \"https://github.com/thesalah\",\n      \"contributions\": [\n        \"code\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"icfantv\",\n      \"name\": \"Adam Gordon\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/370054?v=4\",\n      \"profile\": \"http://gordonizer.com\",\n      \"contributions\": [\n        \"bug\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"silvenon\",\n      \"name\": \"Matija Marohnić\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/471278?v=4\",\n      \"profile\": \"https://silvenon.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"Dajust\",\n      \"name\": \"Justice Mba\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/8015514?v=4\",\n      \"profile\": \"https://github.com/Dajust\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"MarkPollmann\",\n      \"name\": \"Mark Pollmann\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/5286559?v=4\",\n      \"profile\": \"https://markpollmann.com/\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"ehteshamkafeel\",\n      \"name\": \"Ehtesham Kafeel\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/1213123?v=4\",\n      \"profile\": \"https://github.com/ehteshamkafeel\",\n      \"contributions\": [\n        \"code\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"jpavon\",\n      \"name\": \"Julio Pavón\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/1493505?v=4\",\n      \"profile\": \"http://jpavon.com\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"duncanleung\",\n      \"name\": \"Duncan L\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/1765048?v=4\",\n      \"profile\": \"http://www.duncanleung.com/\",\n      \"contributions\": [\n        \"doc\",\n        \"example\"\n      ]\n    },\n    {\n      \"login\": \"tyagow\",\n      \"name\": \"Tiago Almeida\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/700778?v=4\",\n      \"profile\": \"https://www.linkedin.com/in/tyagow/?locale=en_US\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"rbrtsmith\",\n      \"name\": \"Robert Smith\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/4982001?v=4\",\n      \"profile\": \"http://rbrtsmith.com/\",\n      \"contributions\": [\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"zgreen\",\n      \"name\": \"Zach Green\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1700355?v=4\",\n      \"profile\": \"https://offbyone.tech\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"dadamssg\",\n      \"name\": \"dadamssg\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/881986?v=4\",\n      \"profile\": \"https://github.com/dadamssg\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"YazanAabeed\",\n      \"name\": \"Yazan Aabed\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/8734097?v=4\",\n      \"profile\": \"https://www.yaabed.com/\",\n      \"contributions\": [\n        \"blog\"\n      ]\n    },\n    {\n      \"login\": \"timbonicus\",\n      \"name\": \"Tim\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/556258?v=4\",\n      \"profile\": \"https://github.com/timbonicus\",\n      \"contributions\": [\n        \"bug\",\n        \"code\",\n        \"doc\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"divyanshu013\",\n      \"name\": \"Divyanshu Maithani\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/6682655?v=4\",\n      \"profile\": \"http://divyanshu.xyz\",\n      \"contributions\": [\n        \"tutorial\",\n        \"video\"\n      ]\n    },\n    {\n      \"login\": \"metagrover\",\n      \"name\": \"Deepak Grover\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/9116042?v=4\",\n      \"profile\": \"https://www.linkedin.com/in/metagrover\",\n      \"contributions\": [\n        \"tutorial\",\n        \"video\"\n      ]\n    },\n    {\n      \"login\": \"eyalcohen4\",\n      \"name\": \"Eyal Cohen\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/16276358?v=4\",\n      \"profile\": \"https://github.com/eyalcohen4\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"petermakowski\",\n      \"name\": \"Peter Makowski\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/7452681?v=4\",\n      \"profile\": \"https://github.com/petermakowski\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"Michielnuyts\",\n      \"name\": \"Michiel Nuyts\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/20361668?v=4\",\n      \"profile\": \"https://github.com/Michielnuyts\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"joeynimu\",\n      \"name\": \"Joe Ng'ethe\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1195863?v=4\",\n      \"profile\": \"https://github.com/joeynimu\",\n      \"contributions\": [\n        \"code\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"Enikol\",\n      \"name\": \"Kate\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/19998290?v=4\",\n      \"profile\": \"https://github.com/Enikol\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"SeanRParker\",\n      \"name\": \"Sean\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/11980217?v=4\",\n      \"profile\": \"http://www.seanrparker.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"jlongster\",\n      \"name\": \"James Long\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/17031?v=4\",\n      \"profile\": \"http://jlongster.com\",\n      \"contributions\": [\n        \"ideas\",\n        \"platform\"\n      ]\n    },\n    {\n      \"login\": \"hhagely\",\n      \"name\": \"Herb Hagely\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/10118777?v=4\",\n      \"profile\": \"https://github.com/hhagely\",\n      \"contributions\": [\n        \"example\"\n      ]\n    },\n    {\n      \"login\": \"themostcolm\",\n      \"name\": \"Alex Wendte\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/5779538?v=4\",\n      \"profile\": \"http://www.wendtedesigns.com/\",\n      \"contributions\": [\n        \"example\"\n      ]\n    },\n    {\n      \"login\": \"M0nica\",\n      \"name\": \"Monica Powell\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/6998954?v=4\",\n      \"profile\": \"http://www.aboutmonica.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"sivkoff\",\n      \"name\": \"Vitaly Sivkov\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/2699953?v=4\",\n      \"profile\": \"http://sivkoff.com\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"weyert\",\n      \"name\": \"Weyert de Boer\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/7049?v=4\",\n      \"profile\": \"https://github.com/weyert\",\n      \"contributions\": [\n        \"ideas\",\n        \"review\",\n        \"design\"\n      ]\n    },\n    {\n      \"login\": \"EstebanMarin\",\n      \"name\": \"EstebanMarin\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/13613037?v=4\",\n      \"profile\": \"https://github.com/EstebanMarin\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"vctormb\",\n      \"name\": \"Victor Martins\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/13953703?v=4\",\n      \"profile\": \"https://github.com/vctormb\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"RoystonS\",\n      \"name\": \"Royston Shufflebotham\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/19773?v=4\",\n      \"profile\": \"https://github.com/RoystonS\",\n      \"contributions\": [\n        \"bug\",\n        \"doc\",\n        \"example\"\n      ]\n    },\n    {\n      \"login\": \"chrbala\",\n      \"name\": \"chrbala\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/6834804?v=4\",\n      \"profile\": \"https://github.com/chrbala\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"donavon\",\n      \"name\": \"Donavon West\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/887639?v=4\",\n      \"profile\": \"http://donavon.com\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"ideas\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"maisano\",\n      \"name\": \"Richard Maisano\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/689081?v=4\",\n      \"profile\": \"https://github.com/maisano\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"marcobiedermann\",\n      \"name\": \"Marco Biedermann\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/5244986?v=4\",\n      \"profile\": \"https://www.marcobiedermann.com\",\n      \"contributions\": [\n        \"code\",\n        \"maintenance\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"alexzherdev\",\n      \"name\": \"Alex Zherdev\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/93752?v=4\",\n      \"profile\": \"https://github.com/alexzherdev\",\n      \"contributions\": [\n        \"bug\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Andrewmat\",\n      \"name\": \"André Matulionis dos Santos\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/5133846?v=4\",\n      \"profile\": \"https://twitter.com/Andrewmat\",\n      \"contributions\": [\n        \"code\",\n        \"example\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"FredyC\",\n      \"name\": \"Daniel K.\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1096340?v=4\",\n      \"profile\": \"https://github.com/FredyC\",\n      \"contributions\": [\n        \"bug\",\n        \"code\",\n        \"ideas\",\n        \"test\",\n        \"review\"\n      ]\n    },\n    {\n      \"login\": \"mohamedmagdy17593\",\n      \"name\": \"mohamedmagdy17593\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/40938625?v=4\",\n      \"profile\": \"https://github.com/mohamedmagdy17593\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"lorensr\",\n      \"name\": \"Loren ☺️\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/251288?v=4\",\n      \"profile\": \"http://lorensr.me\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"MarkFalconbridge\",\n      \"name\": \"MarkFalconbridge\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/20678943?v=4\",\n      \"profile\": \"https://github.com/MarkFalconbridge\",\n      \"contributions\": [\n        \"bug\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"viniciusavieira\",\n      \"name\": \"Vinicius\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/2073019?v=4\",\n      \"profile\": \"https://github.com/viniciusavieira\",\n      \"contributions\": [\n        \"doc\",\n        \"example\"\n      ]\n    },\n    {\n      \"login\": \"pschyma\",\n      \"name\": \"Peter Schyma\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/2489928?v=4\",\n      \"profile\": \"https://github.com/pschyma\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ianschmitz\",\n      \"name\": \"Ian Schmitz\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/6355370?v=4\",\n      \"profile\": \"https://github.com/ianschmitz\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"joual\",\n      \"name\": \"Joel Marcotte\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/157877?v=4\",\n      \"profile\": \"https://github.com/joual\",\n      \"contributions\": [\n        \"bug\",\n        \"test\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"aledustet\",\n      \"name\": \"Alejandro Dustet\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/2413802?v=4\",\n      \"profile\": \"http://aledustet.com\",\n      \"contributions\": [\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"bcarroll22\",\n      \"name\": \"Brandon Carroll\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/11020406?v=4\",\n      \"profile\": \"https://github.com/bcarroll22\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"lucas0707\",\n      \"name\": \"Lucas Machado\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/26284338?v=4\",\n      \"profile\": \"https://github.com/lucas0707\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"pascalduez\",\n      \"name\": \"Pascal Duez\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/335467?v=4\",\n      \"profile\": \"http://pascalduez.me\",\n      \"contributions\": [\n        \"platform\"\n      ]\n    },\n    {\n      \"login\": \"NMinhNguyen\",\n      \"name\": \"Minh Nguyen\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/2852660?v=4\",\n      \"profile\": \"https://twitter.com/minh_ngvyen\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"LiaoJimmy\",\n      \"name\": \"LiaoJimmy\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/11155585?v=4\",\n      \"profile\": \"http://iababy46.blogspot.tw/\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"threepointone\",\n      \"name\": \"Sunil Pai\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/18808?v=4\",\n      \"profile\": \"https://github.com/threepointone\",\n      \"contributions\": [\n        \"code\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"gaearon\",\n      \"name\": \"Dan Abramov\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/810438?v=4\",\n      \"profile\": \"http://twitter.com/dan_abramov\",\n      \"contributions\": [\n        \"review\"\n      ]\n    },\n    {\n      \"login\": \"ChristianMurphy\",\n      \"name\": \"Christian Murphy\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/3107513?v=4\",\n      \"profile\": \"https://github.com/ChristianMurphy\",\n      \"contributions\": [\n        \"infra\"\n      ]\n    },\n    {\n      \"login\": \"jeetiss\",\n      \"name\": \"Ivakhnenko Dmitry\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/6726016?v=4\",\n      \"profile\": \"https://jeetiss.github.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jamesgeorge007\",\n      \"name\": \"James George\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/25279263?v=4\",\n      \"profile\": \"https://ghuser.io/jamesgeorge007\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"JSFernandes\",\n      \"name\": \"João Fernandes\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/1075053?v=4\",\n      \"profile\": \"https://joaofernandes.me/\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"alejandroperea\",\n      \"name\": \"Alejandro Perea\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/6084749?v=4\",\n      \"profile\": \"https://github.com/alejandroperea\",\n      \"contributions\": [\n        \"review\"\n      ]\n    },\n    {\n      \"login\": \"nickmccurdy\",\n      \"name\": \"Nick McCurdy\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/927220?v=4\",\n      \"profile\": \"https://nickmccurdy.com/\",\n      \"contributions\": [\n        \"review\",\n        \"question\",\n        \"infra\"\n      ]\n    },\n    {\n      \"login\": \"eps1lon\",\n      \"name\": \"Sebastian Silbermann\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/12292047?v=4\",\n      \"profile\": \"https://twitter.com/sebsilbermann\",\n      \"contributions\": [\n        \"review\"\n      ]\n    },\n    {\n      \"login\": \"afontcu\",\n      \"name\": \"Adrià Fontcuberta\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/9197791?v=4\",\n      \"profile\": \"https://afontcu.dev\",\n      \"contributions\": [\n        \"review\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"johnnyreilly\",\n      \"name\": \"John Reilly\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1010525?v=4\",\n      \"profile\": \"https://blog.johnnyreilly.com/\",\n      \"contributions\": [\n        \"review\"\n      ]\n    },\n    {\n      \"login\": \"MichaelDeBoey\",\n      \"name\": \"Michaël De Boey\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/6643991?v=4\",\n      \"profile\": \"https://michaeldeboey.be\",\n      \"contributions\": [\n        \"review\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"cimbul\",\n      \"name\": \"Tim Yates\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/927923?v=4\",\n      \"profile\": \"https://cimbul.com\",\n      \"contributions\": [\n        \"review\"\n      ]\n    },\n    {\n      \"login\": \"eventualbuddha\",\n      \"name\": \"Brian Donovan\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/1938?v=4\",\n      \"profile\": \"https://github.com/eventualbuddha\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"JaysQubeXon\",\n      \"name\": \"Noam Gabriel Jacobson\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/18309230?v=4\",\n      \"profile\": \"https://github.com/JaysQubeXon\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"rvdkooy\",\n      \"name\": \"Ronald van der Kooij\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/4119960?v=4\",\n      \"profile\": \"https://github.com/rvdkooy\",\n      \"contributions\": [\n        \"test\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"aayushrajvanshi\",\n      \"name\": \"Aayush Rajvanshi\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/14968551?v=4\",\n      \"profile\": \"https://github.com/aayushrajvanshi\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"ely-alamillo\",\n      \"name\": \"Ely Alamillo\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/24350492?v=4\",\n      \"profile\": \"https://elyalamillo.com\",\n      \"contributions\": [\n        \"code\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"danieljcafonso\",\n      \"name\": \"Daniel Afonso\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/35337607?v=4\",\n      \"profile\": \"https://github.com/danieljcafonso\",\n      \"contributions\": [\n        \"code\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"LaurensBosscher\",\n      \"name\": \"Laurens Bosscher\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/13363196?v=4\",\n      \"profile\": \"http://www.laurensbosscher.nl\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"sakito21\",\n      \"name\": \"Sakito Mukai\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/15010907?v=4\",\n      \"profile\": \"https://twitter.com/__sakito__\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"tteke\",\n      \"name\": \"Türker Teke\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/12457162?v=4\",\n      \"profile\": \"http://turkerteke.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"zbrogz\",\n      \"name\": \"Zach Brogan\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/319162?v=4\",\n      \"profile\": \"http://linkedin.com/in/zachbrogan\",\n      \"contributions\": [\n        \"code\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"ryota-murakami\",\n      \"name\": \"Ryota Murakami\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/5501268?v=4\",\n      \"profile\": \"https://ryota-murakami.github.io/\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"hottmanmichael\",\n      \"name\": \"Michael Hottman\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/10534502?v=4\",\n      \"profile\": \"https://github.com/hottmanmichael\",\n      \"contributions\": [\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"stevenfitzpatrick\",\n      \"name\": \"Steven Fitzpatrick\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/23268855?v=4\",\n      \"profile\": \"https://github.com/stevenfitzpatrick\",\n      \"contributions\": [\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"juangl\",\n      \"name\": \"Juan Je García\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1887029?v=4\",\n      \"profile\": \"https://github.com/juangl\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"Ishaan28malik\",\n      \"name\": \"Championrunner\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/27343592?v=4\",\n      \"profile\": \"https://ghuser.io/Ishaan28malik\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"samtsai\",\n      \"name\": \"Sam Tsai\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/225526?v=4\",\n      \"profile\": \"https://github.com/samtsai\",\n      \"contributions\": [\n        \"code\",\n        \"test\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"screendriver\",\n      \"name\": \"Christian Rackerseder\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/149248?v=4\",\n      \"profile\": \"https://www.echooff.dev\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"NiGhTTraX\",\n      \"name\": \"Andrei Picus\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/485061?v=4\",\n      \"profile\": \"https://github.com/NiGhTTraX\",\n      \"contributions\": [\n        \"bug\",\n        \"review\"\n      ]\n    },\n    {\n      \"login\": \"kettanaito\",\n      \"name\": \"Artem Zakharchenko\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/14984911?v=4\",\n      \"profile\": \"https://redd.one\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"michael-siek\",\n      \"name\": \"Michael\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/45568605?v=4\",\n      \"profile\": \"http://michaelsiek.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"2dubbing\",\n      \"name\": \"Braden Lee\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/15885679?v=4\",\n      \"profile\": \"http://2dubbing.tistory.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"kamranayub\",\n      \"name\": \"Kamran Ayub\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/563819?v=4\",\n      \"profile\": \"http://kamranicus.com/\",\n      \"contributions\": [\n        \"code\",\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"MatanBobi\",\n      \"name\": \"Matan Borenkraout\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/12711091?v=4\",\n      \"profile\": \"https://twitter.com/matanbobi\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"radar\",\n      \"name\": \"Ryan Bigg\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/2687?v=4\",\n      \"profile\": \"http://ryanbigg.com\",\n      \"contributions\": [\n        \"maintenance\"\n      ]\n    },\n    {\n      \"login\": \"antonhalim\",\n      \"name\": \"Anton Halim\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/10498035?v=4\",\n      \"profile\": \"https://antonhalim.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"artem-malko\",\n      \"name\": \"Artem Malko\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1823689?v=4\",\n      \"profile\": \"http://artmalko.ru\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ljosberinn\",\n      \"name\": \"Gerrit Alex\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/29307652?v=4\",\n      \"profile\": \"http://gerritalex.de\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"karthick3018\",\n      \"name\": \"Karthick Raja\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/47154512?v=4\",\n      \"profile\": \"https://github.com/karthick3018\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"theashraf\",\n      \"name\": \"Abdelrahman Ashraf\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/39750790?v=4\",\n      \"profile\": \"https://github.com/theashraf\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"lidoravitan\",\n      \"name\": \"Lidor Avitan\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/35113398?v=4\",\n      \"profile\": \"https://github.com/lidoravitan\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"ljharb\",\n      \"name\": \"Jordan Harband\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/45469?v=4\",\n      \"profile\": \"https://github.com/ljharb\",\n      \"contributions\": [\n        \"review\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"marcosvega91\",\n      \"name\": \"Marco Moretti\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/5365582?v=4\",\n      \"profile\": \"https://github.com/marcosvega91\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"sanchit121\",\n      \"name\": \"sanchit121\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/30828115?v=4\",\n      \"profile\": \"https://github.com/sanchit121\",\n      \"contributions\": [\n        \"bug\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"solufa\",\n      \"name\": \"Solufa\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/9402912?v=4\",\n      \"profile\": \"https://github.com/solufa\",\n      \"contributions\": [\n        \"bug\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"AriPerkkio\",\n      \"name\": \"Ari Perkkiö\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/14806298?v=4\",\n      \"profile\": \"https://codepen.io/ariperkkio/\",\n      \"contributions\": [\n        \"test\"\n      ]\n    },\n    {\n      \"login\": \"jhnns\",\n      \"name\": \"Johannes Ewald\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/781746?v=4\",\n      \"profile\": \"https://github.com/jhnns\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"anpaopao\",\n      \"name\": \"Angus J. Pope\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/44686792?v=4\",\n      \"profile\": \"https://github.com/anpaopao\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"leschdom\",\n      \"name\": \"Dominik Lesch\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/62334278?v=4\",\n      \"profile\": \"https://github.com/leschdom\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"ImADrafter\",\n      \"name\": \"Marcos Gómez\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/44379989?v=4\",\n      \"profile\": \"https://github.com/ImADrafter\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"akashshyamdev\",\n      \"name\": \"Akash Shyam\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/56759828?v=4\",\n      \"profile\": \"https://www.akashshyam.online/\",\n      \"contributions\": [\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"fmeum\",\n      \"name\": \"Fabian Meumertzheim\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4312191?v=4\",\n      \"profile\": \"https://hen.ne.ke\",\n      \"contributions\": [\n        \"code\",\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"Nokel81\",\n      \"name\": \"Sebastian Malton\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8225332?v=4\",\n      \"profile\": \"https://github.com/Nokel81\",\n      \"contributions\": [\n        \"bug\",\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mboettcher\",\n      \"name\": \"Martin Böttcher\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2325337?v=4\",\n      \"profile\": \"https://github.com/mboettcher\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"TkDodo\",\n      \"name\": \"Dominik Dorfmeister\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1021430?v=4\",\n      \"profile\": \"http://tkdodo.eu\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"stephensauceda\",\n      \"name\": \"Stephen Sauceda\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1017723?v=4\",\n      \"profile\": \"https://stephensauceda.com\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"cmdcolin\",\n      \"name\": \"Colin Diesh\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6511937?v=4\",\n      \"profile\": \"http://cmdcolin.github.io\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"yinm\",\n      \"name\": \"Yusuke Iinuma\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/13295106?v=4\",\n      \"profile\": \"http://yinm.info\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"trappar\",\n      \"name\": \"Jeff Way\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/525726?v=4\",\n      \"profile\": \"https://github.com/trappar\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"bernardobelchior\",\n      \"name\": \"Bernardo Belchior\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/12778398?v=4\",\n      \"profile\": \"http://belchior.me\",\n      \"contributions\": [\n        \"code\",\n        \"doc\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7,\n  \"repoHost\": \"https://github.com\",\n  \"commitType\": \"docs\",\n  \"commitConvention\": \"angular\"\n}\n"
  },
  {
    "path": ".bundle.main.env",
    "content": "BUILD_GLOBALS={\"react-dom/test-utils\":\"ReactTestUtils\",\"react\":\"React\",\"react-dom\":\"ReactDOM\"}\n\n"
  },
  {
    "path": ".bundle.pure.env",
    "content": "BUILD_FILENAME_SUFFIX=.pure\nBUILD_INPUT=src/pure.js\n\n"
  },
  {
    "path": ".codesandbox/ci.json",
    "content": "{\n  \"installCommand\": \"install:csb\",\n  \"sandboxes\": [\"new\", \"github/kentcdodds/react-testing-library-examples\"],\n  \"node\": \"18\"\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Bug_Report.md",
    "content": "---\nname: 🐛 Bug Report\nabout: Bugs, missing documentation, or unexpected behavior 🤔.\n---\n\n<!--\n\n* Please fill out this template with all the relevant information so we can\n  understand what's going on and fix the issue. We appreciate bugs filed and PRs\n  submitted!\n\n* If your issue is regarding one of the query APIs (`getByText`,\n  `getByLabelText`, etc), then please file it on the `dom-testing-library`\n  repository instead. If you file it here it will be closed. Thanks :)\n\n* Please make sure that you are familiar with and follow the Code of Conduct for\n  this project (found in the CODE_OF_CONDUCT.md file).\n\nWe'll probably ask you to submit the fix (after giving some direction). If\nyou've never done that before, that's great! Check this free short video\ntutorial to learn how: http://kcd.im/pull-request\n\n-->\n\n- `@testing-library/react` version:\n- Testing Framework and version:\n  <!-- are you using jest, mocha, puppeteer, ava? And what version? -->\n- DOM Environment:\n  <!-- If you're using jsdom (the default with jest), what version? Otherwise, what browser and version are you running tests in? -->\n\n<!--\nKeep in mind that if you're using a version of node we don't support that\ncould also be an issue. Check our package.json file \"engines\" config for the\nsupported version.\n\nAlso keep in mind that if you're using a version of react we don't support\nthat could be an issue. Check our package.json file \"peerDependencies\" config\nfor the supported version.\n-->\n\n### Relevant code or config:\n\n```js\nvar your => (code) => here;\n```\n\n<!--\nIf this is an issue with documentation, please file an issue on the docs repo:\nhttps://github.com/testing-library/testing-library-docs\n-->\n\n### What you did:\n\n<!-- What you were doing -->\n\n### What happened:\n\n<!-- Please provide the full error message/screenshots/anything -->\n\n### Reproduction:\n\n<!--\nIf possible, please try to reproduce this issue in Stackblitz. You can fork the one\nhere: https://testing-library.com/new-rtl\n-->\n\n### Problem description:\n\n<!-- Please describe why the current behavior is a problem -->\n\n### Suggested solution:\n\n<!--\nIt's ok if you don't have a suggested solution, but it really helps if you could\ndo a little digging to come up with some suggestion of how to improve things.\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Feature_Request.md",
    "content": "---\nname: 💡 Feature Request\nabout: I have a suggestion (and might want to implement myself 🙂)!\n---\n\n<!--\n\nVote on feature requests by adding a 👍. This helps maintainers prioritize what\nto work on.\n\n* Please fill out this template with all the relevant information so we can\n  understand what's going on and fix the issue. We appreciate bugs filed and PRs\n  submitted!\n\n* If you're issue is regarding one of the query APIs (`getByText`\n  `getByLabelText`, etc), then please file it on the `dom-testing-library`\n  repository instead. If you file it here it will be closed. Thanks :)\n\n* Please make sure that you are familiar with and follow the Code of Conduct for\n  this project (found in the CODE_OF_CONDUCT.md file).\n\nIt'd be great if after the discussion you're the one who submits the PR that\nimplements this feature. If you've never done that before, that's great! Check\nthis free short video tutorial to learn how: http://kcd.im/pull-request\n\n-->\n\n### Describe the feature you'd like:\n\n<!--\nA clear and concise description of what you want to happen. Add any considered\ndrawbacks.\n-->\n\n### Suggested implementation:\n\n<!-- Helpful but optional 😀 -->\n\n### Describe alternatives you've considered:\n\n<!--\nA clear and concise description of any alternative solutions or features you've\nconsidered.\n-->\n\n### Teachability, Documentation, Adoption, Migration Strategy:\n\n<!--\nIf you can, explain how users will be able to use this and possibly write out a\nversion of the docs.\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Question.md",
    "content": "---\nname: ❓ Support Question\nabout: 🛑 If you have a question 💬, please check out our support channels!\n---\n\n-------------- 👆 Click \"Preview\"!\n\nIssues on GitHub are intended to be related to problems with the library itself\nand feature requests so we recommend not using this medium to ask them here 😁.\n\n---\n\n## ❓ Support Forums\n\nFor questions related to using the library, please visit a support community\ninstead of filing an issue on GitHub. You can follow the instructions in this\ncodesandbox to make a reproduction of your issue: https://kcd.im/rtl-help\n\n- Discord https://discord.gg/testing-library\n- Stack Overflow\n  https://stackoverflow.com/questions/tagged/react-testing-library\n- Documentation: https://github.com/testing-library/testing-library-docs\n\n**ISSUES WHICH ARE QUESTIONS WILL BE CLOSED**\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!--\n\nHI! PLEASE STOP TO READ THIS!! IF YOU DO NOT FOLLOW THE INSTRUCTIONS, YOUR ISSUE\nWILL LIKELY BE CLOSED.\n\nThanks for your interest in the project. We appreciate bugs filed and PRs submitted!\n\n- Please make sure that you are familiar with and follow the Code of Conduct for\n  this project (found in the CODE_OF_CONDUCT.md file).\n\n- Please review the Issues policies before filing an issue:\n\n  🐛 Bugs:\n  File an issue for bugs, missing documentation, or unexpected behavior.\n\n  💡 Feature Requests:\n  File an issue to suggest new features.\n  Vote on feature requests by adding a 👍. This helps maintainers prioritize\n  what to work on.\n\n  ❓ Questions:\n  For questions related to using the library, please visit a support community\n  instead of filing an issue on GitHub. You can follow the instructions in this\n  codesandbox to make a reproduction of your issue: https://kcd.im/rtl-help\n  * Discord\n    https://discord.gg/testing-library\n  * Stack Overflow\n    https://stackoverflow.com/questions/tagged/react-testing-library\n\n  **ISSUES WHICH ARE QUESTIONS WILL BE CLOSED**\n\n- Please fill out this template with all the relevant information so we can\n  understand what's going on and fix the issue.\n\n- If you're issue is regarding one of the query APIs (`getByText`,\n  `getByLabelText`, etc), then please file it on the `dom-testing-library`\n  repository instead. If you file it here it will be closed. Thanks :)\n\nWe'll probably ask you to submit the fix (after giving some direction). If\nyou've never done that before, that's great! Check this free short video\ntutorial to learn how: http://kcd.im/pull-request\n\n-->\n\n- `@testing-library/react` version:\n- Testing Framework and version:\n  <!-- are you using jest, mocha, puppeteer, ava? And what version? -->\n- DOM Environment:\n  <!-- If you're using jsdom (the default with jest), what version? Otherwise, what browser and version are you running tests in? -->\n\n<!--\nKeep in mind that if you're using a version of node we don't support that\ncould also be an issue. Check our package.json file \"engines\" config for the\nsupported version.\n\nAlso keep in mind that if you're using a version of react we don't support\nthat could be an issue. Check our package.json file \"peerDependencies\" config\nfor the supported version.\n-->\n\nRelevant code or config\n\n```javascript\n\n```\n\nWhat you did:\n\nWhat happened:\n\n<!-- Please provide the full error message/screenshots/anything -->\n\nReproduction repository:\n\n<!--\nIf possible, please create a repository that reproduces the issue with the\nminimal amount of code possible. You may fork the template here:\nhttps://github.com/testing-library/dom-testing-library-template\n\nOr if you can, try to reproduce the issue in a codesandbox. You can fork the\none here: https://codesandbox.io/s/5z6x4r7n0p\n-->\n\nProblem description:\n\n<!-- Please describe why the current behavior is a problem -->\n\nSuggested solution:\n\n<!--\nIt's ok if you don't have a suggested solution, but it really helps if you could\ndo a little digging to come up with some suggestion of how to improve things.\n-->\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nThanks for your interest in the project. Bugs filed and PRs submitted are appreciated!\n\nPlease make sure that you are familiar with and follow the Code of Conduct for\nthis project (found in the CODE_OF_CONDUCT.md file).\n\nAlso, please make sure you're familiar with and follow the instructions in the\ncontributing guidelines (found in the CONTRIBUTING.md file).\n\nIf you're new to contributing to open source projects, you might find this free\nvideo course helpful: http://kcd.im/pull-request\n\nPlease fill out the information below to expedite the review and (hopefully)\nmerge of your pull request!\n-->\n\n<!-- What changes are being made? (What feature/bug is being fixed here?) -->\n\n**What**:\n\n<!-- Why are these changes necessary? -->\n\n**Why**:\n\n<!-- How were these changes implemented? -->\n\n**How**:\n\n<!-- Have you done all of these things?  -->\n\n**Checklist**:\n\n<!-- add \"N/A\" to the end of each line that's irrelevant to your changes -->\n\n<!-- to check an item, place an \"x\" in the box like so: \"- [x] Documentation\" -->\n\n- [ ] Documentation added to the\n      [docs site](https://github.com/testing-library/testing-library-docs)\n- [ ] Tests\n- [ ] TypeScript definitions updated\n- [ ] Ready to be merged\n      <!-- In your opinion, is this ready to be merged as soon as it's reviewed? -->\n\n<!-- feel free to add additional comments -->\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: release\non:\n  push:\n    branches:\n      # Match SemVer major release branches\n      # e.g. \"12.x\" or \"8.x\"\n      - '[0-9]+.x'\n      - 'main'\n      - 'next'\n      - 'next-major'\n      - 'beta'\n      - 'alpha'\n      - '!all-contributors/**'\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\npermissions: {}\n\njobs:\n  validate:\n    permissions:\n      contents: read #  to fetch code (actions/checkout)\n    continue-on-error: ${{ matrix.react != 'latest' }}\n    # ignore all-contributors PRs\n    if: ${{ !contains(github.head_ref, 'all-contributors') }}\n    strategy:\n      fail-fast: false\n      matrix:\n        node: [18, 24]\n        react: ['18.x', latest, canary, experimental]\n    runs-on: ubuntu-latest\n    steps:\n      - name: ⬇️ Checkout repo\n        uses: actions/checkout@v4\n\n      - name: ⎔ Setup node\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node }}\n\n      - name: 📥 Download deps\n        uses: bahmutov/npm-install@v1\n        with:\n          useLockFile: false\n\n      # TODO: Can be removed if https://github.com/kentcdodds/kcd-scripts/pull/146 is released\n      - name: Verify format (`npm run format` committed?)\n        run: npm run format -- --check --no-write\n\n      # as requested by the React team :)\n      # https://reactjs.org/blog/2019/10/22/react-release-channels.html#using-the-next-channel-for-integration-testing\n      - name: ⚛️ Setup react\n        run: npm install react@${{ matrix.react }} react-dom@${{ matrix.react }}\n\n      - name: ⚛️ Setup react types\n        if: ${{ matrix.react != 'canary' && matrix.react != 'experimental' }}\n        run:\n          npm install @types/react@${{ matrix.react }} @types/react-dom@${{\n          matrix.react }}\n\n      - name: ▶️ Run validate script\n        run: npm run validate\n\n      - name: ⬆️ Upload coverage report\n        uses: codecov/codecov-action@v5\n        with:\n          fail_ci_if_error: true\n          flags: ${{ matrix.react }}\n          token: ${{ secrets.CODECOV_TOKEN }}\n\n  release:\n    permissions:\n      id-token: write # to enable use of OIDC (npm trusted publishing and provenance)\n      actions: write #  to cancel/stop running workflows (styfle/cancel-workflow-action)\n      contents: write #  to create release tags (cycjimmy/semantic-release-action)\n      issues: write # to post release that resolves an issue (cycjimmy/semantic-release-action)\n      pull-requests: write # to be able to comment on released pull requests\n\n    needs: validate\n    runs-on: ubuntu-latest\n    if:\n      ${{ github.repository == 'testing-library/react-testing-library' &&\n      github.event_name == 'push' }}\n    steps:\n      - name: ⬇️ Checkout repo\n        uses: actions/checkout@v4\n\n      - name: ⎔ Setup node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 24\n\n      - name: 📥 Download deps\n        uses: bahmutov/npm-install@v1\n        with:\n          useLockFile: false\n\n      - name: 🏗 Run build script\n        run: npm run build\n\n      - name: 🚀 Release\n        uses: cycjimmy/semantic-release-action@v5\n        with:\n          semantic_version: 25\n          branches: |\n            [\n              '+([0-9])?(.{+([0-9]),x}).x',\n              'main',\n              'next',\n              'next-major',\n              {name: 'beta', prerelease: true},\n              {name: 'alpha', prerelease: true}\n            ]\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/validate.yml",
    "content": "name: validate\non:\n  pull_request:\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\npermissions:\n  actions: write #  to cancel/stop running workflows (styfle/cancel-workflow-action)\n  contents: read #  to fetch code (actions/checkout)\n\njobs:\n  main:\n    continue-on-error: ${{ matrix.react != 'latest' }}\n    # ignore all-contributors PRs\n    if: ${{ !contains(github.head_ref, 'all-contributors') }}\n    strategy:\n      fail-fast: false\n      matrix:\n        node: [18, 24]\n        react: ['18.x', latest, canary, experimental]\n    runs-on: ubuntu-latest\n    steps:\n      - name: ⬇️ Checkout repo\n        uses: actions/checkout@v4\n\n      - name: ⎔ Setup node\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node }}\n\n      - name: 📥 Download deps\n        uses: bahmutov/npm-install@v1\n        with:\n          useLockFile: false\n\n      # TODO: Can be removed if https://github.com/kentcdodds/kcd-scripts/pull/146 is released\n      - name: Verify format (`npm run format` committed?)\n        run: npm run format -- --check --no-write\n\n      # as requested by the React team :)\n      # https://reactjs.org/blog/2019/10/22/react-release-channels.html#using-the-next-channel-for-integration-testing\n      - name: ⚛️ Setup react\n        run: npm install react@${{ matrix.react }} react-dom@${{ matrix.react }}\n\n      - name: ⚛️ Setup react types\n        if: ${{ matrix.react != 'canary' && matrix.react != 'experimental' }}\n        run:\n          npm install @types/react@${{ matrix.react }} @types/react-dom@${{\n          matrix.react }}\n\n      - name: ▶️ Run validate script\n        run: npm run validate\n\n      - name: ⬆️ Upload coverage report\n        uses: codecov/codecov-action@v5\n        with:\n          fail_ci_if_error: true\n          flags: ${{ matrix.react }}\n          token: ${{ secrets.CODECOV_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\ncoverage\ndist\n.DS_Store\n\n# these cause more harm than good\n# when working with contributors\npackage-lock.json\nyarn.lock\n"
  },
  {
    "path": ".huskyrc.js",
    "content": "module.exports = require('kcd-scripts/husky')\n"
  },
  {
    "path": ".npmrc",
    "content": "registry=https://registry.npmjs.org/\npackage-lock=false\n"
  },
  {
    "path": ".prettierignore",
    "content": "node_modules\ncoverage\ndist\n"
  },
  {
    "path": ".prettierrc.js",
    "content": "module.exports = require('kcd-scripts/prettier')\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# CHANGELOG\n\nThe changelog is automatically updated using\n[semantic-release](https://github.com/semantic-release/semantic-release). You\ncan see it on the [releases page](../../releases).\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n- Demonstrating empathy and kindness toward other people\n- Being respectful of differing opinions, viewpoints, and experiences\n- Giving and gracefully accepting constructive feedback\n- Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n- Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n- The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n- Trolling, insulting or derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n- Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nme+coc@kentcdodds.com. All complaints will be reviewed and investigated promptly\nand fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nThanks for being willing to contribute!\n\n**Working on your first Pull Request?** You can learn how from this _free_\nseries [How to Contribute to an Open Source Project on GitHub][egghead]\n\n## Project setup\n\n1.  Fork and clone the repo\n2.  Run `npm run setup -s` to install dependencies and run validation\n3.  Create a branch for your PR with `git checkout -b pr/your-branch-name`\n\n> Tip: Keep your `main` branch pointing at the original repository and make pull\n> requests from branches on your fork. To do this, run:\n>\n> ```\n> git remote add upstream https://github.com/testing-library/react-testing-library.git\n> git fetch upstream\n> git branch --set-upstream-to=upstream/main main\n> ```\n>\n> This will add the original repository as a \"remote\" called \"upstream,\" Then\n> fetch the git information from that remote, then set your local `main` branch\n> to use the upstream main branch whenever you run `git pull`. Then you can make\n> all of your pull request branches based on this `main` branch. Whenever you\n> want to update your version of `main`, do a regular `git pull`.\n\n## Committing and Pushing changes\n\nPlease make sure to run the tests before you commit your changes. You can run\n`npm run test:update` which will update any snapshots that need updating. Make\nsure to include those changes (if they exist) in your commit.\n\n### Update Typings\n\nIf your PR introduced some changes in the API, you are more than welcome to\nmodify the TypeScript type definition to reflect those changes. Just modify the\n`/types/index.d.ts` file accordingly. If you have never seen TypeScript\ndefinitions before, you can read more about it in its\n[documentation pages](https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html).\nThough this library itself is not written in TypeScript we use\n[dtslint](https://github.com/microsoft/dtslint) to lint our typings.\n\n## Help needed\n\nPlease checkout the [the open issues][issues]\n\nAlso, please watch the repo and respond to questions/bug reports/feature\nrequests! Thanks!\n\n[egghead]:\n  https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github\n[issues]: https://github.com/testing-library/react-testing-library/issues\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\nCopyright (c) 2017-Present Kent C. Dodds\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n<h1>React Testing Library</h1>\n\n<a href=\"https://www.emojione.com/emoji/1f410\">\n  <img\n    height=\"80\"\n    width=\"80\"\n    alt=\"goat\"\n    src=\"https://raw.githubusercontent.com/testing-library/react-testing-library/main/other/goat.png\"\n  />\n</a>\n\n<p>Simple and complete React DOM testing utilities that encourage good testing\npractices.</p>\n\n<br />\n\n[**Read The Docs**](https://testing-library.com/react) |\n[Edit the docs](https://github.com/testing-library/testing-library-docs)\n\n<br />\n</div>\n\n<hr />\n\n<!-- prettier-ignore-start -->\n[![Build Status][build-badge]][build]\n[![Code Coverage][coverage-badge]][coverage]\n[![version][version-badge]][package]\n[![downloads][downloads-badge]][npmtrends]\n[![MIT License][license-badge]][license]\n[![All Contributors][all-contributors-badge]](#contributors)\n[![PRs Welcome][prs-badge]][prs]\n[![Code of Conduct][coc-badge]][coc]\n[![Discord][discord-badge]][discord]\n\n[![Watch on GitHub][github-watch-badge]][github-watch]\n[![Star on GitHub][github-star-badge]][github-star]\n[![Tweet][twitter-badge]][twitter]\n<!-- prettier-ignore-end -->\n\n<div align=\"center\">\n  <a href=\"https://testingjavascript.com\">\n    <img\n      width=\"500\"\n      alt=\"TestingJavaScript.com Learn the smart, efficient way to test any JavaScript application.\"\n      src=\"https://raw.githubusercontent.com/testing-library/react-testing-library/main/other/testingjavascript.jpg\"\n    />\n  </a>\n</div>\n\n## Table of Contents\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [The problem](#the-problem)\n- [The solution](#the-solution)\n- [Installation](#installation)\n  - [Suppressing unnecessary warnings on React DOM 16.8](#suppressing-unnecessary-warnings-on-react-dom-168)\n- [Examples](#examples)\n  - [Basic Example](#basic-example)\n  - [Complex Example](#complex-example)\n  - [More Examples](#more-examples)\n- [Hooks](#hooks)\n- [Guiding Principles](#guiding-principles)\n- [Docs](#docs)\n- [Issues](#issues)\n  - [🐛 Bugs](#-bugs)\n  - [💡 Feature Requests](#-feature-requests)\n  - [❓ Questions](#-questions)\n- [Contributors](#contributors)\n- [LICENSE](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## The problem\n\nYou want to write maintainable tests for your React components. As a part of\nthis goal, you want your tests to avoid including implementation details of your\ncomponents and rather focus on making your tests give you the confidence for\nwhich they are intended. As part of this, you want your testbase to be\nmaintainable in the long run so refactors of your components (changes to\nimplementation but not functionality) don't break your tests and slow you and\nyour team down.\n\n## The solution\n\nThe `React Testing Library` is a very lightweight solution for testing React\ncomponents. It provides light utility functions on top of `react-dom` and\n`react-dom/test-utils`, in a way that encourages better testing practices. Its\nprimary guiding principle is:\n\n> [The more your tests resemble the way your software is used, the more\n> confidence they can give you.][guiding-principle]\n\n## Installation\n\nThis module is distributed via [npm][npm] which is bundled with [node][node] and\nshould be installed as one of your project's `devDependencies`.  \nStarting from RTL version 16, you'll also need to install\n`@testing-library/dom`:\n\n```\nnpm install --save-dev @testing-library/react @testing-library/dom\n```\n\nor\n\nfor installation via [yarn][yarn]\n\n```\nyarn add --dev @testing-library/react @testing-library/dom\n```\n\nThis library has `peerDependencies` listings for `react`, `react-dom` and\nstarting from RTL version 16 also `@testing-library/dom`.\n\n_React Testing Library versions 13+ require React v18. If your project uses an\nolder version of React, be sure to install version 12:_\n\n```\nnpm install --save-dev @testing-library/react@12\n\n\nyarn add --dev @testing-library/react@12\n```\n\nYou may also be interested in installing `@testing-library/jest-dom` so you can\nuse [the custom jest matchers](https://github.com/testing-library/jest-dom).\n\n> [**Docs**](https://testing-library.com/react)\n\n### Suppressing unnecessary warnings on React DOM 16.8\n\nThere is a known compatibility issue with React DOM 16.8 where you will see the\nfollowing warning:\n\n```\nWarning: An update to ComponentName inside a test was not wrapped in act(...).\n```\n\nIf you cannot upgrade to React DOM 16.9, you may suppress the warnings by adding\nthe following snippet to your test configuration\n([learn more](https://github.com/testing-library/react-testing-library/issues/281)):\n\n```js\n// this is just a little hack to silence a warning that we'll get until we\n// upgrade to 16.9. See also: https://github.com/facebook/react/pull/14853\nconst originalError = console.error\nbeforeAll(() => {\n  console.error = (...args) => {\n    if (/Warning.*not wrapped in act/.test(args[0])) {\n      return\n    }\n    originalError.call(console, ...args)\n  }\n})\n\nafterAll(() => {\n  console.error = originalError\n})\n```\n\n## Examples\n\n### Basic Example\n\n```jsx\n// hidden-message.js\nimport * as React from 'react'\n\n// NOTE: React Testing Library works well with React Hooks and classes.\n// Your tests will be the same regardless of how you write your components.\nfunction HiddenMessage({children}) {\n  const [showMessage, setShowMessage] = React.useState(false)\n  return (\n    <div>\n      <label htmlFor=\"toggle\">Show Message</label>\n      <input\n        id=\"toggle\"\n        type=\"checkbox\"\n        onChange={e => setShowMessage(e.target.checked)}\n        checked={showMessage}\n      />\n      {showMessage ? children : null}\n    </div>\n  )\n}\n\nexport default HiddenMessage\n```\n\n```jsx\n// __tests__/hidden-message.js\n// these imports are something you'd normally configure Jest to import for you\n// automatically. Learn more in the setup docs: https://testing-library.com/docs/react-testing-library/setup#cleanup\nimport '@testing-library/jest-dom'\n// NOTE: jest-dom adds handy assertions to Jest and is recommended, but not required\n\nimport * as React from 'react'\nimport {render, fireEvent, screen} from '@testing-library/react'\nimport HiddenMessage from '../hidden-message'\n\ntest('shows the children when the checkbox is checked', () => {\n  const testMessage = 'Test Message'\n  render(<HiddenMessage>{testMessage}</HiddenMessage>)\n\n  // query* functions will return the element or null if it cannot be found\n  // get* functions will return the element or throw an error if it cannot be found\n  expect(screen.queryByText(testMessage)).toBeNull()\n\n  // the queries can accept a regex to make your selectors more resilient to content tweaks and changes.\n  fireEvent.click(screen.getByLabelText(/show/i))\n\n  // .toBeInTheDocument() is an assertion that comes from jest-dom\n  // otherwise you could use .toBeDefined()\n  expect(screen.getByText(testMessage)).toBeInTheDocument()\n})\n```\n\n### Complex Example\n\n```jsx\n// login.js\nimport * as React from 'react'\n\nfunction Login() {\n  const [state, setState] = React.useReducer((s, a) => ({...s, ...a}), {\n    resolved: false,\n    loading: false,\n    error: null,\n  })\n\n  function handleSubmit(event) {\n    event.preventDefault()\n    const {usernameInput, passwordInput} = event.target.elements\n\n    setState({loading: true, resolved: false, error: null})\n\n    window\n      .fetch('/api/login', {\n        method: 'POST',\n        headers: {'Content-Type': 'application/json'},\n        body: JSON.stringify({\n          username: usernameInput.value,\n          password: passwordInput.value,\n        }),\n      })\n      .then(r => r.json().then(data => (r.ok ? data : Promise.reject(data))))\n      .then(\n        user => {\n          setState({loading: false, resolved: true, error: null})\n          window.localStorage.setItem('token', user.token)\n        },\n        error => {\n          setState({loading: false, resolved: false, error: error.message})\n        },\n      )\n  }\n\n  return (\n    <div>\n      <form onSubmit={handleSubmit}>\n        <div>\n          <label htmlFor=\"usernameInput\">Username</label>\n          <input id=\"usernameInput\" />\n        </div>\n        <div>\n          <label htmlFor=\"passwordInput\">Password</label>\n          <input id=\"passwordInput\" type=\"password\" />\n        </div>\n        <button type=\"submit\">Submit{state.loading ? '...' : null}</button>\n      </form>\n      {state.error ? <div role=\"alert\">{state.error}</div> : null}\n      {state.resolved ? (\n        <div role=\"alert\">Congrats! You're signed in!</div>\n      ) : null}\n    </div>\n  )\n}\n\nexport default Login\n```\n\n```jsx\n// __tests__/login.js\n// again, these first two imports are something you'd normally handle in\n// your testing framework configuration rather than importing them in every file.\nimport '@testing-library/jest-dom'\nimport * as React from 'react'\n// import API mocking utilities from Mock Service Worker.\nimport {rest} from 'msw'\nimport {setupServer} from 'msw/node'\n// import testing utilities\nimport {render, fireEvent, screen} from '@testing-library/react'\nimport Login from '../login'\n\nconst fakeUserResponse = {token: 'fake_user_token'}\nconst server = setupServer(\n  rest.post('/api/login', (req, res, ctx) => {\n    return res(ctx.json(fakeUserResponse))\n  }),\n)\n\nbeforeAll(() => server.listen())\nafterEach(() => {\n  server.resetHandlers()\n  window.localStorage.removeItem('token')\n})\nafterAll(() => server.close())\n\ntest('allows the user to login successfully', async () => {\n  render(<Login />)\n\n  // fill out the form\n  fireEvent.change(screen.getByLabelText(/username/i), {\n    target: {value: 'chuck'},\n  })\n  fireEvent.change(screen.getByLabelText(/password/i), {\n    target: {value: 'norris'},\n  })\n\n  fireEvent.click(screen.getByText(/submit/i))\n\n  // just like a manual tester, we'll instruct our test to wait for the alert\n  // to show up before continuing with our assertions.\n  const alert = await screen.findByRole('alert')\n\n  // .toHaveTextContent() comes from jest-dom's assertions\n  // otherwise you could use expect(alert.textContent).toMatch(/congrats/i)\n  // but jest-dom will give you better error messages which is why it's recommended\n  expect(alert).toHaveTextContent(/congrats/i)\n  expect(window.localStorage.getItem('token')).toEqual(fakeUserResponse.token)\n})\n\ntest('handles server exceptions', async () => {\n  // mock the server error response for this test suite only.\n  server.use(\n    rest.post('/api/login', (req, res, ctx) => {\n      return res(ctx.status(500), ctx.json({message: 'Internal server error'}))\n    }),\n  )\n\n  render(<Login />)\n\n  // fill out the form\n  fireEvent.change(screen.getByLabelText(/username/i), {\n    target: {value: 'chuck'},\n  })\n  fireEvent.change(screen.getByLabelText(/password/i), {\n    target: {value: 'norris'},\n  })\n\n  fireEvent.click(screen.getByText(/submit/i))\n\n  // wait for the error message\n  const alert = await screen.findByRole('alert')\n\n  expect(alert).toHaveTextContent(/internal server error/i)\n  expect(window.localStorage.getItem('token')).toBeNull()\n})\n```\n\n> We recommend using [Mock Service Worker](https://github.com/mswjs/msw) library\n> to declaratively mock API communication in your tests instead of stubbing\n> `window.fetch`, or relying on third-party adapters.\n\n### More Examples\n\n> We're in the process of moving examples to the\n> [docs site](https://testing-library.com/docs/example-codesandbox)\n\nYou'll find runnable examples of testing with different libraries in\n[the `react-testing-library-examples` codesandbox](https://codesandbox.io/s/github/kentcdodds/react-testing-library-examples).\nSome included are:\n\n- [`react-redux`](https://codesandbox.io/s/github/kentcdodds/react-testing-library-examples/tree/main/?fontsize=14&module=%2Fsrc%2F__tests__%2Freact-redux.js&previewwindow=tests)\n- [`react-router`](https://codesandbox.io/s/github/kentcdodds/react-testing-library-examples/tree/main/?fontsize=14&module=%2Fsrc%2F__tests__%2Freact-router.js&previewwindow=tests)\n- [`react-context`](https://codesandbox.io/s/github/kentcdodds/react-testing-library-examples/tree/main/?fontsize=14&module=%2Fsrc%2F__tests__%2Freact-context.js&previewwindow=tests)\n\n## Hooks\n\nIf you are interested in testing a custom hook, check out [React Hooks Testing\nLibrary][react-hooks-testing-library].\n\n> NOTE: it is not recommended to test single-use custom hooks in isolation from\n> the components where it's being used. It's better to test the component that's\n> using the hook rather than the hook itself. The `React Hooks Testing Library`\n> is intended to be used for reusable hooks/libraries.\n\n## Guiding Principles\n\n> [The more your tests resemble the way your software is used, the more\n> confidence they can give you.][guiding-principle]\n\nWe try to only expose methods and utilities that encourage you to write tests\nthat closely resemble how your React components are used.\n\nUtilities are included in this project based on the following guiding\nprinciples:\n\n1.  If it relates to rendering components, it deals with DOM nodes rather than\n    component instances, nor should it encourage dealing with component\n    instances.\n2.  It should be generally useful for testing individual React components or\n    full React applications. While this library is focused on `react-dom`,\n    utilities could be included even if they don't directly relate to\n    `react-dom`.\n3.  Utility implementations and APIs should be simple and flexible.\n\nMost importantly, we want React Testing Library to be pretty light-weight,\nsimple, and easy to understand.\n\n## Docs\n\n[**Read The Docs**](https://testing-library.com/react) |\n[Edit the docs](https://github.com/testing-library/testing-library-docs)\n\n## Issues\n\nLooking to contribute? Look for the [Good First Issue][good-first-issue] label.\n\n### 🐛 Bugs\n\nPlease file an issue for bugs, missing documentation, or unexpected behavior.\n\n[**See Bugs**][bugs]\n\n### 💡 Feature Requests\n\nPlease file an issue to suggest new features. Vote on feature requests by adding\na 👍. This helps maintainers prioritize what to work on.\n\n[**See Feature Requests**][requests]\n\n### ❓ Questions\n\nFor questions related to using the library, please visit a support community\ninstead of filing an issue on GitHub.\n\n- [Discord][discord]\n- [Stack Overflow][stackoverflow]\n\n## Contributors\n\nThanks goes to these people ([emoji key][emojis]):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://kentcdodds.com\"><img src=\"https://avatars.githubusercontent.com/u/1500684?v=3?s=100\" width=\"100px;\" alt=\"Kent C. Dodds\"/><br /><sub><b>Kent C. Dodds</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=kentcdodds\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=kentcdodds\" title=\"Documentation\">📖</a> <a href=\"#infra-kentcdodds\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=kentcdodds\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://audiolion.github.io\"><img src=\"https://avatars1.githubusercontent.com/u/2430381?v=4?s=100\" width=\"100px;\" alt=\"Ryan Castner\"/><br /><sub><b>Ryan Castner</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=audiolion\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.dnlsandiego.com\"><img src=\"https://avatars0.githubusercontent.com/u/8008023?v=4?s=100\" width=\"100px;\" alt=\"Daniel Sandiego\"/><br /><sub><b>Daniel Sandiego</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=dnlsandiego\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Miklet\"><img src=\"https://avatars2.githubusercontent.com/u/12592677?v=4?s=100\" width=\"100px;\" alt=\"Paweł Mikołajczyk\"/><br /><sub><b>Paweł Mikołajczyk</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=Miklet\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://co.linkedin.com/in/alejandronanez/\"><img src=\"https://avatars3.githubusercontent.com/u/464978?v=4?s=100\" width=\"100px;\" alt=\"Alejandro Ñáñez Ortiz\"/><br /><sub><b>Alejandro Ñáñez Ortiz</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=alejandronanez\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/pbomb\"><img src=\"https://avatars0.githubusercontent.com/u/1402095?v=4?s=100\" width=\"100px;\" alt=\"Matt Parrish\"/><br /><sub><b>Matt Parrish</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Apbomb\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=pbomb\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=pbomb\" title=\"Documentation\">📖</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=pbomb\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/wKovacs64\"><img src=\"https://avatars1.githubusercontent.com/u/1288694?v=4?s=100\" width=\"100px;\" alt=\"Justin Hall\"/><br /><sub><b>Justin Hall</b></sub></a><br /><a href=\"#platform-wKovacs64\" title=\"Packaging/porting to new platform\">📦</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/antoaravinth\"><img src=\"https://avatars1.githubusercontent.com/u/1241511?s=460&v=4?s=100\" width=\"100px;\" alt=\"Anto Aravinth\"/><br /><sub><b>Anto Aravinth</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=antoaravinth\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=antoaravinth\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=antoaravinth\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/JonahMoses\"><img src=\"https://avatars2.githubusercontent.com/u/3462296?v=4?s=100\" width=\"100px;\" alt=\"Jonah Moses\"/><br /><sub><b>Jonah Moses</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=JonahMoses\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://team.thebrain.pro\"><img src=\"https://avatars1.githubusercontent.com/u/4002543?v=4?s=100\" width=\"100px;\" alt=\"Łukasz Gandecki\"/><br /><sub><b>Łukasz Gandecki</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=lgandecki\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=lgandecki\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=lgandecki\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://sompylasar.github.io\"><img src=\"https://avatars2.githubusercontent.com/u/498274?v=4?s=100\" width=\"100px;\" alt=\"Ivan Babak\"/><br /><sub><b>Ivan Babak</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Asompylasar\" title=\"Bug reports\">🐛</a> <a href=\"#ideas-sompylasar\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jday3\"><img src=\"https://avatars3.githubusercontent.com/u/4439618?v=4?s=100\" width=\"100px;\" alt=\"Jesse Day\"/><br /><sub><b>Jesse Day</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=jday3\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://gnapse.github.io\"><img src=\"https://avatars0.githubusercontent.com/u/15199?v=4?s=100\" width=\"100px;\" alt=\"Ernesto García\"/><br /><sub><b>Ernesto García</b></sub></a><br /><a href=\"#question-gnapse\" title=\"Answering Questions\">💬</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=gnapse\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=gnapse\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://jomaxx.com\"><img src=\"https://avatars2.githubusercontent.com/u/2747424?v=4?s=100\" width=\"100px;\" alt=\"Josef Maxx Blake\"/><br /><sub><b>Josef Maxx Blake</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=jomaxx\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=jomaxx\" title=\"Documentation\">📖</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=jomaxx\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/baranovskim\"><img src=\"https://avatars1.githubusercontent.com/u/29602306?v=4?s=100\" width=\"100px;\" alt=\"Michal Baranowski\"/><br /><sub><b>Michal Baranowski</b></sub></a><br /><a href=\"#blog-mbaranovski\" title=\"Blogposts\">📝</a> <a href=\"#tutorial-mbaranovski\" title=\"Tutorials\">✅</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/aputhin\"><img src=\"https://avatars3.githubusercontent.com/u/13985684?v=4?s=100\" width=\"100px;\" alt=\"Arthur Puthin\"/><br /><sub><b>Arthur Puthin</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=aputhin\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/thchia\"><img src=\"https://avatars2.githubusercontent.com/u/21194045?v=4?s=100\" width=\"100px;\" alt=\"Thomas Chia\"/><br /><sub><b>Thomas Chia</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=thchia\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=thchia\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://ilegra.com/\"><img src=\"https://avatars3.githubusercontent.com/u/20430611?v=4?s=100\" width=\"100px;\" alt=\"Thiago Galvani\"/><br /><sub><b>Thiago Galvani</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=thiagopaiva99\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://Chriswcs.github.io\"><img src=\"https://avatars1.githubusercontent.com/u/19828824?v=4?s=100\" width=\"100px;\" alt=\"Christian\"/><br /><sub><b>Christian</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=ChrisWcs\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://alexkrolick.com\"><img src=\"https://avatars3.githubusercontent.com/u/1571667?v=4?s=100\" width=\"100px;\" alt=\"Alex Krolick\"/><br /><sub><b>Alex Krolick</b></sub></a><br /><a href=\"#question-alexkrolick\" title=\"Answering Questions\">💬</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=alexkrolick\" title=\"Documentation\">📖</a> <a href=\"#example-alexkrolick\" title=\"Examples\">💡</a> <a href=\"#ideas-alexkrolick\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/johann-sonntagbauer\"><img src=\"https://avatars3.githubusercontent.com/u/1239401?v=4?s=100\" width=\"100px;\" alt=\"Johann Hubert Sonntagbauer\"/><br /><sub><b>Johann Hubert Sonntagbauer</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=johann-sonntagbauer\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=johann-sonntagbauer\" title=\"Documentation\">📖</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=johann-sonntagbauer\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.maddijoyce.com\"><img src=\"https://avatars2.githubusercontent.com/u/2224291?v=4?s=100\" width=\"100px;\" alt=\"Maddi Joyce\"/><br /><sub><b>Maddi Joyce</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=maddijoyce\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.vicesoftware.com\"><img src=\"https://avatars2.githubusercontent.com/u/10080111?v=4?s=100\" width=\"100px;\" alt=\"Ryan Vice\"/><br /><sub><b>Ryan Vice</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=RyanAtViceSoftware\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ianwilson.io\"><img src=\"https://avatars1.githubusercontent.com/u/7942604?v=4?s=100\" width=\"100px;\" alt=\"Ian Wilson\"/><br /><sub><b>Ian Wilson</b></sub></a><br /><a href=\"#blog-iwilsonq\" title=\"Blogposts\">📝</a> <a href=\"#tutorial-iwilsonq\" title=\"Tutorials\">✅</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/InExtremaRes\"><img src=\"https://avatars2.githubusercontent.com/u/1635491?v=4?s=100\" width=\"100px;\" alt=\"Daniel\"/><br /><sub><b>Daniel</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3AInExtremaRes\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=InExtremaRes\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/Gpx\"><img src=\"https://avatars0.githubusercontent.com/u/767959?v=4?s=100\" width=\"100px;\" alt=\"Giorgio Polvara\"/><br /><sub><b>Giorgio Polvara</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3AGpx\" title=\"Bug reports\">🐛</a> <a href=\"#ideas-Gpx\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jgoz\"><img src=\"https://avatars2.githubusercontent.com/u/132233?v=4?s=100\" width=\"100px;\" alt=\"John Gozde\"/><br /><sub><b>John Gozde</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=jgoz\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/SavePointSam\"><img src=\"https://avatars0.githubusercontent.com/u/8203211?v=4?s=100\" width=\"100px;\" alt=\"Sam Horton\"/><br /><sub><b>Sam Horton</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=SavePointSam\" title=\"Documentation\">📖</a> <a href=\"#example-SavePointSam\" title=\"Examples\">💡</a> <a href=\"#ideas-SavePointSam\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.richardkotze.com\"><img src=\"https://avatars2.githubusercontent.com/u/10452163?v=4?s=100\" width=\"100px;\" alt=\"Richard Kotze (mobile)\"/><br /><sub><b>Richard Kotze (mobile)</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=rkotze\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/sotobuild\"><img src=\"https://avatars2.githubusercontent.com/u/10819833?v=4?s=100\" width=\"100px;\" alt=\"Brahian E. Soto Mercedes\"/><br /><sub><b>Brahian E. Soto Mercedes</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=sotobuild\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/bdelaforest\"><img src=\"https://avatars2.githubusercontent.com/u/7151559?v=4?s=100\" width=\"100px;\" alt=\"Benoit de La Forest\"/><br /><sub><b>Benoit de La Forest</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=bdelaforest\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/thesalah\"><img src=\"https://avatars3.githubusercontent.com/u/6624197?v=4?s=100\" width=\"100px;\" alt=\"Salah\"/><br /><sub><b>Salah</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=thesalah\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=thesalah\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://gordonizer.com\"><img src=\"https://avatars2.githubusercontent.com/u/370054?v=4?s=100\" width=\"100px;\" alt=\"Adam Gordon\"/><br /><sub><b>Adam Gordon</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Aicfantv\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=icfantv\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://silvenon.com\"><img src=\"https://avatars2.githubusercontent.com/u/471278?v=4?s=100\" width=\"100px;\" alt=\"Matija Marohnić\"/><br /><sub><b>Matija Marohnić</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=silvenon\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Dajust\"><img src=\"https://avatars3.githubusercontent.com/u/8015514?v=4?s=100\" width=\"100px;\" alt=\"Justice Mba\"/><br /><sub><b>Justice Mba</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=Dajust\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://markpollmann.com/\"><img src=\"https://avatars2.githubusercontent.com/u/5286559?v=4?s=100\" width=\"100px;\" alt=\"Mark Pollmann\"/><br /><sub><b>Mark Pollmann</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=MarkPollmann\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ehteshamkafeel\"><img src=\"https://avatars1.githubusercontent.com/u/1213123?v=4?s=100\" width=\"100px;\" alt=\"Ehtesham Kafeel\"/><br /><sub><b>Ehtesham Kafeel</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=ehteshamkafeel\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=ehteshamkafeel\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://jpavon.com\"><img src=\"https://avatars2.githubusercontent.com/u/1493505?v=4?s=100\" width=\"100px;\" alt=\"Julio Pavón\"/><br /><sub><b>Julio Pavón</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=jpavon\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.duncanleung.com/\"><img src=\"https://avatars3.githubusercontent.com/u/1765048?v=4?s=100\" width=\"100px;\" alt=\"Duncan L\"/><br /><sub><b>Duncan L</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=duncanleung\" title=\"Documentation\">📖</a> <a href=\"#example-duncanleung\" title=\"Examples\">💡</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.linkedin.com/in/tyagow/?locale=en_US\"><img src=\"https://avatars1.githubusercontent.com/u/700778?v=4?s=100\" width=\"100px;\" alt=\"Tiago Almeida\"/><br /><sub><b>Tiago Almeida</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=tyagow\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://rbrtsmith.com/\"><img src=\"https://avatars2.githubusercontent.com/u/4982001?v=4?s=100\" width=\"100px;\" alt=\"Robert Smith\"/><br /><sub><b>Robert Smith</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Arbrtsmith\" title=\"Bug reports\">🐛</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://offbyone.tech\"><img src=\"https://avatars0.githubusercontent.com/u/1700355?v=4?s=100\" width=\"100px;\" alt=\"Zach Green\"/><br /><sub><b>Zach Green</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=zgreen\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dadamssg\"><img src=\"https://avatars3.githubusercontent.com/u/881986?v=4?s=100\" width=\"100px;\" alt=\"dadamssg\"/><br /><sub><b>dadamssg</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=dadamssg\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.yaabed.com/\"><img src=\"https://avatars0.githubusercontent.com/u/8734097?v=4?s=100\" width=\"100px;\" alt=\"Yazan Aabed\"/><br /><sub><b>Yazan Aabed</b></sub></a><br /><a href=\"#blog-YazanAabeed\" title=\"Blogposts\">📝</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/timbonicus\"><img src=\"https://avatars0.githubusercontent.com/u/556258?v=4?s=100\" width=\"100px;\" alt=\"Tim\"/><br /><sub><b>Tim</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Atimbonicus\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=timbonicus\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=timbonicus\" title=\"Documentation\">📖</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=timbonicus\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://divyanshu.xyz\"><img src=\"https://avatars3.githubusercontent.com/u/6682655?v=4?s=100\" width=\"100px;\" alt=\"Divyanshu Maithani\"/><br /><sub><b>Divyanshu Maithani</b></sub></a><br /><a href=\"#tutorial-divyanshu013\" title=\"Tutorials\">✅</a> <a href=\"#video-divyanshu013\" title=\"Videos\">📹</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.linkedin.com/in/metagrover\"><img src=\"https://avatars2.githubusercontent.com/u/9116042?v=4?s=100\" width=\"100px;\" alt=\"Deepak Grover\"/><br /><sub><b>Deepak Grover</b></sub></a><br /><a href=\"#tutorial-metagrover\" title=\"Tutorials\">✅</a> <a href=\"#video-metagrover\" title=\"Videos\">📹</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/eyalcohen4\"><img src=\"https://avatars0.githubusercontent.com/u/16276358?v=4?s=100\" width=\"100px;\" alt=\"Eyal Cohen\"/><br /><sub><b>Eyal Cohen</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=eyalcohen4\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/petermakowski\"><img src=\"https://avatars3.githubusercontent.com/u/7452681?v=4?s=100\" width=\"100px;\" alt=\"Peter Makowski\"/><br /><sub><b>Peter Makowski</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=petermakowski\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Michielnuyts\"><img src=\"https://avatars2.githubusercontent.com/u/20361668?v=4?s=100\" width=\"100px;\" alt=\"Michiel Nuyts\"/><br /><sub><b>Michiel Nuyts</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=Michielnuyts\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/joeynimu\"><img src=\"https://avatars0.githubusercontent.com/u/1195863?v=4?s=100\" width=\"100px;\" alt=\"Joe Ng'ethe\"/><br /><sub><b>Joe Ng'ethe</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=joeynimu\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=joeynimu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Enikol\"><img src=\"https://avatars3.githubusercontent.com/u/19998290?v=4?s=100\" width=\"100px;\" alt=\"Kate\"/><br /><sub><b>Kate</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=Enikol\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.seanrparker.com\"><img src=\"https://avatars1.githubusercontent.com/u/11980217?v=4?s=100\" width=\"100px;\" alt=\"Sean\"/><br /><sub><b>Sean</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=SeanRParker\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://jlongster.com\"><img src=\"https://avatars2.githubusercontent.com/u/17031?v=4?s=100\" width=\"100px;\" alt=\"James Long\"/><br /><sub><b>James Long</b></sub></a><br /><a href=\"#ideas-jlongster\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"#platform-jlongster\" title=\"Packaging/porting to new platform\">📦</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/hhagely\"><img src=\"https://avatars1.githubusercontent.com/u/10118777?v=4?s=100\" width=\"100px;\" alt=\"Herb Hagely\"/><br /><sub><b>Herb Hagely</b></sub></a><br /><a href=\"#example-hhagely\" title=\"Examples\">💡</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.wendtedesigns.com/\"><img src=\"https://avatars2.githubusercontent.com/u/5779538?v=4?s=100\" width=\"100px;\" alt=\"Alex Wendte\"/><br /><sub><b>Alex Wendte</b></sub></a><br /><a href=\"#example-themostcolm\" title=\"Examples\">💡</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.aboutmonica.com\"><img src=\"https://avatars0.githubusercontent.com/u/6998954?v=4?s=100\" width=\"100px;\" alt=\"Monica Powell\"/><br /><sub><b>Monica Powell</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=M0nica\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://sivkoff.com\"><img src=\"https://avatars1.githubusercontent.com/u/2699953?v=4?s=100\" width=\"100px;\" alt=\"Vitaly Sivkov\"/><br /><sub><b>Vitaly Sivkov</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=sivkoff\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/weyert\"><img src=\"https://avatars3.githubusercontent.com/u/7049?v=4?s=100\" width=\"100px;\" alt=\"Weyert de Boer\"/><br /><sub><b>Weyert de Boer</b></sub></a><br /><a href=\"#ideas-weyert\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Aweyert\" title=\"Reviewed Pull Requests\">👀</a> <a href=\"#design-weyert\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/EstebanMarin\"><img src=\"https://avatars3.githubusercontent.com/u/13613037?v=4?s=100\" width=\"100px;\" alt=\"EstebanMarin\"/><br /><sub><b>EstebanMarin</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=EstebanMarin\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/vctormb\"><img src=\"https://avatars2.githubusercontent.com/u/13953703?v=4?s=100\" width=\"100px;\" alt=\"Victor Martins\"/><br /><sub><b>Victor Martins</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=vctormb\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/RoystonS\"><img src=\"https://avatars0.githubusercontent.com/u/19773?v=4?s=100\" width=\"100px;\" alt=\"Royston Shufflebotham\"/><br /><sub><b>Royston Shufflebotham</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3ARoystonS\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=RoystonS\" title=\"Documentation\">📖</a> <a href=\"#example-RoystonS\" title=\"Examples\">💡</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/chrbala\"><img src=\"https://avatars0.githubusercontent.com/u/6834804?v=4?s=100\" width=\"100px;\" alt=\"chrbala\"/><br /><sub><b>chrbala</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=chrbala\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://donavon.com\"><img src=\"https://avatars3.githubusercontent.com/u/887639?v=4?s=100\" width=\"100px;\" alt=\"Donavon West\"/><br /><sub><b>Donavon West</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=donavon\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=donavon\" title=\"Documentation\">📖</a> <a href=\"#ideas-donavon\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=donavon\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/maisano\"><img src=\"https://avatars2.githubusercontent.com/u/689081?v=4?s=100\" width=\"100px;\" alt=\"Richard Maisano\"/><br /><sub><b>Richard Maisano</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=maisano\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.marcobiedermann.com\"><img src=\"https://avatars0.githubusercontent.com/u/5244986?v=4?s=100\" width=\"100px;\" alt=\"Marco Biedermann\"/><br /><sub><b>Marco Biedermann</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=marcobiedermann\" title=\"Code\">💻</a> <a href=\"#maintenance-marcobiedermann\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=marcobiedermann\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/alexzherdev\"><img src=\"https://avatars3.githubusercontent.com/u/93752?v=4?s=100\" width=\"100px;\" alt=\"Alex Zherdev\"/><br /><sub><b>Alex Zherdev</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Aalexzherdev\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=alexzherdev\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/Andrewmat\"><img src=\"https://avatars0.githubusercontent.com/u/5133846?v=4?s=100\" width=\"100px;\" alt=\"André Matulionis dos Santos\"/><br /><sub><b>André Matulionis dos Santos</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=Andrewmat\" title=\"Code\">💻</a> <a href=\"#example-Andrewmat\" title=\"Examples\">💡</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=Andrewmat\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/FredyC\"><img src=\"https://avatars0.githubusercontent.com/u/1096340?v=4?s=100\" width=\"100px;\" alt=\"Daniel K.\"/><br /><sub><b>Daniel K.</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3AFredyC\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=FredyC\" title=\"Code\">💻</a> <a href=\"#ideas-FredyC\" title=\"Ideas, Planning, & Feedback\">🤔</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=FredyC\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3AFredyC\" title=\"Reviewed Pull Requests\">👀</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/mohamedmagdy17593\"><img src=\"https://avatars0.githubusercontent.com/u/40938625?v=4?s=100\" width=\"100px;\" alt=\"mohamedmagdy17593\"/><br /><sub><b>mohamedmagdy17593</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=mohamedmagdy17593\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://lorensr.me\"><img src=\"https://avatars2.githubusercontent.com/u/251288?v=4?s=100\" width=\"100px;\" alt=\"Loren ☺️\"/><br /><sub><b>Loren ☺️</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=lorensr\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/MarkFalconbridge\"><img src=\"https://avatars1.githubusercontent.com/u/20678943?v=4?s=100\" width=\"100px;\" alt=\"MarkFalconbridge\"/><br /><sub><b>MarkFalconbridge</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3AMarkFalconbridge\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=MarkFalconbridge\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/viniciusavieira\"><img src=\"https://avatars0.githubusercontent.com/u/2073019?v=4?s=100\" width=\"100px;\" alt=\"Vinicius\"/><br /><sub><b>Vinicius</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=viniciusavieira\" title=\"Documentation\">📖</a> <a href=\"#example-viniciusavieira\" title=\"Examples\">💡</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/pschyma\"><img src=\"https://avatars2.githubusercontent.com/u/2489928?v=4?s=100\" width=\"100px;\" alt=\"Peter Schyma\"/><br /><sub><b>Peter Schyma</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=pschyma\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ianschmitz\"><img src=\"https://avatars1.githubusercontent.com/u/6355370?v=4?s=100\" width=\"100px;\" alt=\"Ian Schmitz\"/><br /><sub><b>Ian Schmitz</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=ianschmitz\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/joual\"><img src=\"https://avatars0.githubusercontent.com/u/157877?v=4?s=100\" width=\"100px;\" alt=\"Joel Marcotte\"/><br /><sub><b>Joel Marcotte</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Ajoual\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=joual\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=joual\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://aledustet.com\"><img src=\"https://avatars3.githubusercontent.com/u/2413802?v=4?s=100\" width=\"100px;\" alt=\"Alejandro Dustet\"/><br /><sub><b>Alejandro Dustet</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Aaledustet\" title=\"Bug reports\">🐛</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/bcarroll22\"><img src=\"https://avatars2.githubusercontent.com/u/11020406?v=4?s=100\" width=\"100px;\" alt=\"Brandon Carroll\"/><br /><sub><b>Brandon Carroll</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=bcarroll22\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/lucas0707\"><img src=\"https://avatars1.githubusercontent.com/u/26284338?v=4?s=100\" width=\"100px;\" alt=\"Lucas Machado\"/><br /><sub><b>Lucas Machado</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=lucas0707\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://pascalduez.me\"><img src=\"https://avatars3.githubusercontent.com/u/335467?v=4?s=100\" width=\"100px;\" alt=\"Pascal Duez\"/><br /><sub><b>Pascal Duez</b></sub></a><br /><a href=\"#platform-pascalduez\" title=\"Packaging/porting to new platform\">📦</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/minh_ngvyen\"><img src=\"https://avatars3.githubusercontent.com/u/2852660?v=4?s=100\" width=\"100px;\" alt=\"Minh Nguyen\"/><br /><sub><b>Minh Nguyen</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=NMinhNguyen\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://iababy46.blogspot.tw/\"><img src=\"https://avatars0.githubusercontent.com/u/11155585?v=4?s=100\" width=\"100px;\" alt=\"LiaoJimmy\"/><br /><sub><b>LiaoJimmy</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=LiaoJimmy\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/threepointone\"><img src=\"https://avatars2.githubusercontent.com/u/18808?v=4?s=100\" width=\"100px;\" alt=\"Sunil Pai\"/><br /><sub><b>Sunil Pai</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=threepointone\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=threepointone\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://twitter.com/dan_abramov\"><img src=\"https://avatars0.githubusercontent.com/u/810438?v=4?s=100\" width=\"100px;\" alt=\"Dan Abramov\"/><br /><sub><b>Dan Abramov</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Agaearon\" title=\"Reviewed Pull Requests\">👀</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ChristianMurphy\"><img src=\"https://avatars3.githubusercontent.com/u/3107513?v=4?s=100\" width=\"100px;\" alt=\"Christian Murphy\"/><br /><sub><b>Christian Murphy</b></sub></a><br /><a href=\"#infra-ChristianMurphy\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jeetiss.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/6726016?v=4?s=100\" width=\"100px;\" alt=\"Ivakhnenko Dmitry\"/><br /><sub><b>Ivakhnenko Dmitry</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=jeetiss\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ghuser.io/jamesgeorge007\"><img src=\"https://avatars2.githubusercontent.com/u/25279263?v=4?s=100\" width=\"100px;\" alt=\"James George\"/><br /><sub><b>James George</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=jamesgeorge007\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://joaofernandes.me/\"><img src=\"https://avatars1.githubusercontent.com/u/1075053?v=4?s=100\" width=\"100px;\" alt=\"João Fernandes\"/><br /><sub><b>João Fernandes</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=JSFernandes\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/alejandroperea\"><img src=\"https://avatars3.githubusercontent.com/u/6084749?v=4?s=100\" width=\"100px;\" alt=\"Alejandro Perea\"/><br /><sub><b>Alejandro Perea</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Aalejandroperea\" title=\"Reviewed Pull Requests\">👀</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://nickmccurdy.com/\"><img src=\"https://avatars0.githubusercontent.com/u/927220?v=4?s=100\" width=\"100px;\" alt=\"Nick McCurdy\"/><br /><sub><b>Nick McCurdy</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Anickmccurdy\" title=\"Reviewed Pull Requests\">👀</a> <a href=\"#question-nickmccurdy\" title=\"Answering Questions\">💬</a> <a href=\"#infra-nickmccurdy\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/sebsilbermann\"><img src=\"https://avatars3.githubusercontent.com/u/12292047?v=4?s=100\" width=\"100px;\" alt=\"Sebastian Silbermann\"/><br /><sub><b>Sebastian Silbermann</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Aeps1lon\" title=\"Reviewed Pull Requests\">👀</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://afontcu.dev\"><img src=\"https://avatars0.githubusercontent.com/u/9197791?v=4?s=100\" width=\"100px;\" alt=\"Adrià Fontcuberta\"/><br /><sub><b>Adrià Fontcuberta</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Aafontcu\" title=\"Reviewed Pull Requests\">👀</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=afontcu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://blog.johnnyreilly.com/\"><img src=\"https://avatars0.githubusercontent.com/u/1010525?v=4?s=100\" width=\"100px;\" alt=\"John Reilly\"/><br /><sub><b>John Reilly</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Ajohnnyreilly\" title=\"Reviewed Pull Requests\">👀</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://michaeldeboey.be\"><img src=\"https://avatars3.githubusercontent.com/u/6643991?v=4?s=100\" width=\"100px;\" alt=\"Michaël De Boey\"/><br /><sub><b>Michaël De Boey</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3AMichaelDeBoey\" title=\"Reviewed Pull Requests\">👀</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=MichaelDeBoey\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://cimbul.com\"><img src=\"https://avatars2.githubusercontent.com/u/927923?v=4?s=100\" width=\"100px;\" alt=\"Tim Yates\"/><br /><sub><b>Tim Yates</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Acimbul\" title=\"Reviewed Pull Requests\">👀</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/eventualbuddha\"><img src=\"https://avatars3.githubusercontent.com/u/1938?v=4?s=100\" width=\"100px;\" alt=\"Brian Donovan\"/><br /><sub><b>Brian Donovan</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=eventualbuddha\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/JaysQubeXon\"><img src=\"https://avatars1.githubusercontent.com/u/18309230?v=4?s=100\" width=\"100px;\" alt=\"Noam Gabriel Jacobson\"/><br /><sub><b>Noam Gabriel Jacobson</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=JaysQubeXon\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rvdkooy\"><img src=\"https://avatars1.githubusercontent.com/u/4119960?v=4?s=100\" width=\"100px;\" alt=\"Ronald van der Kooij\"/><br /><sub><b>Ronald van der Kooij</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=rvdkooy\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=rvdkooy\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/aayushrajvanshi\"><img src=\"https://avatars0.githubusercontent.com/u/14968551?v=4?s=100\" width=\"100px;\" alt=\"Aayush Rajvanshi\"/><br /><sub><b>Aayush Rajvanshi</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=aayushrajvanshi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://elyalamillo.com\"><img src=\"https://avatars2.githubusercontent.com/u/24350492?v=4?s=100\" width=\"100px;\" alt=\"Ely Alamillo\"/><br /><sub><b>Ely Alamillo</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=ely-alamillo\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=ely-alamillo\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/danieljcafonso\"><img src=\"https://avatars3.githubusercontent.com/u/35337607?v=4?s=100\" width=\"100px;\" alt=\"Daniel Afonso\"/><br /><sub><b>Daniel Afonso</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=danieljcafonso\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=danieljcafonso\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.laurensbosscher.nl\"><img src=\"https://avatars0.githubusercontent.com/u/13363196?v=4?s=100\" width=\"100px;\" alt=\"Laurens Bosscher\"/><br /><sub><b>Laurens Bosscher</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=LaurensBosscher\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/__sakito__\"><img src=\"https://avatars1.githubusercontent.com/u/15010907?v=4?s=100\" width=\"100px;\" alt=\"Sakito Mukai\"/><br /><sub><b>Sakito Mukai</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=sakito21\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://turkerteke.com\"><img src=\"https://avatars3.githubusercontent.com/u/12457162?v=4?s=100\" width=\"100px;\" alt=\"Türker Teke\"/><br /><sub><b>Türker Teke</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=tteke\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://linkedin.com/in/zachbrogan\"><img src=\"https://avatars1.githubusercontent.com/u/319162?v=4?s=100\" width=\"100px;\" alt=\"Zach Brogan\"/><br /><sub><b>Zach Brogan</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=zbrogz\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=zbrogz\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ryota-murakami.github.io/\"><img src=\"https://avatars2.githubusercontent.com/u/5501268?v=4?s=100\" width=\"100px;\" alt=\"Ryota Murakami\"/><br /><sub><b>Ryota Murakami</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=ryota-murakami\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/hottmanmichael\"><img src=\"https://avatars3.githubusercontent.com/u/10534502?v=4?s=100\" width=\"100px;\" alt=\"Michael Hottman\"/><br /><sub><b>Michael Hottman</b></sub></a><br /><a href=\"#ideas-hottmanmichael\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/stevenfitzpatrick\"><img src=\"https://avatars0.githubusercontent.com/u/23268855?v=4?s=100\" width=\"100px;\" alt=\"Steven Fitzpatrick\"/><br /><sub><b>Steven Fitzpatrick</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Astevenfitzpatrick\" title=\"Bug reports\">🐛</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/juangl\"><img src=\"https://avatars0.githubusercontent.com/u/1887029?v=4?s=100\" width=\"100px;\" alt=\"Juan Je García\"/><br /><sub><b>Juan Je García</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=juangl\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ghuser.io/Ishaan28malik\"><img src=\"https://avatars3.githubusercontent.com/u/27343592?v=4?s=100\" width=\"100px;\" alt=\"Championrunner\"/><br /><sub><b>Championrunner</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=Ishaan28malik\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/samtsai\"><img src=\"https://avatars0.githubusercontent.com/u/225526?v=4?s=100\" width=\"100px;\" alt=\"Sam Tsai\"/><br /><sub><b>Sam Tsai</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=samtsai\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=samtsai\" title=\"Tests\">⚠️</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=samtsai\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.echooff.dev\"><img src=\"https://avatars0.githubusercontent.com/u/149248?v=4?s=100\" width=\"100px;\" alt=\"Christian Rackerseder\"/><br /><sub><b>Christian Rackerseder</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=screendriver\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/NiGhTTraX\"><img src=\"https://avatars0.githubusercontent.com/u/485061?v=4?s=100\" width=\"100px;\" alt=\"Andrei Picus\"/><br /><sub><b>Andrei Picus</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3ANiGhTTraX\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3ANiGhTTraX\" title=\"Reviewed Pull Requests\">👀</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://redd.one\"><img src=\"https://avatars3.githubusercontent.com/u/14984911?v=4?s=100\" width=\"100px;\" alt=\"Artem Zakharchenko\"/><br /><sub><b>Artem Zakharchenko</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=kettanaito\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://michaelsiek.com\"><img src=\"https://avatars0.githubusercontent.com/u/45568605?v=4?s=100\" width=\"100px;\" alt=\"Michael\"/><br /><sub><b>Michael</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=michael-siek\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://2dubbing.tistory.com\"><img src=\"https://avatars2.githubusercontent.com/u/15885679?v=4?s=100\" width=\"100px;\" alt=\"Braden Lee\"/><br /><sub><b>Braden Lee</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=2dubbing\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://kamranicus.com/\"><img src=\"https://avatars1.githubusercontent.com/u/563819?v=4?s=100\" width=\"100px;\" alt=\"Kamran Ayub\"/><br /><sub><b>Kamran Ayub</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=kamranayub\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=kamranayub\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/matanbobi\"><img src=\"https://avatars2.githubusercontent.com/u/12711091?v=4?s=100\" width=\"100px;\" alt=\"Matan Borenkraout\"/><br /><sub><b>Matan Borenkraout</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=MatanBobi\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://ryanbigg.com\"><img src=\"https://avatars3.githubusercontent.com/u/2687?v=4?s=100\" width=\"100px;\" alt=\"Ryan Bigg\"/><br /><sub><b>Ryan Bigg</b></sub></a><br /><a href=\"#maintenance-radar\" title=\"Maintenance\">🚧</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://antonhalim.com\"><img src=\"https://avatars1.githubusercontent.com/u/10498035?v=4?s=100\" width=\"100px;\" alt=\"Anton Halim\"/><br /><sub><b>Anton Halim</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=antonhalim\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://artmalko.ru\"><img src=\"https://avatars0.githubusercontent.com/u/1823689?v=4?s=100\" width=\"100px;\" alt=\"Artem Malko\"/><br /><sub><b>Artem Malko</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=artem-malko\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://gerritalex.de\"><img src=\"https://avatars1.githubusercontent.com/u/29307652?v=4?s=100\" width=\"100px;\" alt=\"Gerrit Alex\"/><br /><sub><b>Gerrit Alex</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=ljosberinn\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/karthick3018\"><img src=\"https://avatars1.githubusercontent.com/u/47154512?v=4?s=100\" width=\"100px;\" alt=\"Karthick Raja\"/><br /><sub><b>Karthick Raja</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=karthick3018\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/theashraf\"><img src=\"https://avatars1.githubusercontent.com/u/39750790?v=4?s=100\" width=\"100px;\" alt=\"Abdelrahman Ashraf\"/><br /><sub><b>Abdelrahman Ashraf</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=theashraf\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/lidoravitan\"><img src=\"https://avatars0.githubusercontent.com/u/35113398?v=4?s=100\" width=\"100px;\" alt=\"Lidor Avitan\"/><br /><sub><b>Lidor Avitan</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=lidoravitan\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ljharb\"><img src=\"https://avatars1.githubusercontent.com/u/45469?v=4?s=100\" width=\"100px;\" alt=\"Jordan Harband\"/><br /><sub><b>Jordan Harband</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/pulls?q=is%3Apr+reviewed-by%3Aljharb\" title=\"Reviewed Pull Requests\">👀</a> <a href=\"#ideas-ljharb\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/marcosvega91\"><img src=\"https://avatars2.githubusercontent.com/u/5365582?v=4?s=100\" width=\"100px;\" alt=\"Marco Moretti\"/><br /><sub><b>Marco Moretti</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=marcosvega91\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/sanchit121\"><img src=\"https://avatars2.githubusercontent.com/u/30828115?v=4?s=100\" width=\"100px;\" alt=\"sanchit121\"/><br /><sub><b>sanchit121</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Asanchit121\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=sanchit121\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/solufa\"><img src=\"https://avatars.githubusercontent.com/u/9402912?v=4?s=100\" width=\"100px;\" alt=\"Solufa\"/><br /><sub><b>Solufa</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Asolufa\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=solufa\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://codepen.io/ariperkkio/\"><img src=\"https://avatars.githubusercontent.com/u/14806298?v=4?s=100\" width=\"100px;\" alt=\"Ari Perkkiö\"/><br /><sub><b>Ari Perkkiö</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=AriPerkkio\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jhnns\"><img src=\"https://avatars.githubusercontent.com/u/781746?v=4?s=100\" width=\"100px;\" alt=\"Johannes Ewald\"/><br /><sub><b>Johannes Ewald</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=jhnns\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/anpaopao\"><img src=\"https://avatars.githubusercontent.com/u/44686792?v=4?s=100\" width=\"100px;\" alt=\"Angus J. Pope\"/><br /><sub><b>Angus J. Pope</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=anpaopao\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/leschdom\"><img src=\"https://avatars.githubusercontent.com/u/62334278?v=4?s=100\" width=\"100px;\" alt=\"Dominik Lesch\"/><br /><sub><b>Dominik Lesch</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=leschdom\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ImADrafter\"><img src=\"https://avatars.githubusercontent.com/u/44379989?v=4?s=100\" width=\"100px;\" alt=\"Marcos Gómez\"/><br /><sub><b>Marcos Gómez</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=ImADrafter\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.akashshyam.online/\"><img src=\"https://avatars.githubusercontent.com/u/56759828?v=4?s=100\" width=\"100px;\" alt=\"Akash Shyam\"/><br /><sub><b>Akash Shyam</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Aakashshyamdev\" title=\"Bug reports\">🐛</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://hen.ne.ke\"><img src=\"https://avatars.githubusercontent.com/u/4312191?v=4?s=100\" width=\"100px;\" alt=\"Fabian Meumertzheim\"/><br /><sub><b>Fabian Meumertzheim</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=fmeum\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3Afmeum\" title=\"Bug reports\">🐛</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Nokel81\"><img src=\"https://avatars.githubusercontent.com/u/8225332?v=4?s=100\" width=\"100px;\" alt=\"Sebastian Malton\"/><br /><sub><b>Sebastian Malton</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/issues?q=author%3ANokel81\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=Nokel81\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/mboettcher\"><img src=\"https://avatars.githubusercontent.com/u/2325337?v=4?s=100\" width=\"100px;\" alt=\"Martin Böttcher\"/><br /><sub><b>Martin Böttcher</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=mboettcher\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://tkdodo.eu\"><img src=\"https://avatars.githubusercontent.com/u/1021430?v=4?s=100\" width=\"100px;\" alt=\"Dominik Dorfmeister\"/><br /><sub><b>Dominik Dorfmeister</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=TkDodo\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://stephensauceda.com\"><img src=\"https://avatars.githubusercontent.com/u/1017723?v=4?s=100\" width=\"100px;\" alt=\"Stephen Sauceda\"/><br /><sub><b>Stephen Sauceda</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=stephensauceda\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://cmdcolin.github.io\"><img src=\"https://avatars.githubusercontent.com/u/6511937?v=4?s=100\" width=\"100px;\" alt=\"Colin Diesh\"/><br /><sub><b>Colin Diesh</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=cmdcolin\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://yinm.info\"><img src=\"https://avatars.githubusercontent.com/u/13295106?v=4?s=100\" width=\"100px;\" alt=\"Yusuke Iinuma\"/><br /><sub><b>Yusuke Iinuma</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=yinm\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/trappar\"><img src=\"https://avatars.githubusercontent.com/u/525726?v=4?s=100\" width=\"100px;\" alt=\"Jeff Way\"/><br /><sub><b>Jeff Way</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=trappar\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://belchior.me\"><img src=\"https://avatars.githubusercontent.com/u/12778398?v=4?s=100\" width=\"100px;\" alt=\"Bernardo Belchior\"/><br /><sub><b>Bernardo Belchior</b></sub></a><br /><a href=\"https://github.com/testing-library/react-testing-library/commits?author=bernardobelchior\" title=\"Code\">💻</a> <a href=\"https://github.com/testing-library/react-testing-library/commits?author=bernardobelchior\" title=\"Documentation\">📖</a></td>\n    </tr>\n  </tbody>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors][all-contributors] specification.\nContributions of any kind welcome!\n\n## LICENSE\n\n[MIT](LICENSE)\n\n<!-- prettier-ignore-start -->\n\n[npm]: https://www.npmjs.com/\n[yarn]: https://classic.yarnpkg.com\n[node]: https://nodejs.org\n[build-badge]: https://img.shields.io/github/actions/workflow/status/testing-library/react-testing-library/validate.yml?branch=main&logo=github\n[build]: https://github.com/testing-library/react-testing-library/actions?query=workflow%3Avalidate\n[coverage-badge]: https://img.shields.io/codecov/c/github/testing-library/react-testing-library.svg?style=flat-square\n[coverage]: https://codecov.io/github/testing-library/react-testing-library\n[version-badge]: https://img.shields.io/npm/v/@testing-library/react.svg?style=flat-square\n[package]: https://www.npmjs.com/package/@testing-library/react\n[downloads-badge]: https://img.shields.io/npm/dm/@testing-library/react.svg?style=flat-square\n[npmtrends]: http://www.npmtrends.com/@testing-library/react\n[license-badge]: https://img.shields.io/npm/l/@testing-library/react.svg?style=flat-square\n[license]: https://github.com/testing-library/react-testing-library/blob/main/LICENSE\n[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\n[prs]: http://makeapullrequest.com\n[coc-badge]: https://img.shields.io/badge/code%20of-conduct-ff69b4.svg?style=flat-square\n[coc]: https://github.com/testing-library/react-testing-library/blob/main/CODE_OF_CONDUCT.md\n[github-watch-badge]: https://img.shields.io/github/watchers/testing-library/react-testing-library.svg?style=social\n[github-watch]: https://github.com/testing-library/react-testing-library/watchers\n[github-star-badge]: https://img.shields.io/github/stars/testing-library/react-testing-library.svg?style=social\n[github-star]: https://github.com/testing-library/react-testing-library/stargazers\n[twitter]: https://twitter.com/intent/tweet?text=Check%20out%20react-testing-library%20by%20%40@TestingLib%20https%3A%2F%2Fgithub.com%2Ftesting-library%2Freact-testing-library%20%F0%9F%91%8D\n[twitter-badge]: https://img.shields.io/twitter/url/https/github.com/testing-library/react-testing-library.svg?style=social\n[emojis]: https://github.com/all-contributors/all-contributors#emoji-key\n[all-contributors]: https://github.com/all-contributors/all-contributors\n[all-contributors-badge]: https://img.shields.io/github/all-contributors/testing-library/react-testing-library?color=orange&style=flat-square\n[guiding-principle]: https://twitter.com/kentcdodds/status/977018512689455106\n[bugs]: https://github.com/testing-library/react-testing-library/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Acreated-desc\n[requests]: https://github.com/testing-library/react-testing-library/issues?q=is%3Aissue+sort%3Areactions-%2B1-desc+label%3Aenhancement+is%3Aopen\n[good-first-issue]: https://github.com/testing-library/react-testing-library/issues?utf8=✓&q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3A\"good+first+issue\"+\n[discord-badge]: https://img.shields.io/discord/723559267868737556.svg?color=7389D8&labelColor=6A7EC2&logo=discord&logoColor=ffffff&style=flat-square\n[discord]: https://discord.gg/testing-library\n[stackoverflow]: https://stackoverflow.com/questions/tagged/react-testing-library\n[react-hooks-testing-library]: https://github.com/testing-library/react-hooks-testing-library\n\n<!-- prettier-ignore-end -->\n"
  },
  {
    "path": "codecov.yml",
    "content": "coverage:\n  status:\n    project:\n      default:\n        # basic\n        target: 100%\n        threshold: 0%\n        flags:\n          - canary\n          - experimental\n          - latest\n        branches:\n          - main\n          - 12.x\n        if_ci_failed: success\n        if_not_found: failure\n        informational: false\n        only_pulls: false\ngithub_checks:\n  annotations: true\n"
  },
  {
    "path": "dont-cleanup-after-each.js",
    "content": "process.env.RTL_SKIP_AUTO_CLEANUP = true\n"
  },
  {
    "path": "jest.config.js",
    "content": "const {jest: jestConfig} = require('kcd-scripts/config')\n\nmodule.exports = Object.assign(jestConfig, {\n  coverageThreshold: {\n    ...jestConfig.coverageThreshold,\n    // Full coverage across the build matrix (React 18, 19) but not in a single job\n    // Full coverage is checked via codecov\n    './src/act-compat': {\n      branches: 90,\n    },\n    './src/pure': {\n      // minimum coverage of jobs using React 18 and 19\n      branches: 95,\n      functions: 88,\n      lines: 92,\n      statements: 92,\n    },\n  },\n})\n"
  },
  {
    "path": "other/MAINTAINING.md",
    "content": "# Maintaining\n\nThis is documentation for maintainers of this project.\n\n## Code of Conduct\n\nPlease review, understand, and be an example of it. Violations of the code of\nconduct are taken seriously, even (especially) for maintainers.\n\n## Issues\n\nWe want to support and build the community. We do that best by helping people\nlearn to solve their own problems. We have an issue template and hopefully most\nfolks follow it. If it's not clear what the issue is, invite them to create a\nminimal reproduction of what they're trying to accomplish or the bug they think\nthey've found.\n\nOnce it's determined that a code change is necessary, point people to\n[makeapullrequest.com](http://makeapullrequest.com) and invite them to make a\npull request. If they're the one who needs the feature, they're the one who can\nbuild it. If they need some hand holding and you have time to lend a hand,\nplease do so. It's an investment into another human being, and an investment\ninto a potential maintainer.\n\nRemember that this is open source, so the code is not yours, it's ours. If\nsomeone needs a change in the codebase, you don't have to make it happen\nyourself. Commit as much time to the project as you want/need to. Nobody can ask\nany more of you than that.\n\n## Pull Requests\n\nAs a maintainer, you're fine to make your branches on the main repo or on your\nown fork. Either way is fine.\n\nWhen we receive a pull request, a github action is kicked off automatically (see\nthe `.github/workflows/validate.yml` for what runs in the action). We avoid\nmerging anything that breaks the validate action.\n\nPlease review PRs and focus on the code rather than the individual. You never\nknow when this is someone's first ever PR and we want their experience to be as\npositive as possible, so be uplifting and constructive.\n\nWhen you merge the pull request, 99% of the time you should use the\n[Squash and merge](https://help.github.com/articles/merging-a-pull-request/)\nfeature. This keeps our git history clean, but more importantly, this allows us\nto make any necessary changes to the commit message so we release what we want\nto release. See the next section on Releases for more about that.\n\n## Release\n\nOur releases are automatic. They happen whenever code lands into `main`. A\ngithub action gets kicked off and if it's successful, a tool called\n[`semantic-release`](https://github.com/semantic-release/semantic-release) is\nused to automatically publish a new release to npm as well as a changelog to\nGitHub. It is only able to determine the version and whether a release is\nnecessary by the git commit messages. With this in mind, **please brush up on\n[the commit message convention][commit] which drives our releases.**\n\n> One important note about this: Please make sure that commit messages do NOT\n> contain the words \"BREAKING CHANGE\" in them unless we want to push a major\n> version. I've been burned by this more than once where someone will include\n> \"BREAKING CHANGE: None\" and it will end up releasing a new major version. Not\n> a huge deal honestly, but kind of annoying...\n\n## Thanks!\n\nThank you so much for helping to maintain this project!\n\n[commit]:\n  https://github.com/conventional-changelog-archived-repos/conventional-changelog-angular/blob/ed32559941719a130bb0327f886d6a32a8cbc2ba/convention.md\n"
  },
  {
    "path": "other/USERS.md",
    "content": "# Users\n\nIf you or your company uses this project, add your name to this list! Eventually\nwe may have a website to showcase these (wanna build it!?)\n\n> No users have been added yet!\n\n<!--\nThis file should just be a bulleted list like this:\n\n- [Company/Project/Person](https://example.com) uses it in [some app](https://example.com)\n-->\n"
  },
  {
    "path": "other/design files/README.txt",
    "content": "# Cheat sheet design\n\nThe cheat sheet document has been created using the desktop publishing software called Affinity Publisher, the original source file can be found in this folder\n\n## Fonts used\n\n- Menlo\n- Arial\n\n## Standard distances\n\n15pt between boxes\n8pt margin from box edge to inner text"
  },
  {
    "path": "other/manual-releases.md",
    "content": "# manual-releases\n\nThis project has an automated release set up. So things are only released when\nthere are useful changes in the code that justify a release. But sometimes\nthings get messed up one way or another and we need to trigger the release\nourselves. When this happens, simply bump the number below and commit that with\nthe following commit message based on your needs:\n\n**Major**\n\n```\nfix(release): manually release a major version\n\nThere was an issue with a major release, so this manual-releases.md\nchange is to release a new major version.\n\nReference: #<the number of a relevant pull request, issue, or commit>\n\nBREAKING CHANGE: <mention any relevant breaking changes (this is what triggers the major version change so don't skip this!)>\n```\n\n**Minor**\n\n```\nfeat(release): manually release a minor version\n\nThere was an issue with a minor release, so this manual-releases.md\nchange is to release a new minor version.\n\nReference: #<the number of a relevant pull request, issue, or commit>\n```\n\n**Patch**\n\n```\nfix(release): manually release a patch version\n\nThere was an issue with a patch release, so this manual-releases.md\nchange is to release a new patch version.\n\nReference: #<the number of a relevant pull request, issue, or commit>\n```\n\nThe number of times we've had to do a manual release is: 5\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@testing-library/react\",\n  \"version\": \"0.0.0-semantically-released\",\n  \"description\": \"Simple and complete React DOM testing utilities that encourage good testing practices.\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"types/index.d.ts\",\n  \"module\": \"dist/@testing-library/react.esm.js\",\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"scripts\": {\n    \"prebuild\": \"rimraf dist\",\n    \"build\": \"npm-run-all --parallel build:main build:bundle:main build:bundle:pure\",\n    \"build:bundle:main\": \"dotenv -e .bundle.main.env kcd-scripts build -- --bundle --no-clean --no-ts-defs\",\n    \"build:bundle:pure\": \"dotenv -e .bundle.main.env -e .bundle.pure.env kcd-scripts build -- --bundle --no-clean --no-ts-defs\",\n    \"build:main\": \"kcd-scripts build --no-clean --no-ts-defs\",\n    \"format\": \"kcd-scripts format\",\n    \"install:csb\": \"npm install\",\n    \"lint\": \"kcd-scripts lint\",\n    \"setup\": \"npm install && npm run validate -s\",\n    \"test\": \"kcd-scripts test\",\n    \"test:update\": \"npm test -- --updateSnapshot --coverage\",\n    \"typecheck\": \"tsc --project tsconfig.json\",\n    \"validate\": \"kcd-scripts validate\"\n  },\n  \"files\": [\n    \"dist\",\n    \"dont-cleanup-after-each.js\",\n    \"pure.js\",\n    \"pure.d.ts\",\n    \"types/*.d.ts\"\n  ],\n  \"keywords\": [\n    \"testing\",\n    \"react\",\n    \"ui\",\n    \"dom\",\n    \"jsdom\",\n    \"unit\",\n    \"integration\",\n    \"functional\",\n    \"end-to-end\",\n    \"e2e\"\n  ],\n  \"author\": \"Kent C. Dodds <me@kentcdodds.com> (https://kentcdodds.com)\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.12.5\"\n  },\n  \"devDependencies\": {\n    \"@testing-library/dom\": \"^10.0.0\",\n    \"@testing-library/jest-dom\": \"^5.11.6\",\n    \"@types/react\": \"^19.0.0\",\n    \"@types/react-dom\": \"^19.0.0\",\n    \"chalk\": \"^4.1.2\",\n    \"dotenv-cli\": \"^4.0.0\",\n    \"jest-diff\": \"^29.7.0\",\n    \"kcd-scripts\": \"^13.0.0\",\n    \"npm-run-all2\": \"^6.2.6\",\n    \"react\": \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\",\n    \"rimraf\": \"^3.0.2\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"peerDependencies\": {\n    \"@testing-library/dom\": \"^10.0.0\",\n    \"@types/react\": \"^18.0.0 || ^19.0.0\",\n    \"@types/react-dom\": \"^18.0.0 || ^19.0.0\",\n    \"react\": \"^18.0.0 || ^19.0.0\",\n    \"react-dom\": \"^18.0.0 || ^19.0.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"@types/react\": {\n      \"optional\": true\n    },\n    \"@types/react-dom\": {\n      \"optional\": true\n    }\n  },\n  \"eslintConfig\": {\n    \"extends\": \"./node_modules/kcd-scripts/eslint.js\",\n    \"parserOptions\": {\n      \"ecmaVersion\": 2022\n    },\n    \"globals\": {\n      \"globalThis\": \"readonly\"\n    },\n    \"rules\": {\n      \"react/prop-types\": \"off\",\n      \"react/no-adjacent-inline-elements\": \"off\",\n      \"import/no-unassigned-import\": \"off\",\n      \"import/named\": \"off\",\n      \"testing-library/no-container\": \"off\",\n      \"testing-library/no-debugging-utils\": \"off\",\n      \"testing-library/no-dom-import\": \"off\",\n      \"testing-library/no-unnecessary-act\": \"off\",\n      \"testing-library/prefer-explicit-assert\": \"off\",\n      \"testing-library/prefer-find-by\": \"off\",\n      \"testing-library/prefer-user-event\": \"off\"\n    }\n  },\n  \"eslintIgnore\": [\n    \"node_modules\",\n    \"coverage\",\n    \"dist\",\n    \"*.d.ts\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/testing-library/react-testing-library\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/testing-library/react-testing-library/issues\"\n  },\n  \"homepage\": \"https://github.com/testing-library/react-testing-library#readme\"\n}\n"
  },
  {
    "path": "pure.d.ts",
    "content": "export * from './types/pure'\n"
  },
  {
    "path": "pure.js",
    "content": "// makes it so people can import from '@testing-library/react/pure'\nmodule.exports = require('./dist/pure')\n"
  },
  {
    "path": "src/__mocks__/axios.js",
    "content": "module.exports = {\n  get: jest.fn(() => Promise.resolve({data: {}})),\n}\n\n// Note:\n// For now we don't need any other method (POST/PUT/PATCH), what we have already works fine.\n// We will add more methods only if we need to.\n// For reference please read: https://github.com/testing-library/react-testing-library/issues/2\n"
  },
  {
    "path": "src/__tests__/__snapshots__/render.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`render API supports fragments 1`] = `\n<DocumentFragment>\n  <div>\n    <code>\n      DocumentFragment\n    </code>\n     is pretty cool!\n  </div>\n</DocumentFragment>\n`;\n"
  },
  {
    "path": "src/__tests__/act.js",
    "content": "import * as React from 'react'\nimport {act, render, fireEvent, screen} from '../'\n\ntest('render calls useEffect immediately', () => {\n  const effectCb = jest.fn()\n  function MyUselessComponent() {\n    React.useEffect(effectCb)\n    return null\n  }\n  render(<MyUselessComponent />)\n  expect(effectCb).toHaveBeenCalledTimes(1)\n})\n\ntest('findByTestId returns the element', async () => {\n  const ref = React.createRef()\n  render(<div ref={ref} data-testid=\"foo\" />)\n  expect(await screen.findByTestId('foo')).toBe(ref.current)\n})\n\ntest('fireEvent triggers useEffect calls', () => {\n  const effectCb = jest.fn()\n  function Counter() {\n    React.useEffect(effectCb)\n    const [count, setCount] = React.useState(0)\n    return <button onClick={() => setCount(count + 1)}>{count}</button>\n  }\n  const {\n    container: {firstChild: buttonNode},\n  } = render(<Counter />)\n\n  effectCb.mockClear()\n  fireEvent.click(buttonNode)\n  expect(buttonNode).toHaveTextContent('1')\n  expect(effectCb).toHaveBeenCalledTimes(1)\n})\n\ntest('calls to hydrate will run useEffects', () => {\n  const effectCb = jest.fn()\n  function MyUselessComponent() {\n    React.useEffect(effectCb)\n    return null\n  }\n  render(<MyUselessComponent />, {hydrate: true})\n  expect(effectCb).toHaveBeenCalledTimes(1)\n})\n\ntest('cleans up IS_REACT_ACT_ENVIRONMENT if its callback throws', () => {\n  global.IS_REACT_ACT_ENVIRONMENT = false\n\n  expect(() =>\n    act(() => {\n      throw new Error('threw')\n    }),\n  ).toThrow('threw')\n\n  expect(global.IS_REACT_ACT_ENVIRONMENT).toEqual(false)\n})\n\ntest('cleans up IS_REACT_ACT_ENVIRONMENT if its async callback throws', async () => {\n  global.IS_REACT_ACT_ENVIRONMENT = false\n\n  await expect(() =>\n    act(async () => {\n      throw new Error('thenable threw')\n    }),\n  ).rejects.toThrow('thenable threw')\n\n  expect(global.IS_REACT_ACT_ENVIRONMENT).toEqual(false)\n})\n"
  },
  {
    "path": "src/__tests__/auto-cleanup-skip.js",
    "content": "import * as React from 'react'\n\nlet render\nbeforeAll(() => {\n  process.env.RTL_SKIP_AUTO_CLEANUP = 'true'\n  const rtl = require('../')\n  render = rtl.render\n})\n\n// This one verifies that if RTL_SKIP_AUTO_CLEANUP is set\n// then we DON'T auto-wire up the afterEach for folks\ntest('first', () => {\n  render(<div>hi</div>)\n})\n\ntest('second', () => {\n  expect(document.body.innerHTML).toEqual('<div><div>hi</div></div>')\n})\n"
  },
  {
    "path": "src/__tests__/auto-cleanup.js",
    "content": "import * as React from 'react'\nimport {render} from '../'\n\n// This just verifies that by importing RTL in an\n// environment which supports afterEach (like jest)\n// we'll get automatic cleanup between tests.\ntest('first', () => {\n  render(<div>hi</div>)\n})\n\ntest('second', () => {\n  expect(document.body).toBeEmptyDOMElement()\n})\n"
  },
  {
    "path": "src/__tests__/cleanup.js",
    "content": "import * as React from 'react'\nimport {render, cleanup} from '../'\n\ntest('cleans up the document', () => {\n  const spy = jest.fn()\n  const divId = 'my-div'\n\n  class Test extends React.Component {\n    componentWillUnmount() {\n      expect(document.getElementById(divId)).toBeInTheDocument()\n      spy()\n    }\n\n    render() {\n      return <div id={divId} />\n    }\n  }\n\n  render(<Test />)\n  cleanup()\n  expect(document.body).toBeEmptyDOMElement()\n  expect(spy).toHaveBeenCalledTimes(1)\n})\n\ntest('cleanup does not error when an element is not a child', () => {\n  render(<div />, {container: document.createElement('div')})\n  cleanup()\n})\n\ntest('cleanup runs effect cleanup functions', () => {\n  const spy = jest.fn()\n\n  const Test = () => {\n    React.useEffect(() => spy)\n\n    return null\n  }\n\n  render(<Test />)\n  cleanup()\n  expect(spy).toHaveBeenCalledTimes(1)\n})\n\ndescribe('fake timers and missing act warnings', () => {\n  beforeEach(() => {\n    jest.resetAllMocks()\n    jest.spyOn(console, 'error').mockImplementation(() => {\n      // assert messages explicitly\n    })\n    jest.useFakeTimers()\n  })\n\n  afterEach(() => {\n    jest.restoreAllMocks()\n    jest.useRealTimers()\n  })\n\n  test('cleanup does not flush microtasks', () => {\n    const microTaskSpy = jest.fn()\n    function Test() {\n      const counter = 1\n      const [, setDeferredCounter] = React.useState(null)\n      React.useEffect(() => {\n        let cancelled = false\n        Promise.resolve().then(() => {\n          microTaskSpy()\n          // eslint-disable-next-line jest/no-if, jest/no-conditional-in-test -- false positive\n          if (!cancelled) {\n            setDeferredCounter(counter)\n          }\n        })\n\n        return () => {\n          cancelled = true\n        }\n      }, [counter])\n\n      return null\n    }\n    render(<Test />)\n\n    cleanup()\n\n    expect(microTaskSpy).toHaveBeenCalledTimes(0)\n    // console.error is mocked\n    // eslint-disable-next-line no-console\n    expect(console.error).toHaveBeenCalledTimes(0)\n  })\n\n  test('cleanup does not swallow missing act warnings', () => {\n    const deferredStateUpdateSpy = jest.fn()\n    function Test() {\n      const counter = 1\n      const [, setDeferredCounter] = React.useState(null)\n      React.useEffect(() => {\n        let cancelled = false\n        setTimeout(() => {\n          deferredStateUpdateSpy()\n          // eslint-disable-next-line jest/no-conditional-in-test -- false-positive\n          if (!cancelled) {\n            setDeferredCounter(counter)\n          }\n        }, 0)\n\n        return () => {\n          cancelled = true\n        }\n      }, [counter])\n\n      return null\n    }\n    render(<Test />)\n\n    jest.runAllTimers()\n    cleanup()\n\n    expect(deferredStateUpdateSpy).toHaveBeenCalledTimes(1)\n    // console.error is mocked\n    // eslint-disable-next-line no-console\n    expect(console.error).toHaveBeenCalledTimes(1)\n    // eslint-disable-next-line no-console\n    expect(console.error.mock.calls[0][0]).toMatch(\n      'a test was not wrapped in act(...)',\n    )\n  })\n})\n"
  },
  {
    "path": "src/__tests__/config.js",
    "content": "import {configure, getConfig} from '../'\n\ndescribe('configuration API', () => {\n  let originalConfig\n  beforeEach(() => {\n    // Grab the existing configuration so we can restore\n    // it at the end of the test\n    configure(existingConfig => {\n      originalConfig = existingConfig\n      // Don't change the existing config\n      return {}\n    })\n  })\n\n  afterEach(() => {\n    configure(originalConfig)\n  })\n\n  describe('DTL options', () => {\n    test('configure can set by a plain JS object', () => {\n      const testIdAttribute = 'not-data-testid'\n      configure({testIdAttribute})\n\n      expect(getConfig().testIdAttribute).toBe(testIdAttribute)\n    })\n\n    test('configure can set by a function', () => {\n      // setup base option\n      const baseTestIdAttribute = 'data-testid'\n      configure({testIdAttribute: baseTestIdAttribute})\n\n      const modifiedPrefix = 'modified-'\n      configure(existingConfig => ({\n        testIdAttribute: `${modifiedPrefix}${existingConfig.testIdAttribute}`,\n      }))\n\n      expect(getConfig().testIdAttribute).toBe(\n        `${modifiedPrefix}${baseTestIdAttribute}`,\n      )\n    })\n  })\n\n  describe('RTL options', () => {\n    test('configure can set by a plain JS object', () => {\n      configure({reactStrictMode: true})\n\n      expect(getConfig().reactStrictMode).toBe(true)\n    })\n\n    test('configure can set by a function', () => {\n      configure(existingConfig => ({\n        reactStrictMode: !existingConfig.reactStrictMode,\n      }))\n\n      expect(getConfig().reactStrictMode).toBe(true)\n    })\n  })\n\n  test('configure can set DTL and RTL options at once', () => {\n    const testIdAttribute = 'not-data-testid'\n    configure({testIdAttribute, reactStrictMode: true})\n\n    expect(getConfig().testIdAttribute).toBe(testIdAttribute)\n    expect(getConfig().reactStrictMode).toBe(true)\n  })\n})\n"
  },
  {
    "path": "src/__tests__/debug.js",
    "content": "import * as React from 'react'\nimport {render, screen} from '../'\n\nbeforeEach(() => {\n  jest.spyOn(console, 'log').mockImplementation(() => {})\n})\n\nafterEach(() => {\n  console.log.mockRestore()\n})\n\ntest('debug pretty prints the container', () => {\n  const HelloWorld = () => <h1>Hello World</h1>\n  const {debug} = render(<HelloWorld />)\n  debug()\n  expect(console.log).toHaveBeenCalledTimes(1)\n  expect(console.log).toHaveBeenCalledWith(\n    expect.stringContaining('Hello World'),\n  )\n})\n\ntest('debug pretty prints multiple containers', () => {\n  const HelloWorld = () => (\n    <>\n      <h1 data-testid=\"testId\">Hello World</h1>\n      <h1 data-testid=\"testId\">Hello World</h1>\n    </>\n  )\n  const {debug} = render(<HelloWorld />)\n  const multipleElements = screen.getAllByTestId('testId')\n  debug(multipleElements)\n\n  expect(console.log).toHaveBeenCalledTimes(2)\n  expect(console.log).toHaveBeenCalledWith(\n    expect.stringContaining('Hello World'),\n  )\n})\n\ntest('allows same arguments as prettyDOM', () => {\n  const HelloWorld = () => <h1>Hello World</h1>\n  const {debug, container} = render(<HelloWorld />)\n  debug(container, 6, {highlight: false})\n  expect(console.log).toHaveBeenCalledTimes(1)\n  expect(console.log.mock.calls[0]).toMatchInlineSnapshot(`\n    [\n      <div>\n    ...,\n    ]\n  `)\n})\n\n/*\neslint\n  no-console: \"off\",\n*/\n"
  },
  {
    "path": "src/__tests__/end-to-end.js",
    "content": "import * as React from 'react'\nimport {render, waitForElementToBeRemoved, screen, waitFor} from '../'\n\ndescribe.each([\n  ['real timers', () => jest.useRealTimers()],\n  ['fake legacy timers', () => jest.useFakeTimers('legacy')],\n  ['fake modern timers', () => jest.useFakeTimers('modern')],\n])(\n  'it waits for the data to be loaded in a macrotask using %s',\n  (label, useTimers) => {\n    beforeEach(() => {\n      useTimers()\n    })\n\n    afterEach(() => {\n      jest.useRealTimers()\n    })\n\n    const fetchAMessageInAMacrotask = () =>\n      new Promise(resolve => {\n        // we are using random timeout here to simulate a real-time example\n        // of an async operation calling a callback at a non-deterministic time\n        const randomTimeout = Math.floor(Math.random() * 100)\n        setTimeout(() => {\n          resolve({returnedMessage: 'Hello World'})\n        }, randomTimeout)\n      })\n\n    function ComponentWithMacrotaskLoader() {\n      const [state, setState] = React.useState({data: undefined, loading: true})\n      React.useEffect(() => {\n        let cancelled = false\n        fetchAMessageInAMacrotask().then(data => {\n          if (!cancelled) {\n            setState({data, loading: false})\n          }\n        })\n\n        return () => {\n          cancelled = true\n        }\n      }, [])\n\n      if (state.loading) {\n        return <div>Loading...</div>\n      }\n\n      return (\n        <div data-testid=\"message\">\n          Loaded this message: {state.data.returnedMessage}!\n        </div>\n      )\n    }\n\n    test('waitForElementToBeRemoved', async () => {\n      render(<ComponentWithMacrotaskLoader />)\n      const loading = () => screen.getByText('Loading...')\n      await waitForElementToBeRemoved(loading)\n      expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)\n    })\n\n    test('waitFor', async () => {\n      render(<ComponentWithMacrotaskLoader />)\n      await waitFor(() => screen.getByText(/Loading../))\n      await waitFor(() => screen.getByText(/Loaded this message:/))\n      expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)\n    })\n\n    test('findBy', async () => {\n      render(<ComponentWithMacrotaskLoader />)\n      await expect(screen.findByTestId('message')).resolves.toHaveTextContent(\n        /Hello World/,\n      )\n    })\n  },\n)\n\ndescribe.each([\n  ['real timers', () => jest.useRealTimers()],\n  ['fake legacy timers', () => jest.useFakeTimers('legacy')],\n  ['fake modern timers', () => jest.useFakeTimers('modern')],\n])(\n  'it waits for the data to be loaded in many microtask using %s',\n  (label, useTimers) => {\n    beforeEach(() => {\n      useTimers()\n    })\n\n    afterEach(() => {\n      jest.useRealTimers()\n    })\n\n    const fetchAMessageInAMicrotask = () =>\n      Promise.resolve({\n        status: 200,\n        json: () => Promise.resolve({title: 'Hello World'}),\n      })\n\n    function ComponentWithMicrotaskLoader() {\n      const [fetchState, setFetchState] = React.useState({fetching: true})\n\n      React.useEffect(() => {\n        if (fetchState.fetching) {\n          fetchAMessageInAMicrotask().then(res => {\n            return (\n              res\n                .json()\n                // By spec, the runtime can only yield back to the event loop once\n                // the microtask queue is empty.\n                // So we ensure that we actually wait for that as well before yielding back from `waitFor`.\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => data)\n                .then(data => {\n                  setFetchState({todo: data.title, fetching: false})\n                })\n            )\n          })\n        }\n      }, [fetchState])\n\n      if (fetchState.fetching) {\n        return <p>Loading..</p>\n      }\n\n      return (\n        <div data-testid=\"message\">Loaded this message: {fetchState.todo}</div>\n      )\n    }\n\n    test('waitForElementToBeRemoved', async () => {\n      render(<ComponentWithMicrotaskLoader />)\n      const loading = () => screen.getByText('Loading..')\n      await waitForElementToBeRemoved(loading)\n      expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)\n    })\n\n    test('waitFor', async () => {\n      render(<ComponentWithMicrotaskLoader />)\n      await waitFor(() => {\n        screen.getByText('Loading..')\n      })\n      await waitFor(() => {\n        screen.getByText(/Loaded this message:/)\n      })\n      expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)\n    })\n\n    test('findBy', async () => {\n      render(<ComponentWithMicrotaskLoader />)\n      await expect(screen.findByTestId('message')).resolves.toHaveTextContent(\n        /Hello World/,\n      )\n    })\n  },\n)\n\ndescribe.each([\n  ['real timers', () => jest.useRealTimers()],\n  ['fake legacy timers', () => jest.useFakeTimers('legacy')],\n  ['fake modern timers', () => jest.useFakeTimers('modern')],\n])(\n  'it waits for the data to be loaded in a microtask using %s',\n  (label, useTimers) => {\n    beforeEach(() => {\n      useTimers()\n    })\n\n    afterEach(() => {\n      jest.useRealTimers()\n    })\n\n    const fetchAMessageInAMicrotask = () =>\n      Promise.resolve({\n        status: 200,\n        json: () => Promise.resolve({title: 'Hello World'}),\n      })\n\n    function ComponentWithMicrotaskLoader() {\n      const [fetchState, setFetchState] = React.useState({fetching: true})\n\n      React.useEffect(() => {\n        if (fetchState.fetching) {\n          fetchAMessageInAMicrotask().then(res => {\n            return res.json().then(data => {\n              setFetchState({todo: data.title, fetching: false})\n            })\n          })\n        }\n      }, [fetchState])\n\n      if (fetchState.fetching) {\n        return <p>Loading..</p>\n      }\n\n      return (\n        <div data-testid=\"message\">Loaded this message: {fetchState.todo}</div>\n      )\n    }\n\n    test('waitForElementToBeRemoved', async () => {\n      render(<ComponentWithMicrotaskLoader />)\n      const loading = () => screen.getByText('Loading..')\n      await waitForElementToBeRemoved(loading)\n      expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)\n    })\n\n    test('waitFor', async () => {\n      render(<ComponentWithMicrotaskLoader />)\n      await waitFor(() => {\n        screen.getByText('Loading..')\n      })\n      await waitFor(() => {\n        screen.getByText(/Loaded this message:/)\n      })\n      expect(screen.getByTestId('message')).toHaveTextContent(/Hello World/)\n    })\n\n    test('findBy', async () => {\n      render(<ComponentWithMicrotaskLoader />)\n      await expect(screen.findByTestId('message')).resolves.toHaveTextContent(\n        /Hello World/,\n      )\n    })\n  },\n)\n"
  },
  {
    "path": "src/__tests__/error-handlers.js",
    "content": "/* eslint-disable jest/no-if */\n/* eslint-disable jest/no-conditional-in-test */\n/* eslint-disable jest/no-conditional-expect */\nimport * as React from 'react'\nimport {render, renderHook} from '../'\n\nconst isReact19 = React.version.startsWith('19.')\n\nconst testGateReact19 = isReact19 ? test : test.skip\n\ntest('render errors', () => {\n  function Thrower() {\n    throw new Error('Boom!')\n  }\n\n  if (isReact19) {\n    expect(() => {\n      render(<Thrower />)\n    }).toThrow('Boom!')\n  } else {\n    expect(() => {\n      expect(() => {\n        render(<Thrower />)\n      }).toThrow('Boom!')\n    }).toErrorDev([\n      'Error: Uncaught [Error: Boom!]',\n      // React retries on error\n      'Error: Uncaught [Error: Boom!]',\n    ])\n  }\n})\n\ntest('onUncaughtError is not supported in render', () => {\n  function Thrower() {\n    throw new Error('Boom!')\n  }\n  const onUncaughtError = jest.fn(() => {})\n\n  expect(() => {\n    render(<Thrower />, {\n      onUncaughtError(error, errorInfo) {\n        console.log({error, errorInfo})\n      },\n    })\n  }).toThrow(\n    'onUncaughtError is not supported. The `render` call will already throw on uncaught errors.',\n  )\n\n  expect(onUncaughtError).toHaveBeenCalledTimes(0)\n})\n\ntestGateReact19('onCaughtError is supported in render', () => {\n  const thrownError = new Error('Boom!')\n  const handleComponentDidCatch = jest.fn()\n  const onCaughtError = jest.fn()\n  class ErrorBoundary extends React.Component {\n    state = {error: null}\n    static getDerivedStateFromError(error) {\n      return {error}\n    }\n    componentDidCatch(error, errorInfo) {\n      handleComponentDidCatch(error, errorInfo)\n    }\n    render() {\n      if (this.state.error) {\n        return null\n      }\n      return this.props.children\n    }\n  }\n  function Thrower() {\n    throw thrownError\n  }\n\n  render(\n    <ErrorBoundary>\n      <Thrower />\n    </ErrorBoundary>,\n    {\n      onCaughtError,\n    },\n  )\n\n  expect(onCaughtError).toHaveBeenCalledWith(thrownError, {\n    componentStack: expect.any(String),\n    errorBoundary: expect.any(Object),\n  })\n})\n\ntest('onRecoverableError is supported in render', () => {\n  const onRecoverableError = jest.fn()\n\n  const container = document.createElement('div')\n  container.innerHTML = '<div>server</div>'\n  // We just hope we forwarded the callback correctly (which is guaranteed since we just pass it along)\n  // Frankly, I'm too lazy to assert on React 18 hydration errors since they're a mess.\n  // eslint-disable-next-line jest/no-conditional-in-test\n  if (isReact19) {\n    render(<div>client</div>, {\n      container,\n      hydrate: true,\n      onRecoverableError,\n    })\n    expect(onRecoverableError).toHaveBeenCalledTimes(1)\n  } else {\n    expect(() => {\n      render(<div>client</div>, {\n        container,\n        hydrate: true,\n        onRecoverableError,\n      })\n    }).toErrorDev(['', ''], {withoutStack: 1})\n    expect(onRecoverableError).toHaveBeenCalledTimes(2)\n  }\n})\n\ntest('onUncaughtError is not supported in renderHook', () => {\n  function useThrower() {\n    throw new Error('Boom!')\n  }\n  const onUncaughtError = jest.fn(() => {})\n\n  expect(() => {\n    renderHook(useThrower, {\n      onUncaughtError(error, errorInfo) {\n        console.log({error, errorInfo})\n      },\n    })\n  }).toThrow(\n    'onUncaughtError is not supported. The `render` call will already throw on uncaught errors.',\n  )\n\n  expect(onUncaughtError).toHaveBeenCalledTimes(0)\n})\n\ntestGateReact19('onCaughtError is supported in renderHook', () => {\n  const thrownError = new Error('Boom!')\n  const handleComponentDidCatch = jest.fn()\n  const onCaughtError = jest.fn()\n  class ErrorBoundary extends React.Component {\n    state = {error: null}\n    static getDerivedStateFromError(error) {\n      return {error}\n    }\n    componentDidCatch(error, errorInfo) {\n      handleComponentDidCatch(error, errorInfo)\n    }\n    render() {\n      if (this.state.error) {\n        return null\n      }\n      return this.props.children\n    }\n  }\n  function useThrower() {\n    throw thrownError\n  }\n\n  renderHook(useThrower, {\n    onCaughtError,\n    wrapper: ErrorBoundary,\n  })\n\n  expect(onCaughtError).toHaveBeenCalledWith(thrownError, {\n    componentStack: expect.any(String),\n    errorBoundary: expect.any(Object),\n  })\n})\n\n// Currently, there's no recoverable error without hydration.\n// The option is still supported though.\ntest('onRecoverableError is supported in renderHook', () => {\n  const onRecoverableError = jest.fn()\n\n  renderHook(\n    () => {\n      // TODO: trigger recoverable error\n    },\n    {\n      onRecoverableError,\n    },\n  )\n})\n"
  },
  {
    "path": "src/__tests__/events.js",
    "content": "import * as React from 'react'\nimport {render, fireEvent} from '../'\n\nconst eventTypes = [\n  {\n    type: 'Clipboard',\n    events: ['copy', 'paste'],\n    elementType: 'input',\n  },\n  {\n    type: 'Composition',\n    events: ['compositionEnd', 'compositionStart', 'compositionUpdate'],\n    elementType: 'input',\n  },\n  {\n    type: 'Keyboard',\n    events: ['keyDown', 'keyPress', 'keyUp'],\n    elementType: 'input',\n    init: {keyCode: 13},\n  },\n  {\n    type: 'Focus',\n    events: ['focus', 'blur'],\n    elementType: 'input',\n  },\n  {\n    type: 'Form',\n    events: ['focus', 'blur'],\n    elementType: 'input',\n  },\n  {\n    type: 'Focus',\n    events: ['input', 'invalid'],\n    elementType: 'input',\n  },\n  {\n    type: 'Focus',\n    events: ['submit'],\n    elementType: 'form',\n  },\n  {\n    type: 'Mouse',\n    events: [\n      'click',\n      'contextMenu',\n      'doubleClick',\n      'drag',\n      'dragEnd',\n      'dragEnter',\n      'dragExit',\n      'dragLeave',\n      'dragOver',\n      'dragStart',\n      'drop',\n      'mouseDown',\n      'mouseEnter',\n      'mouseLeave',\n      'mouseMove',\n      'mouseOut',\n      'mouseOver',\n      'mouseUp',\n    ],\n    elementType: 'button',\n  },\n  {\n    type: 'Pointer',\n    events: [\n      'pointerOver',\n      'pointerEnter',\n      'pointerDown',\n      'pointerMove',\n      'pointerUp',\n      'pointerCancel',\n      'pointerOut',\n      'pointerLeave',\n      'gotPointerCapture',\n      'lostPointerCapture',\n    ],\n    elementType: 'button',\n  },\n  {\n    type: 'Selection',\n    events: ['select'],\n    elementType: 'input',\n  },\n  {\n    type: 'Touch',\n    events: ['touchCancel', 'touchEnd', 'touchMove', 'touchStart'],\n    elementType: 'button',\n  },\n  {\n    type: 'UI',\n    events: ['scroll'],\n    elementType: 'div',\n  },\n  {\n    type: 'Wheel',\n    events: ['wheel'],\n    elementType: 'div',\n  },\n  {\n    type: 'Media',\n    events: [\n      'abort',\n      'canPlay',\n      'canPlayThrough',\n      'durationChange',\n      'emptied',\n      'encrypted',\n      'ended',\n      'error',\n      'loadedData',\n      'loadedMetadata',\n      'loadStart',\n      'pause',\n      'play',\n      'playing',\n      'progress',\n      'rateChange',\n      'seeked',\n      'seeking',\n      'stalled',\n      'suspend',\n      'timeUpdate',\n      'volumeChange',\n      'waiting',\n    ],\n    elementType: 'video',\n  },\n  {\n    type: 'Image',\n    events: ['load', 'error'],\n    elementType: 'img',\n  },\n  {\n    type: 'Animation',\n    events: ['animationStart', 'animationEnd', 'animationIteration'],\n    elementType: 'div',\n  },\n  {\n    type: 'Transition',\n    events: ['transitionEnd'],\n    elementType: 'div',\n  },\n]\n\neventTypes.forEach(({type, events, elementType, init}) => {\n  describe(`${type} Events`, () => {\n    events.forEach(eventName => {\n      const propName = `on${eventName.charAt(0).toUpperCase()}${eventName.slice(\n        1,\n      )}`\n\n      it(`triggers ${propName}`, () => {\n        const ref = React.createRef()\n        const spy = jest.fn()\n\n        render(\n          React.createElement(elementType, {\n            [propName]: spy,\n            ref,\n          }),\n        )\n\n        fireEvent[eventName](ref.current, init)\n        expect(spy).toHaveBeenCalledTimes(1)\n      })\n    })\n  })\n})\n\neventTypes.forEach(({type, events, elementType, init}) => {\n  describe(`Native ${type} Events`, () => {\n    events.forEach(eventName => {\n      let nativeEventName = eventName.toLowerCase()\n\n      // The doubleClick synthetic event maps to the dblclick native event\n      if (nativeEventName === 'doubleclick') {\n        nativeEventName = 'dblclick'\n      }\n\n      it(`triggers native ${nativeEventName}`, () => {\n        const ref = React.createRef()\n        const spy = jest.fn()\n        const Element = elementType\n\n        const NativeEventElement = () => {\n          React.useEffect(() => {\n            const element = ref.current\n            element.addEventListener(nativeEventName, spy)\n            return () => {\n              element.removeEventListener(nativeEventName, spy)\n            }\n          })\n          return <Element ref={ref} />\n        }\n\n        render(<NativeEventElement />)\n\n        fireEvent[eventName](ref.current, init)\n        expect(spy).toHaveBeenCalledTimes(1)\n      })\n    })\n  })\n})\n\ntest('onChange works', () => {\n  const handleChange = jest.fn()\n  const {\n    container: {firstChild: input},\n  } = render(<input onChange={handleChange} />)\n  fireEvent.change(input, {target: {value: 'a'}})\n  expect(handleChange).toHaveBeenCalledTimes(1)\n})\n\ntest('calling `fireEvent` directly works too', () => {\n  const handleEvent = jest.fn()\n  const {\n    container: {firstChild: button},\n  } = render(<button onClick={handleEvent} />)\n  fireEvent(\n    button,\n    new Event('MouseEvent', {\n      bubbles: true,\n      cancelable: true,\n      button: 0,\n    }),\n  )\n})\n\ntest('blur/focus bubbles in react', () => {\n  const handleBlur = jest.fn()\n  const handleBubbledBlur = jest.fn()\n  const handleFocus = jest.fn()\n  const handleBubbledFocus = jest.fn()\n  const {container} = render(\n    <div onBlur={handleBubbledBlur} onFocus={handleBubbledFocus}>\n      <button onBlur={handleBlur} onFocus={handleFocus} />\n    </div>,\n  )\n  const button = container.firstChild.firstChild\n\n  fireEvent.focus(button)\n\n  expect(handleBlur).toHaveBeenCalledTimes(0)\n  expect(handleBubbledBlur).toHaveBeenCalledTimes(0)\n  expect(handleFocus).toHaveBeenCalledTimes(1)\n  expect(handleBubbledFocus).toHaveBeenCalledTimes(1)\n\n  fireEvent.blur(button)\n\n  expect(handleBlur).toHaveBeenCalledTimes(1)\n  expect(handleBubbledBlur).toHaveBeenCalledTimes(1)\n  expect(handleFocus).toHaveBeenCalledTimes(1)\n  expect(handleBubbledFocus).toHaveBeenCalledTimes(1)\n})\n"
  },
  {
    "path": "src/__tests__/multi-base.js",
    "content": "import * as React from 'react'\nimport {render} from '../'\n\n// these are created once per test suite and reused for each case\nlet treeA, treeB\nbeforeAll(() => {\n  treeA = document.createElement('div')\n  treeB = document.createElement('div')\n  document.body.appendChild(treeA)\n  document.body.appendChild(treeB)\n})\n\nafterAll(() => {\n  treeA.parentNode.removeChild(treeA)\n  treeB.parentNode.removeChild(treeB)\n})\n\ntest('baseElement isolates trees from one another', () => {\n  const {getByText: getByTextInA} = render(<div>Jekyll</div>, {\n    baseElement: treeA,\n  })\n  const {getByText: getByTextInB} = render(<div>Hyde</div>, {\n    baseElement: treeB,\n  })\n\n  expect(() => getByTextInA('Jekyll')).not.toThrow(\n    'Unable to find an element with the text: Jekyll.',\n  )\n  expect(() => getByTextInB('Jekyll')).toThrow(\n    'Unable to find an element with the text: Jekyll.',\n  )\n\n  expect(() => getByTextInA('Hyde')).toThrow(\n    'Unable to find an element with the text: Hyde.',\n  )\n  expect(() => getByTextInB('Hyde')).not.toThrow(\n    'Unable to find an element with the text: Hyde.',\n  )\n})\n\n// https://github.com/testing-library/eslint-plugin-testing-library/issues/188\n/*\neslint\n  testing-library/prefer-screen-queries: \"off\",\n*/\n"
  },
  {
    "path": "src/__tests__/new-act.js",
    "content": "let asyncAct\n\njest.mock('react', () => {\n  return {\n    ...jest.requireActual('react'),\n    act: cb => {\n      return cb()\n    },\n  }\n})\n\nbeforeEach(() => {\n  jest.resetModules()\n  asyncAct = require('../act-compat').default\n  jest.spyOn(console, 'error').mockImplementation(() => {})\n})\n\nafterEach(() => {\n  jest.restoreAllMocks()\n})\n\ntest('async act works when it does not exist (older versions of react)', async () => {\n  const callback = jest.fn()\n  await asyncAct(async () => {\n    await Promise.resolve()\n    await callback()\n  })\n  expect(console.error).toHaveBeenCalledTimes(0)\n  expect(callback).toHaveBeenCalledTimes(1)\n\n  callback.mockClear()\n  console.error.mockClear()\n\n  await asyncAct(async () => {\n    await Promise.resolve()\n    await callback()\n  })\n  expect(console.error).toHaveBeenCalledTimes(0)\n  expect(callback).toHaveBeenCalledTimes(1)\n})\n\ntest('async act recovers from errors', async () => {\n  try {\n    await asyncAct(async () => {\n      await null\n      throw new Error('test error')\n    })\n  } catch (err) {\n    console.error('call console.error')\n  }\n  expect(console.error).toHaveBeenCalledTimes(1)\n  expect(console.error.mock.calls).toMatchInlineSnapshot(`\n    [\n      [\n        call console.error,\n      ],\n    ]\n  `)\n})\n\ntest('async act recovers from sync errors', async () => {\n  try {\n    await asyncAct(() => {\n      throw new Error('test error')\n    })\n  } catch (err) {\n    console.error('call console.error')\n  }\n  expect(console.error).toHaveBeenCalledTimes(1)\n  expect(console.error.mock.calls).toMatchInlineSnapshot(`\n    [\n      [\n        call console.error,\n      ],\n    ]\n  `)\n})\n\n/* eslint no-console:0 */\n"
  },
  {
    "path": "src/__tests__/render.js",
    "content": "import * as React from 'react'\nimport ReactDOM from 'react-dom'\nimport ReactDOMServer from 'react-dom/server'\nimport {fireEvent, render, screen, configure} from '../'\n\nconst isReact18 = React.version.startsWith('18.')\nconst isReact19 = React.version.startsWith('19.')\n\nconst testGateReact18 = isReact18 ? test : test.skip\nconst testGateReact19 = isReact19 ? test : test.skip\n\ndescribe('render API', () => {\n  let originalConfig\n  beforeEach(() => {\n    // Grab the existing configuration so we can restore\n    // it at the end of the test\n    configure(existingConfig => {\n      originalConfig = existingConfig\n      // Don't change the existing config\n      return {}\n    })\n  })\n\n  afterEach(() => {\n    configure(originalConfig)\n  })\n\n  test('renders div into document', () => {\n    const ref = React.createRef()\n    const {container} = render(<div ref={ref} />)\n    expect(container.firstChild).toBe(ref.current)\n  })\n\n  test('works great with react portals', () => {\n    class MyPortal extends React.Component {\n      constructor(...args) {\n        super(...args)\n        this.portalNode = document.createElement('div')\n        this.portalNode.dataset.testid = 'my-portal'\n      }\n      componentDidMount() {\n        document.body.appendChild(this.portalNode)\n      }\n      componentWillUnmount() {\n        this.portalNode.parentNode.removeChild(this.portalNode)\n      }\n      render() {\n        return ReactDOM.createPortal(\n          <Greet greeting=\"Hello\" subject=\"World\" />,\n          this.portalNode,\n        )\n      }\n    }\n\n    function Greet({greeting, subject}) {\n      return (\n        <div>\n          <strong>\n            {greeting} {subject}\n          </strong>\n        </div>\n      )\n    }\n\n    const {unmount} = render(<MyPortal />)\n    expect(screen.getByText('Hello World')).toBeInTheDocument()\n    const portalNode = screen.getByTestId('my-portal')\n    expect(portalNode).toBeInTheDocument()\n    unmount()\n    expect(portalNode).not.toBeInTheDocument()\n  })\n\n  test('returns baseElement which defaults to document.body', () => {\n    const {baseElement} = render(<div />)\n    expect(baseElement).toBe(document.body)\n  })\n\n  test('supports fragments', () => {\n    class Test extends React.Component {\n      render() {\n        return (\n          <div>\n            <code>DocumentFragment</code> is pretty cool!\n          </div>\n        )\n      }\n    }\n\n    const {asFragment} = render(<Test />)\n    expect(asFragment()).toMatchSnapshot()\n  })\n\n  test('renders options.wrapper around node', () => {\n    const WrapperComponent = ({children}) => (\n      <div data-testid=\"wrapper\">{children}</div>\n    )\n\n    const {container} = render(<div data-testid=\"inner\" />, {\n      wrapper: WrapperComponent,\n    })\n\n    expect(screen.getByTestId('wrapper')).toBeInTheDocument()\n    expect(container.firstChild).toMatchInlineSnapshot(`\n    <div\n      data-testid=wrapper\n    >\n      <div\n        data-testid=inner\n      />\n    </div>\n  `)\n  })\n\n  test('renders options.wrapper around node when reactStrictMode is true', () => {\n    configure({reactStrictMode: true})\n\n    const WrapperComponent = ({children}) => (\n      <div data-testid=\"wrapper\">{children}</div>\n    )\n    const {container} = render(<div data-testid=\"inner\" />, {\n      wrapper: WrapperComponent,\n    })\n\n    expect(screen.getByTestId('wrapper')).toBeInTheDocument()\n    expect(container.firstChild).toMatchInlineSnapshot(`\n    <div\n      data-testid=wrapper\n    >\n      <div\n        data-testid=inner\n      />\n    </div>\n  `)\n  })\n\n  test('renders twice when reactStrictMode is true', () => {\n    configure({reactStrictMode: true})\n\n    const spy = jest.fn()\n    function Component() {\n      spy()\n      return null\n    }\n\n    render(<Component />)\n    expect(spy).toHaveBeenCalledTimes(2)\n  })\n\n  test('flushes useEffect cleanup functions sync on unmount()', () => {\n    const spy = jest.fn()\n    function Component() {\n      React.useEffect(() => spy, [])\n      return null\n    }\n    const {unmount} = render(<Component />)\n    expect(spy).toHaveBeenCalledTimes(0)\n\n    unmount()\n\n    expect(spy).toHaveBeenCalledTimes(1)\n  })\n\n  test('can be called multiple times on the same container', () => {\n    const container = document.createElement('div')\n\n    const {unmount} = render(<strong />, {container})\n\n    expect(container).toContainHTML('<strong></strong>')\n\n    render(<em />, {container})\n\n    expect(container).toContainHTML('<em></em>')\n\n    unmount()\n\n    expect(container).toBeEmptyDOMElement()\n  })\n\n  test('hydrate will make the UI interactive', () => {\n    function App() {\n      const [clicked, handleClick] = React.useReducer(n => n + 1, 0)\n\n      return (\n        <button type=\"button\" onClick={handleClick}>\n          clicked:{clicked}\n        </button>\n      )\n    }\n    const ui = <App />\n    const container = document.createElement('div')\n    document.body.appendChild(container)\n    container.innerHTML = ReactDOMServer.renderToString(ui)\n\n    expect(container).toHaveTextContent('clicked:0')\n\n    render(ui, {container, hydrate: true})\n\n    fireEvent.click(container.querySelector('button'))\n\n    expect(container).toHaveTextContent('clicked:1')\n  })\n\n  test('hydrate can have a wrapper', () => {\n    const wrapperComponentMountEffect = jest.fn()\n    function WrapperComponent({children}) {\n      React.useEffect(() => {\n        wrapperComponentMountEffect()\n      })\n\n      return children\n    }\n    const ui = <div />\n    const container = document.createElement('div')\n    document.body.appendChild(container)\n    container.innerHTML = ReactDOMServer.renderToString(ui)\n\n    render(ui, {container, hydrate: true, wrapper: WrapperComponent})\n\n    expect(wrapperComponentMountEffect).toHaveBeenCalledTimes(1)\n  })\n\n  testGateReact18('legacyRoot uses legacy ReactDOM.render', () => {\n    expect(() => {\n      render(<div />, {legacyRoot: true})\n    }).toErrorDev(\n      [\n        \"Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot\",\n      ],\n      {withoutStack: true},\n    )\n  })\n\n  testGateReact19('legacyRoot throws', () => {\n    expect(() => {\n      render(<div />, {legacyRoot: true})\n    }).toThrowErrorMatchingInlineSnapshot(\n      `\\`legacyRoot: true\\` is not supported in this version of React. If your app runs React 19 or later, you should remove this flag. If your app runs React 18 or earlier, visit https://react.dev/blog/2022/03/08/react-18-upgrade-guide for upgrade instructions.`,\n    )\n  })\n\n  testGateReact18('legacyRoot uses legacy ReactDOM.hydrate', () => {\n    const ui = <div />\n    const container = document.createElement('div')\n    container.innerHTML = ReactDOMServer.renderToString(ui)\n    expect(() => {\n      render(ui, {container, hydrate: true, legacyRoot: true})\n    }).toErrorDev(\n      [\n        \"Warning: ReactDOM.hydrate is no longer supported in React 18. Use hydrateRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot\",\n      ],\n      {withoutStack: true},\n    )\n  })\n\n  testGateReact19('legacyRoot throws even with hydrate', () => {\n    const ui = <div />\n    const container = document.createElement('div')\n    container.innerHTML = ReactDOMServer.renderToString(ui)\n    expect(() => {\n      render(ui, {container, hydrate: true, legacyRoot: true})\n    }).toThrowErrorMatchingInlineSnapshot(\n      `\\`legacyRoot: true\\` is not supported in this version of React. If your app runs React 19 or later, you should remove this flag. If your app runs React 18 or earlier, visit https://react.dev/blog/2022/03/08/react-18-upgrade-guide for upgrade instructions.`,\n    )\n  })\n\n  test('reactStrictMode in renderOptions has precedence over config when rendering', () => {\n    const wrapperComponentMountEffect = jest.fn()\n    function WrapperComponent({children}) {\n      React.useEffect(() => {\n        wrapperComponentMountEffect()\n      })\n\n      return children\n    }\n    const ui = <div />\n    configure({reactStrictMode: false})\n\n    render(ui, {wrapper: WrapperComponent, reactStrictMode: true})\n\n    expect(wrapperComponentMountEffect).toHaveBeenCalledTimes(2)\n  })\n\n  test('reactStrictMode in config is used when renderOptions does not specify reactStrictMode', () => {\n    const wrapperComponentMountEffect = jest.fn()\n    function WrapperComponent({children}) {\n      React.useEffect(() => {\n        wrapperComponentMountEffect()\n      })\n\n      return children\n    }\n    const ui = <div />\n    configure({reactStrictMode: true})\n\n    render(ui, {wrapper: WrapperComponent})\n\n    expect(wrapperComponentMountEffect).toHaveBeenCalledTimes(2)\n  })\n})\n"
  },
  {
    "path": "src/__tests__/renderHook.js",
    "content": "import React, {useEffect} from 'react'\nimport {configure, renderHook} from '../pure'\n\nconst isReact18 = React.version.startsWith('18.')\nconst isReact19 = React.version.startsWith('19.')\n\nconst testGateReact18 = isReact18 ? test : test.skip\nconst testGateReact19 = isReact19 ? test : test.skip\n\ntest('gives committed result', () => {\n  const {result} = renderHook(() => {\n    const [state, setState] = React.useState(1)\n\n    React.useEffect(() => {\n      setState(2)\n    }, [])\n\n    return [state, setState]\n  })\n\n  expect(result.current).toEqual([2, expect.any(Function)])\n})\n\ntest('allows rerendering', () => {\n  const {result, rerender} = renderHook(\n    ({branch}) => {\n      const [left, setLeft] = React.useState('left')\n      const [right, setRight] = React.useState('right')\n\n      // eslint-disable-next-line jest/no-if, jest/no-conditional-in-test -- false-positive\n      switch (branch) {\n        case 'left':\n          return [left, setLeft]\n        case 'right':\n          return [right, setRight]\n\n        default:\n          throw new Error(\n            'No Props passed. This is a bug in the implementation',\n          )\n      }\n    },\n    {initialProps: {branch: 'left'}},\n  )\n\n  expect(result.current).toEqual(['left', expect.any(Function)])\n\n  rerender({branch: 'right'})\n\n  expect(result.current).toEqual(['right', expect.any(Function)])\n})\n\ntest('allows wrapper components', async () => {\n  const Context = React.createContext('default')\n  function Wrapper({children}) {\n    return <Context.Provider value=\"provided\">{children}</Context.Provider>\n  }\n  const {result} = renderHook(\n    () => {\n      return React.useContext(Context)\n    },\n    {\n      wrapper: Wrapper,\n    },\n  )\n\n  expect(result.current).toEqual('provided')\n})\n\ntestGateReact18('legacyRoot uses legacy ReactDOM.render', () => {\n  const Context = React.createContext('default')\n  function Wrapper({children}) {\n    return <Context.Provider value=\"provided\">{children}</Context.Provider>\n  }\n  let result\n  expect(() => {\n    result = renderHook(\n      () => {\n        return React.useContext(Context)\n      },\n      {\n        wrapper: Wrapper,\n        legacyRoot: true,\n      },\n    ).result\n  }).toErrorDev(\n    [\n      \"Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot\",\n    ],\n    {withoutStack: true},\n  )\n  expect(result.current).toEqual('provided')\n})\n\ntestGateReact19('legacyRoot throws', () => {\n  const Context = React.createContext('default')\n  function Wrapper({children}) {\n    return <Context.Provider value=\"provided\">{children}</Context.Provider>\n  }\n  expect(() => {\n    renderHook(\n      () => {\n        return React.useContext(Context)\n      },\n      {\n        wrapper: Wrapper,\n        legacyRoot: true,\n      },\n    ).result\n  }).toThrowErrorMatchingInlineSnapshot(\n    `\\`legacyRoot: true\\` is not supported in this version of React. If your app runs React 19 or later, you should remove this flag. If your app runs React 18 or earlier, visit https://react.dev/blog/2022/03/08/react-18-upgrade-guide for upgrade instructions.`,\n  )\n})\n\ndescribe('reactStrictMode', () => {\n  let originalConfig\n  beforeEach(() => {\n    // Grab the existing configuration so we can restore\n    // it at the end of the test\n    configure(existingConfig => {\n      originalConfig = existingConfig\n      // Don't change the existing config\n      return {}\n    })\n  })\n\n  afterEach(() => {\n    configure(originalConfig)\n  })\n\n  test('reactStrictMode in renderOptions has precedence over config when rendering', () => {\n    const hookMountEffect = jest.fn()\n    configure({reactStrictMode: false})\n\n    renderHook(() => useEffect(() => hookMountEffect()), {\n      reactStrictMode: true,\n    })\n\n    expect(hookMountEffect).toHaveBeenCalledTimes(2)\n  })\n})\n"
  },
  {
    "path": "src/__tests__/rerender.js",
    "content": "import * as React from 'react'\nimport {render, configure} from '../'\n\ndescribe('rerender API', () => {\n  let originalConfig\n  beforeEach(() => {\n    // Grab the existing configuration so we can restore\n    // it at the end of the test\n    configure(existingConfig => {\n      originalConfig = existingConfig\n      // Don't change the existing config\n      return {}\n    })\n  })\n\n  afterEach(() => {\n    configure(originalConfig)\n  })\n\n  test('rerender will re-render the element', () => {\n    const Greeting = props => <div>{props.message}</div>\n    const {container, rerender} = render(<Greeting message=\"hi\" />)\n    expect(container.firstChild).toHaveTextContent('hi')\n    rerender(<Greeting message=\"hey\" />)\n    expect(container.firstChild).toHaveTextContent('hey')\n  })\n\n  test('hydrate will not update props until next render', () => {\n    const initialInputElement = document.createElement('input')\n    const container = document.createElement('div')\n    container.appendChild(initialInputElement)\n    document.body.appendChild(container)\n\n    const firstValue = 'hello'\n    const {rerender} = render(\n      <input value={firstValue} onChange={() => null} />,\n      {\n        container,\n        hydrate: true,\n      },\n    )\n\n    expect(initialInputElement).toHaveValue(firstValue)\n\n    const secondValue = 'goodbye'\n    rerender(<input value={secondValue} onChange={() => null} />)\n    expect(initialInputElement).toHaveValue(secondValue)\n  })\n\n  test('re-renders options.wrapper around node when reactStrictMode is true', () => {\n    configure({reactStrictMode: true})\n\n    const WrapperComponent = ({children}) => (\n      <div data-testid=\"wrapper\">{children}</div>\n    )\n    const Greeting = props => <div>{props.message}</div>\n    const {container, rerender} = render(<Greeting message=\"hi\" />, {\n      wrapper: WrapperComponent,\n    })\n\n    expect(container.firstChild).toMatchInlineSnapshot(`\n    <div\n      data-testid=wrapper\n    >\n      <div>\n        hi\n      </div>\n    </div>\n  `)\n\n    rerender(<Greeting message=\"hey\" />)\n    expect(container.firstChild).toMatchInlineSnapshot(`\n    <div\n      data-testid=wrapper\n    >\n      <div>\n        hey\n      </div>\n    </div>\n  `)\n  })\n\n  test('re-renders twice when reactStrictMode is true', () => {\n    configure({reactStrictMode: true})\n\n    const spy = jest.fn()\n    function Component() {\n      spy()\n      return null\n    }\n\n    const {rerender} = render(<Component />)\n    expect(spy).toHaveBeenCalledTimes(2)\n\n    spy.mockClear()\n    rerender(<Component />)\n    expect(spy).toHaveBeenCalledTimes(2)\n  })\n})\n"
  },
  {
    "path": "src/__tests__/stopwatch.js",
    "content": "import * as React from 'react'\nimport {render, fireEvent, screen} from '../'\n\nclass StopWatch extends React.Component {\n  state = {lapse: 0, running: false}\n  handleRunClick = () => {\n    this.setState(state => {\n      if (state.running) {\n        clearInterval(this.timer)\n      } else {\n        const startTime = Date.now() - this.state.lapse\n        this.timer = setInterval(() => {\n          this.setState({lapse: Date.now() - startTime})\n        })\n      }\n      return {running: !state.running}\n    })\n  }\n  handleClearClick = () => {\n    clearInterval(this.timer)\n    this.setState({lapse: 0, running: false})\n  }\n  componentWillUnmount() {\n    clearInterval(this.timer)\n  }\n  render() {\n    const {lapse, running} = this.state\n    return (\n      <div>\n        <span>{lapse}ms</span>\n        <button onClick={this.handleRunClick}>\n          {running ? 'Stop' : 'Start'}\n        </button>\n        <button onClick={this.handleClearClick}>Clear</button>\n      </div>\n    )\n  }\n}\n\nconst sleep = t => new Promise(resolve => setTimeout(resolve, t))\n\ntest('unmounts a component', async () => {\n  const {unmount, container} = render(<StopWatch />)\n  fireEvent.click(screen.getByText('Start'))\n  unmount()\n  // hey there reader! You don't need to have an assertion like this one\n  // this is just me making sure that the unmount function works.\n  // You don't need to do this in your apps. Just rely on the fact that this works.\n  expect(container).toBeEmptyDOMElement()\n  // just wait to see if the interval is cleared or not\n  // if it's not, then we'll call setState on an unmounted component\n  // and get an error.\n  await sleep(5)\n})\n"
  },
  {
    "path": "src/act-compat.js",
    "content": "import * as React from 'react'\nimport * as DeprecatedReactTestUtils from 'react-dom/test-utils'\n\nconst reactAct =\n  typeof React.act === 'function' ? React.act : DeprecatedReactTestUtils.act\n\nfunction getGlobalThis() {\n  /* istanbul ignore else */\n  if (typeof globalThis !== 'undefined') {\n    return globalThis\n  }\n  /* istanbul ignore next */\n  if (typeof self !== 'undefined') {\n    return self\n  }\n  /* istanbul ignore next */\n  if (typeof window !== 'undefined') {\n    return window\n  }\n  /* istanbul ignore next */\n  if (typeof global !== 'undefined') {\n    return global\n  }\n  /* istanbul ignore next */\n  throw new Error('unable to locate global object')\n}\n\nfunction setIsReactActEnvironment(isReactActEnvironment) {\n  getGlobalThis().IS_REACT_ACT_ENVIRONMENT = isReactActEnvironment\n}\n\nfunction getIsReactActEnvironment() {\n  return getGlobalThis().IS_REACT_ACT_ENVIRONMENT\n}\n\nfunction withGlobalActEnvironment(actImplementation) {\n  return callback => {\n    const previousActEnvironment = getIsReactActEnvironment()\n    setIsReactActEnvironment(true)\n    try {\n      // The return value of `act` is always a thenable.\n      let callbackNeedsToBeAwaited = false\n      const actResult = actImplementation(() => {\n        const result = callback()\n        if (\n          result !== null &&\n          typeof result === 'object' &&\n          typeof result.then === 'function'\n        ) {\n          callbackNeedsToBeAwaited = true\n        }\n        return result\n      })\n      if (callbackNeedsToBeAwaited) {\n        const thenable = actResult\n        return {\n          then: (resolve, reject) => {\n            thenable.then(\n              returnValue => {\n                setIsReactActEnvironment(previousActEnvironment)\n                resolve(returnValue)\n              },\n              error => {\n                setIsReactActEnvironment(previousActEnvironment)\n                reject(error)\n              },\n            )\n          },\n        }\n      } else {\n        setIsReactActEnvironment(previousActEnvironment)\n        return actResult\n      }\n    } catch (error) {\n      // Can't be a `finally {}` block since we don't know if we have to immediately restore IS_REACT_ACT_ENVIRONMENT\n      // or if we have to await the callback first.\n      setIsReactActEnvironment(previousActEnvironment)\n      throw error\n    }\n  }\n}\n\nconst act = withGlobalActEnvironment(reactAct)\n\nexport default act\nexport {\n  setIsReactActEnvironment as setReactActEnvironment,\n  getIsReactActEnvironment,\n}\n\n/* eslint no-console:0 */\n"
  },
  {
    "path": "src/config.js",
    "content": "import {\n  getConfig as getConfigDTL,\n  configure as configureDTL,\n} from '@testing-library/dom'\n\nlet configForRTL = {\n  reactStrictMode: false,\n}\n\nfunction getConfig() {\n  return {\n    ...getConfigDTL(),\n    ...configForRTL,\n  }\n}\n\nfunction configure(newConfig) {\n  if (typeof newConfig === 'function') {\n    // Pass the existing config out to the provided function\n    // and accept a delta in return\n    newConfig = newConfig(getConfig())\n  }\n\n  const {reactStrictMode, ...configForDTL} = newConfig\n\n  configureDTL(configForDTL)\n\n  configForRTL = {\n    ...configForRTL,\n    reactStrictMode,\n  }\n}\n\nexport {getConfig, configure}\n"
  },
  {
    "path": "src/fire-event.js",
    "content": "import {fireEvent as dtlFireEvent} from '@testing-library/dom'\n\n// react-testing-library's version of fireEvent will call\n// dom-testing-library's version of fireEvent. The reason\n// we make this distinction however is because we have\n// a few extra events that work a bit differently\nconst fireEvent = (...args) => dtlFireEvent(...args)\n\nObject.keys(dtlFireEvent).forEach(key => {\n  fireEvent[key] = (...args) => dtlFireEvent[key](...args)\n})\n\n// React event system tracks native mouseOver/mouseOut events for\n// running onMouseEnter/onMouseLeave handlers\n// @link https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/events/EnterLeaveEventPlugin.js#L24-L31\nconst mouseEnter = fireEvent.mouseEnter\nconst mouseLeave = fireEvent.mouseLeave\nfireEvent.mouseEnter = (...args) => {\n  mouseEnter(...args)\n  return fireEvent.mouseOver(...args)\n}\nfireEvent.mouseLeave = (...args) => {\n  mouseLeave(...args)\n  return fireEvent.mouseOut(...args)\n}\n\nconst pointerEnter = fireEvent.pointerEnter\nconst pointerLeave = fireEvent.pointerLeave\nfireEvent.pointerEnter = (...args) => {\n  pointerEnter(...args)\n  return fireEvent.pointerOver(...args)\n}\nfireEvent.pointerLeave = (...args) => {\n  pointerLeave(...args)\n  return fireEvent.pointerOut(...args)\n}\n\nconst select = fireEvent.select\nfireEvent.select = (node, init) => {\n  select(node, init)\n  // React tracks this event only on focused inputs\n  node.focus()\n\n  // React creates this event when one of the following native events happens\n  // - contextMenu\n  // - mouseUp\n  // - dragEnd\n  // - keyUp\n  // - keyDown\n  // so we can use any here\n  // @link https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/events/SelectEventPlugin.js#L203-L224\n  fireEvent.keyUp(node, init)\n}\n\n// React event system tracks native focusout/focusin events for\n// running blur/focus handlers\n// @link https://github.com/facebook/react/pull/19186\nconst blur = fireEvent.blur\nconst focus = fireEvent.focus\nfireEvent.blur = (...args) => {\n  fireEvent.focusOut(...args)\n  return blur(...args)\n}\nfireEvent.focus = (...args) => {\n  fireEvent.focusIn(...args)\n  return focus(...args)\n}\n\nexport {fireEvent}\n"
  },
  {
    "path": "src/index.js",
    "content": "import {getIsReactActEnvironment, setReactActEnvironment} from './act-compat'\nimport {cleanup} from './pure'\n\n// if we're running in a test runner that supports afterEach\n// or teardown then we'll automatically run cleanup afterEach test\n// this ensures that tests run in isolation from each other\n// if you don't like this then either import the `pure` module\n// or set the RTL_SKIP_AUTO_CLEANUP env variable to 'true'.\nif (typeof process === 'undefined' || !process.env?.RTL_SKIP_AUTO_CLEANUP) {\n  // ignore teardown() in code coverage because Jest does not support it\n  /* istanbul ignore else */\n  if (typeof afterEach === 'function') {\n    afterEach(() => {\n      cleanup()\n    })\n  } else if (typeof teardown === 'function') {\n    // Block is guarded by `typeof` check.\n    // eslint does not support `typeof` guards.\n    // eslint-disable-next-line no-undef\n    teardown(() => {\n      cleanup()\n    })\n  }\n\n  // No test setup with other test runners available\n  /* istanbul ignore else */\n  if (typeof beforeAll === 'function' && typeof afterAll === 'function') {\n    // This matches the behavior of React < 18.\n    let previousIsReactActEnvironment = getIsReactActEnvironment()\n    beforeAll(() => {\n      previousIsReactActEnvironment = getIsReactActEnvironment()\n      setReactActEnvironment(true)\n    })\n\n    afterAll(() => {\n      setReactActEnvironment(previousIsReactActEnvironment)\n    })\n  }\n}\n\nexport * from './pure'\n"
  },
  {
    "path": "src/pure.js",
    "content": "import * as React from 'react'\nimport ReactDOM from 'react-dom'\nimport * as ReactDOMClient from 'react-dom/client'\nimport {\n  getQueriesForElement,\n  prettyDOM,\n  configure as configureDTL,\n} from '@testing-library/dom'\nimport act, {\n  getIsReactActEnvironment,\n  setReactActEnvironment,\n} from './act-compat'\nimport {fireEvent} from './fire-event'\nimport {getConfig, configure} from './config'\n\nfunction jestFakeTimersAreEnabled() {\n  /* istanbul ignore else */\n  if (typeof jest !== 'undefined' && jest !== null) {\n    return (\n      // legacy timers\n      setTimeout._isMockFunction === true || // modern timers\n      // eslint-disable-next-line prefer-object-has-own -- No Object.hasOwn in all target environments we support.\n      Object.prototype.hasOwnProperty.call(setTimeout, 'clock')\n    )\n  } // istanbul ignore next\n\n  return false\n}\n\nconfigureDTL({\n  unstable_advanceTimersWrapper: cb => {\n    return act(cb)\n  },\n  // We just want to run `waitFor` without IS_REACT_ACT_ENVIRONMENT\n  // But that's not necessarily how `asyncWrapper` is used since it's a public method.\n  // Let's just hope nobody else is using it.\n  asyncWrapper: async cb => {\n    const previousActEnvironment = getIsReactActEnvironment()\n    setReactActEnvironment(false)\n    try {\n      const result = await cb()\n      // Drain microtask queue.\n      // Otherwise we'll restore the previous act() environment, before we resolve the `waitFor` call.\n      // The caller would have no chance to wrap the in-flight Promises in `act()`\n      await new Promise(resolve => {\n        setTimeout(() => {\n          resolve()\n        }, 0)\n\n        if (jestFakeTimersAreEnabled()) {\n          jest.advanceTimersByTime(0)\n        }\n      })\n\n      return result\n    } finally {\n      setReactActEnvironment(previousActEnvironment)\n    }\n  },\n  eventWrapper: cb => {\n    let result\n    act(() => {\n      result = cb()\n    })\n    return result\n  },\n})\n\n// Ideally we'd just use a WeakMap where containers are keys and roots are values.\n// We use two variables so that we can bail out in constant time when we render with a new container (most common use case)\n/**\n * @type {Set<import('react-dom').Container>}\n */\nconst mountedContainers = new Set()\n/**\n * @type Array<{container: import('react-dom').Container, root: ReturnType<typeof createConcurrentRoot>}>\n */\nconst mountedRootEntries = []\n\nfunction strictModeIfNeeded(innerElement, reactStrictMode) {\n  return reactStrictMode ?? getConfig().reactStrictMode\n    ? React.createElement(React.StrictMode, null, innerElement)\n    : innerElement\n}\n\nfunction wrapUiIfNeeded(innerElement, wrapperComponent) {\n  return wrapperComponent\n    ? React.createElement(wrapperComponent, null, innerElement)\n    : innerElement\n}\n\nfunction createConcurrentRoot(\n  container,\n  {\n    hydrate,\n    onCaughtError,\n    onRecoverableError,\n    ui,\n    wrapper: WrapperComponent,\n    reactStrictMode,\n  },\n) {\n  let root\n  if (hydrate) {\n    act(() => {\n      root = ReactDOMClient.hydrateRoot(\n        container,\n        strictModeIfNeeded(\n          wrapUiIfNeeded(ui, WrapperComponent),\n          reactStrictMode,\n        ),\n        {onCaughtError, onRecoverableError},\n      )\n    })\n  } else {\n    root = ReactDOMClient.createRoot(container, {\n      onCaughtError,\n      onRecoverableError,\n    })\n  }\n\n  return {\n    hydrate() {\n      /* istanbul ignore if */\n      if (!hydrate) {\n        throw new Error(\n          'Attempted to hydrate a non-hydrateable root. This is a bug in `@testing-library/react`.',\n        )\n      }\n      // Nothing to do since hydration happens when creating the root object.\n    },\n    render(element) {\n      root.render(element)\n    },\n    unmount() {\n      root.unmount()\n    },\n  }\n}\n\nfunction createLegacyRoot(container) {\n  return {\n    hydrate(element) {\n      ReactDOM.hydrate(element, container)\n    },\n    render(element) {\n      ReactDOM.render(element, container)\n    },\n    unmount() {\n      ReactDOM.unmountComponentAtNode(container)\n    },\n  }\n}\n\nfunction renderRoot(\n  ui,\n  {\n    baseElement,\n    container,\n    hydrate,\n    queries,\n    root,\n    wrapper: WrapperComponent,\n    reactStrictMode,\n  },\n) {\n  act(() => {\n    if (hydrate) {\n      root.hydrate(\n        strictModeIfNeeded(\n          wrapUiIfNeeded(ui, WrapperComponent),\n          reactStrictMode,\n        ),\n        container,\n      )\n    } else {\n      root.render(\n        strictModeIfNeeded(\n          wrapUiIfNeeded(ui, WrapperComponent),\n          reactStrictMode,\n        ),\n        container,\n      )\n    }\n  })\n\n  return {\n    container,\n    baseElement,\n    debug: (el = baseElement, maxLength, options) =>\n      Array.isArray(el)\n        ? // eslint-disable-next-line no-console\n          el.forEach(e => console.log(prettyDOM(e, maxLength, options)))\n        : // eslint-disable-next-line no-console,\n          console.log(prettyDOM(el, maxLength, options)),\n    unmount: () => {\n      act(() => {\n        root.unmount()\n      })\n    },\n    rerender: rerenderUi => {\n      renderRoot(rerenderUi, {\n        container,\n        baseElement,\n        root,\n        wrapper: WrapperComponent,\n        reactStrictMode,\n      })\n      // Intentionally do not return anything to avoid unnecessarily complicating the API.\n      // folks can use all the same utilities we return in the first place that are bound to the container\n    },\n    asFragment: () => {\n      /* istanbul ignore else (old jsdom limitation) */\n      if (typeof document.createRange === 'function') {\n        return document\n          .createRange()\n          .createContextualFragment(container.innerHTML)\n      } else {\n        const template = document.createElement('template')\n        template.innerHTML = container.innerHTML\n        return template.content\n      }\n    },\n    ...getQueriesForElement(baseElement, queries),\n  }\n}\n\nfunction render(\n  ui,\n  {\n    container,\n    baseElement = container,\n    legacyRoot = false,\n    onCaughtError,\n    onUncaughtError,\n    onRecoverableError,\n    queries,\n    hydrate = false,\n    wrapper,\n    reactStrictMode,\n  } = {},\n) {\n  if (onUncaughtError !== undefined) {\n    throw new Error(\n      'onUncaughtError is not supported. The `render` call will already throw on uncaught errors.',\n    )\n  }\n  if (legacyRoot && typeof ReactDOM.render !== 'function') {\n    const error = new Error(\n      '`legacyRoot: true` is not supported in this version of React. ' +\n        'If your app runs React 19 or later, you should remove this flag. ' +\n        'If your app runs React 18 or earlier, visit https://react.dev/blog/2022/03/08/react-18-upgrade-guide for upgrade instructions.',\n    )\n    Error.captureStackTrace(error, render)\n    throw error\n  }\n\n  if (!baseElement) {\n    // default to document.body instead of documentElement to avoid output of potentially-large\n    // head elements (such as JSS style blocks) in debug output\n    baseElement = document.body\n  }\n  if (!container) {\n    container = baseElement.appendChild(document.createElement('div'))\n  }\n\n  let root\n  // eslint-disable-next-line no-negated-condition -- we want to map the evolution of this over time. The root is created first. Only later is it re-used so we don't want to read the case that happens later first.\n  if (!mountedContainers.has(container)) {\n    const createRootImpl = legacyRoot ? createLegacyRoot : createConcurrentRoot\n    root = createRootImpl(container, {\n      hydrate,\n      onCaughtError,\n      onRecoverableError,\n      ui,\n      wrapper,\n      reactStrictMode,\n    })\n\n    mountedRootEntries.push({container, root})\n    // we'll add it to the mounted containers regardless of whether it's actually\n    // added to document.body so the cleanup method works regardless of whether\n    // they're passing us a custom container or not.\n    mountedContainers.add(container)\n  } else {\n    mountedRootEntries.forEach(rootEntry => {\n      // Else is unreachable since `mountedContainers` has the `container`.\n      // Only reachable if one would accidentally add the container to `mountedContainers` but not the root to `mountedRootEntries`\n      /* istanbul ignore else */\n      if (rootEntry.container === container) {\n        root = rootEntry.root\n      }\n    })\n  }\n\n  return renderRoot(ui, {\n    container,\n    baseElement,\n    queries,\n    hydrate,\n    wrapper,\n    root,\n    reactStrictMode,\n  })\n}\n\nfunction cleanup() {\n  mountedRootEntries.forEach(({root, container}) => {\n    act(() => {\n      root.unmount()\n    })\n    if (container.parentNode === document.body) {\n      document.body.removeChild(container)\n    }\n  })\n  mountedRootEntries.length = 0\n  mountedContainers.clear()\n}\n\nfunction renderHook(renderCallback, options = {}) {\n  const {initialProps, ...renderOptions} = options\n\n  if (renderOptions.legacyRoot && typeof ReactDOM.render !== 'function') {\n    const error = new Error(\n      '`legacyRoot: true` is not supported in this version of React. ' +\n        'If your app runs React 19 or later, you should remove this flag. ' +\n        'If your app runs React 18 or earlier, visit https://react.dev/blog/2022/03/08/react-18-upgrade-guide for upgrade instructions.',\n    )\n    Error.captureStackTrace(error, renderHook)\n    throw error\n  }\n\n  const result = React.createRef()\n\n  function TestComponent({renderCallbackProps}) {\n    const pendingResult = renderCallback(renderCallbackProps)\n\n    React.useEffect(() => {\n      result.current = pendingResult\n    })\n\n    return null\n  }\n\n  const {rerender: baseRerender, unmount} = render(\n    <TestComponent renderCallbackProps={initialProps} />,\n    renderOptions,\n  )\n\n  function rerender(rerenderCallbackProps) {\n    return baseRerender(\n      <TestComponent renderCallbackProps={rerenderCallbackProps} />,\n    )\n  }\n\n  return {result, rerender, unmount}\n}\n\n// just re-export everything from dom-testing-library\nexport * from '@testing-library/dom'\nexport {render, renderHook, cleanup, act, fireEvent, getConfig, configure}\n\n/* eslint func-name-matching:0 */\n"
  },
  {
    "path": "tests/failOnUnexpectedConsoleCalls.js",
    "content": "// Fork of https://github.com/facebook/react/blob/513417d6951fa3ff5729302b7990b84604b11afa/scripts/jest/setupTests.js#L71-L161\n/**\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */\n/* eslint-disable prefer-template */\n/* eslint-disable func-names */\nconst util = require('util')\nconst chalk = require('chalk')\nconst shouldIgnoreConsoleError = require('./shouldIgnoreConsoleError')\n\nconst patchConsoleMethod = (methodName, unexpectedConsoleCallStacks) => {\n  const newMethod = function (format, ...args) {\n    // Ignore uncaught errors reported by jsdom\n    // and React addendums because they're too noisy.\n    if (methodName === 'error' && shouldIgnoreConsoleError(format, args)) {\n      return\n    }\n\n    // Capture the call stack now so we can warn about it later.\n    // The call stack has helpful information for the test author.\n    // Don't throw yet though b'c it might be accidentally caught and suppressed.\n    const stack = new Error().stack\n    unexpectedConsoleCallStacks.push([\n      stack.substr(stack.indexOf('\\n') + 1),\n      util.format(format, ...args),\n    ])\n  }\n\n  console[methodName] = newMethod\n\n  return newMethod\n}\n\nconst isSpy = spy =>\n  (spy.calls && typeof spy.calls.count === 'function') ||\n  spy._isMockFunction === true\n\nconst flushUnexpectedConsoleCalls = (\n  mockMethod,\n  methodName,\n  expectedMatcher,\n  unexpectedConsoleCallStacks,\n) => {\n  if (console[methodName] !== mockMethod && !isSpy(console[methodName])) {\n    throw new Error(\n      `Test did not tear down console.${methodName} mock properly.`,\n    )\n  }\n  if (unexpectedConsoleCallStacks.length > 0) {\n    const messages = unexpectedConsoleCallStacks.map(\n      ([stack, message]) =>\n        `${chalk.red(message)}\\n` +\n        `${stack\n          .split('\\n')\n          .map(line => chalk.gray(line))\n          .join('\\n')}`,\n    )\n\n    const message =\n      `Expected test not to call ${chalk.bold(\n        `console.${methodName}()`,\n      )}.\\n\\n` +\n      'If the warning is expected, test for it explicitly by:\\n' +\n      `1. Using the ${chalk.bold('.' + expectedMatcher + '()')} ` +\n      `matcher, or...\\n` +\n      `2. Mock it out using ${chalk.bold(\n        'spyOnDev',\n      )}(console, '${methodName}') or ${chalk.bold(\n        'spyOnProd',\n      )}(console, '${methodName}'), and test that the warning occurs.`\n\n    throw new Error(`${message}\\n\\n${messages.join('\\n\\n')}`)\n  }\n}\n\nconst unexpectedErrorCallStacks = []\nconst unexpectedWarnCallStacks = []\n\nconst errorMethod = patchConsoleMethod('error', unexpectedErrorCallStacks)\nconst warnMethod = patchConsoleMethod('warn', unexpectedWarnCallStacks)\n\nconst flushAllUnexpectedConsoleCalls = () => {\n  flushUnexpectedConsoleCalls(\n    errorMethod,\n    'error',\n    'toErrorDev',\n    unexpectedErrorCallStacks,\n  )\n  flushUnexpectedConsoleCalls(\n    warnMethod,\n    'warn',\n    'toWarnDev',\n    unexpectedWarnCallStacks,\n  )\n  unexpectedErrorCallStacks.length = 0\n  unexpectedWarnCallStacks.length = 0\n}\n\nconst resetAllUnexpectedConsoleCalls = () => {\n  unexpectedErrorCallStacks.length = 0\n  unexpectedWarnCallStacks.length = 0\n}\n\nexpect.extend({\n  ...require('./toWarnDev'),\n})\n\nbeforeEach(resetAllUnexpectedConsoleCalls)\nafterEach(flushAllUnexpectedConsoleCalls)\n"
  },
  {
    "path": "tests/setup-env.js",
    "content": "import '@testing-library/jest-dom/extend-expect'\nimport './failOnUnexpectedConsoleCalls'\nimport {TextEncoder} from 'util'\nimport {MessageChannel} from 'worker_threads'\n\nglobal.TextEncoder = TextEncoder\n// TODO: Revisit once https://github.com/jsdom/jsdom/issues/2448 is resolved\n// This isn't perfect but good enough.\nglobal.MessageChannel = MessageChannel\n"
  },
  {
    "path": "tests/shouldIgnoreConsoleError.js",
    "content": "// Fork of https://github.com/facebook/react/blob/513417d6951fa3ff5729302b7990b84604b11afa/scripts/jest/shouldIgnoreConsoleError.js\n/**\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */\n\nmodule.exports = function shouldIgnoreConsoleError(format) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (typeof format === 'string') {\n      if (format.indexOf('Error: Uncaught [') === 0) {\n        // This looks like an uncaught error from invokeGuardedCallback() wrapper\n        // in development that is reported by jsdom. Ignore because it's noisy.\n        return true\n      }\n      if (format.indexOf('The above error occurred') === 0) {\n        // This looks like an error addendum from ReactFiberErrorLogger.\n        // Ignore it too.\n        return true\n      }\n      if (\n        format.startsWith(\n          'Warning: `ReactDOMTestUtils.act` is deprecated in favor of `React.act`.',\n        )\n      ) {\n        // This is a React bug in 18.3.0.\n        // Versions with `ReactDOMTestUtils.ac` being deprecated, should have `React.act`\n        return true\n      }\n    }\n  }\n  // Looks legit\n  return false\n}\n"
  },
  {
    "path": "tests/toWarnDev.js",
    "content": "// Fork of https://github.com/facebook/react/blob/513417d6951fa3ff5729302b7990b84604b11afa/scripts/jest/matchers/toWarnDev.js\n/**\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */\n/* eslint-disable no-unsafe-finally */\n/* eslint-disable no-negated-condition */\n/* eslint-disable no-invalid-this */\n/* eslint-disable prefer-template */\n/* eslint-disable func-names */\n/* eslint-disable complexity */\nconst util = require('util')\nconst jestDiff = require('jest-diff').diff\nconst shouldIgnoreConsoleError = require('./shouldIgnoreConsoleError')\n\nfunction normalizeCodeLocInfo(str) {\n  if (typeof str !== 'string') {\n    return str\n  }\n  // This special case exists only for the special source location in\n  // ReactElementValidator. That will go away if we remove source locations.\n  str = str.replace(/Check your code at .+?:\\d+/g, 'Check your code at **')\n  // V8 format:\n  //  at Component (/path/filename.js:123:45)\n  // React format:\n  //    in Component (at filename.js:123)\n  // eslint-disable-next-line prefer-arrow-callback\n  return str.replace(/\\n +(?:at|in) ([\\S]+)[^\\n]*/g, function (m, name) {\n    return '\\n    in ' + name + ' (at **)'\n  })\n}\n\nconst createMatcherFor = (consoleMethod, matcherName) =>\n  function matcher(callback, expectedMessages, options = {}) {\n    if (process.env.NODE_ENV !== 'production') {\n      // Warn about incorrect usage of matcher.\n      if (typeof expectedMessages === 'string') {\n        expectedMessages = [expectedMessages]\n      } else if (!Array.isArray(expectedMessages)) {\n        throw Error(\n          `${matcherName}() requires a parameter of type string or an array of strings ` +\n            `but was given ${typeof expectedMessages}.`,\n        )\n      }\n      if (\n        options != null &&\n        (typeof options !== 'object' || Array.isArray(options))\n      ) {\n        throw new Error(\n          `${matcherName}() second argument, when present, should be an object. ` +\n            'Did you forget to wrap the messages into an array?',\n        )\n      }\n      if (arguments.length > 3) {\n        // `matcher` comes from Jest, so it's more than 2 in practice\n        throw new Error(\n          `${matcherName}() received more than two arguments. ` +\n            'Did you forget to wrap the messages into an array?',\n        )\n      }\n\n      const withoutStack = options.withoutStack\n      const logAllErrors = options.logAllErrors\n      const warningsWithoutComponentStack = []\n      const warningsWithComponentStack = []\n      const unexpectedWarnings = []\n\n      let lastWarningWithMismatchingFormat = null\n      let lastWarningWithExtraComponentStack = null\n\n      // Catch errors thrown by the callback,\n      // But only rethrow them if all test expectations have been satisfied.\n      // Otherwise an Error in the callback can mask a failed expectation,\n      // and result in a test that passes when it shouldn't.\n      let caughtError\n\n      const isLikelyAComponentStack = message =>\n        typeof message === 'string' &&\n        (message.includes('\\n    in ') || message.includes('\\n    at '))\n\n      const consoleSpy = (format, ...args) => {\n        // Ignore uncaught errors reported by jsdom\n        // and React addendums because they're too noisy.\n        if (\n          !logAllErrors &&\n          consoleMethod === 'error' &&\n          shouldIgnoreConsoleError(format, args)\n        ) {\n          return\n        }\n\n        const message = util.format(format, ...args)\n        const normalizedMessage = normalizeCodeLocInfo(message)\n\n        // Remember if the number of %s interpolations\n        // doesn't match the number of arguments.\n        // We'll fail the test if it happens.\n        let argIndex = 0\n        String(format).replace(/%s/g, () => argIndex++)\n        if (argIndex !== args.length) {\n          lastWarningWithMismatchingFormat = {\n            format,\n            args,\n            expectedArgCount: argIndex,\n          }\n        }\n\n        // Protect against accidentally passing a component stack\n        // to warning() which already injects the component stack.\n        if (\n          args.length >= 2 &&\n          isLikelyAComponentStack(args[args.length - 1]) &&\n          isLikelyAComponentStack(args[args.length - 2])\n        ) {\n          lastWarningWithExtraComponentStack = {\n            format,\n          }\n        }\n\n        for (let index = 0; index < expectedMessages.length; index++) {\n          const expectedMessage = expectedMessages[index]\n          if (\n            normalizedMessage === expectedMessage ||\n            normalizedMessage.includes(expectedMessage)\n          ) {\n            if (isLikelyAComponentStack(normalizedMessage)) {\n              warningsWithComponentStack.push(normalizedMessage)\n            } else {\n              warningsWithoutComponentStack.push(normalizedMessage)\n            }\n            expectedMessages.splice(index, 1)\n            return\n          }\n        }\n\n        let errorMessage\n        if (expectedMessages.length === 0) {\n          errorMessage =\n            'Unexpected warning recorded: ' +\n            this.utils.printReceived(normalizedMessage)\n        } else if (expectedMessages.length === 1) {\n          errorMessage =\n            'Unexpected warning recorded: ' +\n            jestDiff(expectedMessages[0], normalizedMessage)\n        } else {\n          errorMessage =\n            'Unexpected warning recorded: ' +\n            jestDiff(expectedMessages, [normalizedMessage])\n        }\n\n        // Record the call stack for unexpected warnings.\n        // We don't throw an Error here though,\n        // Because it might be suppressed by ReactFiberScheduler.\n        unexpectedWarnings.push(new Error(errorMessage))\n      }\n\n      // TODO Decide whether we need to support nested toWarn* expectations.\n      // If we don't need it, add a check here to see if this is already our spy,\n      // And throw an error.\n      const originalMethod = console[consoleMethod]\n\n      // Avoid using Jest's built-in spy since it can't be removed.\n      console[consoleMethod] = consoleSpy\n\n      try {\n        callback()\n      } catch (error) {\n        caughtError = error\n      } finally {\n        // Restore the unspied method so that unexpected errors fail tests.\n        console[consoleMethod] = originalMethod\n\n        // Any unexpected Errors thrown by the callback should fail the test.\n        // This should take precedence since unexpected errors could block warnings.\n        if (caughtError) {\n          throw caughtError\n        }\n\n        // Any unexpected warnings should be treated as a failure.\n        if (unexpectedWarnings.length > 0) {\n          return {\n            message: () => unexpectedWarnings[0].stack,\n            pass: false,\n          }\n        }\n\n        // Any remaining messages indicate a failed expectations.\n        if (expectedMessages.length > 0) {\n          return {\n            message: () =>\n              `Expected warning was not recorded:\\n  ${this.utils.printReceived(\n                expectedMessages[0],\n              )}`,\n            pass: false,\n          }\n        }\n\n        if (typeof withoutStack === 'number') {\n          // We're expecting a particular number of warnings without stacks.\n          if (withoutStack !== warningsWithoutComponentStack.length) {\n            return {\n              message: () =>\n                `Expected ${withoutStack} warnings without a component stack but received ${warningsWithoutComponentStack.length}:\\n` +\n                warningsWithoutComponentStack.map(warning =>\n                  this.utils.printReceived(warning),\n                ),\n              pass: false,\n            }\n          }\n        } else if (withoutStack === true) {\n          // We're expecting that all warnings won't have the stack.\n          // If some warnings have it, it's an error.\n          if (warningsWithComponentStack.length > 0) {\n            return {\n              message: () =>\n                `Received warning unexpectedly includes a component stack:\\n  ${this.utils.printReceived(\n                  warningsWithComponentStack[0],\n                )}\\nIf this warning intentionally includes the component stack, remove ` +\n                `{withoutStack: true} from the ${matcherName}() call. If you have a mix of ` +\n                `warnings with and without stack in one ${matcherName}() call, pass ` +\n                `{withoutStack: N} where N is the number of warnings without stacks.`,\n              pass: false,\n            }\n          }\n        } else if (withoutStack === false || withoutStack === undefined) {\n          // We're expecting that all warnings *do* have the stack (default).\n          // If some warnings don't have it, it's an error.\n          if (warningsWithoutComponentStack.length > 0) {\n            return {\n              message: () =>\n                `Received warning unexpectedly does not include a component stack:\\n  ${this.utils.printReceived(\n                  warningsWithoutComponentStack[0],\n                )}\\nIf this warning intentionally omits the component stack, add ` +\n                `{withoutStack: true} to the ${matcherName} call.`,\n              pass: false,\n            }\n          }\n        } else {\n          throw Error(\n            `The second argument for ${matcherName}(), when specified, must be an object. It may have a ` +\n              `property called \"withoutStack\" whose value may be undefined, boolean, or a number. ` +\n              `Instead received ${typeof withoutStack}.`,\n          )\n        }\n\n        if (lastWarningWithMismatchingFormat !== null) {\n          return {\n            message: () =>\n              `Received ${\n                lastWarningWithMismatchingFormat.args.length\n              } arguments for a message with ${\n                lastWarningWithMismatchingFormat.expectedArgCount\n              } placeholders:\\n  ${this.utils.printReceived(\n                lastWarningWithMismatchingFormat.format,\n              )}`,\n            pass: false,\n          }\n        }\n\n        if (lastWarningWithExtraComponentStack !== null) {\n          return {\n            message: () =>\n              `Received more than one component stack for a warning:\\n  ${this.utils.printReceived(\n                lastWarningWithExtraComponentStack.format,\n              )}\\nDid you accidentally pass a stack to warning() as the last argument? ` +\n              `Don't forget warning() already injects the component stack automatically.`,\n            pass: false,\n          }\n        }\n\n        return {pass: true}\n      }\n    } else {\n      // Any uncaught errors or warnings should fail tests in production mode.\n      callback()\n\n      return {pass: true}\n    }\n  }\n\nmodule.exports = {\n  toWarnDev: createMatcherFor('warn', 'toWarnDev'),\n  toErrorDev: createMatcherFor('error', 'toErrorDev'),\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  // Visit https://aka.ms/tsconfig to read more about this file\n  \"compilerOptions\": {\n    // File Layout\n    // \"rootDir\": \"./src\",\n    // \"outDir\": \"./dist\",\n\n    // Environment Settings\n    // See also https://aka.ms/tsconfig/module\n    \"module\": \"nodenext\",\n    \"target\": \"esnext\",\n    // For nodejs:\n    \"lib\": [\"esnext\", \"DOM\"],\n    \"types\": [\"node\"],\n\n    // Other Outputs\n    \"sourceMap\": true,\n    \"declaration\": true,\n    \"declarationMap\": true,\n\n    // Stricter Typechecking Options\n    \"noUncheckedIndexedAccess\": true,\n    \"exactOptionalPropertyTypes\": true,\n\n    // Style Options\n    // \"noImplicitReturns\": true,\n    // \"noImplicitOverride\": true,\n    // \"noUnusedLocals\": true,\n    // \"noUnusedParameters\": true,\n    // \"noFallthroughCasesInSwitch\": true,\n    // \"noPropertyAccessFromIndexSignature\": true,\n\n    \"strict\": true,\n    \"jsx\": \"react-jsx\",\n    \"verbatimModuleSyntax\": false,\n    \"isolatedModules\": true,\n    \"noUncheckedSideEffectImports\": true,\n    \"moduleDetection\": \"force\",\n    \"skipLibCheck\": false,\n\n    \"noEmit\": true\n  },\n  \"include\": [\"types\"]\n}\n"
  },
  {
    "path": "types/index.d.ts",
    "content": "// TypeScript Version: 3.8\nimport * as ReactDOMClient from 'react-dom/client'\nimport {\n  queries,\n  Queries,\n  BoundFunction,\n  prettyFormat,\n  Config as ConfigDTL,\n} from '@testing-library/dom'\nimport {act as reactDeprecatedAct} from 'react-dom/test-utils'\n//@ts-ignore\nimport {act as reactAct} from 'react'\n\nexport * from '@testing-library/dom'\n\nexport interface Config extends ConfigDTL {\n  reactStrictMode: boolean\n}\n\nexport interface ConfigFn {\n  (existingConfig: Config): Partial<Config>\n}\n\nexport function configure(configDelta: ConfigFn | Partial<Config>): void\n\nexport function getConfig(): Config\n\nexport type RenderResult<\n  Q extends Queries = typeof queries,\n  Container extends RendererableContainer | HydrateableContainer = HTMLElement,\n  BaseElement extends RendererableContainer | HydrateableContainer = Container,\n> = {\n  container: Container\n  baseElement: BaseElement\n  debug: (\n    baseElement?:\n      | RendererableContainer\n      | HydrateableContainer\n      | Array<RendererableContainer | HydrateableContainer>\n      | undefined,\n    maxLength?: number | undefined,\n    options?: prettyFormat.OptionsReceived | undefined,\n  ) => void\n  rerender: (ui: React.ReactNode) => void\n  unmount: () => void\n  asFragment: () => DocumentFragment\n} & {[P in keyof Q]: BoundFunction<Q[P]>}\n\n/** @deprecated */\nexport type BaseRenderOptions<\n  Q extends Queries,\n  Container extends RendererableContainer | HydrateableContainer,\n  BaseElement extends RendererableContainer | HydrateableContainer,\n> = RenderOptions<Q, Container, BaseElement>\n\ntype RendererableContainer = ReactDOMClient.Container\ntype HydrateableContainer = Parameters<typeof ReactDOMClient['hydrateRoot']>[0]\n/** @deprecated */\nexport interface ClientRenderOptions<\n  Q extends Queries,\n  Container extends RendererableContainer,\n  BaseElement extends RendererableContainer = Container,\n> extends BaseRenderOptions<Q, Container, BaseElement> {\n  /**\n   * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side\n   *  rendering and use ReactDOM.hydrate to mount your components.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#hydrate)\n   */\n  hydrate?: false | undefined\n}\n/** @deprecated */\nexport interface HydrateOptions<\n  Q extends Queries,\n  Container extends HydrateableContainer,\n  BaseElement extends HydrateableContainer = Container,\n> extends BaseRenderOptions<Q, Container, BaseElement> {\n  /**\n   * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side\n   *  rendering and use ReactDOM.hydrate to mount your components.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#hydrate)\n   */\n  hydrate: true\n}\n\nexport interface RenderOptions<\n  Q extends Queries = typeof queries,\n  Container extends RendererableContainer | HydrateableContainer = HTMLElement,\n  BaseElement extends RendererableContainer | HydrateableContainer = Container,\n> {\n  /**\n   * By default, React Testing Library will create a div and append that div to the document.body. Your React component will be rendered in the created div. If you provide your own HTMLElement container via this option,\n   *  it will not be appended to the document.body automatically.\n   *\n   *  For example: If you are unit testing a `<tbody>` element, it cannot be a child of a div. In this case, you can\n   *  specify a table as the render container.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#container\n   */\n  container?: Container | undefined\n  /**\n   * Defaults to the container if the container is specified. Otherwise `document.body` is used for the default. This is used as\n   *  the base element for the queries as well as what is printed when you use `debug()`.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#baseelement\n   */\n  baseElement?: BaseElement | undefined\n  /**\n   * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side\n   *  rendering and use ReactDOM.hydrate to mount your components.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#hydrate)\n   */\n  hydrate?: boolean | undefined\n  /**\n   * Only works if used with React 18.\n   * Set to `true` if you want to force synchronous `ReactDOM.render`.\n   * Otherwise `render` will default to concurrent React if available.\n   */\n  legacyRoot?: boolean | undefined\n  /**\n   * Only supported in React 19.\n   * Callback called when React catches an error in an Error Boundary.\n   * Called with the error caught by the Error Boundary, and an `errorInfo` object containing the `componentStack`.\n   *\n   * @see {@link https://react.dev/reference/react-dom/client/createRoot#parameters createRoot#options}\n   */\n  onCaughtError?: ReactDOMClient.RootOptions extends {\n    onCaughtError?: infer OnCaughtError\n  }\n    ? OnCaughtError\n    : never\n  /**\n   * Callback called when React automatically recovers from errors.\n   * Called with an error React throws, and an `errorInfo` object containing the `componentStack`.\n   * Some recoverable errors may include the original error cause as `error.cause`.\n   *\n   * @see {@link https://react.dev/reference/react-dom/client/createRoot#parameters createRoot#options}\n   */\n  onRecoverableError?: ReactDOMClient.RootOptions['onRecoverableError']\n  /**\n   * Not supported at the moment\n   */\n  onUncaughtError?: never\n  /**\n   * Queries to bind. Overrides the default set from DOM Testing Library unless merged.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#queries\n   */\n  queries?: Q | undefined\n  /**\n   * Pass a React Component as the wrapper option to have it rendered around the inner element. This is most useful for creating\n   *  reusable custom render functions for common data providers. See setup for examples.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#wrapper\n   */\n  wrapper?: React.JSXElementConstructor<{children: React.ReactNode}> | undefined\n  /**\n   * When enabled, <StrictMode> is rendered around the inner element.\n   * If defined, overrides the value of `reactStrictMode` set in `configure`.\n   */\n  reactStrictMode?: boolean\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\n\n/**\n * Render into a container which is appended to document.body. It should be used with cleanup.\n */\nexport function render<\n  Q extends Queries = typeof queries,\n  Container extends RendererableContainer | HydrateableContainer = HTMLElement,\n  BaseElement extends RendererableContainer | HydrateableContainer = Container,\n>(\n  ui: React.ReactNode,\n  options: RenderOptions<Q, Container, BaseElement>,\n): RenderResult<Q, Container, BaseElement>\nexport function render(\n  ui: React.ReactNode,\n  options?: Omit<RenderOptions, 'queries'> | undefined,\n): RenderResult\n\nexport interface RenderHookResult<Result, Props> {\n  /**\n   * Triggers a re-render. The props will be passed to your renderHook callback.\n   */\n  rerender: (props?: Props) => void\n  /**\n   * This is a stable reference to the latest value returned by your renderHook\n   * callback\n   */\n  result: {\n    /**\n     * The value returned by your renderHook callback\n     */\n    current: Result\n  }\n  /**\n   * Unmounts the test component. This is useful for when you need to test\n   * any cleanup your useEffects have.\n   */\n  unmount: () => void\n}\n\n/** @deprecated */\nexport type BaseRenderHookOptions<\n  Props,\n  Q extends Queries,\n  Container extends RendererableContainer | HydrateableContainer,\n  BaseElement extends Element | DocumentFragment,\n> = RenderHookOptions<Props, Q, Container, BaseElement>\n\n/** @deprecated */\nexport interface ClientRenderHookOptions<\n  Props,\n  Q extends Queries,\n  Container extends Element | DocumentFragment,\n  BaseElement extends Element | DocumentFragment = Container,\n> extends BaseRenderHookOptions<Props, Q, Container, BaseElement> {\n  /**\n   * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side\n   *  rendering and use ReactDOM.hydrate to mount your components.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#hydrate)\n   */\n  hydrate?: false | undefined\n}\n\n/** @deprecated */\nexport interface HydrateHookOptions<\n  Props,\n  Q extends Queries,\n  Container extends Element | DocumentFragment,\n  BaseElement extends Element | DocumentFragment = Container,\n> extends BaseRenderHookOptions<Props, Q, Container, BaseElement> {\n  /**\n   * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side\n   *  rendering and use ReactDOM.hydrate to mount your components.\n   *\n   *  @see https://testing-library.com/docs/react-testing-library/api/#hydrate)\n   */\n  hydrate: true\n}\n\nexport interface RenderHookOptions<\n  Props,\n  Q extends Queries = typeof queries,\n  Container extends RendererableContainer | HydrateableContainer = HTMLElement,\n  BaseElement extends RendererableContainer | HydrateableContainer = Container,\n> extends BaseRenderOptions<Q, Container, BaseElement> {\n  /**\n   * The argument passed to the renderHook callback. Can be useful if you plan\n   * to use the rerender utility to change the values passed to your hook.\n   */\n  initialProps?: Props | undefined\n}\n\n/**\n * Allows you to render a hook within a test React component without having to\n * create that component yourself.\n */\nexport function renderHook<\n  Result,\n  Props,\n  Q extends Queries = typeof queries,\n  Container extends RendererableContainer | HydrateableContainer = HTMLElement,\n  BaseElement extends RendererableContainer | HydrateableContainer = Container,\n>(\n  render: (initialProps: Props) => Result,\n  options?: RenderHookOptions<Props, Q, Container, BaseElement> | undefined,\n): RenderHookResult<Result, Props>\n\n/**\n * Unmounts React trees that were mounted with render.\n */\nexport function cleanup(): void\n\n/**\n * Simply calls React.act(cb)\n * If that's not available (older version of react) then it\n * simply calls the deprecated version which is ReactTestUtils.act(cb)\n */\n// IfAny<typeof reactAct, reactDeprecatedAct, reactAct> from https://stackoverflow.com/a/61626123/3406963\nexport const act: 0 extends 1 & typeof reactAct\n  ? typeof reactDeprecatedAct\n  : typeof reactAct\n"
  },
  {
    "path": "types/pure.d.ts",
    "content": "export * from './'\n"
  },
  {
    "path": "types/test.tsx",
    "content": "import * as React from 'react'\nimport {render, fireEvent, screen, waitFor, renderHook} from '.'\nimport * as pure from './pure'\n\nexport async function testRender() {\n  const view = render(<button />)\n\n  // single queries\n  view.getByText('foo')\n  view.queryByText('foo')\n  await view.findByText('foo')\n\n  // multiple queries\n  view.getAllByText('bar')\n  view.queryAllByText('bar')\n  await view.findAllByText('bar')\n\n  // helpers\n  const {container, rerender, debug} = view\n  expectType<HTMLElement, typeof container>(container)\n  return {container, rerender, debug}\n}\n\nexport async function testPureRender() {\n  const view = pure.render(<button />)\n\n  // single queries\n  view.getByText('foo')\n  view.queryByText('foo')\n  await view.findByText('foo')\n\n  // multiple queries\n  view.getAllByText('bar')\n  view.queryAllByText('bar')\n  await view.findAllByText('bar')\n\n  // helpers\n  const {container, rerender, debug} = view\n  expectType<HTMLElement, typeof container>(container)\n  return {container, rerender, debug}\n}\n\nexport function testRenderOptions() {\n  const container = document.createElement('div')\n  const options = {container}\n  const {container: returnedContainer} = render(<button />, options)\n  expectType<HTMLDivElement, typeof returnedContainer>(returnedContainer)\n\n  render(<div />, {wrapper: () => null})\n}\n\nexport function testSVGRenderOptions() {\n  const container = document.createElementNS(\n    'http://www.w3.org/2000/svg',\n    'svg',\n  )\n  const options = {container}\n  const {container: returnedContainer} = render(<path />, options)\n  expectType<SVGSVGElement, typeof returnedContainer>(returnedContainer)\n}\n\nexport function testFireEvent() {\n  const {container} = render(<button />)\n  fireEvent.click(container)\n}\n\nexport function testConfigure() {\n  // test for DTL's config\n  pure.configure({testIdAttribute: 'foobar'})\n  pure.configure(existingConfig => ({\n    testIdAttribute: `modified-${existingConfig.testIdAttribute}`,\n  }))\n\n  // test for RTL's config\n  pure.configure({reactStrictMode: true})\n  pure.configure(existingConfig => ({\n    reactStrictMode: !existingConfig.reactStrictMode,\n  }))\n}\n\nexport function testGetConfig() {\n  // test for DTL's config\n  pure.getConfig().testIdAttribute\n\n  // test for RTL's config\n  pure.getConfig().reactStrictMode\n}\n\nexport function testDebug() {\n  const {debug, getAllByTestId} = render(\n    <>\n      <h2 data-testid=\"testid\">Hello World</h2>\n      <h2 data-testid=\"testid\">Hello World</h2>\n    </>,\n  )\n  debug(getAllByTestId('testid'))\n}\n\nexport async function testScreen() {\n  render(<button />)\n\n  await screen.findByRole('button')\n}\n\nexport async function testWaitFor() {\n  const {container} = render(<button />)\n  fireEvent.click(container)\n  await waitFor(() => {})\n}\n\nexport function testQueries() {\n  const {getByLabelText} = render(\n    <label htmlFor=\"usernameInput\">Username</label>,\n  )\n  expectType<HTMLElement, ReturnType<typeof getByLabelText>>(\n    getByLabelText('Username'),\n  )\n\n  const container = document.createElement('div')\n  const options = {container}\n  const {getByText} = render(<div>Hello World</div>, options)\n  expectType<HTMLElement, ReturnType<typeof getByText>>(\n    getByText('Hello World'),\n  )\n}\n\nexport function wrappedRender(\n  ui: React.ReactNode,\n  options?: pure.RenderOptions,\n) {\n  const Wrapper = ({\n    children,\n  }: {\n    children: React.ReactNode\n  }): React.JSX.Element => {\n    return <div>{children}</div>\n  }\n\n  return pure.render(ui, {\n    wrapper: Wrapper,\n    // testing exactOptionalPropertyTypes comaptibility\n    hydrate: options?.hydrate,\n    ...options,\n  })\n}\n\nexport function wrappedRenderB(\n  ui: React.ReactNode,\n  options?: pure.RenderOptions,\n) {\n  const Wrapper: React.FunctionComponent<{children?: React.ReactNode}> = ({\n    children,\n  }) => {\n    return <div>{children}</div>\n  }\n\n  return pure.render(ui, {wrapper: Wrapper, ...options})\n}\n\nexport function wrappedRenderC(\n  ui: React.ReactNode,\n  options?: pure.RenderOptions,\n) {\n  interface AppWrapperProps {\n    children?: React.ReactNode\n    userProviderProps?: {user: string}\n  }\n  const AppWrapperProps: React.FunctionComponent<AppWrapperProps> = ({\n    children,\n    userProviderProps = {user: 'TypeScript'},\n  }) => {\n    return <div data-testid={userProviderProps.user}>{children}</div>\n  }\n\n  return pure.render(ui, {wrapper: AppWrapperProps, ...options})\n}\n\nexport function wrappedRenderHook<Props>(\n  hook: () => unknown,\n  options?: pure.RenderHookOptions<Props>,\n) {\n  interface AppWrapperProps {\n    children?: React.ReactNode\n    userProviderProps?: {user: string}\n  }\n  const AppWrapperProps: React.FunctionComponent<AppWrapperProps> = ({\n    children,\n    userProviderProps = {user: 'TypeScript'},\n  }) => {\n    return <div data-testid={userProviderProps.user}>{children}</div>\n  }\n\n  return pure.renderHook(hook, {...options})\n}\n\nexport function testBaseElement() {\n  const {baseElement: baseDefaultElement} = render(<div />)\n  expectType<HTMLElement, typeof baseDefaultElement>(baseDefaultElement)\n\n  const container = document.createElement('input')\n  const {baseElement: baseElementFromContainer} = render(<div />, {container})\n  expectType<typeof container, typeof baseElementFromContainer>(\n    baseElementFromContainer,\n  )\n\n  const baseElementOption = document.createElement('input')\n  const {baseElement: baseElementFromOption} = render(<div />, {\n    baseElement: baseElementOption,\n  })\n  expectType<typeof baseElementOption, typeof baseElementFromOption>(\n    baseElementFromOption,\n  )\n}\n\nexport function testRenderHook() {\n  const {result, rerender, unmount} = renderHook(() => React.useState(2)[0])\n\n  expectType<number, typeof result.current>(result.current)\n\n  rerender()\n\n  unmount()\n\n  renderHook(() => null, {wrapper: () => null})\n}\n\nexport function testRenderHookProps() {\n  const {result, rerender, unmount} = renderHook(\n    ({defaultValue}) => React.useState(defaultValue)[0],\n    {initialProps: {defaultValue: 2}},\n  )\n\n  expectType<number, typeof result.current>(result.current)\n\n  rerender()\n\n  unmount()\n}\n\nexport function testContainer() {\n  render('a', {container: document.createElement('div')})\n  render('a', {container: document.createDocumentFragment()})\n  //  Only allowed in React 19\n  render('a', {container: document})\n  render('a', {container: document.createElement('div'), hydrate: true})\n  // Only allowed for createRoot but typing `render` appropriately makes it harder to compose.\n  render('a', {container: document.createDocumentFragment(), hydrate: true})\n  render('a', {container: document, hydrate: true})\n\n  renderHook(() => null, {container: document.createElement('div')})\n  renderHook(() => null, {container: document.createDocumentFragment()})\n  //  Only allowed in React 19\n  renderHook(() => null, {container: document})\n  renderHook(() => null, {\n    container: document.createElement('div'),\n    hydrate: true,\n  })\n  // Only allowed for createRoot but typing `render` appropriately makes it harder to compose.\n  renderHook(() => null, {\n    container: document.createDocumentFragment(),\n    hydrate: true,\n  })\n  renderHook(() => null, {container: document, hydrate: true})\n}\n\nexport function testErrorHandlers() {\n  // This test runs under both React 18 and React 19 types. For React 19, verify that this works with `\"@types/react\": \"npm:types-react@rc\"`.\n  render(null, {\n    // This option is intended to type-check successfully with React 19 types\n    // but to fail (produce a type error) with React 18 types.\n    //\n    // > Why use `@ts-ignore` instead of `@ts-expect-error`?\n    // > Semantically, `@ts-expect-error` would be the right choice here:\n    // > it would fail under React 18 types and be unused under React 19 types.\n    // > However, when running with React 19 types, TypeScript reports that\n    // > `@ts-expect-error` is unused, which causes unwanted noise in CI.\n    // > To avoid those unused-directive diagnostics while still supporting\n    // > both React 18 and React 19 typings, we pragmatically use `@ts-ignore`,\n    // > acknowledging that it suppresses any real type errors at this site.\n    //\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error\n    // @ts-ignore\n    onCaughtError: () => {},\n  })\n  render(null, {\n    // Should never work as it's not supported yet.\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-expect-error\n    onUncaughtError: () => {},\n  })\n  render(null, {\n    onRecoverableError: (error, errorInfo) => {\n      console.error(error)\n      console.log(errorInfo.componentStack)\n    },\n  })\n}\n\n/*\neslint\n  testing-library/prefer-explicit-assert: \"off\",\n  testing-library/no-wait-for-empty-callback: \"off\",\n  testing-library/prefer-screen-queries: \"off\"\n*/\n\n// https://stackoverflow.com/questions/53807517/how-to-test-if-two-types-are-exactly-the-same\ntype IfEquals<T, U, Yes = unknown, No = never> = (<G>() => G extends T\n  ? 1\n  : 2) extends <G>() => G extends U ? 1 : 2\n  ? Yes\n  : No\n\n/**\n * Issues a type error if `Expected` is not identical to `Actual`.\n *\n * `Expected` should be declared when invoking `expectType`.\n * `Actual` should almost always we be a `typeof value` statement.\n *\n * Source: https://github.com/mui-org/material-ui/blob/6221876a4b468a3330ffaafa8472de7613933b87/packages/material-ui-types/index.d.ts#L73-L84\n *\n * @example `expectType<number | string, typeof value>(value)`\n * TypeScript issues a type error since `value is not assignable to never`.\n * This means `typeof value` is not identical to `number | string`\n * @param actual\n */\ndeclare function expectType<Expected, Actual>(\n  actual: IfEquals<Actual, Expected, Actual>,\n): void\n"
  },
  {
    "path": "types/tsconfig.json",
    "content": "{\n  \"extends\": \"../node_modules/kcd-scripts/shared-tsconfig.json\",\n  \"compilerOptions\": {\n    \"exactOptionalPropertyTypes\": true,\n    \"skipLibCheck\": false\n  },\n  \"include\": [\".\"]\n}\n"
  }
]