diff --git a/.all-contributorsrc b/.all-contributorsrc index a0524bde2..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" ] }, { @@ -628,7 +629,8 @@ "avatar_url": "https://avatars2.githubusercontent.com/u/12711091?v=4", "profile": "https://twitter.com/matan_bobi", "contributions": [ - "doc" + "doc", + "code" ] }, { @@ -1037,6 +1039,1767 @@ "contributions": [ "doc" ] + }, + { + "login": "jesujcastillom", + "name": "Jesu Castillo", + "avatar_url": "https://avatars3.githubusercontent.com/u/7827281?v=4", + "profile": "https://github.com/jesujcastillom", + "contributions": [ + "doc" + ] + }, + { + "login": "corehtml5canvas", + "name": "Core HTML5 Canvas, the book", + "avatar_url": "https://avatars1.githubusercontent.com/u/1553693?v=4", + "profile": "http://gearysite.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "johnste", + "name": "John Sterling", + "avatar_url": "https://avatars3.githubusercontent.com/u/886051?v=4", + "profile": "https://github.com/johnste", + "contributions": [ + "doc" + ] + }, + { + "login": "velusgautam", + "name": "Velu S Gautam", + "avatar_url": "https://avatars3.githubusercontent.com/u/8556085?v=4", + "profile": "http://www.velusgautam.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "RichardBray", + "name": "Richard Oliver Bray", + "avatar_url": "https://avatars2.githubusercontent.com/u/1377253?v=4", + "profile": "https://www.youtube.com/c/RichardBray", + "contributions": [ + "doc" + ] + }, + { + "login": "cncolder", + "name": "Yanlin Jiang", + "avatar_url": "https://avatars3.githubusercontent.com/u/127009?v=4", + "profile": "https://github.com/cncolder", + "contributions": [ + "doc" + ] + }, + { + "login": "lidoravitan", + "name": "Lidor Avitan", + "avatar_url": "https://avatars0.githubusercontent.com/u/35113398?v=4", + "profile": "https://github.com/lidoravitan", + "contributions": [ + "doc" + ] + }, + { + "login": "ITenthusiasm", + "name": "Isaiah Thomason", + "avatar_url": "https://avatars0.githubusercontent.com/u/47364027?v=4", + "profile": "https://github.com/ITenthusiasm", + "contributions": [ + "doc" + ] + }, + { + "login": "denis", + "name": "Denis Barushev", + "avatar_url": "https://avatars3.githubusercontent.com/u/805?v=4", + "profile": "http://barushev.net/", + "contributions": [ + "doc" + ] + }, + { + "login": "domasx2", + "name": "Domas", + "avatar_url": "https://avatars1.githubusercontent.com/u/847684?v=4", + "profile": "https://github.com/domasx2", + "contributions": [ + "doc" + ] + }, + { + "login": "AntonNiklasson", + "name": "Anton Niklasson", + "avatar_url": "https://avatars0.githubusercontent.com/u/785676?v=4", + "profile": "http://www.antn.se/", + "contributions": [ + "doc" + ] + }, + { + "login": "nick722", + "name": "Nikolai Yakuschenko", + "avatar_url": "https://avatars3.githubusercontent.com/u/31370625?v=4", + "profile": "https://github.com/nick722", + "contributions": [ + "doc" + ] + }, + { + "login": "vier31", + "name": "Jan Schröder", + "avatar_url": "https://avatars1.githubusercontent.com/u/34372068?v=4", + "profile": "https://github.com/vier31", + "contributions": [ + "doc" + ] + }, + { + "login": "nickmccurdy", + "name": "Nick McCurdy", + "avatar_url": "https://avatars0.githubusercontent.com/u/927220?v=4", + "profile": "https://nickmccurdy.com/", + "contributions": [ + "doc", + "review", + "code" + ] + }, + { + "login": "tsuki42", + "name": "Sudhanshu", + "avatar_url": "https://avatars2.githubusercontent.com/u/22864071?v=4", + "profile": "http://sudhanshu-ranjan.tech/", + "contributions": [ + "doc" + ] + }, + { + "login": "aleks-rope", + "name": "Aleksandr Chernov", + "avatar_url": "https://avatars0.githubusercontent.com/u/58922379?v=4", + "profile": "http://newrope.biz/", + "contributions": [ + "doc" + ] + }, + { + "login": "mathiassoeholm", + "name": "Mathias", + "avatar_url": "https://avatars0.githubusercontent.com/u/1747242?v=4", + "profile": "https://github.com/mathiassoeholm", + "contributions": [ + "doc" + ] + }, + { + "login": "davidseow", + "name": "davidseow", + "avatar_url": "https://avatars1.githubusercontent.com/u/502503?v=4", + "profile": "https://github.com/davidseow", + "contributions": [ + "doc" + ] + }, + { + "login": "tonyhallett", + "name": "Tony Hallett", + "avatar_url": "https://avatars2.githubusercontent.com/u/11292998?v=4", + "profile": "https://github.com/tonyhallett", + "contributions": [ + "doc" + ] + }, + { + "login": "prsdta", + "name": "prsdta", + "avatar_url": "https://avatars3.githubusercontent.com/u/19373361?v=4", + "profile": "https://github.com/prsdta", + "contributions": [ + "doc" + ] + }, + { + "login": "tal-joffe", + "name": "tal-joffe", + "avatar_url": "https://avatars0.githubusercontent.com/u/7221753?v=4", + "profile": "https://github.com/tal-joffe", + "contributions": [ + "doc" + ] + }, + { + "login": "mayank23", + "name": "Mayank Jethva", + "avatar_url": "https://avatars.githubusercontent.com/u/1103708?v=4", + "profile": "http://mayankjethva.xyz/", + "contributions": [ + "doc" + ] + }, + { + "login": "EladIsraeli", + "name": "Elad Israeli", + "avatar_url": "https://avatars.githubusercontent.com/u/13487086?v=4", + "profile": "https://github.com/EladIsraeli", + "contributions": [ + "doc" + ] + }, + { + "login": "chartrandf", + "name": "Francis Chartrand", + "avatar_url": "https://avatars.githubusercontent.com/u/1503758?v=4", + "profile": "https://francischartrand.com/", + "contributions": [ + "doc" + ] + }, + { + "login": "prestoncarman", + "name": "Preston Carman", + "avatar_url": "https://avatars.githubusercontent.com/u/3517157?v=4", + "profile": "https://github.com/prestoncarman", + "contributions": [ + "doc" + ] + }, + { + "login": "olivierwilkinson", + "name": "Olivier Wilkinson", + "avatar_url": "https://avatars.githubusercontent.com/u/15321261?v=4", + "profile": "https://github.com/olivierwilkinson", + "contributions": [ + "doc" + ] + }, + { + "login": "amitmiran137", + "name": "Amit Miran", + "avatar_url": "https://avatars.githubusercontent.com/u/47772523?v=4", + "profile": "https://github.com/amitmiran137", + "contributions": [ + "doc" + ] + }, + { + "login": "gangsthub", + "name": "Paul Melero", + "avatar_url": "https://avatars.githubusercontent.com/u/6775220?v=4", + "profile": "https://graficos.net/", + "contributions": [ + "doc" + ] + }, + { + "login": "modosc", + "name": "jonathan schatz", + "avatar_url": "https://avatars.githubusercontent.com/u/2231664?v=4", + "profile": "https://modo.sc/", + "contributions": [ + "doc" + ] + }, + { + "login": "rickysullivan", + "name": "Ricky Sullivan Himself", + "avatar_url": "https://avatars.githubusercontent.com/u/437480?v=4", + "profile": "https://github.com/rickysullivan", + "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, @@ -1044,5 +2807,6 @@ "projectOwner": "testing-library", "repoType": "github", "repoHost": "https://github.com/", - "skipCi": true + "skipCi": true, + "commitType": "docs" } diff --git a/.dockerignore b/.dockerignore deleted file mode 100755 index 27d2dae2b..000000000 --- a/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -*/node_modules -*.log 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/.gitignore b/.gitignore index d600b8924..5c447595b 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea .DS_Store node_modules @@ -5,10 +6,12 @@ node_modules lib/core/metadata.js lib/core/MetadataBlog.js -website/translated_docs -website/build/ -website/i18n/* +translated_docs +build/ +i18n/* +.docusaurus +.cache-loader *.log -.idea +yarn.lock 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/markdown.code-snippets b/.vscode/markdown.code-snippets index 8df3257d7..bed57a2f8 100644 --- a/.vscode/markdown.code-snippets +++ b/.vscode/markdown.code-snippets @@ -1,53 +1,47 @@ { - // Place your testing-library-docs workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and - // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope - // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is - // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: - // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. - // Placeholders with the same ids are connected. - // Example: - // "Print to console": { - // "scope": "javascript,typescript", - // "prefix": "log", - // "body": [ - // "console.log('$1');", - // "$2" - // ], - // "description": "Log output to console" - // }, - "Multilanguage Code Block": { - "scope": "markdown", - "prefix": "docblock", - "body": [ - "```html", - "$4", - "```", - "", - "", - "", - "", - "```js", - "import { $1 } from '@testing-library/dom'", - "", - "const container = document.body", - "const $3 = $1(container, '$2')", - "```", - "", - "", - "```js", - "import { render } from '@testing-library/react'", - "", - "const { $1 } = render()", - "const $3 = $1('$2')", - "```", - "", - "", - "```js", - "cy.$1('$2').should('exist')", - "```", - "", - "" - ], - "description": "Create a Docusaurus multi-language code block" - } -} \ No newline at end of file + "MDX title": { + "prefix": "mdxtitle", + "body": ["---", "id: $1", "title: $2", "sidebar_label: $3", "---"], + "description": "MDX file titles" + }, + "MDX Multilingual Tabs": { + "prefix": "mdxtabs", + "body": [ + "", + "import Tabs from '@theme/Tabs';", + "import TabItem from '@theme/TabItem';", + "", + " ", + " ", + "", + " ```js", + " $1", + " ```", + "", + " ", + " ", + "", + " ```jsx", + " $2", + " ```", + "", + " ", + " ", + "", + " ```js", + " $3", + " ```", + "", + " ", + " ", + "" + ], + "description": "MDX multilingual tabs" + } +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 7a17ef2a4..176df8375 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +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/Dockerfile b/Dockerfile deleted file mode 100755 index 20d59aadf..000000000 --- a/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM node:8.11.4 - -WORKDIR /app/website - -EXPOSE 3000 35729 -COPY ./docs /app/docs -COPY ./website /app/website -RUN npm install - -CMD ["npm", "start"] diff --git a/README.md b/README.md index 327b57c9d..4ffd940f5 100644 --- a/README.md +++ b/README.md @@ -1,16 +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) - -See [./website/README.md](./website/README.md) for instructions on building the site +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** @@ -18,174 +17,532 @@ See [./website/README.md](./website/README.md) for instructions on building the [![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). + +# What's In This Document + +- [Get Started in 5 Minutes](#get-started-in-5-minutes) +- [Editing Content](#editing-content) +- [Adding Content](#adding-content) + +# Get Started in 5 Minutes + +1. Make sure all the dependencies for the website are installed: + +```sh +# Install dependencies +$ npm install +``` + +2. Run your dev server: + +```sh +# Start the site +$ npm start +``` + +# Editing Content + +## Editing an existing docs page + +Edit docs by navigating to `docs/` and editing the corresponding document: + +`docs/doc-to-be-edited.mdx` + +```markdown +--- +id: page-needs-edit +title: This Doc Needs To Be Edited +--- + +Edit me... +``` + +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: + +`blog/post-to-be-edited.mdx` + +```markdown +--- +id: post-needs-edit +title: This Blog Post Needs To Be Edited +--- + +Edit me... +``` + +For more information about blog posts, click +[here](https://v2.docusaurus.io/docs/blog) + +# Adding Content + +## Adding a new docs page to an existing sidebar + +1. Create the doc as a new markdown file in `/docs`, example + `docs/newly-created-doc.mdx`: + +```md +--- +id: newly-created-doc +title: This Doc Needs To Be Edited +--- + +My new content here.. +``` + +Note: Ensure the file name and the id value do not include non-url safe +characters i.e. '\*'. + +2. Refer to that doc's ID in an existing sidebar in `sidebar.json`: + +```javascript +// Add newly-created-doc to the Getting Started category of docs +{ + "docs": { + "Getting Started": [ + "quick-start", + "newly-created-doc" // new doc here + ], + ... + }, + ... +} +``` + +For more information about adding new docs, click +[here](https://v2.docusaurus.io/docs/) ## 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

