diff --git a/.all-contributorsrc b/.all-contributorsrc index b2beef237..9bc2e912d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -94,7 +94,8 @@ "avatar_url": "https://avatars1.githubusercontent.com/u/28659384?v=4", "profile": "http://timdeschryver.dev/", "contributions": [ - "doc" + "doc", + "code" ] }, { @@ -1310,6 +1311,1495 @@ "contributions": [ "doc" ] + }, + { + "login": "wuarmin", + "name": "Armin", + "avatar_url": "https://avatars.githubusercontent.com/u/9987680?v=4", + "profile": "https://github.com/wuarmin", + "contributions": [ + "doc" + ] + }, + { + "login": "dalebaldwin", + "name": "Dale Baldwin", + "avatar_url": "https://avatars.githubusercontent.com/u/403546?v=4", + "profile": "http://linktr.ee/dalebaldwin", + "contributions": [ + "doc" + ] + }, + { + "login": "AdriSolid", + "name": "AdriSolid", + "avatar_url": "https://avatars.githubusercontent.com/u/25487037?v=4", + "profile": "https://www.linkedin.com/in/adrisolid/", + "contributions": [ + "doc" + ] + }, + { + "login": "naruthk", + "name": "Naruth Kongurai", + "avatar_url": "https://avatars.githubusercontent.com/u/9120451?v=4", + "profile": "https://naruth.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "ErfanMirzapour", + "name": "Erfan Mirzapour", + "avatar_url": "https://avatars.githubusercontent.com/u/52346515?v=4", + "profile": "https://github.com/ErfanMirzapour", + "contributions": [ + "doc" + ] + }, + { + "login": "shemExelate", + "name": "Shem Mahluf", + "avatar_url": "https://avatars.githubusercontent.com/u/46557021?v=4", + "profile": "https://github.com/shemExelate", + "contributions": [ + "code", + "infra", + "doc" + ] + }, + { + "login": "scoobster17", + "name": "Phil Gibbins", + "avatar_url": "https://avatars.githubusercontent.com/u/12157029?v=4", + "profile": "https://github.com/scoobster17", + "contributions": [ + "doc" + ] + }, + { + "login": "Liadshiran", + "name": "Liad Shiran", + "avatar_url": "https://avatars.githubusercontent.com/u/18011106?v=4", + "profile": "https://github.com/Liadshiran", + "contributions": [ + "doc" + ] + }, + { + "login": "EduardoSimon", + "name": "Eduardo Simón Picón", + "avatar_url": "https://avatars.githubusercontent.com/u/19764148?v=4", + "profile": "https://github.com/EduardoSimon", + "contributions": [ + "doc" + ] + }, + { + "login": "thesanjeevsharma", + "name": "Sanjeev Sharma", + "avatar_url": "https://avatars.githubusercontent.com/u/29539278?v=4", + "profile": "https://thesanjeevsharma.now.sh/", + "contributions": [ + "doc" + ] + }, + { + "login": "drorheller", + "name": "dror-heller", + "avatar_url": "https://avatars.githubusercontent.com/u/12750737?v=4", + "profile": "https://github.com/drorheller", + "contributions": [ + "doc" + ] + }, + { + "login": "yialo", + "name": "Aleksei Arro", + "avatar_url": "https://avatars.githubusercontent.com/u/38593881?v=4", + "profile": "https://github.com/yialo", + "contributions": [ + "doc" + ] + }, + { + "login": "carlobeltrame", + "name": "Carlo Beltrame", + "avatar_url": "https://avatars.githubusercontent.com/u/7566995?v=4", + "profile": "https://github.com/carlobeltrame", + "contributions": [ + "doc" + ] + }, + { + "login": "ggorlen", + "name": "ggorlen", + "avatar_url": "https://avatars.githubusercontent.com/u/17895165?v=4", + "profile": "https://github.com/ggorlen", + "contributions": [ + "doc" + ] + }, + { + "login": "mattstobbs", + "name": "mattstobbs", + "avatar_url": "https://avatars.githubusercontent.com/u/15341757?v=4", + "profile": "https://blog.scottlogic.com/mstobbs/", + "contributions": [ + "doc" + ] + }, + { + "login": "vxxce", + "name": "Zach", + "avatar_url": "https://avatars.githubusercontent.com/u/38638365?v=4", + "profile": "https://vxxce.github.io/", + "contributions": [ + "doc" + ] + }, + { + "login": "anpaopao", + "name": "Angus J. Pope", + "avatar_url": "https://avatars.githubusercontent.com/u/44686792?v=4", + "profile": "https://github.com/anpaopao", + "contributions": [ + "doc" + ] + }, + { + "login": "DylanPiercey", + "name": "Dylan Piercey", + "avatar_url": "https://avatars.githubusercontent.com/u/4985201?v=4", + "profile": "https://twitter.com/dylan_piercey", + "contributions": [ + "doc" + ] + }, + { + "login": "ruhollahh", + "name": "Ruhollah", + "avatar_url": "https://avatars.githubusercontent.com/u/53814636?v=4", + "profile": "https://github.com/ruhollahh", + "contributions": [ + "doc" + ] + }, + { + "login": "votemike", + "name": "Michael Gwynne", + "avatar_url": "https://avatars.githubusercontent.com/u/3957065?v=4", + "profile": "https://votemike.co.uk/", + "contributions": [ + "doc" + ] + }, + { + "login": "thetric", + "name": "Dominik Broj", + "avatar_url": "https://avatars.githubusercontent.com/u/19861998?v=4", + "profile": "https://github.com/thetric", + "contributions": [ + "doc" + ] + }, + { + "login": "stephenwade", + "name": "Stephen Wade", + "avatar_url": "https://avatars.githubusercontent.com/u/4148577?v=4", + "profile": "https://github.com/stephenwade", + "contributions": [ + "doc" + ] + }, + { + "login": "luizbaldi", + "name": "Luiz Baldi", + "avatar_url": "https://avatars.githubusercontent.com/u/17226904?v=4", + "profile": "https://luizbaldi.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "ravinggenius", + "name": "Thomas Ingram", + "avatar_url": "https://avatars.githubusercontent.com/u/21517?v=4", + "profile": "http://www.ravinggenius.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "dwjohnston", + "name": "David Johnston", + "avatar_url": "https://avatars.githubusercontent.com/u/2467377?v=4", + "profile": "https://blacksheepcode.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "fildon", + "name": "Rupert McKay", + "avatar_url": "https://avatars.githubusercontent.com/u/10462288?v=4", + "profile": "https://fildon.me/", + "contributions": [ + "doc" + ] + }, + { + "login": "SebastianMaciel", + "name": "Sebastián Maciel", + "avatar_url": "https://avatars.githubusercontent.com/u/4841148?v=4", + "profile": "http://www.sebastianmaciel.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "sidharthv96", + "name": "Sidharth Vinod", + "avatar_url": "https://avatars.githubusercontent.com/u/10703445?v=4", + "profile": "http://sidharth.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "jankalfus", + "name": "Honza Kalfus", + "avatar_url": "https://avatars.githubusercontent.com/u/12714276?v=4", + "profile": "https://github.com/jankalfus", + "contributions": [ + "doc" + ] + }, + { + "login": "claidler", + "name": "Christopher Laidler", + "avatar_url": "https://avatars.githubusercontent.com/u/43636691?v=4", + "profile": "https://github.com/claidler", + "contributions": [ + "doc" + ] + }, + { + "login": "savcni01", + "name": "Nik Savchenko", + "avatar_url": "https://avatars.githubusercontent.com/u/18025894?v=4", + "profile": "https://github.com/savcni01", + "contributions": [ + "doc" + ] + }, + { + "login": "sfrieson", + "name": "Steven Frieson", + "avatar_url": "https://avatars.githubusercontent.com/u/15187179?v=4", + "profile": "http://stevenfrieson.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "andrewarosario", + "name": "Andrew Rosário", + "avatar_url": "https://avatars.githubusercontent.com/u/21269337?v=4", + "profile": "https://andrewrosario.medium.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "brleinad", + "name": "Daniel RB", + "avatar_url": "https://avatars.githubusercontent.com/u/12233785?v=4", + "profile": "http://danielrb.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "HonkingGoose", + "name": "HonkingGoose", + "avatar_url": "https://avatars.githubusercontent.com/u/34918129?v=4", + "profile": "https://github.com/HonkingGoose", + "contributions": [ + "doc" + ] + }, + { + "login": "Daniel-Kolev", + "name": "Daniel Kolev", + "avatar_url": "https://avatars.githubusercontent.com/u/43587261?v=4", + "profile": "https://github.com/Daniel-Kolev", + "contributions": [ + "doc" + ] + }, + { + "login": "arryanggaputra", + "name": "Arryangga Aliev Pratamaputra", + "avatar_url": "https://avatars.githubusercontent.com/u/4743772?v=4", + "profile": "http://www.kopi.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "arahansen", + "name": "Andrew Hansen", + "avatar_url": "https://avatars.githubusercontent.com/u/8746094?v=4", + "profile": "http://arahansen.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "jgsneves", + "name": "JOAO GABRIEL SANTOS NEVES", + "avatar_url": "https://avatars.githubusercontent.com/u/48700146?v=4", + "profile": "https://www.linkedin.com/in/jgsneves/", + "contributions": [ + "doc" + ] + }, + { + "login": "lukeingalls", + "name": "Luke Ingalls", + "avatar_url": "https://avatars.githubusercontent.com/u/45518011?v=4", + "profile": "http://lukeingalls.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "levenleven", + "name": "Aleksey Levenstein", + "avatar_url": "https://avatars.githubusercontent.com/u/6463364?v=4", + "profile": "https://github.com/levenleven", + "contributions": [ + "doc" + ] + }, + { + "login": "zaicevas", + "name": "Tomas Zaicevas", + "avatar_url": "https://avatars.githubusercontent.com/u/34719980?v=4", + "profile": "https://medium.com/@zaicevas", + "contributions": [ + "doc" + ] + }, + { + "login": "tsriram", + "name": "Sriram Thiagarajan", + "avatar_url": "https://avatars.githubusercontent.com/u/450559?v=4", + "profile": "https://github.com/tsriram", + "contributions": [ + "doc" + ] + }, + { + "login": "EstebanBorai", + "name": "Esteban Borai", + "avatar_url": "https://avatars.githubusercontent.com/u/34756077?v=4", + "profile": "http://estebanborai.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "artivilla", + "name": "Arti Villa", + "avatar_url": "https://avatars.githubusercontent.com/u/2120159?v=4", + "profile": "https://twitter.com/artivilla", + "contributions": [ + "doc" + ] + }, + { + "login": "jakeboone02", + "name": "Jake Boone", + "avatar_url": "https://avatars.githubusercontent.com/u/366438?v=4", + "profile": "https://github.com/jakeboone02", + "contributions": [ + "doc" + ] + }, + { + "login": "Dennis273", + "name": "Dennis273", + "avatar_url": "https://avatars.githubusercontent.com/u/19815164?v=4", + "profile": "https://github.com/Dennis273", + "contributions": [ + "doc" + ] + }, + { + "login": "moshfeu", + "name": "Mosh Feu", + "avatar_url": "https://avatars.githubusercontent.com/u/3723951?v=4", + "profile": "https://www.linkedin.com/in/moshfeu/", + "contributions": [ + "doc" + ] + }, + { + "login": "make-github-pseudonymous-again", + "name": "Notas Hellout", + "avatar_url": "https://avatars.githubusercontent.com/u/5165674?v=4", + "profile": "https://fosstodon.org/@sudonymouse", + "contributions": [ + "doc" + ] + }, + { + "login": "msmolens", + "name": "Max Smolens", + "avatar_url": "https://avatars.githubusercontent.com/u/7122091?v=4", + "profile": "https://maxsmolens.org/", + "contributions": [ + "doc" + ] + }, + { + "login": "nimaebra", + "name": "Nima Ebrazeh", + "avatar_url": "https://avatars.githubusercontent.com/u/78249749?v=4", + "profile": "https://github.com/nimaebra", + "contributions": [ + "doc" + ] + }, + { + "login": "ph-fritsche", + "name": "Philipp Fritsche", + "avatar_url": "https://avatars.githubusercontent.com/u/39068198?v=4", + "profile": "http://ph-fritsche.github.io/", + "contributions": [ + "review" + ] + }, + { + "login": "clemp6r", + "name": "Clément Plantier", + "avatar_url": "https://avatars.githubusercontent.com/u/4757677?v=4", + "profile": "https://github.com/clemp6r", + "contributions": [ + "doc" + ] + }, + { + "login": "pppp606", + "name": "pppp606", + "avatar_url": "https://avatars.githubusercontent.com/u/7203958?v=4", + "profile": "https://github.com/pppp606", + "contributions": [ + "doc" + ] + }, + { + "login": "bilouw", + "name": "Bilou", + "avatar_url": "https://avatars.githubusercontent.com/u/7089641?v=4", + "profile": "https://github.com/bilouw", + "contributions": [ + "doc" + ] + }, + { + "login": "dten", + "name": "David Hewson", + "avatar_url": "https://avatars.githubusercontent.com/u/1019038?v=4", + "profile": "https://github.com/dten", + "contributions": [ + "doc" + ] + }, + { + "login": "alex-kim-dev", + "name": "Alex Kim", + "avatar_url": "https://avatars.githubusercontent.com/u/45559664?v=4", + "profile": "https://github.com/alex-kim-dev", + "contributions": [ + "doc" + ] + }, + { + "login": "PaquitoSoft", + "name": "PaquitoSoft", + "avatar_url": "https://avatars.githubusercontent.com/u/166022?v=4", + "profile": "http://paquitosoftware.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "marcioggs", + "name": "Márcio Gabriel", + "avatar_url": "https://avatars.githubusercontent.com/u/2506127?v=4", + "profile": "https://br.linkedin.com/in/marcioggs", + "contributions": [ + "doc" + ] + }, + { + "login": "krychaxp", + "name": "Krychaxp", + "avatar_url": "https://avatars.githubusercontent.com/u/55843050?v=4", + "profile": "http://krychaxp.pl/", + "contributions": [ + "doc" + ] + }, + { + "login": "mohetti", + "name": "momokolo", + "avatar_url": "https://avatars.githubusercontent.com/u/73931283?v=4", + "profile": "https://github.com/mohetti", + "contributions": [ + "doc" + ] + }, + { + "login": "meatnordrink", + "name": "AndyG", + "avatar_url": "https://avatars.githubusercontent.com/u/35735666?v=4", + "profile": "https://github.com/meatnordrink", + "contributions": [ + "doc" + ] + }, + { + "login": "jbutz", + "name": "Jason Butz", + "avatar_url": "https://avatars.githubusercontent.com/u/736696?v=4", + "profile": "http://www.jasonbutz.info/", + "contributions": [ + "infra" + ] + }, + { + "login": "olejech", + "name": "Oleg", + "avatar_url": "https://avatars.githubusercontent.com/u/64708593?v=4", + "profile": "https://github.com/olejech", + "contributions": [ + "doc" + ] + }, + { + "login": "danywalls", + "name": "Dany Paredes", + "avatar_url": "https://avatars.githubusercontent.com/u/5494535?v=4", + "profile": "http://www.danywalls.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "abelhbeyene", + "name": "Abel", + "avatar_url": "https://avatars.githubusercontent.com/u/12272815?v=4", + "profile": "https://github.com/abelhbeyene", + "contributions": [ + "doc" + ] + }, + { + "login": "patrady", + "name": "Patrick Brady", + "avatar_url": "https://avatars.githubusercontent.com/u/17067460?v=4", + "profile": "https://github.com/patrady", + "contributions": [ + "doc" + ] + }, + { + "login": "GrantIsEaton", + "name": "Grant Eaton", + "avatar_url": "https://avatars.githubusercontent.com/u/101603396?v=4", + "profile": "https://github.com/GrantIsEaton", + "contributions": [ + "doc" + ] + }, + { + "login": "aarondunphy", + "name": "Aaron Dunphy", + "avatar_url": "https://avatars.githubusercontent.com/u/5583119?v=4", + "profile": "https://aarondunphy.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "mrazauskas", + "name": "Tom Mrazauskas", + "avatar_url": "https://avatars.githubusercontent.com/u/72159681?v=4", + "profile": "https://github.com/mrazauskas", + "contributions": [ + "doc" + ] + }, + { + "login": "LuckyMona", + "name": "Supermaryy", + "avatar_url": "https://avatars.githubusercontent.com/u/12708942?v=4", + "profile": "http://supermaryy.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "bennewton999", + "name": "Ben Newton", + "avatar_url": "https://avatars.githubusercontent.com/u/458991?v=4", + "profile": "http://benenewton.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "silvenon", + "name": "Matija Marohnić", + "avatar_url": "https://avatars.githubusercontent.com/u/471278?v=4", + "profile": "https://silvenon.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "ThaddeusJiang", + "name": "Thaddeus Jiang", + "avatar_url": "https://avatars.githubusercontent.com/u/17308201?v=4", + "profile": "https://thaddeusjiang.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "robin-drexler", + "name": "Robin Drexler", + "avatar_url": "https://avatars.githubusercontent.com/u/474248?v=4", + "profile": "https://www.robin-drexler.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "caffeine-storm", + "name": "Thomas McKee", + "avatar_url": "https://avatars.githubusercontent.com/u/1609128?v=4", + "profile": "https://github.com/caffeine-storm", + "contributions": [ + "doc" + ] + }, + { + "login": "satanTime", + "name": "satanTime", + "avatar_url": "https://avatars.githubusercontent.com/u/966305?v=4", + "profile": "https://sudo.eu/", + "contributions": [ + "doc" + ] + }, + { + "login": "polinamochan", + "name": "polinamochan", + "avatar_url": "https://avatars.githubusercontent.com/u/108654322?v=4", + "profile": "https://github.com/polinamochan", + "contributions": [ + "doc" + ] + }, + { + "login": "shaiRose", + "name": "Shai Rose", + "avatar_url": "https://avatars.githubusercontent.com/u/4546940?v=4", + "profile": "https://github.com/shaiRose", + "contributions": [ + "doc" + ] + }, + { + "login": "AldinRekic", + "name": "AldinRekic", + "avatar_url": "https://avatars.githubusercontent.com/u/65592409?v=4", + "profile": "https://github.com/AldinRekic", + "contributions": [ + "design" + ] + }, + { + "login": "thanhsonng", + "name": "Son Nguyen", + "avatar_url": "https://avatars.githubusercontent.com/u/28614996?v=4", + "profile": "https://sonng.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "Lirlev48", + "name": "Lirlev48", + "avatar_url": "https://avatars.githubusercontent.com/u/58209233?v=4", + "profile": "https://github.com/Lirlev48", + "contributions": [ + "doc" + ] + }, + { + "login": "tarjei", + "name": "Tarjei Huse", + "avatar_url": "https://avatars.githubusercontent.com/u/211263?v=4", + "profile": "https://github.com/tarjei", + "contributions": [ + "doc" + ] + }, + { + "login": "ObieMunoz", + "name": "Obie Munoz", + "avatar_url": "https://avatars.githubusercontent.com/u/5696449?v=4", + "profile": "https://www.linkedin.com/in/obedmunozjr/", + "contributions": [ + "doc" + ] + }, + { + "login": "bertybot", + "name": "Bert B", + "avatar_url": "https://avatars.githubusercontent.com/u/44912991?v=4", + "profile": "https://github.com/bertybot", + "contributions": [ + "doc" + ] + }, + { + "login": "alirezahi", + "name": "Alireza Heydari", + "avatar_url": "https://avatars.githubusercontent.com/u/16666064?v=4", + "profile": "https://github.com/alirezahi", + "contributions": [ + "doc" + ] + }, + { + "login": "glebinsky", + "name": "Gleb Radutsky", + "avatar_url": "https://avatars.githubusercontent.com/u/898643?v=4", + "profile": "https://github.com/glebinsky", + "contributions": [ + "doc" + ] + }, + { + "login": "giovanniPepi", + "name": "giovanniPepi", + "avatar_url": "https://avatars.githubusercontent.com/u/5255535?v=4", + "profile": "https://github.com/giovanniPepi", + "contributions": [ + "doc" + ] + }, + { + "login": "mdjastrzebski", + "name": "Maciej Jastrzebski", + "avatar_url": "https://avatars.githubusercontent.com/u/6368606?v=4", + "profile": "https://github.com/mdjastrzebski", + "contributions": [ + "doc" + ] + }, + { + "login": "semoal", + "name": "Sergio Moreno", + "avatar_url": "https://avatars.githubusercontent.com/u/22656541?v=4", + "profile": "https://semoal.github.io/sergiomoreno/", + "contributions": [ + "code" + ] + }, + { + "login": "davidnixon", + "name": "David Nixon", + "avatar_url": "https://avatars.githubusercontent.com/u/7536103?v=4", + "profile": "https://github.com/davidnixon", + "contributions": [ + "doc" + ] + }, + { + "login": "khitrenovich", + "name": "Anton Khitrenovich", + "avatar_url": "https://avatars.githubusercontent.com/u/3424762?v=4", + "profile": "http://technotes.khitrenovich.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "kostasx", + "name": "Kostas Minaidis", + "avatar_url": "https://avatars.githubusercontent.com/u/1638325?v=4", + "profile": "https://plethorathemes.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "MynockSpit", + "name": "Than Hutchins", + "avatar_url": "https://avatars.githubusercontent.com/u/5713867?v=4", + "profile": "https://github.com/MynockSpit", + "contributions": [ + "doc" + ] + }, + { + "login": "edmundsj", + "name": "Jordan Edmunds", + "avatar_url": "https://avatars.githubusercontent.com/u/11085127?v=4", + "profile": "https://github.com/edmundsj", + "contributions": [ + "doc" + ] + }, + { + "login": "mouse484", + "name": "mouse", + "avatar_url": "https://avatars.githubusercontent.com/u/38714187?v=4", + "profile": "https://portfolio.mouse484.vercel.app/", + "contributions": [ + "doc" + ] + }, + { + "login": "robertoms99", + "name": "Roberto Molina", + "avatar_url": "https://avatars.githubusercontent.com/u/54558382?v=4", + "profile": "https://roberto-molina.netlify.app/", + "contributions": [ + "doc" + ] + }, + { + "login": "louis-young", + "name": "Louis Young", + "avatar_url": "https://avatars.githubusercontent.com/u/35606709?v=4", + "profile": "https://www.louisyoung.co.uk/", + "contributions": [ + "doc" + ] + }, + { + "login": "lukaselmer", + "name": "Lukas Elmer", + "avatar_url": "https://avatars.githubusercontent.com/u/326935?v=4", + "profile": "https://www.linkedin.com/in/lukaselmer/", + "contributions": [ + "doc" + ] + }, + { + "login": "brentguf", + "name": "Brent Guffens", + "avatar_url": "https://avatars.githubusercontent.com/u/16427929?v=4", + "profile": "https://github.com/brentguf", + "contributions": [ + "doc" + ] + }, + { + "login": "estebanfelipep", + "name": "Esteban", + "avatar_url": "https://avatars.githubusercontent.com/u/15718690?v=4", + "profile": "https://github.com/estebanfelipep", + "contributions": [ + "doc" + ] + }, + { + "login": "tiborbarsi", + "name": "Tibor Barsi", + "avatar_url": "https://avatars.githubusercontent.com/u/21023594?v=4", + "profile": "https://github.com/tiborbarsi", + "contributions": [ + "doc" + ] + }, + { + "login": "tnyo43", + "name": "Tomoya Kashifuku", + "avatar_url": "https://avatars.githubusercontent.com/u/11014018?v=4", + "profile": "https://github.com/tnyo43", + "contributions": [ + "doc" + ] + }, + { + "login": "wtlin1228", + "name": "Leo", + "avatar_url": "https://avatars.githubusercontent.com/u/16910748?v=4", + "profile": "https://leonerd.gatsbyjs.io/", + "contributions": [ + "doc" + ] + }, + { + "login": "erik-metz", + "name": "Erik Metz", + "avatar_url": "https://avatars.githubusercontent.com/u/69653055?v=4", + "profile": "http://spray-r.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "mrtyagi07", + "name": "Vaibhav Tyagi", + "avatar_url": "https://avatars.githubusercontent.com/u/83115094?v=4", + "profile": "https://github.com/mrtyagi07", + "contributions": [ + "doc" + ] + }, + { + "login": "alleksei37", + "name": "Aleksei Drokin", + "avatar_url": "https://avatars.githubusercontent.com/u/18336748?v=4", + "profile": "https://github.com/alleksei37", + "contributions": [ + "doc" + ] + }, + { + "login": "shaman-apprentice", + "name": "Torsten Knauf", + "avatar_url": "https://avatars.githubusercontent.com/u/3596742?v=4", + "profile": "https://github.com/shaman-apprentice", + "contributions": [ + "doc" + ] + }, + { + "login": "jharlowuk", + "name": "John Harlow", + "avatar_url": "https://avatars.githubusercontent.com/u/41212861?v=4", + "profile": "http://jharlow.uk/", + "contributions": [ + "doc" + ] + }, + { + "login": "morgan121", + "name": "Morgan Hunter", + "avatar_url": "https://avatars.githubusercontent.com/u/62575603?v=4", + "profile": "https://github.com/morgan121", + "contributions": [ + "doc" + ] + }, + { + "login": "Mozl", + "name": "Louis Moselhi", + "avatar_url": "https://avatars.githubusercontent.com/u/24245755?v=4", + "profile": "https://github.com/Mozl", + "contributions": [ + "doc" + ] + }, + { + "login": "rydash", + "name": "Ryan McGill", + "avatar_url": "https://avatars.githubusercontent.com/u/9492442?v=4", + "profile": "https://github.com/rydash", + "contributions": [ + "doc" + ] + }, + { + "login": "renansoares", + "name": "Renan Andrade", + "avatar_url": "https://avatars.githubusercontent.com/u/1657840?v=4", + "profile": "http://rensoares.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "boldurean", + "name": "Vasilii Boldurean", + "avatar_url": "https://avatars.githubusercontent.com/u/64642760?v=4", + "profile": "https://github.com/boldurean", + "contributions": [ + "doc" + ] + }, + { + "login": "josiasds", + "name": "Josias Schneider", + "avatar_url": "https://avatars.githubusercontent.com/u/882253?v=4", + "profile": "http://theoutsider.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "ledenis", + "name": "Denis LE", + "avatar_url": "https://avatars.githubusercontent.com/u/2855723?v=4", + "profile": "https://github.com/ledenis", + "contributions": [ + "doc" + ] + }, + { + "login": "Nicoss54", + "name": "Nicolas Frizzarin", + "avatar_url": "https://avatars.githubusercontent.com/u/24563545?v=4", + "profile": "https://github.com/Nicoss54", + "contributions": [ + "doc" + ] + }, + { + "login": "santoshyadavdev", + "name": "Santosh Yadav", + "avatar_url": "https://avatars.githubusercontent.com/u/11923975?v=4", + "profile": "https://github.com/santoshyadavdev", + "contributions": [ + "doc" + ] + }, + { + "login": "caiangums", + "name": "Ilê Caian", + "avatar_url": "https://avatars.githubusercontent.com/u/7551787?v=4", + "profile": "http://caian.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "Clarity-89", + "name": "Alex Khomenko", + "avatar_url": "https://avatars.githubusercontent.com/u/8878045?v=4", + "profile": "https://claritydev.net/", + "contributions": [ + "doc" + ] + }, + { + "login": "LLCampos", + "name": "Luís Campos", + "avatar_url": "https://avatars.githubusercontent.com/u/12008784?v=4", + "profile": "https://llcampos.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "YozhEzhi", + "name": "Alexandr Zhidovlenko", + "avatar_url": "https://avatars.githubusercontent.com/u/2706062?v=4", + "profile": "https://github.com/YozhEzhi", + "contributions": [ + "doc" + ] + }, + { + "login": "lyannel", + "name": "lyannel", + "avatar_url": "https://avatars.githubusercontent.com/u/34246811?v=4", + "profile": "https://github.com/lyannel", + "contributions": [ + "a11y" + ] + }, + { + "login": "yanick", + "name": "Yanick Champoux", + "avatar_url": "https://avatars.githubusercontent.com/u/19954?v=4", + "profile": "https://techblog.babyl.ca/", + "contributions": [ + "doc" + ] + }, + { + "login": "ali-kamalizade", + "name": "Ali", + "avatar_url": "https://avatars.githubusercontent.com/u/1886605?v=4", + "profile": "https://ali-dev.medium.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "macmillen", + "name": "Milan Jaritz", + "avatar_url": "https://avatars.githubusercontent.com/u/33156526?v=4", + "profile": "https://github.com/macmillen", + "contributions": [ + "doc" + ] + }, + { + "login": "dzonatan", + "name": "Rokas Brazdžionis", + "avatar_url": "https://avatars.githubusercontent.com/u/5166666?v=4", + "profile": "https://github.com/dzonatan", + "contributions": [ + "doc" + ] + }, + { + "login": "tomalaforge", + "name": "Laforge Thomas", + "avatar_url": "https://avatars.githubusercontent.com/u/30832608?v=4", + "profile": "https://thomaslaforge.dev/home", + "contributions": [ + "doc" + ] + }, + { + "login": "StephNathai", + "name": "Steph Nathai", + "avatar_url": "https://avatars.githubusercontent.com/u/11414958?v=4", + "profile": "https://github.com/StephNathai", + "contributions": [ + "code", + "a11y" + ] + }, + { + "login": "friederbluemle", + "name": "Frieder Bluemle", + "avatar_url": "https://avatars.githubusercontent.com/u/743291?v=4", + "profile": "https://github.com/friederbluemle", + "contributions": [ + "doc" + ] + }, + { + "login": "ssi02014", + "name": "Gromit (전민재)", + "avatar_url": "https://avatars.githubusercontent.com/u/64779472?v=4", + "profile": "https://blog.naver.com/ssi02014", + "contributions": [ + "doc" + ] + }, + { + "login": "csantos1113", + "name": "Cesar S", + "avatar_url": "https://avatars.githubusercontent.com/u/9648559?v=4", + "profile": "https://github.com/csantos1113", + "contributions": [ + "doc" + ] + }, + { + "login": "crutchcorn", + "name": "Corbin Crutchley", + "avatar_url": "https://avatars.githubusercontent.com/u/9100169?v=4", + "profile": "https://crutchcorn.dev/", + "contributions": [ + "doc" + ] + }, + { + "login": "rbatsenko", + "name": "Roman Batsenko", + "avatar_url": "https://avatars.githubusercontent.com/u/6410057?v=4", + "profile": "https://github.com/rbatsenko", + "contributions": [ + "doc" + ] + }, + { + "login": "snjro", + "name": "snjro", + "avatar_url": "https://avatars.githubusercontent.com/u/34432943?v=4", + "profile": "https://github.com/snjro", + "contributions": [ + "doc" + ] + }, + { + "login": "taro-28", + "name": "taro", + "avatar_url": "https://avatars.githubusercontent.com/u/66539019?v=4", + "profile": "https://bento.me/taro", + "contributions": [ + "doc" + ] + }, + { + "login": "andnorda", + "name": "Andreas Nordahl", + "avatar_url": "https://avatars.githubusercontent.com/u/1894119?v=4", + "profile": "https://github.com/andnorda", + "contributions": [ + "doc" + ] + }, + { + "login": "neaumusic", + "name": "neaumusic", + "avatar_url": "https://avatars.githubusercontent.com/u/3423750?v=4", + "profile": "https://neaumusic.github.io/", + "contributions": [ + "doc" + ] + }, + { + "login": "JoyelJohny", + "name": "Joyel Johny", + "avatar_url": "https://avatars.githubusercontent.com/u/81413791?v=4", + "profile": "https://github.com/JoyelJohny", + "contributions": [ + "code" + ] + }, + { + "login": "bsheps", + "name": "bsheps", + "avatar_url": "https://avatars.githubusercontent.com/u/35780702?v=4", + "profile": "https://github.com/bsheps", + "contributions": [ + "doc" + ] + }, + { + "login": "kyle-n", + "name": "Kyle Nazario", + "avatar_url": "https://avatars.githubusercontent.com/u/13384477?v=4", + "profile": "http://www.kylenazario.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "thefalked", + "name": "Giuliano Crivelli", + "avatar_url": "https://avatars.githubusercontent.com/u/28029756?v=4", + "profile": "https://github.com/thefalked", + "contributions": [ + "doc" + ] + }, + { + "login": "mroforolhc", + "name": "mrkv", + "avatar_url": "https://avatars.githubusercontent.com/u/26799398?v=4", + "profile": "https://t.me/markov_ka", + "contributions": [ + "doc" + ] + }, + { + "login": "smk267", + "name": "smk267", + "avatar_url": "https://avatars.githubusercontent.com/u/88115182?v=4", + "profile": "https://github.com/smk267", + "contributions": [ + "infra" + ] + }, + { + "login": "agentdylan", + "name": "Dylan Gordon", + "avatar_url": "https://avatars.githubusercontent.com/u/3656794?v=4", + "profile": "https://www.dylangordon.co.nz/", + "contributions": [ + "doc" + ] + }, + { + "login": "mcous", + "name": "Michael Cousins", + "avatar_url": "https://avatars.githubusercontent.com/u/2963448?v=4", + "profile": "https://michael.cousins.io/", + "contributions": [ + "doc", + "review" + ] + }, + { + "login": "kettanaito", + "name": "Artem Zakharchenko", + "avatar_url": "https://avatars.githubusercontent.com/u/14984911?v=4", + "profile": "https://kettanaito.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "vadimshvetsov", + "name": "Vadim Shvetsov", + "avatar_url": "https://avatars.githubusercontent.com/u/16336572?v=4", + "profile": "https://github.com/vadimshvetsov", + "contributions": [ + "doc" + ] + }, + { + "login": "domnantas", + "name": "Domantas Petrauskas", + "avatar_url": "https://avatars.githubusercontent.com/u/51953549?v=4", + "profile": "https://domnantas.lt/", + "contributions": [ + "doc" + ] + }, + { + "login": "Efim-Kapliy", + "name": "Efim", + "avatar_url": "https://avatars.githubusercontent.com/u/126895483?v=4", + "profile": "https://portfolio.edkt.ru/", + "contributions": [ + "doc" + ] + }, + { + "login": "denisx", + "name": "denisx", + "avatar_url": "https://avatars.githubusercontent.com/u/427776?v=4", + "profile": "https://github.com/denisx", + "contributions": [ + "code" + ] + }, + { + "login": "ggualiato", + "name": "Giovanni Gualiato", + "avatar_url": "https://avatars.githubusercontent.com/u/26698704?v=4", + "profile": "https://github.com/ggualiato", + "contributions": [ + "doc" + ] + }, + { + "login": "saubaig456", + "name": "Saud Baig", + "avatar_url": "https://avatars.githubusercontent.com/u/143418574?v=4", + "profile": "https://github.com/saubaig456", + "contributions": [ + "doc" + ] + }, + { + "login": "moeyashi", + "name": "Ren Adachi", + "avatar_url": "https://avatars.githubusercontent.com/u/49895682?v=4", + "profile": "https://github.com/moeyashi", + "contributions": [ + "doc" + ] + }, + { + "login": "TyMick", + "name": "Ty Mick", + "avatar_url": "https://avatars.githubusercontent.com/u/5317080?v=4", + "profile": "https://tymick.me/", + "contributions": [ + "doc" + ] + }, + { + "login": "enmanuelduran", + "name": "Enmanuel Durán", + "avatar_url": "https://avatars.githubusercontent.com/u/8060530?v=4", + "profile": "https://enmascript.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "gbhasha", + "name": "Galeel Bhasha Satthar", + "avatar_url": "https://avatars.githubusercontent.com/u/501794?v=4", + "profile": "https://github.com/gbhasha", + "contributions": [ + "doc" + ] + }, + { + "login": "ianlet", + "name": "Ian Létourneau", + "avatar_url": "https://avatars.githubusercontent.com/u/6018732?v=4", + "profile": "https://noma.to/", + "contributions": [ + "doc" + ] + }, + { + "login": "brianlu2610", + "name": "brianlu2610", + "avatar_url": "https://avatars.githubusercontent.com/u/68666483?v=4", + "profile": "https://github.com/brianlu2610", + "contributions": [ + "code" + ] + }, + { + "login": "ezzatron", + "name": "Erin", + "avatar_url": "https://avatars.githubusercontent.com/u/100152?v=4", + "profile": "https://github.com/ezzatron", + "contributions": [ + "doc" + ] + }, + { + "login": "nchen000", + "name": "Nan Chen", + "avatar_url": "https://avatars.githubusercontent.com/u/23487984?v=4", + "profile": "https://www.linkedin.com/in/nan-chen-000/", + "contributions": [ + "doc" + ] + }, + { + "login": "aburdiss", + "name": "Alexander Burdiss", + "avatar_url": "https://avatars.githubusercontent.com/u/31200600?v=4", + "profile": "http://alexanderburdiss.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "peterh-capella", + "name": "Peter Hentges", + "avatar_url": "https://avatars.githubusercontent.com/u/1122723?v=4", + "profile": "https://github.com/peterh-capella", + "contributions": [ + "doc" + ] + }, + { + "login": "neknalb", + "name": "neknalb", + "avatar_url": "https://avatars.githubusercontent.com/u/23031302?v=4", + "profile": "https://github.com/neknalb", + "contributions": [ + "doc" + ] + }, + { + "login": "fetsorn", + "name": "fetsorn", + "avatar_url": "https://avatars.githubusercontent.com/u/12858105?v=4", + "profile": "https://github.com/fetsorn", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, @@ -1317,5 +2807,6 @@ "projectOwner": "testing-library", "repoType": "github", "repoHost": "https://github.com/", - "skipCi": true + "skipCi": true, + "commitType": "docs" } diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 9bf526656..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -open_collective: testing-library diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dd84ea782..8bc4a7ed8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,35 +4,33 @@ about: Create a report to help us improve title: '' labels: '' assignees: '' - --- -**Describe the bug** -A clear and concise description of what the bug is. +**Describe the bug** A clear and concise description of what the bug is. + +**To Reproduce** Steps to reproduce the behavior: -**To Reproduce** -Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error -**Expected behavior** -A clear and concise description of what you expected to happen. +**Expected behavior** A clear and concise description of what you expected to +happen. -**Screenshots** -If applicable, add screenshots to help explain your problem. +**Screenshots** If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] **Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] -**Additional context** -Add any other context about the problem here. +- Device: [e.g. iPhone6] +- OS: [e.g. iOS8.1] +- Browser [e.g. stock browser, safari] +- Version [e.g. 22] + +**Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bbcbbe7d6..2866f790f 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,17 +4,16 @@ about: Suggest an idea for this project title: '' labels: '' assignees: '' - --- -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +**Is your feature request related to a problem? Please describe.** A clear and +concise description of what the problem is. Ex. I'm always frustrated when [...] -**Describe the solution you'd like** -A clear and concise description of what you want to happen. +**Describe the solution you'd like** A clear and concise description of what you +want to happen. -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +**Describe alternatives you've considered** A clear and concise description of +any alternative solutions or features you've considered. -**Additional context** -Add any other context or screenshots about the feature request here. +**Additional context** Add any other context or screenshots about the feature +request here. diff --git a/.node-version b/.node-version new file mode 100644 index 000000000..dcf74e268 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +16.14 \ No newline at end of file diff --git a/.prettierrc.js b/.prettierrc.js index 30f575a92..4679d9bf6 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,6 +1 @@ -module.exports = { - proseWrap: 'always', - singleQuote: true, - semi: false, - trailingComma: 'es5', -} \ No newline at end of file +module.exports = require('kcd-scripts/prettier') diff --git a/.vscode/settings.json b/.vscode/settings.json index 3c9f7f1e3..176df8375 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,9 @@ { "editor.rulers": [ 60, // try to keep examples this long - 80, // hard wrap + 80 // hard wrap ], "files.associations": { "*.md": "mdx" - }, + } } diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 26cd10755..6a568d709 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -5,31 +5,31 @@ In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. +size, disability, ethnicity, sex characteristics, gender identity and +expression, level of experience, education, socio-economic status, nationality, +personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting ## Our Responsibilities @@ -37,11 +37,11 @@ Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +Project maintainers have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, or to ban temporarily or permanently any +contributor for other behaviors that they deem inappropriate, threatening, +offensive, or harmful. ## Scope @@ -55,11 +55,12 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at alexander.krolick+testing@gmail.com. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +reported by contacting the project team at alexander.krolick+testing@gmail.com. +All complaints will be reviewed and investigated and will result in a response +that is deemed necessary and appropriate to the circumstances. The project team +is obligated to maintain confidentiality with regard to the reporter of an +incident. Further details of specific enforcement policies may be posted +separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other @@ -67,8 +68,9 @@ members of the project's leadership. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.4, available at +https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org diff --git a/README.md b/README.md index c4b271cf2..4ffd940f5 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,15 @@ -testing-library-docs --------------------- - +## testing-library-docs -[![Open Collective Sponsors and Backers][opencollective-badge]][opencollective] [![All Contributors][allcontributors-badge]](#contributors) [![Code of Conduct][coc-badge]][coc] -Documentation site for [React Testing Library](https://github.com/testing-library/react-testing-library), [DOM Testing Library](https://github.com/testing-library/dom-testing-library), and [related projects](https://github.com/testing-library) +Documentation site for +[React Testing Library](https://github.com/testing-library/react-testing-library), +[DOM Testing Library](https://github.com/testing-library/dom-testing-library), +[Angular Testing Library](https://github.com/testing-library/angular-testing-library), +and [related projects](https://github.com/testing-library) **https://testing-library.com** @@ -16,13 +17,15 @@ Documentation site for [React Testing Library](https://github.com/testing-librar [![Netlify Status][netlify-badge]][build] -[netlify-badge]: https://api.netlify.com/api/v1/badges/24366204-84ca-41e9-b573-2a64f0845e46/deploy-status +[netlify-badge]: + https://api.netlify.com/api/v1/badges/24366204-84ca-41e9-b573-2a64f0845e46/deploy-status [build]: https://app.netlify.com/sites/testing-library/deploys -[opencollective]: https://opencollective.com/testing-library/ -[opencollective-badge]: https://img.shields.io/opencollective/all/testing-library.svg?label=opencollective%20backers&style=flat-square -[allcontributors-badge]: https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square -[coc-badge]: https://img.shields.io/badge/code%20of-conduct-ff69b4.svg?style=flat-square -[coc]: https://github.com/testing-library/react-testing-library/blob/master/CODE_OF_CONDUCT.md +[allcontributors-badge]: + https://img.shields.io/github/all-contributors/testing-library/testing-library-docs?color=ee8449&style=flat-square +[coc-badge]: + https://img.shields.io/badge/code%20of-conduct-ff69b4.svg?style=flat-square +[coc]: + https://github.com/testing-library/react-testing-library/blob/main/CODE_OF_CONDUCT.md This website was created with [Docusaurus](https://v2.docusaurus.io). @@ -69,8 +72,7 @@ For more information about docs, click [here](https://v2.docusaurus.io/docs) ## Editing an existing blog post -Edit blog posts by navigating to `blog` and editing the corresponding -post: +Edit blog posts by navigating to `blog` and editing the corresponding post: `blog/post-to-be-edited.mdx` @@ -126,198 +128,414 @@ For more information about adding new docs, click ## Contributors -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Kent C. Dodds

🚧

Alex Krolick

🚧

Sidak Singh Aulakh

💻

Brandon Carroll

💻

David

📖

Ryan James

📖

Brandon Johnson

📖

Edward Coleridge Smith

📖

Adrià Fontcuberta

📖 👀

Tim Deschryver

📖

Ben Monro

📖

Scott Sauber

📝

Shota Tamura

🖋 📖

Giorgio Polvara

📖

michalak111

📖 ⚠️

Huyen Nguyen

📖

Kieren Hughes

📖

Sean McPherson

📖

Michael Lasky

📖

Thomas Lombart

📖

Patrick K Long

📖

Pedro Filho

📖

Tanguy Antoine

📖

Kevin Anderson

📖

Dustin Myers

📖

Vojta Holik

🎨

Steve Schwarz

📖

Aayush Rajvanshi

📖

Eugie Limpin

📖

Kevin

📖

Jennifer Shehane

📖

Steve Taggart

📖

Stephen Sugden

📖

Blai Samitier

📖

Vernon Kesner

📖

Will Douglas

📖

Head

📖

Lee

📖

Mario Beltrán Alarcón

📖

jameslevine

📖

Rahim Alwer

📖

Chenjia

📖

Olivier Le Thanh Duong

📖

Jakub Jastrzębski

📖

Ivan Galiatin

📖

Hendrik Röhm

📖

Sam Kauffman

📖

Turadg Aleahmad

📖

mark g romano

📖

Arturo Romero

📖

Dustin Masters

📖

Darren Lester

📖

Iswara Chaitanya

📖

Nataliia Pylypenko

📖

Hu Chen

📖

Josh

📖

numb86

📖

Nicholas Boll

📖

Billy Matthews

📢 📖

Dale French

📖

aw-davidson

📖

Benjamin Blackwood

📖

Ben

📖

Daniel Afonso

📖

Noman Gul

📖

Rafael Souza

📖

Pavel Pustovalov

📖

Dyma

📖

Matan Borenkraout

📖 💻

timrobinson33

📖

Manuel Dugué

📖

karthik20

📖

Pob Ch

📖

Mohammad Kermani

📖

Adeel Imran

📖

Varun Dey

📖

Pablo R. Dinella

📖

Jamie

📖

Cory House

📖

Jack Zhao

📖

Ryan Kennel

📖

Jesus Hernandez

📖

Aaron Pettengill

📖

Izhaki

📖

Robin Wieruch


Alexander Sokolov

📖

Sascha Tandel

📖

Gyuwon Yi

📖

Boris Serdiuk

📖

balavishnuvj

📖

Sharmila Jesupaul

📖

Batuhan Wilhelm

📖

Dennis Kaffer

📖

Cam Jackson

📖

Jared Luxenberg

📖

Yakir Narkis

📖

Rahul Bhooteshwar

📖

Maja Wichrowska

📖

Kermani

📖 👀

Vasily Malykhin

📖

Brian Alexis

📖

Kalpesh Singh

📖

Gerrit Alex

📖

Winter LaMon

📖

Juliano Penna

📖

Paul Coroneos

📖

Sebastian Silbermann

📖 👀

Paul Salaets

📖

Michaël De Boey

📖

Washington Soares

📖

Jami Suomalainen

📖

Oriol Puig

📖

hedgecox

📖

Sherman Hui

📖

Jesu Castillo

📖

Core HTML5 Canvas, the book

📖

John Sterling

📖

Velu S Gautam

📖

Richard Oliver Bray

📖

Yanlin Jiang

📖

Lidor Avitan

📖

Isaiah Thomason

📖

Denis Barushev

📖

Domas

📖

Anton Niklasson

📖

Nikolai Yakuschenko

📖

Jan Schröder

📖

Nick McCurdy

📖 👀 💻

Sudhanshu

📖

Aleksandr Chernov

📖

Mathias

📖

davidseow

📖

Tony Hallett

📖

prsdta

📖

tal-joffe

📖

Mayank Jethva

📖

Elad Israeli

📖

Francis Chartrand

📖

Preston Carman

📖

Olivier Wilkinson

📖

Amit Miran

📖

Paul Melero

📖

jonathan schatz

📖

Ricky Sullivan Himself

📖
Kent C. Dodds
Kent C. Dodds

🚧
Alex Krolick
Alex Krolick

🚧
Sidak Singh Aulakh
Sidak Singh Aulakh

💻
Brandon Carroll
Brandon Carroll

💻
David
David

📖
Ryan James
Ryan James

📖
Brandon Johnson
Brandon Johnson

📖
Edward Coleridge Smith
Edward Coleridge Smith

📖
Adrià Fontcuberta
Adrià Fontcuberta

📖 👀
Tim Deschryver
Tim Deschryver

📖 💻
Ben Monro
Ben Monro

📖
Scott Sauber
Scott Sauber

📝
Shota Tamura
Shota Tamura

🖋 📖
Giorgio Polvara
Giorgio Polvara

📖
michalak111
michalak111

📖 ⚠️
Huyen Nguyen
Huyen Nguyen

📖
Kieren Hughes
Kieren Hughes

📖
Sean McPherson
Sean McPherson

📖
Michael Lasky
Michael Lasky

📖
Thomas Lombart
Thomas Lombart

📖
Patrick K Long
Patrick K Long

📖
Pedro Filho
Pedro Filho

📖
Tanguy Antoine
Tanguy Antoine

📖
Kevin Anderson
Kevin Anderson

📖
Dustin Myers
Dustin Myers

📖
Vojta Holik
Vojta Holik

🎨
Steve Schwarz
Steve Schwarz

📖
Aayush Rajvanshi
Aayush Rajvanshi

📖
Eugie Limpin
Eugie Limpin

📖
Kevin
Kevin

📖
Jennifer Shehane
Jennifer Shehane

📖
Steve Taggart
Steve Taggart

📖
Stephen Sugden
Stephen Sugden

📖
Blai Samitier
Blai Samitier

📖
Vernon Kesner
Vernon Kesner

📖
Will Douglas
Will Douglas

📖
Head
Head

📖
Lee
Lee

📖
Mario Beltrán Alarcón
Mario Beltrán Alarcón

📖
jameslevine
jameslevine

📖
Rahim Alwer
Rahim Alwer

📖
Chenjia
Chenjia

📖
Olivier Le Thanh Duong
Olivier Le Thanh Duong

📖
Jakub Jastrzębski
Jakub Jastrzębski

📖
Ivan Galiatin
Ivan Galiatin

📖
Hendrik Röhm
Hendrik Röhm

📖
Sam Kauffman
Sam Kauffman

📖
Turadg Aleahmad
Turadg Aleahmad

📖
mark g romano
mark g romano

📖
Arturo Romero
Arturo Romero

📖
Dustin Masters
Dustin Masters

📖
Darren Lester
Darren Lester

📖
Iswara Chaitanya
Iswara Chaitanya

📖
Nataliia Pylypenko
Nataliia Pylypenko

📖
Hu Chen
Hu Chen

📖
Josh
Josh

📖
numb86
numb86

📖
Nicholas Boll
Nicholas Boll

📖
Billy Matthews
Billy Matthews

📢 📖
Dale French
Dale French

📖
aw-davidson
aw-davidson

📖
Benjamin Blackwood
Benjamin Blackwood

📖
Ben
Ben

📖
Daniel Afonso
Daniel Afonso

📖
Noman Gul
Noman Gul

📖
Rafael Souza
Rafael Souza

📖
Pavel Pustovalov
Pavel Pustovalov

📖
Dyma
Dyma

📖
Matan Borenkraout
Matan Borenkraout

📖 💻
timrobinson33
timrobinson33

📖
Manuel Dugué
Manuel Dugué

📖
karthik20
karthik20

📖
Pob Ch
Pob Ch

📖
Mohammad Kermani
Mohammad Kermani

📖
Adeel Imran
Adeel Imran

📖
Varun Dey
Varun Dey

📖
Pablo R. Dinella
Pablo R. Dinella

📖
Jamie
Jamie

📖
Cory House
Cory House

📖
Jack Zhao
Jack Zhao

📖
Ryan Kennel
Ryan Kennel

📖
Jesus Hernandez
Jesus Hernandez

📖
Aaron Pettengill
Aaron Pettengill

📖
Izhaki
Izhaki

📖
Robin Wieruch
Robin Wieruch

Alexander Sokolov
Alexander Sokolov

📖
Sascha Tandel
Sascha Tandel

📖
Gyuwon Yi
Gyuwon Yi

📖
Boris Serdiuk
Boris Serdiuk

📖
balavishnuvj
balavishnuvj

📖
Sharmila Jesupaul
Sharmila Jesupaul

📖
Batuhan Wilhelm
Batuhan Wilhelm

📖
Dennis Kaffer
Dennis Kaffer

📖
Cam Jackson
Cam Jackson

📖
Jared Luxenberg
Jared Luxenberg

📖
Yakir Narkis
Yakir Narkis

📖
Rahul Bhooteshwar
Rahul Bhooteshwar

📖
Maja Wichrowska
Maja Wichrowska

📖
Kermani
Kermani

📖 👀
Vasily Malykhin
Vasily Malykhin

📖
Brian Alexis
Brian Alexis

📖
Kalpesh Singh
Kalpesh Singh

📖
Gerrit Alex
Gerrit Alex

📖
Winter LaMon
Winter LaMon

📖
Juliano Penna
Juliano Penna

📖
Paul Coroneos
Paul Coroneos

📖
Sebastian Silbermann
Sebastian Silbermann

📖 👀
Paul Salaets
Paul Salaets

📖
Michaël De Boey
Michaël De Boey

📖
Washington Soares
Washington Soares

📖
Jami Suomalainen
Jami Suomalainen

📖
Oriol Puig
Oriol Puig

📖
hedgecox
hedgecox

📖
Sherman Hui
Sherman Hui

📖
Jesu Castillo
Jesu Castillo

📖
Core HTML5 Canvas, the book
Core HTML5 Canvas, the book

📖
John Sterling
John Sterling

📖
Velu S Gautam
Velu S Gautam

📖
Richard Oliver Bray
Richard Oliver Bray

📖
Yanlin Jiang
Yanlin Jiang

📖
Lidor Avitan
Lidor Avitan

📖
Isaiah Thomason
Isaiah Thomason

📖
Denis Barushev
Denis Barushev

📖
Domas
Domas

📖
Anton Niklasson
Anton Niklasson

📖
Nikolai Yakuschenko
Nikolai Yakuschenko

📖
Jan Schröder
Jan Schröder

📖
Nick McCurdy
Nick McCurdy

📖 👀 💻
Sudhanshu
Sudhanshu

📖
Aleksandr Chernov
Aleksandr Chernov

📖
Mathias
Mathias

📖
davidseow
davidseow

📖
Tony Hallett
Tony Hallett

📖
prsdta
prsdta

📖
tal-joffe
tal-joffe

📖
Mayank Jethva
Mayank Jethva

📖
Elad Israeli
Elad Israeli

📖
Francis Chartrand
Francis Chartrand

📖
Preston Carman
Preston Carman

📖
Olivier Wilkinson
Olivier Wilkinson

📖
Amit Miran
Amit Miran

📖
Paul Melero
Paul Melero

📖
jonathan schatz
jonathan schatz

📖
Ricky Sullivan Himself
Ricky Sullivan Himself

📖
Armin
Armin

📖
Dale Baldwin
Dale Baldwin

📖
AdriSolid
AdriSolid

📖
Naruth Kongurai
Naruth Kongurai

📖
Erfan Mirzapour
Erfan Mirzapour

📖
Shem Mahluf
Shem Mahluf

💻 🚇 📖
Phil Gibbins
Phil Gibbins

📖
Liad Shiran
Liad Shiran

📖
Eduardo Simón Picón
Eduardo Simón Picón

📖
Sanjeev Sharma
Sanjeev Sharma

📖
dror-heller
dror-heller

📖
Aleksei Arro
Aleksei Arro

📖
Carlo Beltrame
Carlo Beltrame

📖
ggorlen
ggorlen

📖
mattstobbs
mattstobbs

📖
Zach
Zach

📖
Angus J. Pope
Angus J. Pope

📖
Dylan Piercey
Dylan Piercey

📖
Ruhollah
Ruhollah

📖
Michael Gwynne
Michael Gwynne

📖
Dominik Broj
Dominik Broj

📖
Stephen Wade
Stephen Wade

📖
Luiz Baldi
Luiz Baldi

📖
Thomas Ingram
Thomas Ingram

📖
David Johnston
David Johnston

📖
Rupert McKay
Rupert McKay

📖
Sebastián Maciel
Sebastián Maciel

📖
Sidharth Vinod
Sidharth Vinod

📖
Honza Kalfus
Honza Kalfus

📖
Christopher Laidler
Christopher Laidler

📖
Nik Savchenko
Nik Savchenko

📖
Steven Frieson
Steven Frieson

📖
Andrew Rosário
Andrew Rosário

📖
Daniel RB
Daniel RB

📖
HonkingGoose
HonkingGoose

📖
Daniel Kolev
Daniel Kolev

📖
Arryangga Aliev Pratamaputra
Arryangga Aliev Pratamaputra

📖
Andrew Hansen
Andrew Hansen

📖
JOAO GABRIEL SANTOS NEVES
JOAO GABRIEL SANTOS NEVES

📖
Luke Ingalls
Luke Ingalls

📖
Aleksey Levenstein
Aleksey Levenstein

📖
Tomas Zaicevas
Tomas Zaicevas

📖
Sriram Thiagarajan
Sriram Thiagarajan

📖
Esteban Borai
Esteban Borai

📖
Arti Villa
Arti Villa

📖
Jake Boone
Jake Boone

📖
Dennis273
Dennis273

📖
Mosh Feu
Mosh Feu

📖
Notas Hellout
Notas Hellout

📖
Max Smolens
Max Smolens

📖
Nima Ebrazeh
Nima Ebrazeh

📖
Philipp Fritsche
Philipp Fritsche

👀
Clément Plantier
Clément Plantier

📖
pppp606
pppp606

📖
Bilou
Bilou

📖
David Hewson
David Hewson

📖
Alex Kim
Alex Kim

📖
PaquitoSoft
PaquitoSoft

📖
Márcio Gabriel
Márcio Gabriel

📖
Krychaxp
Krychaxp

📖
momokolo
momokolo

📖
AndyG
AndyG

📖
Jason Butz
Jason Butz

🚇
Oleg
Oleg

📖
Dany Paredes
Dany Paredes

📖
Abel
Abel

📖
Patrick Brady
Patrick Brady

📖
Grant Eaton
Grant Eaton

📖
Aaron Dunphy
Aaron Dunphy

📖
Tom Mrazauskas
Tom Mrazauskas

📖
Supermaryy
Supermaryy

📖
Ben Newton
Ben Newton

📖
Matija Marohnić
Matija Marohnić

📖
Thaddeus Jiang
Thaddeus Jiang

📖
Robin Drexler
Robin Drexler

📖
Thomas McKee
Thomas McKee

📖
satanTime
satanTime

📖
polinamochan
polinamochan

📖
Shai Rose
Shai Rose

📖
AldinRekic
AldinRekic

🎨
Son Nguyen
Son Nguyen

📖
Lirlev48
Lirlev48

📖
Tarjei Huse
Tarjei Huse

📖
Obie Munoz
Obie Munoz

📖
Bert B
Bert B

📖
Alireza Heydari
Alireza Heydari

📖
Gleb Radutsky
Gleb Radutsky

📖
giovanniPepi
giovanniPepi

📖
Maciej Jastrzebski
Maciej Jastrzebski

📖
Sergio Moreno
Sergio Moreno

💻
David Nixon
David Nixon

📖
Anton Khitrenovich
Anton Khitrenovich

📖
Kostas Minaidis
Kostas Minaidis

📖
Than Hutchins
Than Hutchins

📖
Jordan Edmunds
Jordan Edmunds

📖
mouse
mouse

📖
Roberto Molina
Roberto Molina

📖
Louis Young
Louis Young

📖
Lukas Elmer
Lukas Elmer

📖
Brent Guffens
Brent Guffens

📖
Esteban
Esteban

📖
Tibor Barsi
Tibor Barsi

📖
Tomoya Kashifuku
Tomoya Kashifuku

📖
Leo
Leo

📖
Erik Metz
Erik Metz

📖
Vaibhav Tyagi
Vaibhav Tyagi

📖
Aleksei Drokin
Aleksei Drokin

📖
Torsten Knauf
Torsten Knauf

📖
John Harlow
John Harlow

📖
Morgan Hunter
Morgan Hunter

📖
Louis Moselhi
Louis Moselhi

📖
Ryan McGill
Ryan McGill

📖
Renan Andrade
Renan Andrade

📖
Vasilii Boldurean
Vasilii Boldurean

📖
Josias Schneider
Josias Schneider

📖
Denis LE
Denis LE

📖
Nicolas Frizzarin
Nicolas Frizzarin

📖
Santosh Yadav
Santosh Yadav

📖
Ilê Caian
Ilê Caian

📖
Alex Khomenko
Alex Khomenko

📖
Luís Campos
Luís Campos

📖
Alexandr Zhidovlenko
Alexandr Zhidovlenko

📖
lyannel
lyannel

️️️️♿️
Yanick Champoux
Yanick Champoux

📖
Ali
Ali

📖
Milan Jaritz
Milan Jaritz

📖
Rokas Brazdžionis
Rokas Brazdžionis

📖
Laforge Thomas
Laforge Thomas

📖
Steph Nathai
Steph Nathai

💻 ️️️️♿️
Frieder Bluemle
Frieder Bluemle

📖
Gromit (전민재)
Gromit (전민재)

📖
Cesar S
Cesar S

📖
Corbin Crutchley
Corbin Crutchley

📖
Roman Batsenko
Roman Batsenko

📖
snjro
snjro

📖
taro
taro

📖
Andreas Nordahl
Andreas Nordahl

📖
neaumusic
neaumusic

📖
Joyel Johny
Joyel Johny

💻
bsheps
bsheps

📖
Kyle Nazario
Kyle Nazario

📖
Giuliano Crivelli
Giuliano Crivelli

📖
mrkv
mrkv

📖
smk267
smk267

🚇
Dylan Gordon
Dylan Gordon

📖
Michael Cousins
Michael Cousins

📖 👀
Artem Zakharchenko
Artem Zakharchenko

📖
Vadim Shvetsov
Vadim Shvetsov

📖
Domantas Petrauskas
Domantas Petrauskas

📖
Efim
Efim

📖
denisx
denisx

💻
Giovanni Gualiato
Giovanni Gualiato

📖
Saud Baig
Saud Baig

📖
Ren Adachi
Ren Adachi

📖
Ty Mick
Ty Mick

📖
Enmanuel Durán
Enmanuel Durán

📖
Galeel Bhasha Satthar
Galeel Bhasha Satthar

📖
Ian Létourneau
Ian Létourneau

📖
brianlu2610
brianlu2610

💻
Erin
Erin

📖
Nan Chen
Nan Chen

📖
Alexander Burdiss
Alexander Burdiss

📖
Peter Hentges
Peter Hentges

📖
neknalb
neknalb

📖
fetsorn
fetsorn

📖
@@ -325,4 +543,6 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! diff --git a/blog/2019-03-17-code-blocks.mdx b/blog/2019-03-17-code-blocks.mdx index a9e4f2d2f..b17d70ea2 100755 --- a/blog/2019-03-17-code-blocks.mdx +++ b/blog/2019-03-17-code-blocks.mdx @@ -1,7 +1,7 @@ --- title: Multi-Framework Code Blocks author: Alex Krolick -authorURL: "http://github.com/alexkrolick" +authorURL: 'http://github.com/alexkrolick' --- Many of the code samples have been updated to include tabs to switch between diff --git a/blog/2019-04-25-new-org.mdx b/blog/2019-04-25-new-org.mdx index 6325f8ba2..b0e09c200 100644 --- a/blog/2019-04-25-new-org.mdx +++ b/blog/2019-04-25-new-org.mdx @@ -1,10 +1,12 @@ --- # prettier doesn't like how long this line is.: "" # prettier-ignore: "" -title: "Testing Library Updates: new release, github org, open collective, and twitter account" +title: + 'Testing Library Updates: new release, github org, open collective, and + twitter account' author: Kent C. Dodds -authorURL: "https://kentcdodds.com/" -authorImageURL: "https://avatars0.githubusercontent.com/u/1500684?s=120&v=4" +authorURL: 'https://kentcdodds.com/' +authorImageURL: 'https://avatars0.githubusercontent.com/u/1500684?s=120&v=4' --- Hello friends! I'm pleased to announce the recent updates to the testing-library @@ -121,33 +123,27 @@ there.) Please join us! > [Join us on Spectrum](https://spectrum.chat/testing-library) -## [Testing Library on React Native](https://www.native-testing-library.com/) +## [Testing Library on React Native](https://callstack.github.io/react-native-testing-library/) I'm really happy to announce a super solution to the React Native testing space. The DOM is quite different from native, as I mentioned before, it's not the code but the concepts that really make the Testing Library great. I'm happy to say -that [Brandon Carroll](https://twitter.com/bcarroll22) has successfully ported +that [Brandon Carroll](https://github.com/bcarroll22) has successfully ported those concepts to a solution for React Native and I'm really happy with it. Give it a look if you're building React Native applications and want confidence that they continue to work as you make changes! -(Note, there is already `react-native-testing-library`, but it doesn't quite -follow the guiding principles of Testing Library, so we recommend you use -`native-testing-library`. -[Learn More](https://medium.com/@brandoncarroll/why-native-testing-library-exists-629ffb85cae2)). +> [Checkout native-testing-library](https://callstack.github.io/react-native-testing-library/) -> [Checkout native-testing-library](https://www.native-testing-library.com/) - -## [Learn Testing Library](https://testing-library.com/docs/learning) +## [Learn Testing Library](/docs/learning) There's been a LOT of activity around the Testing Library principles and tools in the content space. We do have -[a page that lists learning materials](https://testing-library.com/docs/learning), -and more gets added to it daily. If you know of blog posts, YouTube videos, -courses, or anything else about the Testing Library family of tools, please -contribute to the list! +[a page that lists learning materials](/docs/learning), and more gets added to +it daily. If you know of blog posts, YouTube videos, courses, or anything else +about the Testing Library family of tools, please contribute to the list! -> [Contribute to the learning materials page](https://github.com/testing-library/testing-library-docs/edit/master/docs/learning.mdx) +> [Contribute to the learning materials page](https://github.com/testing-library/testing-library-docs/edit/main/docs/learning.mdx) ## Other Exciting news @@ -177,7 +173,7 @@ an especially significant impact on the Testing Library family of tools and community. [Myself 👋](https://kentcdodds.com), [Alex Krolick](https://alexkrolick.com/), -[Brandon Carroll](https://twitter.com/bcarroll22), +[Brandon Carroll](https://github.com/bcarroll22), [Giorgio](https://twitter.com/Gpx), [Ernesto García](https://twitter.com/gnapse), and [Daniel Cook](https://github.com/dfcook). diff --git a/docs/angular-testing-library/api.mdx b/docs/angular-testing-library/api.mdx index 4ddb32ede..08daa3359 100644 --- a/docs/angular-testing-library/api.mdx +++ b/docs/angular-testing-library/api.mdx @@ -1,16 +1,12 @@ --- id: api title: API -sidebar_label: API --- `Angular Testing Library` re-exports everything from `DOM Testing Library` as -well as these methods: +well as the `render` method. -- [`render`](#render) - -Some of the `DOM Testing Library` re-exports are patched to work easier with -Angular: +The following re-exports are patched to make them easier to use with Angular: - The events on `fireEvent` automatically invoke a change detection cycle after the event has been fired @@ -21,42 +17,116 @@ Angular: ## `render` +With Angular Testing Library, the component can be rendered in two ways, via the +component's type or with a template. + +> By default, `render` also imports the `NoopAnimationsModule`. + +## `Type` + +To render a component, you need to pass component's type to the `render` method. +For components that don't use other parts of your application (for example +design modules or services), rendering a component can be as simple as the +following example. + +```typescript +await render(AppComponent) +``` + +## `template` + +Instead of passing the component's type as first argument, you can also provide +a template. This practice is required to render directives but can also be +applied to components, it might even be more useful. The directive's (or +component's) type must then be added to the `imports` (or `declarations` in case +of non-standalone components). + +**example with directive**: + ```typescript -async function render( +await render('
', { + declarations: [SpoilerDirective], +}) +``` + +**example with component**: + +```typescript +await render( + '', + { + declarations: [AppComponent], + componentProperties: { + anotherValue: 'valueOfAnotherProperty', + sendValue: jest.fn(), + }, + }, +) +``` + +```typescript +export async function render( component: Type, - renderOptions?: RenderComponentOptions + renderOptions?: RenderComponentOptions, ): Promise> -async function render( - component: Type, - renderOptions?: RenderDirectiveOptions -): Promise> +export async function render( + template: string, + renderOptions?: RenderTemplateOptions, +): Promise> ``` ## Component RenderOptions -### `componentProperties` -An object to set `@Input` and `@Output` properties of the component. +### `inputs` -**default** : `{}` +An object to set `@Input` or `input()` properties of the component. -**example**: +**default** : `{}` ```typescript await render(AppComponent, { - componentProperties: { + inputs: { counterValue: 10, - send: (value) => { ... } + // explicitly define aliases using `aliasedInput` + ...aliasedInput('someAlias', 'someValue'), + }, +}) +``` + +### `on` + +An object with callbacks to subscribe to `EventEmitters` and `Observables` of +the component. + +**default** : `{}` + +```ts +// using a manual callback +const sendValue = (value) => { ... } +await render(AppComponent, { + on: { + send: (value) => sendValue(value), + } +}) + +// using a (jest) spy +const sendValueSpy = jest.fn() + +await render(AppComponent, { + on: { + send: sendValueSpy } }) ``` -### `componentProviders` +### `declarations` -A collection of providers to inject dependencies of the component. +A collection of components, directives and pipes needed to render the component. +For example, nested components of the component. For more info see the -[Angular docs](https://angular.io/api/core/Directive#providers). +[Angular docs](https://angular.dev/guide/ngmodules/overview#declarations). **default** : `[]` @@ -64,17 +134,56 @@ For more info see the ```typescript await render(AppComponent, { - componentProviders: [AppComponentService], + declarations: [CustomerDetailComponent, ButtonComponent], }) ``` -### `declarations` +### `deferBlockBehavior` + +Set the defer blocks behavior. + +For more info see the +[Angular docs](https://angular.dev/api/core/testing/DeferBlockBehavior) + +**default** : `undefined` (uses `DeferBlockBehavior.Manual`, which is different +from the Angular default of `DeferBlockBehavior.Playthrough`) + +**example**: + +```typescript +await render(AppComponent, { + deferBlockBehavior: DeferBlockBehavior.Playthrough, +}) +``` + +### `deferBlockStates` + +Set the initial state of a deferrable blocks in a component. + +For more info see the +[Angular docs](https://angular.dev/api/core/testing/DeferBlockState) + +**default** : `undefined` (uses the Angular default, which is +`DeferBlockState.Placeholder`) + +**example**: + +```typescript +await render(FixtureComponent, { + deferBlockStates: DeferBlockState.Loading, +}) +``` + +### `componentProviders` A collection of providers needed to render the component via Dependency -Injection, for example, injectable services or tokens. +Injection. + +These will be provided at the component level. To inject dependencies at the +module level, use [`providers`](#providers). For more info see the -[Angular docs](https://angular.io/api/core/NgModule#providers). +[Angular docs](https://angular.dev/guide/di/hierarchical-dependency-injection#example-providing-services-in-component). **default** : `[]` @@ -82,32 +191,75 @@ For more info see the ```typescript await render(AppComponent, { - providers: [ - CustomersService, + componentProviders: [AppComponentService], +}) +``` + +### `componentImports` + +A collection of imports to override a standalone component's imports with. + +**default** : `undefined` + +**example**: + +```typescript +await render(AppComponent, { + componentImports: [MockChildComponent], +}) +``` + +### `childComponentOverrides` + +Collection of child component specified providers to override with. + +**default** : `undefined` + +**example**: + +```typescript +await render(AppComponent, { + childComponentOverrides: [ { - provide: MAX_CUSTOMERS_TOKEN, - useValue: 10, + component: ChildOfAppComponent, + providers: [{provide: ChildService, useValue: {hello: 'world'}}], }, ], }) ``` -### `detectChanges` +### `detectChangesOnRender` + +Invokes `detectChanges` after the component is rendered. + +**default** : `true` + +**example**: + +```typescript +await render(AppComponent, {detectChangesOnRender: false}) +``` -Will call `detectChanges` when the component is compiled +### `autoDetectChanges` + +Automatically detect changes as a "real" running component would do. For +example, runs a change detection cycle when an event has occured. **default** : `true` **example**: ```typescript -await render(AppComponent, { detectChanges: false }) +await render(AppComponent, { + autoDetectChanges: false, +}) ``` ### `excludeComponentDeclaration` Exclude the component to be automatically be added as a declaration. This is -needed when the component is declared in an imported module. +needed when the component is declared in an imported module, for example with +SCAMs. **default** : `false` @@ -127,7 +279,7 @@ modules. Adds `NoopAnimationsModule` by default if `BrowserAnimationsModule` isn't added to the collection For more info see the -[Angular docs](https://angular.io/api/core/NgModule#imports). +[Angular docs](https://angular.dev/guide/components#imports-in-the-component-decorator). **default** : `[NoopAnimationsModule]` @@ -139,6 +291,33 @@ await render(AppComponent, { }) ``` +### `providers` + +A collection of providers needed to render the component via Dependency +Injection. + +These will be provided at the module level. To inject dependencies at the +component level, use [`componentProviders`](#componentProviders). + +For more info see the +[Angular docs](https://angular.dev/guide/di/dependency-injection-providers#). + +**default** : `[]` + +**example**: + +```typescript +await render(AppComponent, { + providers: [ + CustomersService, + { + provide: MAX_CUSTOMERS_TOKEN, + useValue: 10, + }, + ], +}) +``` + ### `queries` Queries to bind. Overrides the default set from DOM Testing Library unless @@ -150,7 +329,7 @@ merged. ```typescript await render(AppComponent, { - queries: { ...queries, ...customQueries }, + queries: {...queries, ...customQueries}, }) ``` @@ -158,7 +337,7 @@ await render(AppComponent, { The route configuration to set up the router service via `RouterTestingModule.withRoutes`. For more info see the -[Angular Routes docs](https://angular.io/api/router/Routes). +[Angular Routes docs](https://angular.dev/api/router/Routes). **default** : `[]` @@ -187,7 +366,7 @@ A collection of schemas needed to render the component. Allowed values are `NO_ERRORS_SCHEMA` and `CUSTOM_ELEMENTS_SCHEMA`. For more info see the -[Angular docs](https://angular.io/api/core/NgModule#schemas). +[Angular docs](https://angular.dev/guide/components/advanced-configuration#custom-element-schemas). **default** : `[]` @@ -213,39 +392,64 @@ await render(AppComponent, { }) ``` -## Directive RenderOptions -To test a directive, the render API is a bit different. The API has the same -options as the Component RenderOptions, but has more options: +### ~~`componentInputs`~~ (deprecated) + +An object to set `@Input` properties of the component. Uses `setInput` to set +the input property. Throws if the component property is not annotated with the +`@Input` attribute. -### `template` +**default** : `{}` + +**example**: + +```typescript +await render(AppComponent, { + componentInputs: { + counterValue: 10, + }, +}) +``` + +### ~~`componentOutputs`~~ (deprecated) + +An object to set `@Output` properties of the component. -The template to render the directive. +**default** : `{}` **example**: ```typescript -await render(SpoilerDirective, { - template: `
`, +await render(AppComponent, { + componentOutputs: { + clicked: (value) => { ... } + } }) ``` -### `wrapper` +### ~~`componentProperties`~~ (deprecated) -An Angular component to wrap the directive in. +An object to set `@Input` and `@Output` properties of the component. Doesn't +have a fine-grained control as `inputs` and `on`. -**default**: `WrapperComponent` , an empty component that strips the -`ng-version` attribute. +**default** : `{}` **example**: ```typescript -await render(SpoilerDirective, { - template: `
` - wrapper: CustomWrapperComponent +await render(AppComponent, { + componentProperties: { + // an input + counterValue: 10, + // an output + send: (value) => { ... } + // a public property + name: 'Tim' + } }) ``` + ## `RenderResult` ### `container` @@ -260,49 +464,79 @@ Prints out the component's DOM with syntax highlighting. Accepts an optional parameter, to print out a specific DOM node. ```typescript -const { debug } = await render(AppComponent) +const {debug} = await render(AppComponent) debug() ``` ### `rerender` -Re-render the same component with different props. Will call `detectChanges` -after props has been updated. +Changes the input properties of the existing component instance by following +Angular component lifecycle events (i.e. `ngOnChanges` is called). Input +properties that are not defined are cleared. ```typescript -const { rerender } = await render(Counter, { componentProperties: { count: 4 } }) +const {rerender} = await render(Counter, { + inputs: {count: 4, name: 'Sarah'}, +}) expect(screen.getByTestId('count-value').textContent).toBe('4') +expect(screen.getByTestId('name-value').textContent).toBe('Sarah') -rerender({ count: 7 }) +await rerender({ + inputs: {count: 7} +}) + +// count is updated to 7 +expect(screen.getByTestId('count-value').textContent).toBe('7') +// name is undefined because it's not provided in rerender +expect(screen.getByTestId('name-value').textContent).toBeUndefined() +``` + +Using `partialUpdate`, only the newly provided properties will be updated. Other +input properties that aren't provided won't be cleared. + +```typescript +const {rerender} = await render(Counter, { + inputs: {count: 4, name: 'Sarah'}, +}) + +expect(screen.getByTestId('count-value').textContent).toBe('4') +expect(screen.getByTestId('name-value').textContent).toBe('Sarah') + +await rerender({inputs: {count: 7}, partialUpdate: true}) +// count is updated to 7 expect(screen.getByTestId('count-value').textContent).toBe('7') +// name is still rendered as "Sarah" because of the partial update +expect(screen.getByTestId('name-value').textContent).toBe('Sarah') ``` ### `detectChanges` Trigger a change detection cycle for the component. -For more info see the [Angular docs](https://angular.io/api/core/testing/ComponentFixture#detectChanges). +For more info see the +[Angular docs](https://angular.dev/api/core/testing/ComponentFixture#detectChanges). ### `debugElement` The Angular `DebugElement` of the component. -For more info see the [Angular docs](https://angular.io/api/core/DebugElement). +For more info see the [Angular docs](https://angular.dev/api/core/DebugElement). ### `fixture` The Angular `ComponentFixture` of the component. For more info see the -[Angular docs](https://angular.io/api/core/testing/ComponentFixture). +[Angular docs](https://angular.dev/api/core/testing/ComponentFixture). ```typescript -const { fixture } = await render(AppComponent) +const {fixture} = await render(AppComponent) -const componentInstance = fixture.componentInstance as AppComponent +// componentInstance is typed as AppComponent +const componentInstance = fixture.componentInstance ``` > 🚨 If you find yourself using `fixture` to access the component's internal @@ -327,18 +561,37 @@ await navigate('details/3') ### `...queries` The most important feature of `render` is that the queries from -[DOM Testing Library](https://testing-library.com/docs/dom-testing-library) are -automatically returned with their first argument bound to the component under -test. +[DOM Testing Library](/docs/dom-testing-library/intro) are automatically +returned with their first argument bound to the component under test. -See [Queries](https://testing-library.com/docs/dom-testing-library/api-queries) -for a complete list. +See [Queries](queries/about.mdx) for a complete list. **example**: ```typescript -const { getByText, queryByLabelText} = await render(AppComponent) +const {getByText, queryByLabelText} = await render(AppComponent) + +screen.getByRole('heading', { + name: /api/i, +}) +queryByLabelText(/First name/i') +``` + +### `renderDeferBlock` + +To test [Deferrable views](https://angular.dev/guide/defer#defer), you can make +use of `renderDeferBlock`. `renderDeferBlock` will set the desired defer state +for a specific deferrable block. The default value of a deferrable view is +`Placeholder`, but you can also set the initial state while rendering the +component. + +```typescript +const {renderDeferBlock} = await render(FixtureComponent, { + deferBlockStates: DeferBlockState.Loading, +}) + +expect(screen.getByText(/loading/i)).toBeInTheDocument() -getByText('Hello world') -queryByLabelText('First name:') +await renderDeferBlock(DeferBlockState.Complete) +expect(screen.getByText(/completed/i)).toBeInTheDocument() ``` diff --git a/docs/angular-testing-library/examples.mdx b/docs/angular-testing-library/examples.mdx index c4eee4601..2e44b893c 100644 --- a/docs/angular-testing-library/examples.mdx +++ b/docs/angular-testing-library/examples.mdx @@ -1,72 +1,81 @@ --- id: examples -title: Examples -sidebar_label: Examples +title: Example --- -> Read -> [Good testing practices with 🦔 Angular Testing Library](https://timdeschryver.dev/posts/good-testing-practices-with-angular-testing-library) -> for a guided example +> Read about +> [best practices](https://timdeschryver.dev/blog/good-testing-practices-with-angular-testing-library), +> or follow the +> [guided example](https://timdeschryver.dev/blog/getting-the-most-value-out-of-your-angular-component-tests) -counter.component.ts +Angular Testing Library can be used with standalone components and also with Angular components that uses Modules. +The example below shows how to test a standalone component, but the same principles apply to Angular components that uses Modules. +In fact, there should be no difference in how you test both types of components, only the setup might be different. -```typescript +```ts title="counter.component.ts" @Component({ - selector: 'counter', + selector: 'app-counter', template: ` + {{ hello() }} - Current Count: {{ counter }} + Current Count: {{ counter() }} `, }) export class CounterComponent { - @Input() counter = 0 + counter = model(0); + hello = input('Hi', { alias: 'greeting' }); increment() { - this.counter += 1 + this.counter.set(this.counter() + 1); } decrement() { - this.counter -= 1 + this.counter.set(this.counter() - 1); } } ``` -counter.component.spec.ts - -```typescript -import { render, screen, fireEvent } from '@testing-library/angular' -import { CounterComponent } from './counter.component.ts' +```typescript title="counter.component.spec.ts" +import { render, screen, fireEvent, aliasedInput } from '@testing-library/angular'; +import { CounterComponent } from './counter.component'; describe('Counter', () => { - test('should render counter', async () => { + it('should render counter', async () => { await render(CounterComponent, { - componentProperties: { counter: 5 }, - }) + inputs: { + counter: 5, + // aliases need to be specified using aliasedInput + ...aliasedInput('greeting', 'Hello Alias!'), + }, + }); - expect(screen.getByText('Current Count: 5')) - }) + expect(screen.getByText('Current Count: 5')).toBeVisible(); + expect(screen.getByText('Hello Alias!')).toBeVisible(); + }); - test('should increment the counter on click', async () => { - await render(CounterComponent, { - componentProperties: { counter: 5 }, - }) + it('should increment the counter on click', async () => { + await render(CounterComponent, { inputs: { counter: 5 } }); - fireEvent.click(screen.getByText('+')) + const incrementButton = screen.getByRole('button', { name: '+' }); + fireEvent.click(incrementButton); - expect(screen.getByText('Current Count: 6')) - }) -}) + expect(screen.getByText('Current Count: 6')).toBeVisible(); + }); +}); ``` +## More examples + More examples can be found in the -[GitHub project](https://github.com/testing-library/angular-testing-library/tree/master/apps/example-app/app/examples). +[GitHub project](https://github.com/testing-library/angular-testing-library/tree/master/apps/example-app/src/app/examples). These examples include: -- `@Input` and `@Output` properties -- (Reactive) Forms -- Integration with NgRx (mock) Store -- And more +- `input` and `output` properties +- Forms +- Integration injected services +- And + [more](https://github.com/testing-library/angular-testing-library/tree/master/apps/example-app/src/app/examples) If you're looking for an example that isn't on the list, please feel free to create a diff --git a/docs/angular-testing-library/faq.mdx b/docs/angular-testing-library/faq.mdx new file mode 100644 index 000000000..e333db4b3 --- /dev/null +++ b/docs/angular-testing-library/faq.mdx @@ -0,0 +1,109 @@ +--- +id: faq +title: FAQ +--- + +See also the [main FAQ](dom-testing-library/faq.mdx) for questions not specific +to Angular testing. + +
+ +Can I write unit tests with this library? + +Definitely yes! You can write unit and integration tests with this library. See +below for more on how to mock dependencies (because this library intentionally +does NOT support shallow rendering) if you want to unit test a high level +component. The tests in this project show several examples of unit testing with +this library. + +As you write your tests, keep in mind: + +> The more your tests resemble the way your software is used, the more +> confidence they can give you. - [17 Feb 2018][guiding-principle] + +
+ +
+ + + If I can't use shallow rendering, how do I mock out components in tests? + + +In general, you should avoid mocking out components (see +[the Guiding Principles section](guiding-principles.mdx)). However, if you need +to, then try to use [ng-mocks](https://ng-mocks.sudo.eu/) and its +[`MockBuilder`](https://ng-mocks.sudo.eu/extra/with-3rd-party#testing-libraryangular-and-mockbuilder). + +```typescript +import {Component, NgModule} from '@angular/core' +import {render, screen} from '@testing-library/angular' +import {MockBuilder} from 'ng-mocks' + +@Component({ + selector: 'app-parent-component', + template: '', +}) +class ParentComponent {} + +@Component({ + selector: 'app-child-component', + template: '

Child component

', +}) +class ChildComponent {} + +@NgModule({ + declarations: [ParentComponent, ChildComponent], +}) +export class AppModule {} + +describe('ParentComponent', () => { + it('should not render ChildComponent when shallow rendering', async () => { + // all imports, declarations and exports of AppModule will be mocked. + const dependencies = MockBuilder(ParentComponent, AppModule).build() + + await render(ParentComponent, dependencies) + + expect(screen.queryByText('Child component')).toBeNull() + }) +}) +``` + +
+ +
+ + + What level of a component tree should I test? Children, parents, or both? + + +Following the guiding principle of this library, it is useful to break down how +tests are organized around how the user experiences and interacts with +application functionality rather than around specific components themselves. In +some cases, for example for reusable component libraries, it might be useful to +include developers in the list of users to test for and test each of the +reusable components individually. Other times, the specific break down of a +component tree is just an implementation detail and testing every component +within that tree individually can cause issues (see +https://kentcdodds.com/blog/avoid-the-test-user). + +In practice this means that it is often preferable to test high enough up the +component tree to simulate realistic user interactions. The question of whether +it is worth additionally testing at a higher or lower level on top of this comes +down to a question of tradeoffs and what will provide enough value for the cost +(see https://kentcdodds.com/blog/unit-vs-integration-vs-e2e-tests on more info +on different levels of testing). + +For a more in-depth discussion of this topic see +[this video](https://youtu.be/0qmPdcV-rN8). + +
+ + + + + +[guiding-principle]: https://twitter.com/kentcdodds/status/977018512689455106 + + diff --git a/docs/angular-testing-library/intro.mdx b/docs/angular-testing-library/intro.mdx index 7fb31f31a..a7820b7f0 100644 --- a/docs/angular-testing-library/intro.mdx +++ b/docs/angular-testing-library/intro.mdx @@ -8,9 +8,17 @@ sidebar_label: Introduction builds on top of [`DOM Testing Library`](https://github.com/testing-library/dom-testing-library) by adding APIs for working with Angular components. +Starting from ATL version 17, you also need to install `@testing-library/dom`: + +```bash npm2yarn +npm install --save-dev @testing-library/angular @testing-library/dom +``` + +Or, you can use the `ng add` command. +This sets up your project to use Angular Testing Library, which also includes the installation of `@testing-library/dom`. ```bash -npm install --save-dev @testing-library/angular +ng add @testing-library/angular ``` - [`@testing-library/angular-testing-library` on GitHub](https://github.com/testing-library/angular-testing-library) diff --git a/docs/angular-testing-library/version-compatibility.mdx b/docs/angular-testing-library/version-compatibility.mdx new file mode 100644 index 000000000..3b64dd5d2 --- /dev/null +++ b/docs/angular-testing-library/version-compatibility.mdx @@ -0,0 +1,18 @@ +--- +id: version-compatibility +title: Version compatibility +--- + +An overview of the compatibility between different versions of Angular Testing +Library and Angular. + +| Angular | Angular Testing Library | +| ------- | ---------------------------------- | +| 20.x | 18.x | +| 19.x | 18.x, 17.x, 16.x, 15.x, 14.x, 13.x | +| 18.x | 17.x, 16.x, 15.x, 14.x, 13.x | +| 17.x | 17.x, 16.x, 15.x, 14.x, 13.x | +| 16.x | 14.x, 13.x | +| >= 15.1 | 14.x, 13.x | +| < 15.1 | 12.x, 11.x | +| 14.x | 12.x, 11.x | diff --git a/docs/bs-react-testing-library/examples.mdx b/docs/bs-react-testing-library/examples.mdx index ce8d544a7..08e96a7c9 100644 --- a/docs/bs-react-testing-library/examples.mdx +++ b/docs/bs-react-testing-library/examples.mdx @@ -1,6 +1,6 @@ --- id: examples -title: Examples +title: Example --- You can find more bs-dom-testing-library examples at @@ -11,9 +11,7 @@ You can find more bs-react-testing-library examples at ## React Testing Library -```reason -/* Component_test.re */ - +```reason title="Component_test.re" open Jest; open Expect; open ReactTestingLibrary; @@ -37,8 +35,7 @@ with typings and creating events. ### getByText -```reason -/* __tests__/example_test.re */ +```reason title="__tests__/example_test.re" open Jest; open DomTestingLibrary; open Expect; diff --git a/docs/bs-react-testing-library/intro.mdx b/docs/bs-react-testing-library/intro.mdx index 8e2545423..316ccc9b2 100644 --- a/docs/bs-react-testing-library/intro.mdx +++ b/docs/bs-react-testing-library/intro.mdx @@ -13,8 +13,11 @@ Bindings for several testing libraries have been ported to [ReasonML][re]. [`bs-dom-testing-library`][gh-dom] contains [BuckleScript][bs] bindings for `DOM Testing Library`. -``` +```bash npm2yarn npm install --save-dev bs-dom-testing-library +``` + +```bash npm2yarn npm install --save-dev bs-react-testing-library ``` @@ -49,7 +52,7 @@ _or_ This is what [BuckleScript][bs] uses to compile the [Reason][re] code to JS. If it is not in your project you can install it like so: -``` +```bash npm2yarn npm install --save-dev bs-platform ``` @@ -60,7 +63,7 @@ examples here will be using it. - [bs-jest on GitHub](https://github.com/glennsl/bs-jest) -``` +```bash npm2yarn npm install --save-dev @glennsl/bs-jest ``` diff --git a/docs/cypress-testing-library/intro.mdx b/docs/cypress-testing-library/intro.mdx index cb6dacf7b..3c88d4d2b 100644 --- a/docs/cypress-testing-library/intro.mdx +++ b/docs/cypress-testing-library/intro.mdx @@ -6,7 +6,7 @@ title: Cypress Testing Library [`Cypress Testing Library`][gh] allows the use of dom-testing queries within [Cypress](https://cypress.io) end-to-end browser tests. -``` +```bash npm2yarn npm install --save-dev cypress @testing-library/cypress ``` @@ -18,13 +18,12 @@ npm install --save-dev cypress @testing-library/cypress Add this line to your project's `cypress/support/commands.js`: -``` -import '@testing-library/cypress/add-commands'; +```js +import '@testing-library/cypress/add-commands' ``` -You can now use all of `DOM Testing Library`'s `findBy`, `findAllBy`, `queryBy` -and `queryAllBy` commands off the global `cy` object. -[See the `DOM Testing Library` docs for reference](https://testing-library.com/docs/dom-testing-library/api-queries). +You can now use some of `DOM Testing Library`'s `findBy`, and `findAllBy` commands off the global `cy` object. +[See the `About queries` docs for reference](/docs/queries/about). > Note: the `get*` queries are not supported because for reasonable Cypress > tests you need retryability and `find*` queries already support that. `query*` @@ -53,19 +52,17 @@ To show some simple examples (from [cypress/integration/find.spec.js](https://github.com/testing-library/cypress-testing-library/blob/97939da7d4707a71049884c0324c0eda56e26fc2/cypress/integration/find.spec.js)): ```javascript -cy.findByRole('button', { name: /Jackie Chan/i }).click() -cy.findByRole('button', { name: /Button Text/i }).should('exist') -cy.findByRole('button', { name: /Non-existing Button Text/i }).should( - 'not.exist' -) -cy.findByLabelText(/Label text/i, { timeout: 7000 }).should('exist') - -// findAllByText _inside_ a form element +cy.findByRole('button', {name: /Jackie Chan/i}).click() +cy.findByRole('button', {name: /Button Text/i}).should('exist') +cy.findByRole('button', {name: /Non-existing Button Text/i}).should('not.exist') +cy.findByLabelText(/Label text/i, {timeout: 7000}).should('exist') + +// findByRole _inside_ a form element cy.get('form') - .findByText('button', { name: /Button Text/i }) + .findByRole('button', {name: /Button Text/i}) .should('exist') cy.findByRole('dialog').within(() => { - cy.findByRole('button', { name: /confirm/i }) + cy.findByRole('button', {name: /confirm/i}) }) ``` diff --git a/docs/dom-testing-library/api-accessibility.mdx b/docs/dom-testing-library/api-accessibility.mdx index 11e2f2ccd..9b5e4e761 100644 --- a/docs/dom-testing-library/api-accessibility.mdx +++ b/docs/dom-testing-library/api-accessibility.mdx @@ -26,7 +26,7 @@ See for more information about implicit ARIA roles. ```javascript -import { getRoles } from '@testing-library/dom' +import {getRoles} from '@testing-library/dom' const nav = document.createElement('nav') nav.innerHTML = ` @@ -64,7 +64,7 @@ nodes which match that role. This can be helpful for finding ways to query the DOM under test with [getByRole](queries/byrole.mdx). ```javascript -import { logRoles } from '@testing-library/dom' +import {logRoles} from '@testing-library/dom' const nav = document.createElement('nav') nav.innerHTML = ` diff --git a/docs/dom-testing-library/api-async.mdx b/docs/dom-testing-library/api-async.mdx index d9eafdabc..700fbe81d 100644 --- a/docs/dom-testing-library/api-async.mdx +++ b/docs/dom-testing-library/api-async.mdx @@ -22,7 +22,7 @@ accept the waitFor options as the last argument (e.g. DOM might not happen immediately. ```js -const button = screen.getByRole('button', { name: 'Click Me' }) +const button = screen.getByRole('button', {name: 'Click Me'}) fireEvent.click(button) await screen.findByText('Clicked once') fireEvent.click(button) @@ -40,12 +40,14 @@ function waitFor( interval?: number onTimeout?: (error: Error) => Error mutationObserverOptions?: MutationObserverInit - } + }, ): Promise ``` When in need to wait for any period of time you can use `waitFor`, to wait for -your expectations to pass. Here's a simple example: +your expectations to pass. Returning _a falsy condition is not sufficient_ to +trigger a retry, the callback must throw an error in order to retry the +condition. Here's a simple example: ```javascript // ... @@ -55,24 +57,25 @@ await waitFor(() => expect(mockAPI).toHaveBeenCalledTimes(1)) // ... ``` -`waitFor` may run the callback a variable number of times. +`waitFor` may run the callback a number of times until the timeout is reached. +Note that the number of calls is constrained by the `timeout` and `interval` +options. This can be useful if you have a unit test that mocks API calls and you need to wait for your mock promises to all resolve. If you return a promise in the `waitFor` callback (either explicitly or -implicitly with `async` syntax), then the `waitFor` utility will not call your -callback again until that promise rejects. This allows you to `waitFor` things -that must be checked asynchronously. +implicitly with the `async` syntax), then the `waitFor` utility does not call +your callback again until that promise rejects. This allows you to `waitFor` +things that must be checked asynchronously. The default `container` is the global `document`. Make sure the elements you wait for are descendants of `container`. -The default `interval` is `50ms`. However it will run your callback immediately +The default `interval` is `50ms`. However it runs your callback immediately before starting the intervals. -The default `timeout` is `1000ms` which will keep you under -[Jest's default timeout of `5000ms`](https://jestjs.io/docs/en/jest-object.html#jestsettimeouttimeout). +The default `timeout` is `1000ms`. The default `onTimeout` takes the error and appends the `container`'s printed state to the error message which should hopefully make it easier to track down @@ -80,9 +83,9 @@ what caused the timeout. The default `mutationObserverOptions` is `{subtree: true, childList: true, attributes: true, characterData: true}` which -will detect additions and removals of child elements (including text nodes) in -the `container` and any of its descendants. It will also detect attribute -changes. When any of those changes occur, it will re-run the callback. +detects additions and removals of child elements (including text nodes) in the +`container` and any of its descendants. It also detects attribute changes. When +any of those changes occur, it re-runs the callback. ## `waitForElementToBeRemoved` @@ -95,7 +98,7 @@ function waitForElementToBeRemoved( interval?: number onTimeout?: (error: Error) => Error mutationObserverOptions?: MutationObserverInit - } + }, ): Promise ``` @@ -112,7 +115,7 @@ Here is an example where the promise resolves because the element is removed: const el = document.querySelector('div.getOuttaHere') waitForElementToBeRemoved(document.querySelector('div.getOuttaHere')).then(() => - console.log('Element no longer in DOM') + console.log('Element no longer in DOM'), ) el.setAttribute('data-neat', true) @@ -122,183 +125,22 @@ el.parentElement.removeChild(el) // logs 'Element no longer in DOM' ``` -`waitForElementToBeRemoved` will throw an error if the first argument is `null` -or an empty array: +`waitForElementToBeRemoved` throws an error if the first argument is `null` or +an empty array: ```javascript -waitForElementToBeRemoved(null).catch((err) => console.log(err)) -waitForElementToBeRemoved(queryByText(/not here/i)).catch((err) => - console.log(err) +waitForElementToBeRemoved(null).catch(err => console.log(err)) +waitForElementToBeRemoved(queryByText(/not here/i)).catch(err => + console.log(err), ) -waitForElementToBeRemoved(queryAllByText(/not here/i)).catch((err) => - console.log(err) +waitForElementToBeRemoved(queryAllByText(/not here/i)).catch(err => + console.log(err), ) -waitForElementToBeRemoved(() => getByText(/not here/i)).catch((err) => - console.log(err) +waitForElementToBeRemoved(() => getByText(/not here/i)).catch(err => + console.log(err), ) // Error: The element(s) given to waitForElementToBeRemoved are already removed. waitForElementToBeRemoved requires that the element(s) exist(s) before waiting for removal. ``` The options object is forwarded to `waitFor`. - -## Deprecated Methods - -`wait`, `waitForDomChange`, and `waitForElement` have been combined into the -`waitFor` method. - -
- -
- -Deprecated Methods - -### `wait` - -> (DEPRECATED, use waitFor instead) - -```typescript -function wait( - callback: () => void, - options?: { - container?: HTMLElement - timeout?: number - interval?: number - mutationObserverOptions?: MutationObserverInit - } -): Promise -``` - -Previously, wait was a wrapper around wait-for-expect and used polling instead -of a MutationObserver to look for changes. It is now an alias to waitFor and -will be removed in a future release. - -Unlike wait, the callback parameter is mandatory in waitFor. Although you can -migrate an existing `wait()` call to `waitFor( () => {} )`, it is considered bad -practice to use an empty callback because it will make the tests more fragile. - -### `waitForDomChange` - -> (DEPRECATED, use `waitFor` instead) - -```typescript -function waitForDomChange(options?: { - container?: HTMLElement - timeout?: number - mutationObserverOptions?: MutationObserverInit -}): Promise -``` - -When in need to wait for the DOM to change you can use `waitForDomChange`. The -`waitForDomChange` function is a small wrapper around the -[`MutationObserver`](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver). - -Here is an example where the promise will be resolved because the container is -changed: - -```javascript -const container = document.createElement('div') -waitForDomChange({ container }) - .then(() => console.log('DOM changed!')) - .catch((err) => console.log(`Error you need to deal with: ${err}`)) -container.append(document.createElement('p')) -// if 👆 was the only code affecting the container and it was not run, -// waitForDomChange would throw an error -``` - -The promise will resolve with a -[`mutationsList`](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/MutationObserver) -which you can use to determine what kind of a change (or changes) affected the -container - -```javascript -const container = document.createElement('div') -container.setAttribute('data-cool', 'true') -waitForDomChange({ container }).then((mutationsList) => { - const mutation = mutationsList[0] - console.log( - `was cool: ${mutation.oldValue}\ncurrently cool: ${mutation.target.dataset.cool}` - ) -}) -container.setAttribute('data-cool', 'false') -/* - logs: - was cool: true - currently cool: false -*/ -``` - -The default `container` is the global `document`. Make sure the elements you -wait for are descendants of `container`. - -The default `timeout` is `1000ms` which will keep you under -[Jest's default timeout of `5000ms`](https://jestjs.io/docs/en/jest-object.html#jestsettimeouttimeout). - -The default `mutationObserverOptions` is -`{subtree: true, childList: true, attributes: true, characterData: true}` which -will detect additions and removals of child elements (including text nodes) in -the `container` and any of its descendants. It will also detect attribute -changes. - -### `waitForElement` - -> (DEPRECATED, use `find*` queries or `waitFor`) - -```typescript -function waitForElement( - callback: () => T, - options?: { - container?: HTMLElement - timeout?: number - mutationObserverOptions?: MutationObserverInit - } -): Promise -``` - -When in need to wait for DOM elements to appear, disappear, or change you can -use `waitForElement`. The `waitForElement` function is a small wrapper around -the -[`MutationObserver`](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver). - -Here's a simple example: - -```javascript -// ... -// Wait until the callback does not throw an error and returns a truthy value. In this case, that means -// it'll wait until we can get a form control with a label that matches "username". -// Previously, the difference from `wait` is that rather than running your callback on -// an interval, it's run as soon as there are DOM changes in the container -// and returns the value returned by the callback. -const usernameElement = await waitForElement( - () => getByLabelText(container, 'username'), - { container } -) -usernameElement.value = 'chucknorris' -// ... -``` - -You can also wait for multiple elements at once: - -```javascript -const [usernameElement, passwordElement] = await waitForElement( - () => [ - getByLabelText(container, 'username'), - getByLabelText(container, 'password'), - ], - { container } -) -``` - -The default `container` is the global `document`. Make sure the elements you -wait for will be attached to it, or set a different `container`. - -The default `timeout` is `4500ms` which will keep you under -[Jest's default timeout of `5000ms`](https://facebook.github.io/jest/docs/en/jest-object.html#jestsettimeouttimeout). - -The default `mutationObserverOptions` is -`{subtree: true, childList: true, attributes: true, characterData: true}` which -will detect additions and removals of child elements (including text nodes) in -the `container` and any of its descendants. It will also detect attribute -changes. - -
diff --git a/docs/dom-testing-library/api-configuration.mdx b/docs/dom-testing-library/api-configuration.mdx index 7d772dff2..72dd2e196 100644 --- a/docs/dom-testing-library/api-configuration.mdx +++ b/docs/dom-testing-library/api-configuration.mdx @@ -21,19 +21,26 @@ The library can be configured via the `configure` function, which accepts: > Framework-specific wrappers like React Testing Library may add more options to > the ones shown below. - + ```js title="setup-tests.js" -import { configure } from '@testing-library/dom' +import {configure} from '@testing-library/dom' import serialize from 'my-custom-dom-serializer' configure({ testIdAttribute: 'data-my-test-id', getElementError: (message, container) => { const customMessage = [message, serialize(container.firstChild)].join( - '\n\n' + '\n\n', ) return new Error(customMessage) }, @@ -44,18 +51,31 @@ configure({ ```js title="setup-tests.js" -import { configure } from '@testing-library/react' +import {configure} from '@testing-library/react' -configure({ testIdAttribute: 'data-my-test-id' }) +configure({testIdAttribute: 'data-my-test-id'}) +``` + + + + +```ts title="setup-tests.ts" +import {configure} from '@testing-library/angular' + +configure({ + dom: { + testIdAttribute: 'data-my-test-id', + }, +}) ``` ```js title="setup-tests.js" -import { configure } from '@testing-library/cypress' +import {configure} from '@testing-library/cypress' -configure({ testIdAttribute: 'data-my-test-id' }) +configure({testIdAttribute: 'data-my-test-id'}) ``` @@ -70,37 +90,76 @@ second argument. If you're using testing-library in a browser you almost always want to set this to `true`. Only very old browser don't support this property (such as IE 8 and earlier). However, `jsdom` does not support the second argument currently. This includes versions of `jsdom` prior to `16.4.0` and any -version that logs a `not implemented` warning when calling `getComputedStyle` +version that logs a `not implemented` warning when calling +[`getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) with a second argument e.g. `window.getComputedStyle(document.createElement('div'), '::after')`. Defaults to `false` ### `defaultHidden` -The default value for the `hidden` option used by +The default value for the [`hidden` option](queries/byrole#hidden) used by [`getByRole`](queries/byrole.mdx). Defaults to `false`. +### `defaultIgnore` + +The default value for the [`ignore` option](queries/bytext.mdx#ignore) used by +[`getByText`](queries/bytext.mdx). Also determines the nodes that are being +ignored when errors are printed. + +Defaults to `script, style`. + ### `showOriginalStackTrace` -By default, `waitFor` will ensure that the stack trace for errors thrown by -Testing Library is cleaned up and shortened so it's easier for you to identify -the part of your code that resulted in the error (async stack traces are hard to -debug). If you want to disable this, then set`showOriginalStackTrace` to -`false`. You can also disable this for a specific call in the options you pass -to `waitFor`. +By default, [`waitFor`](api-async#waitfor) will ensure that the stack trace for +errors thrown by Testing Library is cleaned up and shortened so it's easier for +you to identify the part of your code that resulted in the error (async stack +traces are hard to debug). If you want to disable this, then +set`showOriginalStackTrace` to `false`. You can also disable this for a specific +call in the options you pass to `waitFor`. ### `throwSuggestions` (experimental) -When enabled, if [better queries](queries/about.mdx#priority) are available the -test will fail and provide a suggested query to use instead. Default to `false`. +When enabled, if [better queries](queries/about.mdx#priority) are available, the +test will fail and provide a suggested query to use instead. Defaults to +`false`. To disable a suggestion for a single query just add `{suggest:false}` as an option. ```js -screen.getByTestId('foo', { suggest: false }) // will not throw a suggestion +screen.getByTestId('foo', {suggest: false}) // will not throw a suggestion ``` +:::note + +When this option is enabled, it may provide suggestions that lack an intuitive +implementation. Typically this happens for +[roles which cannot be named](https://w3c.github.io/aria/#namefromprohibited), +most notably paragraphs. For instance, if you attempt to use +[`getByText`](queries/bytext.mdx), you may encounter the following error: + +``` +TestingLibraryElementError: A better query is available, try this: + getByRole('paragraph') +``` + +However, there is no direct way to query paragraphs using the config object +parameter, such as in `getByRole('paragraph', { name: 'Hello World' })`. + +To address this issue, you can leverage a custom function to validate the +element's structure, as shown in the example below. More information can be +found in the +[GitHub issue](https://github.com/testing-library/dom-testing-library/issues/1306) + +```js +getByRole('paragraph', { + name: (_, element) => element.textContent === 'Hello world', +}) +``` + +::: + ### `testIdAttribute` The attribute used by [`getByTestId`](queries/bytestid.mdx) and related queries. @@ -114,5 +173,5 @@ message and container object as arguments. ### `asyncUtilTimeout` -The global timeout value in milliseconds used by `waitFor` utilities. Defaults -to 1000ms. +The global timeout value in milliseconds used by [`waitFor`](api-async#waitfor) +utilities. Defaults to 1000ms. diff --git a/docs/dom-testing-library/api-custom-queries.mdx b/docs/dom-testing-library/api-custom-queries.mdx index 0fdad0b6f..8147ead50 100644 --- a/docs/dom-testing-library/api-custom-queries.mdx +++ b/docs/dom-testing-library/api-custom-queries.mdx @@ -3,9 +3,6 @@ id: api-custom-queries title: Custom Queries --- -import Tabs from '@theme/Tabs' -import TabItem from '@theme/TabItem' - `DOM Testing Library` exposes many of the helper functions that are used to implement the default queries. You can use the helpers to build custom queries. For example, the code below shows a way to override the default `testId` queries @@ -21,18 +18,17 @@ to use a different data-attribute. (Note: test files would import > Custom queries are different than > [custom render](react-testing-library/setup.mdx#custom-render) methods. -```js -// test-utils.js +```js title="test-utils.js" const domTestingLib = require('@testing-library/dom') -const { queryHelpers } = domTestingLib +const {queryHelpers} = domTestingLib export const queryByTestId = queryHelpers.queryByAttribute.bind( null, - 'data-test-id' + 'data-test-id', ) export const queryAllByTestId = queryHelpers.queryAllByAttribute.bind( null, - 'data-test-id' + 'data-test-id', ) export function getAllByTestId(container, id, ...rest) { @@ -40,18 +36,22 @@ export function getAllByTestId(container, id, ...rest) { if (!els.length) { throw queryHelpers.getElementError( `Unable to find an element by: [data-test-id="${id}"]`, - container + container, ) } return els } -export function getByTestId(...args) { - const result = getAllByTestId(...args) - if (result.length > 0) { - return result[0] +export function getByTestId(container, id, ...rest) { + // result >= 1 + const result = getAllByTestId(container, id, ...rest) + if (result.length > 1) { + throw queryHelpers.getElementError( + `Found multiple elements with the [data-test-id="${id}"]`, + container, + ) } - return null + return result[0] } // re-export with overrides diff --git a/docs/dom-testing-library/api-debugging.mdx b/docs/dom-testing-library/api-debugging.mdx index b68e5c1bb..492542440 100644 --- a/docs/dom-testing-library/api-debugging.mdx +++ b/docs/dom-testing-library/api-debugging.mdx @@ -5,8 +5,8 @@ title: Debugging ## Automatic Logging -When you use any `get` calls in your test cases, the current state of the -`container` (DOM) gets printed on the console. For example: +When any `get` or `find` calls you use in your test cases fail, the current +state of the `container` (DOM) gets printed on the console. For example: ```javascript //
Hello world
@@ -26,13 +26,13 @@ Here is the state of your container: ``` -Note: Since the DOM size can get really large, you can set the limit of DOM +**Note**: Since the DOM size can get really large, you can set the limit of DOM content to be printed via environment variable `DEBUG_PRINT_LIMIT`. The default value is `7000`. You will see `...` in the console, when the DOM content is stripped off, because of the length you have set or due to default size limit. Here's how you might increase this limit when running tests: -``` +```bash npm2yarn DEBUG_PRINT_LIMIT=10000 npm test ``` @@ -40,33 +40,58 @@ This works on macOS/Linux, you'll need to do something else for Windows. If you'd like a solution that works for both, see [`cross-env`](https://www.npmjs.com/package/cross-env). +**Note**: The output of the DOM is colorized by default if your tests are +running in a node environment. However, you may sometimes want to turn off +colors, such as in cases where the output is written to a log file for debugging +purposes. You can use the environment variable `COLORS` to explicitly force the +colorization off or on. For example: + +```bash npm2yarn +COLORS=false npm test +``` + +This works on macOS/Linux, you'll need to do something else for Windows. If +you'd like a solution that works for both, see +[`cross-env`](https://www.npmjs.com/package/cross-env). + ## `prettyDOM` Built on top of -[`pretty-format`](https://github.com/facebook/jest/tree/master/packages/pretty-format), +[`pretty-format`](https://github.com/jestjs/jest/tree/main/packages/pretty-format), this helper function can be used to print out readable representation of the DOM tree of a node. This can be helpful for instance when debugging tests. It is defined as: ```typescript +interface Options extends prettyFormat.OptionsReceived { + filterNode?: (node: Node) => boolean +} + function prettyDOM( node: HTMLElement, maxLength?: number, - options?: Options + options?: Options, ): string ``` It receives the root node to print out, an optional extra parameter to limit the size of the resulting string, for cases when it becomes too large. It has a last -parameter which allows you to configure your formatting as defined in the -[options](https://github.com/facebook/jest/tree/master/packages/pretty-format#usage-with-options) +parameter which allows you to configure your formatting. In addition to the +options listed you can also pass the +[options](https://github.com/jestjs/jest/tree/main/packages/pretty-format#usage-with-options) of `pretty-format`. +By default, ` - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/static/img/users/ifood.png b/static/img/users/ifood.png index ffcd582fd..b1c8531e9 100644 Binary files a/static/img/users/ifood.png and b/static/img/users/ifood.png differ diff --git a/static/img/users/infojobs.svg b/static/img/users/infojobs.svg index 7109d42f2..aa7b8bed8 100644 --- a/static/img/users/infojobs.svg +++ b/static/img/users/infojobs.svg @@ -1,57 +1 @@ - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/static/img/users/sui.svg b/static/img/users/sui.svg index db9848d9b..46ab850d1 100644 --- a/static/img/users/sui.svg +++ b/static/img/users/sui.svg @@ -1,11 +1 @@ - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/static/img/users/sunhat.svg b/static/img/users/sunhat.svg new file mode 100644 index 000000000..c7fa7a91a --- /dev/null +++ b/static/img/users/sunhat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/users/zup.png b/static/img/users/zup.png index 34b85d6bf..132b5a235 100644 Binary files a/static/img/users/zup.png and b/static/img/users/zup.png differ