📖
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

📖
- + + -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/website/blog/2018-12-29-new-site.md b/blog/2018-12-29-new-site.mdx similarity index 79% rename from website/blog/2018-12-29-new-site.md rename to blog/2018-12-29-new-site.mdx index cd3652a16..592607164 100755 --- a/website/blog/2018-12-29-new-site.md +++ b/blog/2018-12-29-new-site.mdx @@ -1,7 +1,7 @@ --- title: New Site author: Alex Krolick -authorURL: http://github.com/alexkrolick +authorURL: 'http://github.com/alexkrolick' --- We have a docs site now! It's built with [Docusaurus](https://docusaurus.io). @@ -20,6 +20,6 @@ beyond! 🎉 Happy new year! -[dtl]: / -[rtl]: /react -[ctl]: /cypress +[dtl]: /docs/dom-testing-library/intro +[rtl]: /docs/react-testing-library/intro +[ctl]: /docs/cypress-testing-library/intro diff --git a/website/blog/2019-03-17-code-blocks.md b/blog/2019-03-17-code-blocks.mdx similarity index 92% rename from website/blog/2019-03-17-code-blocks.md rename to blog/2019-03-17-code-blocks.mdx index 49b0c45b1..b17d70ea2 100755 --- a/website/blog/2019-03-17-code-blocks.md +++ 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/website/blog/2019-04-25-new-org.md b/blog/2019-04-25-new-org.mdx similarity index 85% rename from website/blog/2019-04-25-new-org.md rename to blog/2019-04-25-new-org.mdx index 4bb3838d0..b0e09c200 100644 --- a/website/blog/2019-04-25-new-org.md +++ 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" +# prettier doesn't like how long this line is.: "" +# prettier-ignore: "" +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 @@ -35,8 +37,7 @@ just disable it here --> We hope that this helps you catch bugs better! @@ -122,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.md) +> [Contribute to the learning materials page](https://github.com/testing-library/testing-library-docs/edit/main/docs/learning.mdx) ## Other Exciting news @@ -178,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/docker-compose.yml b/docker-compose.yml deleted file mode 100755 index 6711192ae..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - docusaurus: - build: . - ports: - - 3000:3000 - - 35729:35729 - volumes: - - ./docs:/app/docs - - ./website/blog:/app/website/blog - - ./website/core:/app/website/core - - ./website/i18n:/app/website/i18n - - ./website/pages:/app/website/pages - - ./website/static:/app/website/static - - ./website/sidebars.json:/app/website/sidebars.json - - ./website/siteConfig.js:/app/website/siteConfig.js - working_dir: /app/website diff --git a/docs/angular-testing-library/api.md b/docs/angular-testing-library/api.md deleted file mode 100644 index 3f65ad3f6..000000000 --- a/docs/angular-testing-library/api.md +++ /dev/null @@ -1,403 +0,0 @@ ---- -id: api -title: API -sidebar_label: API ---- - -`Angular Testing Library` re-exports everything from `DOM Testing Library` as -well as these methods: - -- [`render`](<(#render)>) - -Some of the `DOM Testing Library` re-exports are patched to work easier with -Angular: - -- The events on `fireEvent` automatically invoke a change detection cycle after - the event has been fired -- The `findBy` queries automatically invoke a change detection cycle before the - query is invoked function -- The `waitFor` functions automatically invoke a change detection cycle before - invoking the callback function - -## `render` - -```typescript -async function render( - component: Type, - renderOptions?: RenderComponentOptions -): Promise> -async function render( - component: Type, - renderOptions?: RenderDirectiveOptions -): Promise> -``` - -## Component RenderOptions - -### `componentProperties` - -An object to set `@Input` and `@Output` properties of the component. - -**default** : `{}` - -**example**: - -```typescript -const component = await render(AppComponent, { - componentProperties: { - counterValue: 10, - send: (value) => { ... } - } -}) -``` - -### `componentProviders` - -A collection of providers to inject dependencies of the component. - -For more info see the -[Angular docs](https://angular.io/api/core/Directive#providers). - -**default** : `[]` - -**example**: - -```typescript -const component = await render(AppComponent, { - componentProviders: [AppComponentService], -}) -``` - -### `declarations` - -A collection of providers needed to render the component via Dependency -Injection, for example, injectable services or tokens. - -For more info see the -[Angular docs](https://angular.io/api/core/NgModule#providers). - -**default** : `[]` - -**example**: - -```typescript -const component = await render(AppComponent, { - providers: [ - CustomersService, - { - provide: MAX_CUSTOMERS_TOKEN, - useValue: 10, - }, - ], -}) -``` - -### `detectChanges` - -Will call `detectChanges` when the component is compiled - -**default** : `true` - -**example**: - -```typescript -const component = await render(AppComponent, { detectChanges: 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. - -**default** : `false` - -**example**: - -```typescript -const component = await render(AppComponent, { - imports: [AppModule], // a module that includes AppComponent - excludeComponentDeclaration: true, -}) -``` - -### `imports` - -A collection of imports needed to render the component, for example, shared -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). - -**default** : `[NoopAnimationsModule]` - -**example**: - -```typescript -const component = await render(AppComponent, { - imports: [AppSharedModule, MaterialModule], -}) -``` - -### `queries` - -Queries to bind. Overrides the default set from DOM Testing Library unless -merged. - -**default** : `undefined` - -**example**: - -```typescript -const component = await render(AppComponent, { - queries: { ...queries, ...customQueries }, -}) -``` - -### `routes` - -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). - -**default** : `[]` - -**example**: - -```typescript -const component = await render(AppComponent, { - declarations: [ChildComponent], - routes: [ - { - path: '', - children: [ - { - path: 'child/:id', - component: ChildComponent, - }, - ], - }, - ], -}) -``` - -### `schemas` - -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). - -**default** : `[]` - -**example**: - -```typescript -const component = await render(AppComponent, { - schemas: [NO_ERRORS_SCHEMA], -}) -``` - -### `removeAngularAttributes` - -Removes the Angular attributes (ng-version, and root-id) from the fixture. - -**default** : `false` - -**example**: - -```typescript -const component = await render(AppComponent, { - removeAngularAttributes: true, -}) -``` - -## 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: - -### `template` - -The template to render the directive. - -**example**: - -```typescript -const component = await render(SpoilerDirective, { - template: `
`, -}) -``` - -### `wrapper` - -An Angular component to wrap the directive in. - -**default**: `WrapperComponent` , an empty component that strips the -`ng-version` attribute. - -**example**: - -```typescript -const component = await render(SpoilerDirective, { - template: `
` - wrapper: CustomWrapperComponent -}) -``` - -## `RenderResult` - -### `container` - -The containing DOM node of your rendered Angular Component. This is a regular -DOM node, so you can call `container.querySelector` etc. to inspect the -children. - -### `debug` - -Prints out the component's DOM with syntax highlighting. Accepts an optional -parameter, to print out a specific DOM node. - -```typescript -const component = await render(AppComponent) - -component.debug() -component.debug(component.getByRole('alert')) -``` - -### `rerender` - -Re-render the same component with different props. Will call `detectChanges` -after props has been updated. - -```typescript -const component = await render(Counter, { componentProperties: { count: 4 } }) - -expect(component.getByTestId('count-value').textContent).toBe('4') - -component.rerender({ count: 7 }) -expect(component.getByTestId('count-value').textContent).toBe('7') -``` - -### `fireEvent.***` - -The `fireEvents` re-exported from -[DOM Testing Library](https://testing-library.com/docs/dom-testing-library) that -are automatically bound to the Angular Component. This to ensure that the -Angular change detection has been run by invoking `detectChanges` after an event -has been fired. - -See -[Firing Events](https://testing-library.com/docs/dom-testing-library/api-events) -for a complete list. - -**example**: - -```typescript -const component = await render(AppComponent) - -component.change(component.getByLabelText('Username'), { - target: { - value: 'Tim', - }, -}) -component.click(component.getByText('Login')) -``` - -### `debugElement` - -The Angular `DebugElement` of the component. - -For more info see the [Angular docs](https://angular.io/api/core/DebugElement). - -### `fixture` - -The Angular `ComponentFixture` of the component. - -For more info see the -[Angular docs](https://angular.io/api/core/testing/ComponentFixture). - -```typescript -const component = await render(AppComponent) - -const componentInstance = component.fixture.componentInstance as AppComponent -``` - -> 🚨 If you find yourself using `fixture` to access the component's internal -> values you should reconsider! This probable means, you're testing -> implementation details. - -### `navigate` - -Accepts a DOM element or a path as parameter. If an element is passed, -`navigate` will navigate to the `href` value of the element. If a path is -passed, `navigate` will navigate to the path. - -```typescript -const component = await render(AppComponent, { - routes: [...] -}) - -await component.navigate(component.getByLabelText('To details')) -await component.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. - -See [Queries](https://testing-library.com/docs/dom-testing-library/api-queries) -for a complete list. - -**example**: - -```typescript -const component = await render(AppComponent) - -component.getByText('Hello world') -component.queryByLabelText('First name:') -``` - -### `selectOptions` - -Select an option(s) from a select field with the same interactions as the user -would do. - -```typescript -const component = await render(AppComponent) - -component.selectOptions(component.getByLabelText('Fruit'), 'Blueberry') -component.selectOptions(component.getByLabelText('Fruit'), ['Blueberry'. 'Grape']) -``` - -### `type` - -Types a value in an input field with the same interactions as the user would do. - -```typescript -const component = await render(AppComponent) - -component.type(component.getByLabelText('Username'), 'Tim') -component.type(component.getByLabelText('Username'), 'Tim', { delay: 250 }) -``` - -### `waitFor` - -When in need to wait for any period of time you can use waitFor, to wait for -your expectations to pass. For more info see the -[DOM Testing Library docs](https://testing-library.com/docs/dom-testing-library/api-async#waitFor). - -This function will also call `detectChanges` repeatably to update the DOM, which -is helpful to test async functionalities. - -### `waitForElementToBeRemoved` - -Wait for the removal of element(s) from the DOM. For more info see the -[DOM Testing Library docs](https://testing-library.com/docs/dom-testing-library/api-async#waitforelementtoberemoved). - -This function will also call `detectChanges` repeatably to update the DOM, which -is helpful to test async functionalities. diff --git a/docs/angular-testing-library/api.mdx b/docs/angular-testing-library/api.mdx new file mode 100644 index 000000000..a5ba65c4b --- /dev/null +++ b/docs/angular-testing-library/api.mdx @@ -0,0 +1,654 @@ +--- +id: api +title: API +--- + +`Angular Testing Library` re-exports everything from `DOM Testing Library` as +well as the `render` method. + +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 +- The `findBy` queries automatically invoke a change detection cycle before the + query is invoked function +- The `waitFor` functions automatically invoke a change detection cycle before + invoking the callback function + +## `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 +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, +): Promise> +export async function render( + template: string, + renderOptions?: RenderTemplateOptions, +): Promise> +``` + +## Component RenderOptions + + +### `inputs` + +An object to set `@Input` or `input()` properties of the component. + +**default** : `{}` + +```typescript +await render(AppComponent, { + inputs: { + counterValue: 10, + // 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 + } +}) +``` + +### `bindings` + +An array of bindings to apply to the component using Angular's native bindings API. This provides a more direct way to bind inputs and outputs compared to the `inputs` and `on` options. The bindings API uses Angular's `inputBinding`, `outputBinding`, and `twoWayBinding` functions from `@angular/core`. + +**default** : `[]` + +```typescript +import { inputBinding, outputBinding, twoWayBinding, signal } from '@angular/core' + +await render(AppComponent, { + bindings: [ + // Bind a static input value + inputBinding('greeting', () => 'Hello'), + + // Bind a signal as an input + inputBinding('age', () => 25), + + // Two-way binding with a signal + twoWayBinding('name', signal('John')), + + // Output binding with a callback + outputBinding('submitValue', (event) => console.log(event)), + ], +}) +``` + +**Using signals for reactive updates**: + +```typescript +const greetingSignal = signal('Good day') +const nameSignal = signal('David') +const ageSignal = signal(35) + +const { fixture } = await render(AppComponent, { + bindings: [ + inputBinding('greeting', greetingSignal), + inputBinding('age', ageSignal), + twoWayBinding('name', nameSignal), + ], +}) + +// Update signals externally +greetingSignal.set('Good evening') +``` + +**Handling outputs**: + +```typescript +const submitHandler = jest.fn() + +await render(AppComponent, { + bindings: [ + outputBinding('submit', submitHandler), + ], +}) +``` + +### `declarations` + +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.dev/guide/ngmodules/overview#declarations). + +**default** : `[]` + +**example**: + +```typescript +await render(AppComponent, { + declarations: [CustomerDetailComponent, ButtonComponent], +}) +``` + +### `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. + +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.dev/guide/di/hierarchical-dependency-injection#example-providing-services-in-component). + +**default** : `[]` + +**example**: + +```typescript +await render(AppComponent, { + 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: [ + { + component: ChildOfAppComponent, + providers: [{provide: ChildService, useValue: {hello: 'world'}}], + }, + ], +}) +``` + +### `detectChangesOnRender` + +Invokes `detectChanges` after the component is rendered. + +**default** : `true` + +**example**: + +```typescript +await render(AppComponent, {detectChangesOnRender: false}) +``` + +### `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, { + 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, for example with +SCAMs. + +**default** : `false` + +**example**: + +```typescript +await render(AppComponent, { + imports: [AppModule], // a module that includes AppComponent + excludeComponentDeclaration: true, +}) +``` + +### `imports` + +A collection of imports needed to render the component, for example, shared +modules. Adds `NoopAnimationsModule` by default if `BrowserAnimationsModule` +isn't added to the collection + +For more info see the +[Angular docs](https://angular.dev/guide/components#imports-in-the-component-decorator). + +**default** : `[NoopAnimationsModule]` + +**example**: + +```typescript +await render(AppComponent, { + imports: [AppSharedModule, MaterialModule], +}) +``` + +### `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 +merged. + +**default** : `undefined` + +**example**: + +```typescript +await render(AppComponent, { + queries: {...queries, ...customQueries}, +}) +``` + +### `routes` + +The route configuration to set up the router service via +`RouterTestingModule.withRoutes`. For more info see the +[Angular Routes docs](https://angular.dev/api/router/Routes). + +**default** : `[]` + +**example**: + +```typescript +await render(AppComponent, { + declarations: [ChildComponent], + routes: [ + { + path: '', + children: [ + { + path: 'child/:id', + component: ChildComponent, + }, + ], + }, + ], +}) +``` + +### `schemas` + +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.dev/guide/components/advanced-configuration#custom-element-schemas). + +**default** : `[]` + +**example**: + +```typescript +await render(AppComponent, { + schemas: [NO_ERRORS_SCHEMA], +}) +``` + +### `removeAngularAttributes` + +Removes the Angular attributes (ng-version, and root-id) from the fixture. + +**default** : `false` + +**example**: + +```typescript +await render(AppComponent, { + removeAngularAttributes: true, +}) +``` + + +### ~~`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. + +**default** : `{}` + +**example**: + +```typescript +await render(AppComponent, { + componentInputs: { + counterValue: 10, + }, +}) +``` + +### ~~`componentOutputs`~~ (deprecated) + +An object to set `@Output` properties of the component. + +**default** : `{}` + +**example**: + +```typescript +await render(AppComponent, { + componentOutputs: { + clicked: (value) => { ... } + } +}) +``` + +### ~~`componentProperties`~~ (deprecated) + +An object to set `@Input` and `@Output` properties of the component. Doesn't +have a fine-grained control as `inputs` and `on`. + +**default** : `{}` + +**example**: + +```typescript +await render(AppComponent, { + componentProperties: { + // an input + counterValue: 10, + // an output + send: (value) => { ... } + // a public property + name: 'Tim' + } +}) +``` + + +## `RenderResult` + +### `container` + +The containing DOM node of your rendered Angular Component. This is a regular +DOM node, so you can call `container.querySelector` etc. to inspect the +children. + +### `debug` + +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) + +debug() +``` + +### `rerender` + +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, { + 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} +}) + +// 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.dev/api/core/testing/ComponentFixture#detectChanges). + +### `debugElement` + +The Angular `DebugElement` of the component. + +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.dev/api/core/testing/ComponentFixture). + +```typescript +const {fixture} = await render(AppComponent) + +// componentInstance is typed as AppComponent +const componentInstance = fixture.componentInstance +``` + +> 🚨 If you find yourself using `fixture` to access the component's internal +> values you should reconsider! This probable means, you're testing +> implementation details. + +### `navigate` + +Accepts a DOM element or a path as parameter. If an element is passed, +`navigate` will navigate to the `href` value of the element. If a path is +passed, `navigate` will navigate to the path. + +```typescript +const { navigate } = await render(AppComponent, { + routes: [...] +}) + +await navigate(component.getByLabelText('To details')) +await navigate('details/3') +``` + +### `...queries` + +The most important feature of `render` is that the queries from +[DOM Testing Library](/docs/dom-testing-library/intro) are automatically +returned with their first argument bound to the component under test. + +See [Queries](queries/about.mdx) for a complete list. + +**example**: + +```typescript +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() + +await renderDeferBlock(DeferBlockState.Complete) +expect(screen.getByText(/completed/i)).toBeInTheDocument() +``` diff --git a/docs/angular-testing-library/examples.md b/docs/angular-testing-library/examples.md deleted file mode 100644 index c4eee4601..000000000 --- a/docs/angular-testing-library/examples.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -id: examples -title: Examples -sidebar_label: Examples ---- - -> Read -> [Good testing practices with 🦔 Angular Testing Library](https://timdeschryver.dev/posts/good-testing-practices-with-angular-testing-library) -> for a guided example - -counter.component.ts - -```typescript -@Component({ - selector: 'counter', - template: ` - - Current Count: {{ counter }} - - `, -}) -export class CounterComponent { - @Input() counter = 0 - - increment() { - this.counter += 1 - } - - decrement() { - this.counter -= 1 - } -} -``` - -counter.component.spec.ts - -```typescript -import { render, screen, fireEvent } from '@testing-library/angular' -import { CounterComponent } from './counter.component.ts' - -describe('Counter', () => { - test('should render counter', async () => { - await render(CounterComponent, { - componentProperties: { counter: 5 }, - }) - - expect(screen.getByText('Current Count: 5')) - }) - - test('should increment the counter on click', async () => { - await render(CounterComponent, { - componentProperties: { counter: 5 }, - }) - - fireEvent.click(screen.getByText('+')) - - expect(screen.getByText('Current Count: 6')) - }) -}) -``` - -More examples can be found in the -[GitHub project](https://github.com/testing-library/angular-testing-library/tree/master/apps/example-app/app/examples). -These examples include: - -- `@Input` and `@Output` properties -- (Reactive) Forms -- Integration with NgRx (mock) Store -- And more - -If you're looking for an example that isn't on the list, please feel free to -create a -[new issue](https://github.com/testing-library/angular-testing-library/issues/new). diff --git a/docs/angular-testing-library/examples.mdx b/docs/angular-testing-library/examples.mdx new file mode 100644 index 000000000..00ae4fa1a --- /dev/null +++ b/docs/angular-testing-library/examples.mdx @@ -0,0 +1,85 @@ +--- +id: examples +title: 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) + +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. + +```ts title="counter.component.ts" +@Component({ + selector: 'app-counter', + template: ` + {{ hello() }} + + Current Count: {{ counter() }} + + `, +}) +export class CounterComponent { + counter = model(0); + hello = input('Hi', { alias: 'greeting' }); + + increment() { + this.counter.set(this.counter() + 1); + } + + decrement() { + this.counter.set(this.counter() - 1); + } +} +``` + +```typescript title="counter.component.spec.ts" +import { signal, inputBinding, twoWayBinding } from '@angular/core'; +import { render, screen, fireEvent } from '@testing-library/angular'; +import { CounterComponent } from './counter.component'; + +describe('Counter', () => { + it('renders counter', async () => { + await render(CounterComponent, { + bindings: [ + twoWayBinding('counter', signal(5)), + // aliases are handled naturally with inputBinding + inputBinding('greeting', () => 'Hello Alias!'), + ], + }); + + expect(screen.getByText('Current Count: 5')).toBeVisible(); + expect(screen.getByText('Hello Alias!')).toBeVisible(); + }); + + it('increments the counter on click', async () => { + await render(CounterComponent, { + bindings: [twoWayBinding('counter', signal(5))], + }); + + const incrementButton = screen.getByRole('button', { name: '+' }); + fireEvent.click(incrementButton); + + 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/src/app/examples). +These examples include: + +- `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 +[new issue](https://github.com/testing-library/angular-testing-library/issues/new). 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.md b/docs/angular-testing-library/intro.mdx similarity index 82% rename from docs/angular-testing-library/intro.md rename to docs/angular-testing-library/intro.mdx index 42d30e6ff..a7820b7f0 100644 --- a/docs/angular-testing-library/intro.md +++ 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) @@ -33,11 +41,11 @@ components. It provides light utility functions on top of in a way that encourages better testing practices. Its primary guiding principle is: -> [The more your tests resemble the way your software is used, the more confidence they can give you.](guiding-principles.md) +> [The more your tests resemble the way your software is used, the more confidence they can give you.](guiding-principles.mdx) So rather than dealing with instances of rendered Angular components, your tests will work with actual DOM nodes. The utilities this library provides facilitate -querying the DOM in the same way the user would. Finding for elements by their +querying the DOM in the same way the user would. Finding form elements by their label text (just like a user would), finding links and buttons from their text (like a user would). It also exposes a recommended way to find elements by a `data-testid` as an "escape hatch" for elements where the text content and label 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.md b/docs/bs-react-testing-library/examples.mdx similarity index 97% rename from docs/bs-react-testing-library/examples.md rename to docs/bs-react-testing-library/examples.mdx index ce8d544a7..08e96a7c9 100644 --- a/docs/bs-react-testing-library/examples.md +++ 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.md b/docs/bs-react-testing-library/intro.mdx similarity index 95% rename from docs/bs-react-testing-library/intro.md rename to docs/bs-react-testing-library/intro.mdx index 8e2545423..316ccc9b2 100644 --- a/docs/bs-react-testing-library/intro.md +++ 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/contributing.md b/docs/contributing.md deleted file mode 100644 index 65791f758..000000000 --- a/docs/contributing.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -id: contributing -title: Contributing -sidebar_label: Contributing ---- - -## License - -`React Testing Library` is distributed under the open-source MIT license - -## Issues - -_Looking to contribute? Look for the [Good First Issue][good-first-issue] -label._ - -### 🐛 Bugs - -Please file an issue for bugs, missing documentation, or unexpected behavior. - -[**See Bugs**][bugs] - -### 💡 Feature Requests - -Please file an issue to suggest new features. Vote on feature requests by adding -a 👍. This helps maintainers prioritize what to work on. - -[**See Feature Requests**][requests] - -### ❓ Questions - -For questions related to using the library, please visit a support community -instead of filing an issue on GitHub. - -- [Discord][discord] -- [Stack Overflow][stackoverflow] - - - - - -[npm]: https://www.npmjs.com/ -[node]: https://nodejs.org -[build-badge]: https://img.shields.io/travis/kentcdodds/react-testing-library.svg?style=flat-square -[build]: https://travis-ci.org/kentcdodds/react-testing-library -[coverage-badge]: https://img.shields.io/codecov/c/github/kentcdodds/react-testing-library.svg?style=flat-square -[coverage]: https://codecov.io/github/kentcdodds/react-testing-library -[version-badge]: https://img.shields.io/npm/v/react-testing-library.svg?style=flat-square -[package]: https://www.npmjs.com/package/react-testing-library -[downloads-badge]: https://img.shields.io/npm/dm/react-testing-library.svg?style=flat-square -[npmtrends]: http://www.npmtrends.com/react-testing-library -[license-badge]: https://img.shields.io/npm/l/react-testing-library.svg?style=flat-square -[license]: https://github.com/testing-library/react-testing-library/blob/master/LICENSE -[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square -[prs]: http://makeapullrequest.com -[donate-badge]: https://img.shields.io/badge/$-support-green.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 -[github-watch-badge]: https://img.shields.io/github/watchers/kentcdodds/react-testing-library.svg?style=social -[github-watch]: https://github.com/testing-library/react-testing-library/watchers -[github-star-badge]: https://img.shields.io/github/stars/kentcdodds/react-testing-library.svg?style=social -[github-star]: https://github.com/testing-library/react-testing-library/stargazers -[twitter]: https://twitter.com/intent/tweet?text=Check%20out%20react-testing-library%20by%20%40kentcdodds%20https%3A%2F%2Fgithub.com%2Fkentcdodds%2Freact-testing-library%20%F0%9F%91%8D -[twitter-badge]: https://img.shields.io/twitter/url/https/github.com/testing-library/react-testing-library.svg?style=social -[emojis]: https://github.com/kentcdodds/all-contributors#emoji-key -[all-contributors]: https://github.com/kentcdodds/all-contributors -[set-immediate]: https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate -[guiding-principle]: https://twitter.com/kentcdodds/status/977018512689455106 -[data-testid-blog-post]: https://blog.kentcdodds.com/making-your-ui-tests-resilient-to-change-d37a6ee37269 -[dom-testing-lib-textmatch]: https://github.com/testing-library/dom-testing-library#textmatch -[bugs]: https://github.com/testing-library/react-testing-library/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Acreated-desc -[requests]: https://github.com/testing-library/react-testing-library/issues?q=is%3Aissue+sort%3Areactions-%2B1-desc+label%3Aenhancement+is%3Aopen -[good-first-issue]: https://github.com/testing-library/react-testing-library/issues?utf8=✓&q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3A"good+first+issue"+ -[discord]: https://discord.gg/c6JN9fM -[stackoverflow]: https://stackoverflow.com/questions/tagged/react-testing-library - - diff --git a/docs/contributing.mdx b/docs/contributing.mdx new file mode 100644 index 000000000..167844e54 --- /dev/null +++ b/docs/contributing.mdx @@ -0,0 +1,49 @@ +--- +id: contributing +title: Contributing +sidebar_label: Contributing +--- + +## License + +`React Testing Library` is distributed under the open-source MIT license + +## Issues + +_Looking to contribute? Look for the [Good First Issue][good-first-issue] +label._ + +### 🐛 Bugs + +Please file an issue for bugs, missing documentation, or unexpected behavior. + +[**See Bugs**][bugs] + +### 💡 Feature Requests + +Please file an issue to suggest new features. Vote on feature requests by adding +a 👍. This helps maintainers prioritize what to work on. + +[**See Feature Requests**][requests] + +### ❓ Questions + +For questions related to using the library, please visit a support community +instead of filing an issue on GitHub. + +- [Discord][discord] +- [Stack Overflow][stackoverflow] + + + + + +[bugs]: https://github.com/testing-library/react-testing-library/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Acreated-desc +[requests]: https://github.com/testing-library/react-testing-library/issues?q=is%3Aissue+sort%3Areactions-%2B1-desc+label%3Aenhancement+is%3Aopen +[good-first-issue]: https://github.com/testing-library/react-testing-library/issues?utf8=✓&q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc+label%3A"good+first+issue"+ +[discord]: https://discord.gg/testing-library +[stackoverflow]: https://stackoverflow.com/questions/tagged/react-testing-library + + diff --git a/docs/cypress-testing-library/intro.md b/docs/cypress-testing-library/intro.mdx similarity index 66% rename from docs/cypress-testing-library/intro.md rename to docs/cypress-testing-library/intro.mdx index ec1135944..3c88d4d2b 100644 --- a/docs/cypress-testing-library/intro.md +++ 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*` @@ -45,7 +44,7 @@ Typings should be added as follows in `tsconfig.json`: ``` You can find -[all Library definitions here](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/testing-library__cypress/index.d.ts). +[all Library definitions here](https://github.com/testing-library/cypress-testing-library/blob/master/types/index.d.ts). ## Examples @@ -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 new file mode 100644 index 000000000..9b5e4e761 --- /dev/null +++ b/docs/dom-testing-library/api-accessibility.mdx @@ -0,0 +1,92 @@ +--- +id: api-accessibility +title: Accessibility +--- + +## Testing for Accessibility + +One of the guiding principles of the Testing Library APIs is that they should +enable you to test your app the way your users use it, including through +accessibility interfaces like screen readers. + +See the page on [queries](queries/about.mdx#priority) for details on how using a +semantic HTML query can make sure your app works with browser accessibility +APIs. + +## `getRoles` + +This function allows iteration over the implicit ARIA roles represented in a +given tree of DOM nodes. + +It returns an object, indexed by role name, with each value being an array of +elements which have that implicit ARIA role. + +See +[ARIA in HTML](https://www.w3.org/TR/html-aria/#document-conformance-requirements-for-use-of-aria-attributes-in-html) +for more information about implicit ARIA roles. + +```javascript +import {getRoles} from '@testing-library/dom' + +const nav = document.createElement('nav') +nav.innerHTML = ` +
    +
  • Item 1
  • +
  • Item 2
  • +
` +console.log(getRoles(nav)) + +// Object { +// navigation: [