chore: auto merge branchs (#35049)

chore: merge master into feature
This commit is contained in:
github-actions[bot] 2022-04-15 08:03:26 +00:00 committed by GitHub
commit 4291c1d121
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 662 additions and 358 deletions

View File

@ -1,6 +1,7 @@
+v <ljw@live.jp> +v <ljw@live.jp>
07akioni <07akioni2@gmail.com> 07akioni <07akioni2@gmail.com>
17073025 <17073025@cnsuning.com> 17073025 <17073025@cnsuning.com>
2724635499 <2724635499@qq.com>
282159468 <282159468@qq.com> 282159468 <282159468@qq.com>
778758944 <778758944@qq.com> 778758944 <778758944@qq.com>
Aaron Cawte <aaron@bbncreative.co> Aaron Cawte <aaron@bbncreative.co>
@ -9,6 +10,7 @@ Adam Stankiewicz <sheerun@sher.pl>
Aditya Padhi <aditya.padhi@outlook.com> Aditya Padhi <aditya.padhi@outlook.com>
Adrian Dimitrov <dimitrov.adrian@gmail.com> Adrian Dimitrov <dimitrov.adrian@gmail.com>
Adriano Ruberto <adriano.ruberto@gmail.com> Adriano Ruberto <adriano.ruberto@gmail.com>
Aex <adaex@qq.com>
Ahmad Abdelaziz <ahmad.abdelaziz@robustastudio.com> Ahmad Abdelaziz <ahmad.abdelaziz@robustastudio.com>
Ahmed AlSammany <ahmed.alsammany@incorta.com> Ahmed AlSammany <ahmed.alsammany@incorta.com>
Ahmet Simsek <iamaroott@gmail.com> Ahmet Simsek <iamaroott@gmail.com>
@ -38,13 +40,18 @@ Alexey Vinogradov <vinogradov.a.i.93@gmail.com>
Alexey Yakovlev <yallie@yandex.ru> Alexey Yakovlev <yallie@yandex.ru>
Alfred Qiu <sc941203@gmail.com> Alfred Qiu <sc941203@gmail.com>
Ali Zhdanov <makedonec88@gmail.com> Ali Zhdanov <makedonec88@gmail.com>
Aliaksandr <puskin1914@gmail.com>
Alireza <alireza.mh@gmail.com> Alireza <alireza.mh@gmail.com>
Alvin Abia <alvin.abia@icloud.com> Alvin Abia <alvin.abia@icloud.com>
Aminul Islam <me@aminul.net>
Amir Arafat <amirarafat1@gmail.com> Amir Arafat <amirarafat1@gmail.com>
Amorites <751809522@qq.com> Amorites <751809522@qq.com>
Amour1688 <lcz_1996@foxmail.com>
Amumu <yoyo837@hotmail.com> Amumu <yoyo837@hotmail.com>
Anas Tawfeek <anas.tawfeek@outlook.com> Anas Tawfeek <anas.tawfeek@outlook.com>
Andre Perunicic <andre@intoli.com> Andre Perunicic <andre@intoli.com>
Andre Zyczkowski <andre@oakslab.com>
Andrea Blanco <estefania_8_3@hotmail.com>
Andrew Murray <radarhere@gmail.com> Andrew Murray <radarhere@gmail.com>
Andrew Shearer <andrew@ashearer.com> Andrew Shearer <andrew@ashearer.com>
Andrey G <plandem@gmail.com> Andrey G <plandem@gmail.com>
@ -52,6 +59,7 @@ Andrzej Dybionka <andrzej@arabel.la>
André <mazoni.andre@gmail.com> André <mazoni.andre@gmail.com>
Andrés <andresin87@gmail.com> Andrés <andresin87@gmail.com>
Ankit Babbar <ankit.babbar@valuebound.com> Ankit Babbar <ankit.babbar@valuebound.com>
Antee <gtavctt@protonmail.com>
Aobo Yang <yangaobo@gmail.com> Aobo Yang <yangaobo@gmail.com>
Ardo Kusuma <ardo@uber.com> Ardo Kusuma <ardo@uber.com>
Arlindo Torres <arlindofontetorres@gmail.com> Arlindo Torres <arlindofontetorres@gmail.com>
@ -61,6 +69,7 @@ Artin <lengthmin@gmail.com>
Arvin Xu <arvinx@foxmail.com> Arvin Xu <arvinx@foxmail.com>
Ash Kumar <kumar.ashwin@outlook.com> Ash Kumar <kumar.ashwin@outlook.com>
Ashot Mnatsakanyan <mnatsakanyan.ashot@gmail.com> Ashot Mnatsakanyan <mnatsakanyan.ashot@gmail.com>
Austaras <austaras@outlook.com>
Aymen Bouchekoua <bouchekoua.aymen@gmail.com> Aymen Bouchekoua <bouchekoua.aymen@gmail.com>
Aymen Chebbi <a.chebi@klarx.com> Aymen Chebbi <a.chebi@klarx.com>
BK Heleth <bon.hoo@hotmail.com> BK Heleth <bon.hoo@hotmail.com>
@ -102,15 +111,20 @@ C.J. Winslow <whoaa512@gmail.com>
CORP\lianyufeng <15275222711@163.com> CORP\lianyufeng <15275222711@163.com>
Calin Vlad <vlad.s.calin@gmail.com> Calin Vlad <vlad.s.calin@gmail.com>
Cam Song <neosoyn@gmail.com> Cam Song <neosoyn@gmail.com>
Camol <kwwnjujlc@sina.com>
Cang Ta <hoksilato176@gmail.com> Cang Ta <hoksilato176@gmail.com>
Canwen Xu <canwenxu@126.com> Canwen Xu <canwenxu@126.com>
Carlos Coves Prieto <carlos.coves@interacso.com> Carlos Coves Prieto <carlos.coves@interacso.com>
Carter Feldman <carter@carter.at> Carter Feldman <carter@carter.at>
Caspian Chen <624081567@qq.com>
Cat-XHS <1349021570@qq.com>
Catalin Miron <mironcatalin@gmail.com> Catalin Miron <mironcatalin@gmail.com>
Cee Cirno <i@cee.moe> Cee Cirno <i@cee.moe>
Cemre Mengu <cemremengu@gmail.com> Cemre Mengu <cemremengu@gmail.com>
Chalk <chalkpe@gmail.com>
Chandler Moisen <chandlermoisen@gmail.com> Chandler Moisen <chandlermoisen@gmail.com>
Chang Wang <cheapsteak@gmail.com> Chang Wang <cheapsteak@gmail.com>
Chang Wei <867597730@qq.com>
Charles Covey-Brandt <chazcb@gmail.com> Charles Covey-Brandt <chazcb@gmail.com>
Charlie Jonas <charlie@callawaycloudconsulting.com> Charlie Jonas <charlie@callawaycloudconsulting.com>
Chelsea Huang <chelsea.huang@sap.com> Chelsea Huang <chelsea.huang@sap.com>
@ -130,10 +144,12 @@ Chuang Yu <cyu9960@gmail.com>
Chuck <wfhtzcf@gmail.com> Chuck <wfhtzcf@gmail.com>
Claudio Restifo <claudio.restifo@gmail.com> Claudio Restifo <claudio.restifo@gmail.com>
Cody Chan <int64ago@gmail.com> Cody Chan <int64ago@gmail.com>
Cole <cqiufan@outlook.com>
Colton Pierson <colton@coltonpierson.com> Colton Pierson <colton@coltonpierson.com>
Confiks <confiks@scriptbase.org> Confiks <confiks@scriptbase.org>
Cong Yoo <roopher@163.com> Cong Yoo <roopher@163.com>
Cong Zhang <dancerphil1994@gmail.com> Cong Zhang <dancerphil1994@gmail.com>
Connor White <connor.bcw@gmail.com>
Conway Anderson <hello@conwayanderson.com> Conway Anderson <hello@conwayanderson.com>
Cordaro <elvis07@163.com> Cordaro <elvis07@163.com>
CornerSkyless <573196853@qq.com> CornerSkyless <573196853@qq.com>
@ -149,6 +165,7 @@ Daniel <caishujunchn@163.com>
Daniel Chang <danielchang2022@u.northwestern.edu> Daniel Chang <danielchang2022@u.northwestern.edu>
Daniel Gomez <dgomez@orangeloops.com> Daniel Gomez <dgomez@orangeloops.com>
Daniel Harrison <daniel.equiknox@gmail.com> Daniel Harrison <daniel.equiknox@gmail.com>
Daniel Pfeffer <mail@danielpfeffer.de>
Danny Hoower Antonio Viasus Avila <danjavia@gmail.com> Danny Hoower Antonio Viasus Avila <danjavia@gmail.com>
Daphne Won <daphne.won@shopee.com> Daphne Won <daphne.won@shopee.com>
Daqi Song <dqaria@gmail.com> Daqi Song <dqaria@gmail.com>
@ -161,13 +178,18 @@ David Broder-Rodgers <david.broder-rodgers@softwire.com>
David Hatten <dhatten@covermymeds.com> David Hatten <dhatten@covermymeds.com>
David Schneider <davschne@gmail.com> David Schneider <davschne@gmail.com>
Davide Bianchi <bianchidavide12@gmail.com> Davide Bianchi <bianchidavide12@gmail.com>
Dawnlck <chaokai.lck@antgroup.com>
Dean van Niekerk <deanvniekerk@gmail.com> Dean van Niekerk <deanvniekerk@gmail.com>
Debiancc <never.be.evil.debian@gmail.com> Debiancc <never.be.evil.debian@gmail.com>
DengYun <tdzl2003@gmail.com> DengYun <tdzl2003@gmail.com>
Denis <shumkovdenis@gmail.com> Denis <shumkovdenis@gmail.com>
Dennis273 <dennisc695@icloud.com>
Derrick <derricktel@foxmail.com>
Di Wu <di@gridx.cn>
DiamondYuan <admin@diamondyuan.com> DiamondYuan <admin@diamondyuan.com>
DiamondYuan <541832074@qq.com> DiamondYuan <541832074@qq.com>
Diego Barreiro <diego.barreiro.perez@gmail.com> Diego Barreiro <diego.barreiro.perez@gmail.com>
Diego Villacís <diegovillacis101@gmail.com>
Dimitri Mitropoulos <dimitrimitropoulos@gmail.com> Dimitri Mitropoulos <dimitrimitropoulos@gmail.com>
Dmitriy <dimusig@gmail.com> Dmitriy <dimusig@gmail.com>
Dmitriy Mironov <dima.dev01@gmail.com> Dmitriy Mironov <dima.dev01@gmail.com>
@ -178,9 +200,12 @@ Dmitry Manannikov <email@slonoed.net>
Dmitry Snegirev <rikkitp@gmail.com> Dmitry Snegirev <rikkitp@gmail.com>
Dmitry Tikhomirov <tikhomirov@element-soft.com> Dmitry Tikhomirov <tikhomirov@element-soft.com>
Dongcheng Wang <dongcheng6@qq.com> Dongcheng Wang <dongcheng6@qq.com>
Dony Sukardi <donysukardi@gmail.com>
Dorian <dorian@doma.io> Dorian <dorian@doma.io>
DosLin <doslino@gmail.com> DosLin <doslino@gmail.com>
Douglas Mason <Demasonjr@gmail.com> Douglas Mason <Demasonjr@gmail.com>
Dreamcreative <m543438924@163.com>
Dzmitry Yarmoshkin <spanb4@gmail.com>
Eager <1226393396@qq.com> Eager <1226393396@qq.com>
Eber Rodrigues <eberjoe@gmail.com> Eber Rodrigues <eberjoe@gmail.com>
EcmaProSrc.P/ka <asoiso@foxmail.com> EcmaProSrc.P/ka <asoiso@foxmail.com>
@ -193,14 +218,18 @@ Eduardo Ludi <eduludi@gmail.com>
Edward <7047924@qq.com> Edward <7047924@qq.com>
Egor Yurtaev <yurtaev.egor@gmail.com> Egor Yurtaev <yurtaev.egor@gmail.com>
Elaina Cherudim <shr9192@gmail.com> Elaina Cherudim <shr9192@gmail.com>
Eldar Mirzabekov <prog.eldar@gmail.com>
Eldar Mustafaiev <eldar.mustafaiev@gmail.com> Eldar Mustafaiev <eldar.mustafaiev@gmail.com>
Eli White <github@eli-white.com> Eli White <github@eli-white.com>
Eliot Sanford <eliot587@gmail.com>
Emerson Laurentino <emersonlaurentino@hotmail.com> Emerson Laurentino <emersonlaurentino@hotmail.com>
Emily Xiong <xiongemi@gmail.com> Emily Xiong <xiongemi@gmail.com>
Ender Lee <chnliquan@163.com> Ender Lee <chnliquan@163.com>
Eric <84263800@qq.com> Eric <84263800@qq.com>
Eric Bonow <ebonow@hotmail.com>
Eric Celeste <efc@clst.org> Eric Celeste <efc@clst.org>
Eric Chen <airkro@qq.com> Eric Chen <airkro@qq.com>
Eric Lee <ericfly33@gmail.com>
Eric Turriff <eric.turriff@gmail.com> Eric Turriff <eric.turriff@gmail.com>
Eric Wang <eric@canva.com> Eric Wang <eric@canva.com>
Eric Wang <wjun0912@gmail.com> Eric Wang <wjun0912@gmail.com>
@ -210,36 +239,50 @@ Eugene Matvejev <eugene.matvejev@gmail.com>
Eugene Molokov <molokovev@gmail.com> Eugene Molokov <molokovev@gmail.com>
Eusen <179530591@qq.com> Eusen <179530591@qq.com>
Evan Charlton <evancharlton@gmail.com> Evan Charlton <evancharlton@gmail.com>
EvanOne文一 <1656081615@qq.com>
Evgeny Kuznetsov <jackk@ya.ru> Evgeny Kuznetsov <jackk@ya.ru>
Eward Song <eward.song@gmail.com> Eward Song <eward.song@gmail.com>
FJHou <firemybugs@gmail.com>
Fachreza Muslim <fachreza.muslim7396@gmail.com>
Federico Marcos <marcosfede@gmail.com> Federico Marcos <marcosfede@gmail.com>
Ferdi Koomen <info@madebyferdi.com> Ferdi Koomen <info@madebyferdi.com>
Fergus Leung <fergusleung96@gmail.com> Fergus Leung <fergusleung96@gmail.com>
Fernando Giarritiello <fgiarritiello@gmail.com> Fernando Giarritiello <fgiarritiello@gmail.com>
Filip Kukovec <filip.kukovec1@gmail.com> Filip Kukovec <filip.kukovec1@gmail.com>
Filip Seman <filip.seman@protonmail.com>
Florian Orpelière <florian.orpeliere@gmail.com> Florian Orpelière <florian.orpeliere@gmail.com>
Flynn <li.fulin@foxmail.com> Flynn <li.fulin@foxmail.com>
Fog3211 <fog3211@163.com>
For177 <mengqiang.q@gmail.com> For177 <mengqiang.q@gmail.com>
Frank <frankdingv@gmail.com> Frank <frankdingv@gmail.com>
Frank Fang <FrankFang1990@gmail.com>
Frezc <Frezcw@gmail.com> Frezc <Frezcw@gmail.com>
Fullstop000 <fullstop1005@gmail.com> Fullstop000 <fullstop1005@gmail.com>
GJ Wang <itellboy@foxmail.com> GJ Wang <itellboy@foxmail.com>
GSBL <2602140596@qq.com> GSBL <2602140596@qq.com>
Gabe Medrash <gabeme@alleninstitute.org> Gabe Medrash <gabeme@alleninstitute.org>
Gabriel Henrique <bielrockx@gmail.com>
Gabriel Le Breton <lebreton.gabriel@gmail.com> Gabriel Le Breton <lebreton.gabriel@gmail.com>
Gabriel Mendez Reyes <gabriel.mendez0@hotmail.com>
Gabriel Nunes <gabriel@multiverso.me> Gabriel Nunes <gabriel@multiverso.me>
GalenWong <wonggalen1999@gmail.com> GalenWong <wonggalen1999@gmail.com>
GannonSun <GannonSun@gmail.com>
Gao Jiangmiao <tolbkni@gmail.com> Gao Jiangmiao <tolbkni@gmail.com>
Garrick Crouch <garrickcrouch@gmail.com>
Gautier <rollingautier2@gmail.com> Gautier <rollingautier2@gmail.com>
Geoff Holden <geoff@brightloudnoise.com> Geoff Holden <geoff@brightloudnoise.com>
Geoffrey Bell <gtb104@yahoo.com>
George Gray <george@ummodesign.com> George Gray <george@ummodesign.com>
Germini <634709523@qq.com> Germini <634709523@qq.com>
Gerson Garrido <ggarridom23@gmail.com> Gerson Garrido <ggarridom23@gmail.com>
Gherciu Gheorghe <gherciu553@gmail.com>
Gianmarco Rengucci <rengucci.gianmarco@gmail.com>
Gin-X <xcbwyys@hotmail.com> Gin-X <xcbwyys@hotmail.com>
Go7hic <gtfx0209@qq.com> Go7hic <gtfx0209@qq.com>
Goh Zhao Yang <austinzy@airasia.com> Goh Zhao Yang <austinzy@airasia.com>
Golevka <huangsamfisher@163.com> Golevka <huangsamfisher@163.com>
Googleplex <yyoung2001@gmail.com> Googleplex <yyoung2001@gmail.com>
Gourav Saini <mailtogouravsaini@gmail.com>
Graeme Yeates <yeatesgraeme@gmail.com> Graeme Yeates <yeatesgraeme@gmail.com>
Graeme Yeates <gyeates@clearpath.ai> Graeme Yeates <gyeates@clearpath.ai>
Grant Klinsing <gklinsing@gmail.com> Grant Klinsing <gklinsing@gmail.com>
@ -247,10 +290,14 @@ Gray Choi <gray.choi.1988@gmail.com>
Guan Hao <raptium@gmail.com> Guan Hao <raptium@gmail.com>
Guan Yu Pan (Jacky) <jackypan1989@gmail.com> Guan Yu Pan (Jacky) <jackypan1989@gmail.com>
Guichi Zhao <zgc910619@gmail.com> Guichi Zhao <zgc910619@gmail.com>
Guojun Wang <itwanggj@163.com>
Guru Mahendran <me@gurubavan.com>
HJin.me <hjin.me@gmail.com> HJin.me <hjin.me@gmail.com>
Hai Phan Nguyen <pnghai@gmail.com> Hai Phan Nguyen <pnghai@gmail.com>
Haibin Yu <haibin.yu@oceanwing.com> Haibin Yu <haibin.yu@oceanwing.com>
Hal-pan <hms181231@gmail.com> Hal-pan <hms181231@gmail.com>
Hale Deng <haledeng88@gmail.com>
Han Han <haannn@qq.com>
Hanai <ihanai1991@gmail.com> Hanai <ihanai1991@gmail.com>
Hanjun Kim <hallazzang@gmail.com> Hanjun Kim <hallazzang@gmail.com>
Hanz Luo <lhz0516@gmail.com> Hanz Luo <lhz0516@gmail.com>
@ -262,6 +309,7 @@ Harshit Mehrotra <harshitmehrotra@hotmail.com>
Harutaka Kawamura <hkawamura0130@gmail.com> Harutaka Kawamura <hkawamura0130@gmail.com>
He Linming <hlm52pk@163.com> He Linming <hlm52pk@163.com>
Heaven <ne_smalltown@163.com> Heaven <ne_smalltown@163.com>
Hell Cat <hellcatvn@gmail.com>
Henri Normak <henri.normak@gmail.com> Henri Normak <henri.normak@gmail.com>
HeskeyBaozi <hezhiyu233@foxmail.com> HeskeyBaozi <hezhiyu233@foxmail.com>
HiddenMan <1196089730@qq.com> HiddenMan <1196089730@qq.com>
@ -282,6 +330,7 @@ ILdar Nogmanov <nogmanov@gmail.com>
Igor <nemytyshew@yandex.ru> Igor <nemytyshew@yandex.ru>
Igor Andriushchenko <igor.andriushchenko@snowsoftware.com> Igor Andriushchenko <igor.andriushchenko@snowsoftware.com>
Igor G <i.gaidai4uk@gmail.com> Igor G <i.gaidai4uk@gmail.com>
Ikko Ashimine <eltociear@gmail.com>
Ilan <hasanovtk@gmail.com> Ilan <hasanovtk@gmail.com>
Ilya Bondarenko <bondarenko.ik@gmail.com> Ilya Bondarenko <bondarenko.ik@gmail.com>
ImJoeHs <865439601@qq.com> ImJoeHs <865439601@qq.com>
@ -297,6 +346,7 @@ Ivan Tsybulin <vanyatsybulin@gmail.com>
Ivan Yakovlev <addictional2013@gmail.com> Ivan Yakovlev <addictional2013@gmail.com>
Ivo Stratev <ivo.stratev.tues@gmail.com> Ivo Stratev <ivo.stratev.tues@gmail.com>
JRoger <sjr_vip@126.com> JRoger <sjr_vip@126.com>
Jabir K.H <khjabir@gmail.com>
Jack <jacklee82814@gmail.com> Jack <jacklee82814@gmail.com>
Jack Hsieh <jack@egenware.com> Jack Hsieh <jack@egenware.com>
Jack Lo <jack-lo@foxmail.com> Jack Lo <jack-lo@foxmail.com>
@ -305,21 +355,27 @@ Jackie.Ls <418292038@qq.com>
Jacques Kvam <jwkvam@gmail.com> Jacques Kvam <jwkvam@gmail.com>
JaePil Jung <jjp5023@gmail.com> JaePil Jung <jjp5023@gmail.com>
Jaewook Ahn <ajw4586@gmail.com> Jaewook Ahn <ajw4586@gmail.com>
Jaimy de Graaf <me@vfour.dev>
Jake Richards <jake.richards@genesys.com> Jake Richards <jake.richards@genesys.com>
Jaly <dcdlove@qq.com> Jaly <dcdlove@qq.com>
James <daoxingyue@live.cn>
James <james@schoolshape.com> James <james@schoolshape.com>
James Tsang <wentao_zeng1@163.com> James Tsang <wentao_zeng1@163.com>
James Yeung <shunjiey@hotmail.com> James Yeung <shunjiey@hotmail.com>
JamesYin <elantion@gmail.com> JamesYin <elantion@gmail.com>
Jan Václavík <jvaclavik@gmail.com>
Janry <wangzhili56@126.com>
Jaroslav Bereza <github.com@bereza.cz> Jaroslav Bereza <github.com@bereza.cz>
Jarret Moses <jarret.moses@gmail.com> Jarret Moses <jarret.moses@gmail.com>
Jarvis1010 <travis.mair@gmail.com> Jarvis1010 <travis.mair@gmail.com>
Jase Owens <jaseowens197@gmail.com>
Jase Pellerin <jasepellerin@gmail.com> Jase Pellerin <jasepellerin@gmail.com>
Jason <ceocjy@vip.qq.com> Jason <ceocjy@vip.qq.com>
Jason Chung <shiningjason1989@gmail.com> Jason Chung <shiningjason1989@gmail.com>
Jason Yin <yinjiangsheng@gmail.com> Jason Yin <yinjiangsheng@gmail.com>
Jay Fong <fjc0kb@gmail.com> Jay Fong <fjc0kb@gmail.com>
Jean-Luc Sorak <jlsorak@icloud.com> Jean-Luc Sorak <jlsorak@icloud.com>
Jean-Philippe Roy <ohnoesmyoreos@gmail.com>
Jeff Wen <sinchangwen@gmail.com> Jeff Wen <sinchangwen@gmail.com>
Jeffrey Carl Faden <jeffreyatw@gmail.com> Jeffrey Carl Faden <jeffreyatw@gmail.com>
Jehu <z_zhihao@foxmail.com> Jehu <z_zhihao@foxmail.com>
@ -332,9 +388,11 @@ Jesper We <jesper@journeyman.se>
Jesus The Hun <iletaitunefoisfenghuang@gmail.com> Jesus The Hun <iletaitunefoisfenghuang@gmail.com>
Jiabin Peng <png.inside@gmail.com> Jiabin Peng <png.inside@gmail.com>
Jiahao <jahowchen@outlook.com> Jiahao <jahowchen@outlook.com>
Jiajun Chen <tychenjiajun@live.cn>
Jialei <jialeicui@126.com> Jialei <jialeicui@126.com>
Jiawei Huang <hjiawei@gmail.com> Jiawei Huang <hjiawei@gmail.com>
Jichao Zhong <felixjichao@gmail.com> Jichao Zhong <felixjichao@gmail.com>
Jiehui <jeffylaiakanull@gmail.com>
Jieraaa <842533841@qq.com> Jieraaa <842533841@qq.com>
Jin ZHANG <jz.zhangjin@gmail.com> Jin ZHANG <jz.zhangjin@gmail.com>
JinXin <m18508218948@163.com> JinXin <m18508218948@163.com>
@ -350,6 +408,8 @@ Joe <qiaolibo@126.com>
Joe Hsu <jhsu.x1@gmail.com> Joe Hsu <jhsu.x1@gmail.com>
Johannes Andersen <johannes.andersen@signifyd.com> Johannes Andersen <johannes.andersen@signifyd.com>
Johannes Loewe <johannes@loewe.pm> Johannes Loewe <johannes@loewe.pm>
John <John60676@qq.com>
John Carlo <johncarloaustria@pm.me>
John Johnson III <john@johnjohnson.cc> John Johnson III <john@johnjohnson.cc>
John Nguyen <jtnguyen236@gmail.com> John Nguyen <jtnguyen236@gmail.com>
Johnny Lim <izeye@naver.com> Johnny Lim <izeye@naver.com>
@ -360,21 +420,29 @@ Jonathan Lee <1150974628@qq.com>
Jonny Buchanan <jonathan.buchanan@gmail.com> Jonny Buchanan <jonathan.buchanan@gmail.com>
Joo Wu <wuchu356@gmail.com> Joo Wu <wuchu356@gmail.com>
Jordan Hornblow <jordan@jch254.com> Jordan Hornblow <jordan@jch254.com>
Joshua Chen <sidachen2003@gmail.com>
Josue Peralta <jperal77@gmail.com> Josue Peralta <jperal77@gmail.com>
Josué <ujosuegt@outlook.com> Josué <ujosuegt@outlook.com>
JounQin <admin@1stg.me>
JribiBelhassen <belha9inzaghi@gmail.com> JribiBelhassen <belha9inzaghi@gmail.com>
Jtree03 <wowns0903@gmail.com>
JuFeng Zhang <zjffun@gmail.com>
Juan Carlos Lloret H <juan.carlos.lloret@lansweeper.com> Juan Carlos Lloret H <juan.carlos.lloret@lansweeper.com>
Juan Rodrigo Venegas Boesch <jrvboesch@gmail.com> Juan Rodrigo Venegas Boesch <jrvboesch@gmail.com>
Julia Passynkova <ipassynk@hotmail.com> Julia Passynkova <ipassynk@hotmail.com>
Julien Confetti <julien.confetti@ulg.ac.be> Julien Confetti <julien.confetti@ulg.ac.be>
Jun Wooram <chatoo2412@gmail.com>
JuniorTour <juniortour@qq.com> JuniorTour <juniortour@qq.com>
Junwoo Ji <jydrogen@gmail.com>
Junyu Zhan <irrigator@yeah.net> Junyu Zhan <irrigator@yeah.net>
Juraj Carnogursky <durisvk2@gmail.com> Juraj Carnogursky <durisvk2@gmail.com>
Justin Reich <reich.justin@gmail.com> Justin Reich <reich.justin@gmail.com>
Justin Schuldt <justinschuldt@gmail.com> Justin Schuldt <justinschuldt@gmail.com>
Jógvan Olsen <jogvanolsen@hotmail.com>
Kaan KÜÇÜK <kaankck@gmail.com> Kaan KÜÇÜK <kaankck@gmail.com>
Kaien Liao <liaokaien@gmail.com> Kaien Liao <liaokaien@gmail.com>
Kamal Mahmudi <kamalmahmudi@yahoo.co.id> Kamal Mahmudi <kamalmahmudi@yahoo.co.id>
Karott Schu <karott7@gmail.com>
Kasra Bigdeli <kasra85@gmail.com> Kasra Bigdeli <kasra85@gmail.com>
Kayson Wu <772663139@qq.com> Kayson Wu <772663139@qq.com>
Kelvin Chu <chubillkelvin@gmail.com> Kelvin Chu <chubillkelvin@gmail.com>
@ -421,6 +489,7 @@ LeoYang <LeoY.Dev@gmail.com>
Leon Koole <leon@koole.io> Leon Koole <leon@koole.io>
Leon Shi <superRaytin@163.com> Leon Shi <superRaytin@163.com>
Leon Shi <superRaytin@gmail.com> Leon Shi <superRaytin@gmail.com>
Lewis <lewisfidlers@gmail.com>
Li C. Pan <18306423262@163.com> Li C. Pan <18306423262@163.com>
Li Chao <rftstars@qq.com> Li Chao <rftstars@qq.com>
Li Ming <armyiljfe@gmail.com> Li Ming <armyiljfe@gmail.com>
@ -428,18 +497,25 @@ LiPinghai <twopoles@163.com>
LilyWakana <873435892@qq.com> LilyWakana <873435892@qq.com>
Liming Jin <jinliming2@gmail.com> Liming Jin <jinliming2@gmail.com>
Liming Jin <jinlm@knownsec.com> Liming Jin <jinlm@knownsec.com>
Liron Lavy <liron.lavy@gmail.com>
Liu Bowen <Mr_lbw@outlook.com>
Liu Ya <liuya54892@gmail.com> Liu Ya <liuya54892@gmail.com>
Liu Yang <zation1@gmail.com> Liu Yang <zation1@gmail.com>
LongYinan <lynweklm@gmail.com> LongYinan <lynweklm@gmail.com>
Loogeek <340017792@qq.com> Loogeek <340017792@qq.com>
Loïc Huvé <loic.huve@protonmail.com>
Lu Yu <brantscube@hotmail.com>
Lucien Lee <lkiral7903@gmail.com> Lucien Lee <lkiral7903@gmail.com>
Ludwig Bäcklund <ludli839@student.liu.se> Ludwig Bäcklund <ludli839@student.liu.se>
Luke Vella <me@lukevella.com> Luke Vella <me@lukevella.com>
Lyndon001 <lld207@126.com> Lyndon001 <lld207@126.com>
M Mitchell <mail@megmitchell.ca> M Mitchell <mail@megmitchell.ca>
M. Burak Kalkan <mburakkalkan@gmail.com>
MD. Ariful Alam <swazan.arif@gmail.com>
MG12 <wuzhao.mail@gmail.com> MG12 <wuzhao.mail@gmail.com>
Ma Tianxiao <matx2215@outlook.com> Ma Tianxiao <matx2215@outlook.com>
Maciej Czekaj <natanielcz@gmail.com> Maciej Czekaj <natanielcz@gmail.com>
MadCcc <1075746765@qq.com>
Madis Väin <madisvain@gmail.com> Madis Väin <madisvain@gmail.com>
Maksim Nesterenko <alendorff@gmail.com> Maksim Nesterenko <alendorff@gmail.com>
Maksim Slotvinskij <m.slotvinskij@gmail.com> Maksim Slotvinskij <m.slotvinskij@gmail.com>
@ -449,6 +525,7 @@ Manjit Kumar <manjit1727@gmail.com>
Manoj Kumar <manoj.150283@gmail.com> Manoj Kumar <manoj.150283@gmail.com>
Manweill <mic.liangwenwei@foxmail.com> Manweill <mic.liangwenwei@foxmail.com>
MaoYiWei <137308365@qq.com> MaoYiWei <137308365@qq.com>
Map1en_ <maplenagisa@gmail.com>
Marcel Jackwerth <marceljackwerth@gmail.com> Marcel Jackwerth <marceljackwerth@gmail.com>
Marcela Bomfim <mbomfim@live.com> Marcela Bomfim <mbomfim@live.com>
Marcio Pamplona <marciopamplona79@gmail.com> Marcio Pamplona <marciopamplona79@gmail.com>
@ -469,6 +546,7 @@ Matt Lein <matt.lein@code42.com>
Matt Wilkinson <mattwilki17@gmail.com> Matt Wilkinson <mattwilki17@gmail.com>
Max <maksym.mosyura@kruschecompany.com> Max <maksym.mosyura@kruschecompany.com>
Maximilian Meyer <Maximilian.Meyer@br.de> Maximilian Meyer <Maximilian.Meyer@br.de>
Md_ZubairAhmed <m-zubairahmed@protonmail.com>
MeiLin <postget.me@gmail.com> MeiLin <postget.me@gmail.com>
MengZhaoFly <1424254461@qq.com> MengZhaoFly <1424254461@qq.com>
Meow-z <372086270@qq.com> Meow-z <372086270@qq.com>
@ -476,6 +554,7 @@ Meowu <474384902@qq.com>
Miaow <i@zfeng.net> Miaow <i@zfeng.net>
Micah Guttman <memtech3@gmail.com> Micah Guttman <memtech3@gmail.com>
Michael Adams <mtadams007@gmail.com> Michael Adams <mtadams007@gmail.com>
Michael Crenshaw <michael@crenshaw.dev>
Michael Krog <mic@apaq.dk> Michael Krog <mic@apaq.dk>
Michael Salaverry <michaels@axonize.com> Michael Salaverry <michaels@axonize.com>
Michael Salaverry <barakplasma@gmail.com> Michael Salaverry <barakplasma@gmail.com>
@ -493,6 +572,7 @@ Min <dicklwm@163.com>
MinJeong Kim <min7859@gmail.com> MinJeong Kim <min7859@gmail.com>
MinYuan <s1124yy@gmail.com> MinYuan <s1124yy@gmail.com>
Ming Hann <eldy8888@gmail.com> Ming Hann <eldy8888@gmail.com>
Minh Quy <sugiacupit@gmail.com>
Minqi Pan <pmq2001@gmail.com> Minqi Pan <pmq2001@gmail.com>
Minsung Ryu <ryums0227@gmail.com> Minsung Ryu <ryums0227@gmail.com>
Minwei Xu <faceswilliam@gmail.com> Minwei Xu <faceswilliam@gmail.com>
@ -501,11 +581,14 @@ Misha Kav <misha.kav@gmail.com>
Mitchell Demler <mitchell.demler@harcourts.net> Mitchell Demler <mitchell.demler@harcourts.net>
Moein Alizadeh <truemoein@gmail.com> Moein Alizadeh <truemoein@gmail.com>
Mohamed Seada <mohamed.seada.1994@gmail.com> Mohamed Seada <mohamed.seada.1994@gmail.com>
Mohammad Anas <mohammad.anas190@gmail.com>
Mohammad Arsalan <a4arshi@yahoo.com>
Mohammad Faisal <faisalhmohd@gmail.com> Mohammad Faisal <faisalhmohd@gmail.com>
Mohan Ban <banmohan@outlook.com> Mohan Ban <banmohan@outlook.com>
Mohelm97 <mohelm97@gmail.com> Mohelm97 <mohelm97@gmail.com>
Mongkii <mongkii@hotmail.com> Mongkii <mongkii@hotmail.com>
Moni <usmoni@gmail.com> Moni <usmoni@gmail.com>
Monty <montyma1207@163.com>
Mounish Sai <pvsmounish@gmail.com> Mounish Sai <pvsmounish@gmail.com>
Mr.Biscuit <sunshuaiqi@gmail.com> Mr.Biscuit <sunshuaiqi@gmail.com>
Mr.Tone <vector@malubei.com> Mr.Tone <vector@malubei.com>
@ -523,12 +606,15 @@ Nathan Wells <nwwells@gmail.com>
Naveen <mailtomassnaveen@gmail.com> Naveen <mailtomassnaveen@gmail.com>
Neekey <ni184775761@gmail.com> Neekey <ni184775761@gmail.com>
Nekron <nekron.hyt@gmail.com> Nekron <nekron.hyt@gmail.com>
Neo Tan <neotan12@hotmail.com>
Neto Braghetto <netow93@gmail.com> Neto Braghetto <netow93@gmail.com>
Neverland <chenjiahan@buaa.edu.cn> Neverland <chenjiahan@buaa.edu.cn>
Nico <nicolas@freddelacompta.com> Nico <nicolas@freddelacompta.com>
Nidhi Agarwal <nidhi.agarwal@zomato.com> Nidhi Agarwal <nidhi.agarwal@zomato.com>
Nihal Saxena <saxenanihal95@gmail.com> Nihal Saxena <saxenanihal95@gmail.com>
Nikesh <nikesh.ramnani@gmail.com>
Nikita Bystrov <arttsesoft@gmail.com> Nikita Bystrov <arttsesoft@gmail.com>
Nikita Marinosyan <nikita.marinosyan@gmail.com>
Nikitenkova <katrin_7nes7@mail.ru> Nikitenkova <katrin_7nes7@mail.ru>
Niko Autio <niko.autio@fenten.fi> Niko Autio <niko.autio@fenten.fi>
Nikolay <veseliy07@gmail.com> Nikolay <veseliy07@gmail.com>
@ -551,6 +637,8 @@ Oren Kosto <orenkosto86@gmail.com>
Oren Kosto <oren@panda-os.com> Oren Kosto <oren@panda-os.com>
Orkhan Huseynli <orkhan.huseyn@outlook.com> Orkhan Huseynli <orkhan.huseyn@outlook.com>
OuYancey <ou.yancey@gmail.com> OuYancey <ou.yancey@gmail.com>
PCCCCCCC <zpc.excel@foxmail.com>
Pablo Recalde <me@pablorecalde.com>
Panjie Setiawan Wicaksono <panjie@panjiesw.com> Panjie Setiawan Wicaksono <panjie@panjiesw.com>
Patrick Gidich <patrick.gidich@simnova.com> Patrick Gidich <patrick.gidich@simnova.com>
Patryk <longer44@gmail.com> Patryk <longer44@gmail.com>
@ -564,12 +652,16 @@ Peter Berg <atticusberg@gmail.com>
Phanupong Janthapoon <panupong.jtp@gmail.com> Phanupong Janthapoon <panupong.jtp@gmail.com>
Philip Oliver <philipodev@gmail.com> Philip Oliver <philipodev@gmail.com>
Phyllis <escapiststupor@gmail.com> Phyllis <escapiststupor@gmail.com>
Picsong <312465087@qq.com>
Pierre <pierre@bazoge.com> Pierre <pierre@bazoge.com>
Pierre Neter <pierreneter@gmail.com> Pierre Neter <pierreneter@gmail.com>
Piotr Monwid-Olechnowicz <hasparus@gmail.com> Piotr Monwid-Olechnowicz <hasparus@gmail.com>
Piper Chester <piperchester@gmail.com> Piper Chester <piperchester@gmail.com>
Pixy Yuan <pixy.bupt@gmail.com> Pixy Yuan <pixy.bupt@gmail.com>
PlayerWho <who.zhuang@gmail.com>
Pob Ch <590650@gmail.com>
Pooya Parsa <pyapar@gmail.com> Pooya Parsa <pyapar@gmail.com>
Primlx <primulax@live.com>
Pubudu Kodikara <pubudu@leafycode.com> Pubudu Kodikara <pubudu@leafycode.com>
Pyiner <lijiuyang1992@gmail.com> Pyiner <lijiuyang1992@gmail.com>
Pyroboomka <qwaarty@mail.ru> Pyroboomka <qwaarty@mail.ru>
@ -597,6 +689,7 @@ Regan Langford <regan.reihana@gmail.com>
Renny Ren <rennyallen@hotmail.com> Renny Ren <rennyallen@hotmail.com>
Renovate Bot <bot@renovateapp.com> Renovate Bot <bot@renovateapp.com>
Rex <zhangzilong.zzl@163.com> Rex <zhangzilong.zzl@163.com>
Ricardo Morais <moraispgsi@gmail.com>
Ricardo Raphael Joson <rrjoson08@gmail.com> Ricardo Raphael Joson <rrjoson08@gmail.com>
Richard D. Worth <rdworth@gmail.com> Richard D. Worth <rdworth@gmail.com>
Rick Zhou <rinick@gmail.com> Rick Zhou <rinick@gmail.com>
@ -608,6 +701,7 @@ Rohan Malhotra <rohan.root@gmail.com>
Rongjian Zhang <pd4d10@gmail.com> Rongjian Zhang <pd4d10@gmail.com>
Rrrandom <emanonhere@gmail.com> Rrrandom <emanonhere@gmail.com>
RunningCoderLee <sprint_l@aliyun.com> RunningCoderLee <sprint_l@aliyun.com>
Ryan Lee <yigexbl@gmail.com>
RyanHui <ryanhui1996@gmail.com> RyanHui <ryanhui1996@gmail.com>
Régis Foucault <regisfoucault@gmail.com> Régis Foucault <regisfoucault@gmail.com>
SHEN Lin <shenlin192@gmail.com> SHEN Lin <shenlin192@gmail.com>
@ -622,6 +716,7 @@ Sam Lanning <sam@samlanning.com>
Sam Marks <sam@sammarks.me> Sam Marks <sam@sammarks.me>
Sam Maxwell <sam@paybase.io> Sam Maxwell <sam@paybase.io>
Samed Düzçay <samedduzcay@gmail.com> Samed Düzçay <samedduzcay@gmail.com>
Sami Mäkinen <zakarfin@gmail.com>
Samuel Gaus <sam@gaus.co.uk> Samuel Gaus <sam@gaus.co.uk>
Sanghyeon Lee <yongdamsh@gmail.com> Sanghyeon Lee <yongdamsh@gmail.com>
Sangle <whb97@163.com> Sangle <whb97@163.com>
@ -632,14 +727,18 @@ Scott Goci <scottjg@gmail.com>
Scott Sturgeon <scott@tugboatlogic.com> Scott Sturgeon <scott@tugboatlogic.com>
Sean Lin <sean@ejoy.com> Sean Lin <sean@ejoy.com>
Sean Willis <sean.willis@incorta.com> Sean Willis <sean.willis@incorta.com>
Seba Kerckhof <seba.kerckhof@gmail.com>
Sebastian Blade <blade254353074@hotmail.com> Sebastian Blade <blade254353074@hotmail.com>
Sebastian Busch <s.busch@obg-gruppe.de> Sebastian Busch <s.busch@obg-gruppe.de>
Sebastian Busch <mail@sebastian-bus.ch> Sebastian Busch <mail@sebastian-bus.ch>
Sebastian Busch <s.busch@qbus-enet.de> Sebastian Busch <s.busch@qbus-enet.de>
Sepush <sepush@outlook.com>
Sergey Kachanovskiy <sergey.kachanovskiy@gmx.de>
Sergey Levkovich <gosu.87@mail.ru> Sergey Levkovich <gosu.87@mail.ru>
Sergey Volynkin <sergey.volynkin@akvelon.com> Sergey Volynkin <sergey.volynkin@akvelon.com>
Sergio Crisostomo <sergiosbox@gmail.com> Sergio Crisostomo <sergiosbox@gmail.com>
Sevak <shaderzak@gmail.com> Sevak <shaderzak@gmail.com>
Shanjie Chen <cnzxcsj@outlook.com>
Shawn Sit <xueqingxiao@gmail.com> Shawn Sit <xueqingxiao@gmail.com>
Shengnan <baxtergu@gmail.com> Shengnan <baxtergu@gmail.com>
ShiTengFei <shitengfei@goyoo.com> ShiTengFei <shitengfei@goyoo.com>
@ -656,35 +755,46 @@ Sivaraj <contact@sdev.in>
SkyAo <csvwolf@qq.com> SkyAo <csvwolf@qq.com>
Skylar艺璇 <mengxue.yx@gmail.com> Skylar艺璇 <mengxue.yx@gmail.com>
Snyk bot <github+bot@snyk.io> Snyk bot <github+bot@snyk.io>
Songhn <songhn233@gmail.com>
Sonjeet Paul <sonjeetcp.98@gmail.com> Sonjeet Paul <sonjeetcp.98@gmail.com>
SoraYama <sorayamahou@gmail.com> SoraYama <sorayamahou@gmail.com>
Spencer <spjy@hawaii.edu> Spencer <spjy@hawaii.edu>
Stanley Thijssen <stanley.thijssen@energybox.com> Stanley Thijssen <stanley.thijssen@energybox.com>
Stanley Thijssen <stanley.thijssen@gmail.com> Stanley Thijssen <stanley.thijssen@gmail.com>
Stef Schenkelaars <stef.schenkelaars@gmail.com>
Stephen Esser <Stephen.Esser@gmail.com> Stephen Esser <Stephen.Esser@gmail.com>
Stevche Radevski <sradevski@live.com> Stevche Radevski <sradevski@live.com>
Steven.zhong <953665604@qq.com>
Subroto <shub1493biswas@gmail.com> Subroto <shub1493biswas@gmail.com>
Suki小火车 <463355954@qq.com> Suki小火车 <463355954@qq.com>
Sumit Vekariya <sumitvekariya7@gmail.com> Sumit Vekariya <sumitvekariya7@gmail.com>
Sunny Luo <sunnylqm@gmail.com>
Sven Efftinge <sven.efftinge@typefox.io> Sven Efftinge <sven.efftinge@typefox.io>
SyMind <dacongsama@live.com>
SylvanasGone <397009765@qq.com> SylvanasGone <397009765@qq.com>
TTC <345866517@qq.com> TTC <345866517@qq.com>
Tanmoy Bhowmik <tanmoy.openroot@gmail.com> Tanmoy Bhowmik <tanmoy.openroot@gmail.com>
Tannmay S Gupta <tanmaygup123@gmail.com> Tannmay S Gupta <tanmaygup123@gmail.com>
Tao <magicdawn@qq.com> Tao <magicdawn@qq.com>
Tao Zhang <windse7en@gmail.com> Tao Zhang <windse7en@gmail.com>
Taucher Christoph <taucher.ch@gmail.com>
Taylor Sabell <taylorsabell@gmail.com> Taylor Sabell <taylorsabell@gmail.com>
Ted Shin <ted.m.shin@gmail.com>
Teng YANG <morenyang88@gmail.com> Teng YANG <morenyang88@gmail.com>
Teng YANG <yangteng@me.com> Teng YANG <yangteng@me.com>
Tengjiao Cai <caitengjiao1987@gmail.com> Tengjiao Cai <caitengjiao1987@gmail.com>
Terence <trence320@163.com> Terence <trence320@163.com>
The Rock <zhoguoxin@126.com> The Rock <zhoguoxin@126.com>
Themi Tsiotas von Pfaler <themi1234@gmail.com>
Theo Satloff <1golfball@gmail.com> Theo Satloff <1golfball@gmail.com>
Thibault Derousseaux <tde@activeviam.com> Thibault Derousseaux <tde@activeviam.com>
Thiebaud Thomas <thiebaud.tom@gmail.com> Thiebaud Thomas <thiebaud.tom@gmail.com>
Thomas <tom@axisj.com> Thomas <tom@axisj.com>
Thomas Ladd <thomas.ladd@stackpath.com> Thomas Ladd <thomas.ladd@stackpath.com>
Thomas Zipner <thomas.zipner@gmail.com>
Tianyuan Zhang <tianyuan233.zhang@gmail.com>
Tino D <ginodeis@gmail.com> Tino D <ginodeis@gmail.com>
Tmk <i@tmk.im>
Tom Gao <tom@zoomsoft.cc> Tom Gao <tom@zoomsoft.cc>
Tom Xu <ycxzhkx@gmail.com> Tom Xu <ycxzhkx@gmail.com>
Tom Xu <tom.xu@antcosa.com> Tom Xu <tom.xu@antcosa.com>
@ -699,10 +809,12 @@ TsesamLi <tsesamli17@gmail.com>
Ty Mick <ty@tymick.me> Ty Mick <ty@tymick.me>
Tyler <chaotyler@gmail.com> Tyler <chaotyler@gmail.com>
Ubaldo Quintana <blkdr@hotmail.com> Ubaldo Quintana <blkdr@hotmail.com>
Uladzimir Atroshchanka <Uladzimir.Atroshchanka@vertexinc.com>
Vadim Macagon <vadim.macagon@gmail.com> Vadim Macagon <vadim.macagon@gmail.com>
Valentin Vichnal <valentin@vichnal.com> Valentin Vichnal <valentin@vichnal.com>
Van Nguyen <vnguyen94@gmail.com> Van Nguyen <vnguyen94@gmail.com>
Varun Dey <varundey20@gmail.com> Varun Dey <varundey20@gmail.com>
Varun Sharma <varunsh@stepsecurity.io>
Vemund Santi <vemund@santi.no> Vemund Santi <vemund@santi.no>
Vic <709147950@qq.com> Vic <709147950@qq.com>
Victor <saptefrativictor@gmail.com> Victor <saptefrativictor@gmail.com>
@ -714,6 +826,7 @@ Viorel Cojocaru <vio@beanon.com>
Vitaliy Mazurenko <vitaliymazurenko@gmail.com> Vitaliy Mazurenko <vitaliymazurenko@gmail.com>
Vitaly Budovski <vbudovski@gmail.com> Vitaly Budovski <vbudovski@gmail.com>
ViviaRui <zr1450995198@163.com> ViviaRui <zr1450995198@163.com>
Vlad Vovk <wolfykey@gmail.com>
Vu Hoang Minh <vuhminh@gmail.com> Vu Hoang Minh <vuhminh@gmail.com>
Vyacheslav Kamenev <vy.kamenev@gmail.com> Vyacheslav Kamenev <vy.kamenev@gmail.com>
Walter Barbagallo <brb.walter@gmail.com> Walter Barbagallo <brb.walter@gmail.com>
@ -725,7 +838,9 @@ Wang yb <wangyibu123@gmail.com>
Warren Seymour <warren@fountainhead.tech> Warren Seymour <warren@fountainhead.tech>
Webber Takken <webber@takken.io> Webber Takken <webber@takken.io>
Wei Zhu <yesmeck@gmail.com> Wei Zhu <yesmeck@gmail.com>
WeijieChen <cwjTerrace@163.com>
Wenchao Hu <zjuhwc@gmail.com> Wenchao Hu <zjuhwc@gmail.com>
Wendell <wendellhu95@outlook.com>
Wendell <wendzhue@gmail.com> Wendell <wendzhue@gmail.com>
Wenqi Chen <1264578441@qq.com> Wenqi Chen <1264578441@qq.com>
Wensheng Xu <xws@superid.cn> Wensheng Xu <xws@superid.cn>
@ -737,6 +852,7 @@ William Stein <wstein@gmail.com>
WingGao <wing.gao@live.com> WingGao <wing.gao@live.com>
Wu Haotian <whtsky@gmail.com> Wu Haotian <whtsky@gmail.com>
WuJiali <18767152447@163.com> WuJiali <18767152447@163.com>
X-Jagger <xl.jagger@gmail.com>
XBTop1! <xbtop1@gmail.com> XBTop1! <xbtop1@gmail.com>
XTY <^@xty.dev> XTY <^@xty.dev>
Xiaoming <yokiming1994@gmail.com> Xiaoming <yokiming1994@gmail.com>
@ -744,6 +860,7 @@ Xie Guanglei <xieguanglei@hotmail.com>
Xinxing Li <lixinxing.2019@bytedance.com> Xinxing Li <lixinxing.2019@bytedance.com>
Xinzhe Wang <me@imwxz.com> Xinzhe Wang <me@imwxz.com>
Xiping.wang <527409987@qq.com> Xiping.wang <527409987@qq.com>
Xu Zhiwei <gcdxuzhiwei@gmail.com>
XuMM_12 <owiatsq@sina.cn> XuMM_12 <owiatsq@sina.cn>
Xudong Cai <fifsky@gmail.com> Xudong Cai <fifsky@gmail.com>
Xudong Huang <me@xudong.dev> Xudong Huang <me@xudong.dev>
@ -763,11 +880,13 @@ Yu <yutingzhao1991@sina.com>
Yu Mao <maoyulore@outlook.com> Yu Mao <maoyulore@outlook.com>
Yu Mao <maoyu960320@hotmail.com> Yu Mao <maoyu960320@hotmail.com>
YuChao Liang <l.yuch@foxmail.com> YuChao Liang <l.yuch@foxmail.com>
YuTao <yutao0818@vip.qq.com>
Yuan <1076849402@qq.com> Yuan <1076849402@qq.com>
Yuhang Liu <644186735@qq.com> Yuhang Liu <644186735@qq.com>
Yulia Maximova <juliam2007@mail.ru> Yulia Maximova <juliam2007@mail.ru>
Yunfly <120562638@qq.com> Yunfly <120562638@qq.com>
Yunus EŞ <yunus@yunuses.com> Yunus EŞ <yunus@yunuses.com>
Yunwoo Ji <unu12073@gmail.com>
Yuri Pirola <yuri.pirola@unimi.it> Yuri Pirola <yuri.pirola@unimi.it>
Yury Kozyrev <urakozz@me.com> Yury Kozyrev <urakozz@me.com>
Yusuke Ito <novi.mad@gmail.com> Yusuke Ito <novi.mad@gmail.com>
@ -776,32 +895,40 @@ Yuxuan Huo <yuxuan.huo2011@gmail.com>
YuyingWu <wuyuying1128@gmail.com> YuyingWu <wuyuying1128@gmail.com>
ZHANGYU <723156735@qq.com> ZHANGYU <723156735@qq.com>
ZYSzys <zyszys98@gmail.com> ZYSzys <zyszys98@gmail.com>
Zach Bird <546439325@qq.com>
Zack Amiton <zamiton@outlook.com>
Zack Craig <zack@zack6849.com> Zack Craig <zack@zack6849.com>
Zap <a124116186@qq.com> Zap <a124116186@qq.com>
ZeroToOne <igeeke@163.com> ZeroToOne <igeeke@163.com>
Zester Quinn Albano <zesterquinn.albano@gmail.com> Zester Quinn Albano <zesterquinn.albano@gmail.com>
Zgo <zguoby@gmail.com>
Zhang Zhi <fytriht@gmail.com> Zhang Zhi <fytriht@gmail.com>
Zheeeng <hi@zheeeng.me> Zheeeng <hi@zheeeng.me>
Zhiqiang Gong <elory0513@hotmail.com> Zhiqiang Gong <elory0513@hotmail.com>
ZhouZhen <503633021@qq.com>
Zhuo Chen <chenzhuo@caicloud.io> Zhuo Chen <chenzhuo@caicloud.io>
Ziluo <gyfzzu@gmail.com> Ziluo <gyfzzu@gmail.com>
Zohaib Ijaz <mzohaib.qc@gmail.com> Zohaib Ijaz <mzohaib.qc@gmail.com>
Zzzen <843968788@qq.com> Zzzen <843968788@qq.com>
_XiaoTian <istianlei@qq.com>
aLIEzsss4 <15624958088@163.com> aLIEzsss4 <15624958088@163.com>
aashutoshrathi <aashutoshrathi@gmail.com> aashutoshrathi <aashutoshrathi@gmail.com>
acfasj <acfasj@gmail.com>
adam <adamwu1992@163.com> adam <adamwu1992@163.com>
afc163 <afc163@gmail.com> afc163 <afc163@gmail.com>
agent-z <1607291079@qq.com> agent-z <1607291079@qq.com>
aghArdeshir <ardeshireo@gmail.com>
ahalimkara <ahalimkara@gmail.com> ahalimkara <ahalimkara@gmail.com>
ajuner <106791576@qq.com>
alekslario <aleksandlario@gmail.com> alekslario <aleksandlario@gmail.com>
alex89lj <379118572@qq.com> alex89lj <379118572@qq.com>
alexchen <alexchen@easyops.cn> alexchen <alexchen@easyops.cn>
amedora <americandragsterracing@gmail.com> amedora <americandragsterracing@gmail.com>
aoxiang78 <ao_xiang@live.com>
appleshell <appleshell@outlook.com> appleshell <appleshell@outlook.com>
arange <panpan2558@gmail.com> arange <panpan2558@gmail.com>
arifemrecelik <ce.arifemre@gmail.com> arifemrecelik <ce.arifemre@gmail.com>
arturpfb <arturpfb@gmail.com> arturpfb <arturpfb@gmail.com>
ascodelife <394922886@qq.com>
ascoders <576625322@qq.com> ascoders <576625322@qq.com>
ashishg-qburst <ashishg@qburst.com> ashishg-qburst <ashishg@qburst.com>
atomoo <yangpein@gmail.com> atomoo <yangpein@gmail.com>
@ -812,9 +939,11 @@ baidumap <460807394@qq.com>
bang <sqibang@gmail.com> bang <sqibang@gmail.com>
baozefeng <727751065@qq.com> baozefeng <727751065@qq.com>
bcd337 <b.bcd337@gmail.com> bcd337 <b.bcd337@gmail.com>
benben <jinwentao0914@dingtalk.com>
bigbigbo <zxb141242@163.com> bigbigbo <zxb141242@163.com>
binyellow <571704908@qq.com> binyellow <571704908@qq.com>
blankzust <450811238@qq.com> blankzust <450811238@qq.com>
btea <2356281422@qq.com>
bukas <yhz1219@gmail.com> bukas <yhz1219@gmail.com>
byuanama <byuan@ama.com.au> byuanama <byuan@ama.com.au>
byzyk <bohdan.kh@gmail.com> byzyk <bohdan.kh@gmail.com>
@ -827,6 +956,7 @@ cc189 <cc189dev@gmail.com>
chaofeis <408067385@qq.com> chaofeis <408067385@qq.com>
chchen <cc272309126@gmail.com> chchen <cc272309126@gmail.com>
chen wen jun <731028571@qq.com> chen wen jun <731028571@qq.com>
chen-jingjie <2383844893@qq.com>
chencheng (云谦) <sorrycc@gmail.com> chencheng (云谦) <sorrycc@gmail.com>
chenlei <745512023@qq.com> chenlei <745512023@qq.com>
chenlong <long.chen@abssqr.com> chenlong <long.chen@abssqr.com>
@ -850,6 +980,7 @@ davidhatten <david.r.hatten@gmail.com>
ddcat1115 <ddcat1115@gmail.com> ddcat1115 <ddcat1115@gmail.com>
decade <decadef20@gmail.com> decade <decadef20@gmail.com>
delesseps <andrewlessels@gmail.com> delesseps <andrewlessels@gmail.com>
dengqing <1247748612@qq.com>
denzw <denzw@21cn.com> denzw <denzw@21cn.com>
dependabot[bot] <support@dependabot.com> dependabot[bot] <support@dependabot.com>
desperado <yuwei_149@163.com> desperado <yuwei_149@163.com>
@ -861,6 +992,7 @@ djorkaeff <djorkae55@gmail.com>
dolfje <nikosverschore@gmail.com> dolfje <nikosverschore@gmail.com>
douxc <douxc512@gmail.com> douxc <douxc512@gmail.com>
dpyzo0o <yang.xu940121@outlook.com> dpyzo0o <yang.xu940121@outlook.com>
dujun <emolingzhu@126.com>
duzliang <duzliang@gmail.com> duzliang <duzliang@gmail.com>
edgji <j.edgji@gmail.com> edgji <j.edgji@gmail.com>
eidonjoe <806488716@qq.com> eidonjoe <806488716@qq.com>
@ -877,11 +1009,14 @@ flashback313 <windmark2012@gmail.com>
flyerH <hzw758@qq.com> flyerH <hzw758@qq.com>
frezc <504021398@qq.com> frezc <504021398@qq.com>
gaoryrt <gaoryrt@gmail.com> gaoryrt <gaoryrt@gmail.com>
gaozhenqian <837856276@qq.com>
genie <genie88@163.com> genie <genie88@163.com>
gepd <guillermoepd@hotmail.com>
godfather <greenday.wj@foxmail.com> godfather <greenday.wj@foxmail.com>
gregahren <grega.hren@gmail.com> gregahren <grega.hren@gmail.com>
gxvv <gaoxin18000@gmail.com> gxvv <gaoxin18000@gmail.com>
gyh9457 <gyh9457@163.com> gyh9457 <gyh9457@163.com>
gzq <zguoby@gmail.com>
haianweifeng <1531297152@qq.com> haianweifeng <1531297152@qq.com>
haimrait <haimrait@gmail.com> haimrait <haimrait@gmail.com>
handy <lihandi@gmail.com> handy <lihandi@gmail.com>
@ -895,6 +1030,7 @@ hauwa123 <hauwa.aminu@outlook.com>
hebingchang <hebingchang1@live.com> hebingchang <hebingchang1@live.com>
hehe <xpc1993@gmail.com> hehe <xpc1993@gmail.com>
hehe <xpc_kacl@163.com> hehe <xpc_kacl@163.com>
hello-chinese <841030329@qq.com>
henryv0 <henryvo94@gmail.com> henryv0 <henryvo94@gmail.com>
hi-caicai <hi@cai-cai.me> hi-caicai <hi@cai-cai.me>
hicrystal <295247343@qq.com> hicrystal <295247343@qq.com>
@ -904,6 +1040,8 @@ huangyan.py <huangyan.py@bytedance.com>
hugorezende <hugorezendedev@gmail.com> hugorezende <hugorezendedev@gmail.com>
huishiyi <zhou1maple@gmail.com> huishiyi <zhou1maple@gmail.com>
huzzbuzz <huzzbuzz@outlook.com> huzzbuzz <huzzbuzz@outlook.com>
hydraZty <670688667@qq.com>
i3web <itnote@qq.com>
iamcastelli <sowed@cyberdude.com> iamcastelli <sowed@cyberdude.com>
iamkun <kunhello@outlook.com> iamkun <kunhello@outlook.com>
ibrahim velinov <ibsukru@gmail.com> ibrahim velinov <ibsukru@gmail.com>
@ -912,6 +1050,8 @@ int2d <int2d@qq.com>
iojichervo <ioji@chervonagura.com.ar> iojichervo <ioji@chervonagura.com.ar>
ioldfish <fish.wangl@gmail.com> ioldfish <fish.wangl@gmail.com>
iorikingdom <iorikingdom@hotmail.com> iorikingdom <iorikingdom@hotmail.com>
isakol <isakol@kth.se>
itibbers <jxn2014@gmail.com>
iugo <iugogogo@gmail.com> iugo <iugogogo@gmail.com>
j3l11234 <297259024@qq.com> j3l11234 <297259024@qq.com>
jasonslyvia <jasonslyvia@gmail.com> jasonslyvia <jasonslyvia@gmail.com>
@ -925,11 +1065,11 @@ jieniu$ <jienius@outlook.com>
jinouwuque <ee2win@gmail.com> jinouwuque <ee2win@gmail.com>
jinyaqiao1102 <405782493@QQ.com> jinyaqiao1102 <405782493@QQ.com>
jojoLockLock <miffyschou@sina.com> jojoLockLock <miffyschou@sina.com>
jueinin <1014397160@qq.com>
junjing.zhang <zhangjunjing@gmail.com> junjing.zhang <zhangjunjing@gmail.com>
kacjay <45483388@qq.com> kacjay <45483388@qq.com>
kaifei <150641329@qq.com> kaifei <150641329@qq.com>
kailunyao <kailunyao@163.com> kailunyao <kailunyao@163.com>
kanweiwei <kwwnjujlc@sina.com>
kanweiwei <475801900@qq.com> kanweiwei <475801900@qq.com>
kaoding <41830859@qq.com> kaoding <41830859@qq.com>
kasinooya <kasinooya@gmail.com> kasinooya <kasinooya@gmail.com>
@ -940,6 +1080,7 @@ kdepp <kdepp.cd@gmail.com>
keng <keng@renderinghouse.com> keng <keng@renderinghouse.com>
kenve <zwei.xie@gmail.com> kenve <zwei.xie@gmail.com>
kermolaev <kermolaev@cloudally.com> kermolaev <kermolaev@cloudally.com>
kily zhou <keeliizhou@gmail.com>
klouskingsley <harry_tse@163.com> klouskingsley <harry_tse@163.com>
ko <git@yaksok.net> ko <git@yaksok.net>
konakona <lovekonakona@gmail.com> konakona <lovekonakona@gmail.com>
@ -962,6 +1103,7 @@ liekkas <zjq0717@163.com>
lihqi <455711093@qq.com> lihqi <455711093@qq.com>
lilun <lilun_cd@keruyun.com> lilun <lilun_cd@keruyun.com>
limingxin <906529775@qq.com> limingxin <906529775@qq.com>
lisenenkov <lisenenkov@mail.ru>
littleLane <857183384@qq.com> littleLane <857183384@qq.com>
liuchuzhang <liuweiminer@hotmail.com> liuchuzhang <liuweiminer@hotmail.com>
liuchuzhang <liuweiminer@126.com> liuchuzhang <liuweiminer@126.com>
@ -975,6 +1117,7 @@ luyiming <luyimingchn@gmail.com>
lvren <luren6049@qq.com> lvren <luren6049@qq.com>
lxnxbnq <yuanddmail@163.com> lxnxbnq <yuanddmail@163.com>
lyhper <lyhper@gmail.com> lyhper <lyhper@gmail.com>
lyon.han <lyon.han.china@outlook.com>
mArker <252133226@qq.com> mArker <252133226@qq.com>
maks <pine3ree@gmail.com> maks <pine3ree@gmail.com>
maximest-pierre <me@maximest-pierre.me> maximest-pierre <me@maximest-pierre.me>
@ -982,6 +1125,7 @@ melchior voidwolf <kmno4k2mno4@gmail.com>
memoryza <jincai.wang@foxmail.com> memoryza <jincai.wang@foxmail.com>
mgrdevport <mgrdevport@gmail.com> mgrdevport <mgrdevport@gmail.com>
mingyan.yu <mingyan.yu@wormpex.com> mingyan.yu <mingyan.yu@wormpex.com>
miracles1919 <516571350@qq.com>
mjfwebb <bugeyedboy@gmail.com> mjfwebb <bugeyedboy@gmail.com>
mkermani144 <mkermani144@gmail.com> mkermani144 <mkermani144@gmail.com>
mmmveggies <jakeselig@gmail.com> mmmveggies <jakeselig@gmail.com>
@ -993,6 +1137,7 @@ mumiao <mumiao@dtstack.com>
mushan0x0 <mushan0x0@gmail.com> mushan0x0 <mushan0x0@gmail.com>
muzuiget <muzuiget@gmail.com> muzuiget <muzuiget@gmail.com>
natergj <nater_nater@me.com> natergj <nater_nater@me.com>
netcon <netcon@live.com>
ngolin <poodll@163.com> ngolin <poodll@163.com>
nick-ChenZe <chenze2168@gmail.com> nick-ChenZe <chenze2168@gmail.com>
niko <644506165@qq.com> niko <644506165@qq.com>
@ -1003,6 +1148,7 @@ oldchicken <www.chao3208525@qq.com>
paleface001 <liuye10@yahoo.com> paleface001 <liuye10@yahoo.com>
paranoidjk <hust2012jiangkai@gmail.com> paranoidjk <hust2012jiangkai@gmail.com>
parlop <parlop@gmail.com> parlop <parlop@gmail.com>
paul <34345790@qq.com>
pbrink231 <pbrink231@gmail.com> pbrink231 <pbrink231@gmail.com>
peiming <hyrijk@gmail.com> peiming <hyrijk@gmail.com>
pengtikui <949828390@qq.com> pengtikui <949828390@qq.com>
@ -1022,6 +1168,7 @@ qramilq <ramirez99@mail.ru>
qubaoming <qubaoming@didichuxing.com> qubaoming <qubaoming@didichuxing.com>
ravirambles <ravirambles@gmail.com> ravirambles <ravirambles@gmail.com>
realEago <774855001@qq.com> realEago <774855001@qq.com>
renzhao1113 <547249523@qq.com>
richardison <richard.ison@carleton.ca> richardison <richard.ison@carleton.ca>
ryangun <ryangun@foxmail.com> ryangun <ryangun@foxmail.com>
ryanhoho <hswacoal@gmail.com> ryanhoho <hswacoal@gmail.com>
@ -1031,6 +1178,7 @@ sallen450 <jqh101@sina.com>
samir elsharkawy <samir.elsharkawy@gmail.com> samir elsharkawy <samir.elsharkawy@gmail.com>
sdli <1669375803@qq.com> sdli <1669375803@qq.com>
seognil LC <seognil@gmail.com> seognil LC <seognil@gmail.com>
serializedowen <wjh199455@gmail.com>
sfturing <sfturing@gmail.com> sfturing <sfturing@gmail.com>
shangyuan.ning <shangyuan.ning@manaowan.com> shangyuan.ning <shangyuan.ning@manaowan.com>
shawtung <shawtung@qq.com> shawtung <shawtung@qq.com>
@ -1045,8 +1193,10 @@ snadn <snadn@snadn.cn>
snail <120216220@qq.com> snail <120216220@qq.com>
soeyi <sixinlei0927@gmail.com> soeyi <sixinlei0927@gmail.com>
sojournerc <cmeyer@zvelo.com> sojournerc <cmeyer@zvelo.com>
soso <ethdud1@gmail.com>
sosohime <theziming@126.com> sosohime <theziming@126.com>
spideeee <spideeee@github.com> spideeee <spideeee@github.com>
stefango <nankongyinan@gmail.com>
stevenyuysy <stevenyuysy@gmail.com> stevenyuysy <stevenyuysy@gmail.com>
stickmy <stickmyc@gmail.com> stickmy <stickmyc@gmail.com>
susiwen8 <susiwen8@gmail.com> susiwen8 <susiwen8@gmail.com>
@ -1067,7 +1217,10 @@ toshi1127 <toshi.matsumoto.2n@stu.hosei.ac.jp>
twobin <twobin@live.com> twobin <twobin@live.com>
u3u <qwq@qwq.cat> u3u <qwq@qwq.cat>
ubuntugod <adarshron@gmail.com> ubuntugod <adarshron@gmail.com>
uchanlee <uchanlee.dev@gmail.com>
undefined <johann@objekt.stream>
undefined <undefined> undefined <undefined>
unknown <tongsiyuan@corp.netease.com>
unknown <chenyizhongx@gmail.com> unknown <chenyizhongx@gmail.com>
ustccjw <317713370@qq.com> ustccjw <317713370@qq.com>
vagusX <vagusxl@gmail.com> vagusX <vagusxl@gmail.com>
@ -1075,10 +1228,15 @@ valleykid <valleykiddy@gmail.com>
vaytsel <vaytsel@gmail.com> vaytsel <vaytsel@gmail.com>
veveue <veveue@dingtalk.com> veveue <veveue@dingtalk.com>
vgeyi <vgeyiz@126.com> vgeyi <vgeyiz@126.com>
vldh <lidahao@sisyphe.com.cn>
vldh <alwaysloseall@sina.com> vldh <alwaysloseall@sina.com>
vouis <16nding@gmail.com> vouis <16nding@gmail.com>
wa-ri <tztl1995@gmail.com> wa-ri <tztl1995@gmail.com>
wadezhan <wadezhan@tencent.com> wadezhan <wadezhan@tencent.com>
wan wan <wancihua@qq.com>
wangao <jameslahm17@gmail.com>
wangao <1366463855@qq.com>
wangao <wa17@mails.tsinghua.edu.cn>
wangshantao <605682551@qq.com> wangshantao <605682551@qq.com>
wangshuai <wangshuai@momenta.ai> wangshuai <wangshuai@momenta.ai>
wangtao0101 <yuecjn@gmail.com> wangtao0101 <yuecjn@gmail.com>
@ -1093,6 +1251,7 @@ wendellhu <wendellhu95@gmail.com>
wenhong <wenhong.zw@antfin.com> wenhong <wenhong.zw@antfin.com>
whinc <whincwu@163.com> whinc <whincwu@163.com>
whtang906 <whtang906@gmail.com> whtang906 <whtang906@gmail.com>
whwangms <whwangms@outlook.com>
willc001 <will.c001@163.com> willc001 <will.c001@163.com>
wizawu <wizawu@gmail.com> wizawu <wizawu@gmail.com>
wleven <408493323@qq.com> wleven <408493323@qq.com>
@ -1117,6 +1276,8 @@ y-take <y.takey@gmail.com>
yanguoyu <841185308@qq.com> yanguoyu <841185308@qq.com>
yangwukang <yangwukang@boco.com.cn> yangwukang <yangwukang@boco.com.cn>
yangxiaolin <yangxiao2810279802@gmail.com> yangxiaolin <yangxiao2810279802@gmail.com>
yanm1ng <644169721@qq.com>
yaoweiprc <yaoweiprc@hotmail.com>
ycjcl868 <45808948@qq.com> ycjcl868 <45808948@qq.com>
ye4241 <ye4241@gmail.com> ye4241 <ye4241@gmail.com>
yehq <yedi728@qq.com> yehq <yedi728@qq.com>
@ -1125,7 +1286,9 @@ yeshan333 <1329441308@qq.com>
yibu.wang <yibu.wang@orion.co.com> yibu.wang <yibu.wang@orion.co.com>
yiminanci <yiminanci@gmail.com> yiminanci <yiminanci@gmail.com>
yiminghe <yiminghe@gmail.com> yiminghe <yiminghe@gmail.com>
yingxirz <inseeing@gmail.com>
youmoo <youmoo@vellichor.me> youmoo <youmoo@vellichor.me>
youngz <chinayangzhan@126.com>
yuche <i@yuche.me> yuche <i@yuche.me>
yuezk <yuezk001@gmail.com> yuezk <yuezk001@gmail.com>
yui <1151815317@qq.com> yui <1151815317@qq.com>
@ -1141,19 +1304,23 @@ zhangpc <zhangpc@tenxcloud.com>
zhangyangxue <383632607@qq.com> zhangyangxue <383632607@qq.com>
zhangyanling77 <18783226594@163.com> zhangyanling77 <18783226594@163.com>
zhangzh <zhangzh@cnlemon.net> zhangzh <zhangzh@cnlemon.net>
zhao-huo-long <lijiuyi1995@outlook.com>
zhaocai <lzc09008@gmail.com> zhaocai <lzc09008@gmail.com>
zhaopeidong <lwindscar@gmail.com> zhaopeidong <lwindscar@gmail.com>
zhenfan.yu <fanerge@qq.com>
zhuguibiao <505418722@qq.com> zhuguibiao <505418722@qq.com>
zhujun24 <zhujun87654321@gmail.com> zhujun24 <zhujun87654321@gmail.com>
zhyupe <zyp108421@gmail.com>
zilong <jzlxiaohei@163.com> zilong <jzlxiaohei@163.com>
zinkey <yaya@uloveit.com.cn> zinkey <yaya@uloveit.com.cn>
zj9495 <zj9495@gmail.com> zj9495 <zj9495@gmail.com>
zjf <zjffun@gmail.com>
zkwolf <chenhao5866@gmail.com> zkwolf <chenhao5866@gmail.com>
zlljqn <zlljqn@gmail.com> zlljqn <zlljqn@gmail.com>
zollero <corona7@163.com> zollero <corona7@163.com>
zombiej <smith3816@gmail.com>
zongzi531 <zongzi.xy@gmail.com> zongzi531 <zongzi.xy@gmail.com>
zoomdong <1344492820@qq.com> zoomdong <1344492820@qq.com>
zqran <uuxnet@gmail.com>
ztplz <mysticzt@gmail.com> ztplz <mysticzt@gmail.com>
zuiidea <zuiiidea@gmail.com> zuiidea <zuiiidea@gmail.com>
zx6658 <zx6658@naver.com> zx6658 <zx6658@naver.com>
@ -1167,9 +1334,10 @@ zytjs <yitongzhao@163.com>
不吃猫的鱼 <michael2ib1989@gmail.com> 不吃猫的鱼 <michael2ib1989@gmail.com>
丶尘殇 <sean.snow@live.com> 丶尘殇 <sean.snow@live.com>
乔奕轩 <qiao_yixuan@163.com> 乔奕轩 <qiao_yixuan@163.com>
九思⚡⚡⚡ <2228429150@qq.com>
二哲 <kodo@forchange.cn> 二哲 <kodo@forchange.cn>
二手掉包工程师 <rustin.liu@gmail.com> 二手掉包工程师 <rustin.liu@gmail.com>
二货机器人 <smith3816@gmail.com> 云剪者 <584518260@qq.com>
付引 <xxxquotes@gmail.com> 付引 <xxxquotes@gmail.com>
何乐 <work@imhele.com> 何乐 <work@imhele.com>
何志勇 <15988134176@163.com> 何志勇 <15988134176@163.com>
@ -1199,25 +1367,31 @@ zytjs <yitongzhao@163.com>
廖应龙 <vigossliao@gmail.com> 廖应龙 <vigossliao@gmail.com>
廖星 <liaoxing.lx@bytedance.com> 廖星 <liaoxing.lx@bytedance.com>
张大大 <249812928@qq.com> 张大大 <249812928@qq.com>
张威 <1051127659@qq.com>
张秀玲 <18811794335@163.com> 张秀玲 <18811794335@163.com>
徐坤龙 <272992168@qq.com> 徐坤龙 <272992168@qq.com>
徐新航 <xuxinhang@bytedance.com> 徐新航 <xuxinhang@bytedance.com>
愚道 <tingzhao.ytz@antfin.com> 愚道 <tingzhao.ytz@antfin.com>
曾凯 <zengkai2009@foxmail.com> 曾凯 <zengkai2009@foxmail.com>
期贤 <qixian.cs@antgroup.com>
朮厃 <cn.ah.liu@gmail.com> 朮厃 <cn.ah.liu@gmail.com>
李环冀 <158757774@qq.com> 李环冀 <158757774@qq.com>
杨兴洲 <dr2009.china@gmail.com>
杨哲迪 <yangzhedi@yidian-inc.com> 杨哲迪 <yangzhedi@yidian-inc.com>
杨小事er <Uiryzd@163.com> 杨小事er <Uiryzd@163.com>
松子 <window.pibarr@gmail.com> 松子 <window.pibarr@gmail.com>
林煌东 <10543563@qq.com>
柚子男 <yozman@sina.com> 柚子男 <yozman@sina.com>
沐霖 <304647173@qq.com> 沐霖 <304647173@qq.com>
爱but的苍蝇 <354788473@qq.com> 爱but的苍蝇 <354788473@qq.com>
王林涛 <hzwanglintao@corp.netease.com> 王林涛 <hzwanglintao@corp.netease.com>
王浩 <boomler@hotmail.com>
王集鹄 <wjhu111@21cn.com> 王集鹄 <wjhu111@21cn.com>
琚致远 <juzhiyuan@apache.org> 琚致远 <juzhiyuan@apache.org>
白羊座小葛 <abeyuhang@gmail.com> 白羊座小葛 <abeyuhang@gmail.com>
砖家 <brickspert.fjl@antfin.com> 砖家 <brickspert.fjl@antfin.com>
砖家 <576679268@qq.com> 砖家 <576679268@qq.com>
章鱼 <ryker.zy@gmail.com>
竹尔 <Juelchiang@gmail.com> 竹尔 <Juelchiang@gmail.com>
米老朱 <laozhu.me@gmail.com> 米老朱 <laozhu.me@gmail.com>
精武陈真 <546369005@qq.com> 精武陈真 <546369005@qq.com>
@ -1232,11 +1406,12 @@ zytjs <yitongzhao@163.com>
蔡伦 <sliuqin@gmail.com> 蔡伦 <sliuqin@gmail.com>
薛定谔的猫 <weiran.zsd@outlook.com> 薛定谔的猫 <weiran.zsd@outlook.com>
薛定谔的猫 <hh_2013@foxmail.com> 薛定谔的猫 <hh_2013@foxmail.com>
诸岳 <fuping.dfp@antgroup.com>
诸岳 <fuping.dfp@antfin.com> 诸岳 <fuping.dfp@antfin.com>
诸岳 <fuping.dfp@antgroup.com>
诸岳 <dengfuping_private@163.com> 诸岳 <dengfuping_private@163.com>
诸岳 <dengfuping_develop@163.com> 诸岳 <dengfuping_develop@163.com>
诸葛龙 <158362530@qq.com> 诸葛龙 <158362530@qq.com>
谭真 <736420282@qq.com>
超能刚哥 <margox@foxmail.com> 超能刚哥 <margox@foxmail.com>
迷渡 <justjavac@gmail.com> 迷渡 <justjavac@gmail.com>
郑旭 <332171564@qq.com> 郑旭 <332171564@qq.com>
@ -1254,7 +1429,9 @@ zytjs <yitongzhao@163.com>
骗你是小猫咪 <darryshaw@gmail.com> 骗你是小猫咪 <darryshaw@gmail.com>
高力 <3071730@qq.com> 高力 <3071730@qq.com>
鬼厉 <shawdanon@qq.com> 鬼厉 <shawdanon@qq.com>
麦谷 <1141453778@qq.com>
黄俊亮 <jayhuang@easyops.cn> 黄俊亮 <jayhuang@easyops.cn>
黄文鉴 <concefly@foxmail.com> 黄文鉴 <concefly@foxmail.com>
黄斌 <bin.huang02@hand-china.com> 黄斌 <bin.huang02@hand-china.com>
黑雨 <wangning4567@163.com>
龚方闻 <fangwen.gong@baishancloud.com> 龚方闻 <fangwen.gong@baishancloud.com>

View File

@ -1,12 +0,0 @@
# CODEOWNERS syntax
# A CODEOWNERS file uses a pattern that follows the same rules used in gitignore files.
# The pattern is followed by one or more GitHub usernames or team names using the standard @username or @org/team-name format.
# You can also refer to a user by an email address that has been added to their GitHub account, for example user@example.com.
# no default file owner
#/* @afc163
/components/tree/* @zombieJ
/components/tree-select/* @zombieJ
# ...
# other components

View File

@ -3,7 +3,6 @@ import ReactDOM from 'react-dom';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import Avatar from '..'; import Avatar from '..';
import mountTest from '../../../tests/shared/mountTest'; import mountTest from '../../../tests/shared/mountTest';
import rtlTest from '../../../tests/shared/rtlTest'; import rtlTest from '../../../tests/shared/rtlTest';
@ -88,7 +87,7 @@ describe('Avatar Render', () => {
// https://github.com/jsdom/jsdom/issues/1816 // https://github.com/jsdom/jsdom/issues/1816
wrapper.find('img').simulate('error'); wrapper.find('img').simulate('error');
expect(wrapper).toMatchSnapshot(); expect(wrapper.render()).toMatchSnapshot();
expect(div.querySelector('img').getAttribute('src')).toBe(LOAD_SUCCESS_SRC); expect(div.querySelector('img').getAttribute('src')).toBe(LOAD_SUCCESS_SRC);
wrapper.detach(); wrapper.detach();
@ -106,7 +105,7 @@ describe('Avatar Render', () => {
const wrapper = mount(<Avatar src={LOAD_FAILURE_SRC}>Fallback</Avatar>, { attachTo: div }); const wrapper = mount(<Avatar src={LOAD_FAILURE_SRC}>Fallback</Avatar>, { attachTo: div });
wrapper.find('img').simulate('error'); wrapper.find('img').simulate('error');
expect(wrapper).toMatchSnapshot(); expect(wrapper.render()).toMatchSnapshot();
expect(wrapper.find('.ant-avatar-string').length).toBe(1); expect(wrapper.find('.ant-avatar-string').length).toBe(1);
// children should show, when image load error without onError return false // children should show, when image load error without onError return false
expect(wrapper.find('.ant-avatar-string').prop('style')).not.toHaveProperty('opacity', 0); expect(wrapper.find('.ant-avatar-string').prop('style')).not.toHaveProperty('opacity', 0);
@ -115,7 +114,7 @@ describe('Avatar Render', () => {
wrapper.setProps({ src: LOAD_SUCCESS_SRC }); wrapper.setProps({ src: LOAD_SUCCESS_SRC });
wrapper.update(); wrapper.update();
expect(wrapper).toMatchSnapshot(); expect(wrapper.render()).toMatchSnapshot();
expect(wrapper.find('.ant-avatar-image').length).toBe(1); expect(wrapper.find('.ant-avatar-image').length).toBe(1);
// cleanup // cleanup
@ -125,7 +124,7 @@ describe('Avatar Render', () => {
it('should calculate scale of avatar children correctly', () => { it('should calculate scale of avatar children correctly', () => {
const wrapper = mount(<Avatar>Avatar</Avatar>); const wrapper = mount(<Avatar>Avatar</Avatar>);
expect(wrapper.find('.ant-avatar-string')).toMatchSnapshot(); expect(wrapper.find('.ant-avatar-string').render()).toMatchSnapshot();
Object.defineProperty(HTMLElement.prototype, 'offsetWidth', { Object.defineProperty(HTMLElement.prototype, 'offsetWidth', {
get() { get() {
@ -136,12 +135,12 @@ describe('Avatar Render', () => {
}, },
}); });
wrapper.setProps({ children: 'xx' }); wrapper.setProps({ children: 'xx' });
expect(wrapper.find('.ant-avatar-string')).toMatchSnapshot(); expect(wrapper.find('.ant-avatar-string').render()).toMatchSnapshot();
}); });
it('should calculate scale of avatar children correctly with gap', () => { it('should calculate scale of avatar children correctly with gap', () => {
const wrapper = mount(<Avatar gap={2}>Avatar</Avatar>); const wrapper = mount(<Avatar gap={2}>Avatar</Avatar>);
expect(wrapper.find('.ant-avatar-string')).toMatchSnapshot(); expect(wrapper.find('.ant-avatar-string').render()).toMatchSnapshot();
}); });
it('should warning when pass a string as icon props', () => { it('should warning when pass a string as icon props', () => {

View File

@ -110,14 +110,8 @@ exports[`Avatar Render rtl render component should be rendered correctly in RTL
exports[`Avatar Render should calculate scale of avatar children correctly 1`] = ` exports[`Avatar Render should calculate scale of avatar children correctly 1`] = `
<span <span
className="ant-avatar-string" class="ant-avatar-string"
style={ style="transform: scale(0.72) translateX(-50%);"
Object {
"WebkitTransform": "scale(0.72) translateX(-50%)",
"msTransform": "scale(0.72) translateX(-50%)",
"transform": "scale(0.72) translateX(-50%)",
}
}
> >
Avatar Avatar
</span> </span>
@ -125,14 +119,8 @@ exports[`Avatar Render should calculate scale of avatar children correctly 1`] =
exports[`Avatar Render should calculate scale of avatar children correctly 2`] = ` exports[`Avatar Render should calculate scale of avatar children correctly 2`] = `
<span <span
className="ant-avatar-string" class="ant-avatar-string"
style={ style="transform: scale(0.72) translateX(-50%);"
Object {
"WebkitTransform": "scale(0.72) translateX(-50%)",
"msTransform": "scale(0.72) translateX(-50%)",
"transform": "scale(0.72) translateX(-50%)",
}
}
> >
xx xx
</span> </span>
@ -140,93 +128,44 @@ exports[`Avatar Render should calculate scale of avatar children correctly 2`] =
exports[`Avatar Render should calculate scale of avatar children correctly with gap 1`] = ` exports[`Avatar Render should calculate scale of avatar children correctly with gap 1`] = `
<span <span
className="ant-avatar-string" class="ant-avatar-string"
style={ style="transform: scale(0.36) translateX(-50%);"
Object {
"WebkitTransform": "scale(0.36) translateX(-50%)",
"msTransform": "scale(0.36) translateX(-50%)",
"transform": "scale(0.36) translateX(-50%)",
}
}
> >
Avatar Avatar
</span> </span>
`; `;
exports[`Avatar Render should handle onError correctly 1`] = ` exports[`Avatar Render should handle onError correctly 1`] = `
<Foo> <span
<Avatar class="ant-avatar ant-avatar-circle ant-avatar-image"
onError={[Function]} >
shape="circle" <img
size="default"
src="https://joeschmoe.io/api/v1/random" src="https://joeschmoe.io/api/v1/random"
> />
<span </span>
className="ant-avatar ant-avatar-circle ant-avatar-image"
style={Object {}}
>
<img
onError={[Function]}
src="https://joeschmoe.io/api/v1/random"
/>
</span>
</Avatar>
</Foo>
`; `;
exports[`Avatar Render should show image on success after a failure state 1`] = ` exports[`Avatar Render should show image on success after a failure state 1`] = `
<Avatar <span
shape="circle" class="ant-avatar ant-avatar-circle"
size="default"
src="http://error.url"
> >
<span <span
className="ant-avatar ant-avatar-circle" class="ant-avatar-string"
style={Object {}} style="transform: scale(1) translateX(-50%);"
> >
<ResizeObserver Fallback
onResize={[Function]}
>
<SingleObserver
key="rc-observer-key-0"
onResize={[Function]}
>
<DomWrapper>
<span
className="ant-avatar-string"
style={
Object {
"WebkitTransform": "scale(1) translateX(-50%)",
"msTransform": "scale(1) translateX(-50%)",
"transform": "scale(1) translateX(-50%)",
}
}
>
Fallback
</span>
</DomWrapper>
</SingleObserver>
</ResizeObserver>
</span> </span>
</Avatar> </span>
`; `;
exports[`Avatar Render should show image on success after a failure state 2`] = ` exports[`Avatar Render should show image on success after a failure state 2`] = `
<Avatar <span
shape="circle" class="ant-avatar ant-avatar-circle ant-avatar-image"
size="default"
src="https://joeschmoe.io/api/v1/random"
> >
<span <img
className="ant-avatar ant-avatar-circle ant-avatar-image" src="https://joeschmoe.io/api/v1/random"
style={Object {}} />
> </span>
<img
onError={[Function]}
src="https://joeschmoe.io/api/v1/random"
/>
</span>
</Avatar>
`; `;
exports[`Avatar Render support size is number 1`] = ` exports[`Avatar Render support size is number 1`] = `

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import Breadcrumb from '../index'; import Breadcrumb from '../index';
import mountTest from '../../../tests/shared/mountTest'; import mountTest from '../../../tests/shared/mountTest';
import rtlTest from '../../../tests/shared/rtlTest'; import rtlTest from '../../../tests/shared/rtlTest';

View File

@ -1,7 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { SearchOutlined } from '@ant-design/icons'; import { SearchOutlined } from '@ant-design/icons';
import { resetWarned } from 'rc-util/lib/warning'; import { resetWarned } from 'rc-util/lib/warning';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import ConfigProvider from '..'; import ConfigProvider from '..';
import zhCN from '../../locale/zh_CN'; import zhCN from '../../locale/zh_CN';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import Drawer from '..'; import Drawer from '..';
import ConfigProvider from '../../config-provider'; import ConfigProvider from '../../config-provider';
import mountTest from '../../../tests/shared/mountTest'; import mountTest from '../../../tests/shared/mountTest';

View File

@ -16362,7 +16362,7 @@ exports[`renders ./components/form/demo/validate-other.md extend context correct
class="" class=""
> >
<div <div
class="ant-upload ant-upload-select ant-upload-select-picture ant-upload-in-form-item" class="ant-upload ant-upload-select ant-upload-select-picture"
> >
<span <span
class="ant-upload" class="ant-upload"
@ -16441,7 +16441,7 @@ exports[`renders ./components/form/demo/validate-other.md extend context correct
> >
<span> <span>
<div <div
class="ant-upload ant-upload-drag ant-upload-in-form-item" class="ant-upload ant-upload-drag"
> >
<span <span
class="ant-upload ant-upload-btn" class="ant-upload ant-upload-btn"

View File

@ -7423,7 +7423,7 @@ exports[`renders ./components/form/demo/validate-other.md correctly 1`] = `
class="" class=""
> >
<div <div
class="ant-upload ant-upload-select ant-upload-select-picture ant-upload-in-form-item" class="ant-upload ant-upload-select ant-upload-select-picture"
> >
<span <span
class="ant-upload" class="ant-upload"
@ -7502,7 +7502,7 @@ exports[`renders ./components/form/demo/validate-other.md correctly 1`] = `
> >
<span> <span>
<div <div
class="ant-upload ant-upload-drag ant-upload-in-form-item" class="ant-upload ant-upload-drag"
> >
<span <span
class="ant-upload ant-upload-btn" class="ant-upload ant-upload-btn"

View File

@ -1,7 +1,6 @@
import React, { Component, useState } from 'react'; import React, { Component, useState } from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import scrollIntoView from 'scroll-into-view-if-needed'; import scrollIntoView from 'scroll-into-view-if-needed';
import Form from '..'; import Form from '..';

View File

@ -2,7 +2,6 @@ import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import Form from '..'; import Form from '..';
import Input from '../../input'; import Input from '../../input';
import Button from '../../button'; import Button from '../../button';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import ReactDOMServer from 'react-dom/server'; import ReactDOMServer from 'react-dom/server';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { Col, Row } from '..'; import { Col, Row } from '..';
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars

View File

@ -1,7 +1,6 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
// eslint-disable-next-line import/no-unresolved // eslint-disable-next-line import/no-unresolved
import Form from '../../form'; import Form from '../../form';
import Input, { InputProps, InputRef } from '..'; import Input, { InputProps, InputRef } from '..';

View File

@ -1,7 +1,6 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import RcTextArea from 'rc-textarea'; import RcTextArea from 'rc-textarea';
import Input from '..'; import Input from '..';
import focusTest from '../../../tests/shared/focusTest'; import focusTest from '../../../tests/shared/focusTest';

View File

@ -8,7 +8,6 @@ import {
UserOutlined, UserOutlined,
} from '@ant-design/icons'; } from '@ant-design/icons';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import Menu from '..'; import Menu from '..';
import Layout from '../../layout'; import Layout from '../../layout';

View File

@ -1,3 +1,4 @@
import { act } from 'react-dom/test-utils';
import { sleep } from '../../../tests/utils'; import { sleep } from '../../../tests/utils';
import message, { getInstance } from '..'; import message, { getInstance } from '..';
import ConfigProvider from '../../config-provider'; import ConfigProvider from '../../config-provider';
@ -11,18 +12,26 @@ describe('message.config', () => {
beforeEach(() => { beforeEach(() => {
jest.useFakeTimers(); jest.useFakeTimers();
jest.clearAllTimers();
}); });
afterEach(() => { afterEach(() => {
message.destroy();
jest.useRealTimers(); jest.useRealTimers();
act(() => {
message.destroy();
});
}); });
it('should be able to config top', () => { it('should be able to config top', () => {
message.config({ message.config({
top: 100, top: 100,
}); });
message.info('whatever');
act(() => {
message.info('whatever');
});
expect(document.querySelectorAll('.ant-message')[0].style.top).toBe('100px'); expect(document.querySelectorAll('.ant-message')[0].style.top).toBe('100px');
}); });
@ -30,7 +39,11 @@ describe('message.config', () => {
message.config({ message.config({
rtl: true, rtl: true,
}); });
message.info('whatever');
act(() => {
message.info('whatever');
});
expect(document.querySelectorAll('.ant-message-rtl').length).toBe(1); expect(document.querySelectorAll('.ant-message-rtl').length).toBe(1);
}); });
@ -43,7 +56,10 @@ describe('message.config', () => {
return div; return div;
}, },
}); });
message.info('whatever');
act(() => {
message.info('whatever');
});
expect(document.querySelectorAll('.custom-container').length).toBe(1); expect(document.querySelectorAll('.custom-container').length).toBe(1);
}); });
@ -52,13 +68,21 @@ describe('message.config', () => {
maxCount: 5, maxCount: 5,
}); });
for (let i = 0; i < 10; i += 1) { for (let i = 0; i < 10; i += 1) {
message.info('test'); act(() => {
message.info('test');
});
} }
message.info('last'); act(() => {
message.info('last');
});
expect(document.querySelectorAll('.ant-message-notice').length).toBe(5); expect(document.querySelectorAll('.ant-message-notice').length).toBe(5);
expect(document.querySelectorAll('.ant-message-notice')[4].textContent).toBe('last'); expect(document.querySelectorAll('.ant-message-notice')[4].textContent).toBe('last');
jest.runAllTimers();
act(() => {
jest.runAllTimers();
});
expect(getInstance().component.state.notices).toHaveLength(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
@ -67,7 +91,10 @@ describe('message.config', () => {
message.config({ message.config({
duration: 0.5, duration: 0.5,
}); });
message.info('last');
act(() => {
message.info('last');
});
expect(getInstance().component.state.notices).toHaveLength(1); expect(getInstance().component.state.notices).toHaveLength(1);
await sleep(1000); await sleep(1000);
@ -82,7 +109,9 @@ describe('message.config', () => {
prefixCls: 'light-message', prefixCls: 'light-message',
}); });
message.info('bamboo'); act(() => {
message.info('bamboo');
});
expect(getInstance().config).toEqual( expect(getInstance().config).toEqual(
expect.objectContaining({ expect.objectContaining({
@ -97,7 +126,11 @@ describe('message.config', () => {
it('should be able to global config rootPrefixCls', () => { it('should be able to global config rootPrefixCls', () => {
ConfigProvider.config({ prefixCls: 'prefix-test', iconPrefixCls: 'bamboo' }); ConfigProvider.config({ prefixCls: 'prefix-test', iconPrefixCls: 'bamboo' });
message.info('last');
act(() => {
message.info('last');
});
expect(document.querySelectorAll('.ant-message-notice')).toHaveLength(0); expect(document.querySelectorAll('.ant-message-notice')).toHaveLength(0);
expect(document.querySelectorAll('.prefix-test-message-notice')).toHaveLength(1); expect(document.querySelectorAll('.prefix-test-message-notice')).toHaveLength(1);
expect(document.querySelectorAll('.bamboo-info-circle')).toHaveLength(1); expect(document.querySelectorAll('.bamboo-info-circle')).toHaveLength(1);
@ -107,7 +140,11 @@ describe('message.config', () => {
message.config({ message.config({
prefixCls: 'prefix-test', prefixCls: 'prefix-test',
}); });
message.info('last');
act(() => {
message.info('last');
});
expect(document.querySelectorAll('.ant-message-notice')).toHaveLength(0); expect(document.querySelectorAll('.ant-message-notice')).toHaveLength(0);
expect(document.querySelectorAll('.prefix-test-notice')).toHaveLength(1); expect(document.querySelectorAll('.prefix-test-notice')).toHaveLength(1);
message.config({ message.config({
@ -119,7 +156,11 @@ describe('message.config', () => {
message.config({ message.config({
transitionName: '', transitionName: '',
}); });
message.info('last');
act(() => {
message.info('last');
});
expect(document.querySelectorAll('.ant-move-up-enter')).toHaveLength(0); expect(document.querySelectorAll('.ant-move-up-enter')).toHaveLength(0);
message.config({ message.config({
transitionName: 'ant-move-up', transitionName: 'ant-move-up',
@ -145,13 +186,20 @@ describe('message.config', () => {
getContainer: () => container1, getContainer: () => container1,
}); });
const messageText1 = 'mounted in container1'; const messageText1 = 'mounted in container1';
message.info(messageText1);
act(() => {
message.info(messageText1);
});
expect(container1.querySelector('.ant-message-notice').textContent).toEqual(messageText1); expect(container1.querySelector('.ant-message-notice').textContent).toEqual(messageText1);
message.config({ message.config({
getContainer: () => container2, getContainer: () => container2,
}); });
const messageText2 = 'mounted in container2'; const messageText2 = 'mounted in container2';
message.info(messageText2);
act(() => {
message.info(messageText2);
});
expect(container2.querySelector('.ant-message-notice').textContent).toEqual(messageText2); expect(container2.querySelector('.ant-message-notice').textContent).toEqual(messageText2);
removeContainer1(); removeContainer1();
removeContainer2(); removeContainer2();

View File

@ -1,6 +1,7 @@
/* eslint-disable jsx-a11y/control-has-associated-label */ /* eslint-disable jsx-a11y/control-has-associated-label */
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { act } from 'react-dom/test-utils';
import message, { getInstance } from '..'; import message, { getInstance } from '..';
import ConfigProvider from '../../config-provider'; import ConfigProvider from '../../config-provider';
@ -167,10 +168,16 @@ describe('message.hooks', () => {
const wrapper = mount(<Demo />); const wrapper = mount(<Demo />);
wrapper.find('button').simulate('click'); wrapper.find('button').simulate('click');
jest.runAllTimers();
act(() => {
jest.runAllTimers();
});
expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1); expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1);
hide();
jest.runAllTimers(); act(() => {
hide();
jest.runAllTimers();
});
expect(getInstance().component.state.notices).toHaveLength(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });

View File

@ -1,50 +1,91 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { act } from 'react-dom/test-utils';
import { SmileOutlined } from '@ant-design/icons'; import { SmileOutlined } from '@ant-design/icons';
import message, { getInstance } from '..'; import message, { getInstance } from '..';
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
describe('message', () => { describe('message', () => {
beforeEach(() => { beforeEach(() => {
jest.useFakeTimers(); jest.useFakeTimers();
}); });
afterEach(() => { afterEach(() => {
message.destroy();
jest.useRealTimers(); jest.useRealTimers();
act(() => {
message.destroy();
});
}); });
it('should be able to hide manually', () => { it('should be able to hide manually', async () => {
const hide1 = message.info('whatever', 0); let hide1;
const hide2 = message.info('whatever', 0); let hide2;
act(() => {
hide1 = message.info('whatever', 0);
});
act(() => {
hide2 = message.info('whatever', 0);
});
expect(document.querySelectorAll('.ant-message-notice').length).toBe(2); expect(document.querySelectorAll('.ant-message-notice').length).toBe(2);
hide1(); hide1();
jest.runAllTimers(); act(() => {
jest.runAllTimers();
});
expect(getInstance().component.state.notices).toHaveLength(1); expect(getInstance().component.state.notices).toHaveLength(1);
hide2(); hide2();
jest.runAllTimers(); act(() => {
jest.runAllTimers();
});
expect(getInstance().component.state.notices).toHaveLength(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should be able to remove manually with a unique key', () => { it('should be able to remove manually with a unique key', () => {
const key1 = 'key1'; const key1 = 'key1';
const key2 = 'key2'; const key2 = 'key2';
message.info({ content: 'Message1', key: 'key1', duration: 0 });
message.info({ content: 'Message2', key: 'key2', duration: 0 }); act(() => {
message.info({ content: 'Message1', key: 'key1', duration: 0 });
});
act(() => {
message.info({ content: 'Message2', key: 'key2', duration: 0 });
});
expect(document.querySelectorAll('.ant-message-notice').length).toBe(2); expect(document.querySelectorAll('.ant-message-notice').length).toBe(2);
message.destroy(key1);
jest.runAllTimers(); act(() => {
message.destroy(key1);
jest.runAllTimers();
});
expect(getInstance().component.state.notices).toHaveLength(1); expect(getInstance().component.state.notices).toHaveLength(1);
message.destroy(key2);
jest.runAllTimers(); act(() => {
message.destroy(key2);
jest.runAllTimers();
});
expect(getInstance().component.state.notices).toHaveLength(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should be able to destroy globally', () => { it('should be able to destroy globally', () => {
message.info('whatever', 0); act(() => {
message.info('whatever', 0); message.info('whatever', 0);
});
act(() => {
message.info('whatever', 0);
});
expect(document.querySelectorAll('.ant-message').length).toBe(1); expect(document.querySelectorAll('.ant-message').length).toBe(1);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(2); expect(document.querySelectorAll('.ant-message-notice').length).toBe(2);
message.destroy();
act(() => {
message.destroy();
jest.runAllTimers();
});
expect(document.querySelectorAll('.ant-message').length).toBe(0); expect(document.querySelectorAll('.ant-message').length).toBe(0);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0); expect(document.querySelectorAll('.ant-message-notice').length).toBe(0);
}); });
@ -103,7 +144,9 @@ describe('message', () => {
let hide; let hide;
class Test extends React.Component { class Test extends React.Component {
componentDidMount() { componentDidMount() {
hide = message.loading('Action in progress..', 0); act(() => {
hide = message.loading('Action in progress..', 0);
});
} }
render() { render() {
@ -112,13 +155,18 @@ describe('message', () => {
} }
mount(<Test />); mount(<Test />);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(1); expect(document.querySelectorAll('.ant-message-notice').length).toBe(1);
hide();
jest.runAllTimers(); act(() => {
hide();
jest.runAllTimers();
});
expect(getInstance().component.state.notices).toHaveLength(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });
it('should allow custom icon', () => { it('should allow custom icon', () => {
message.open({ content: 'Message', icon: <SmileOutlined /> }); act(() => {
message.open({ content: 'Message', icon: <SmileOutlined /> });
});
expect(document.querySelectorAll('.anticon-smile').length).toBe(1); expect(document.querySelectorAll('.anticon-smile').length).toBe(1);
}); });
@ -177,9 +225,16 @@ describe('message', () => {
const key = 'updatable'; const key = 'updatable';
class Test extends React.Component { class Test extends React.Component {
componentDidMount() { componentDidMount() {
const hideLoading = message.loading({ content: 'Loading...', key, duration: 0 }); let hideLoading;
act(() => {
hideLoading = message.loading({ content: 'Loading...', key, duration: 0 });
});
// Testing that content of the message should be cancel manually. // Testing that content of the message should be cancel manually.
setTimeout(hideLoading, 1000); setTimeout(() => {
act(() => {
hideLoading();
});
}, 1000);
} }
render() { render() {
@ -189,6 +244,7 @@ describe('message', () => {
mount(<Test />); mount(<Test />);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(1); expect(document.querySelectorAll('.ant-message-notice').length).toBe(1);
jest.advanceTimersByTime(1500); jest.advanceTimersByTime(1500);
expect(getInstance().component.state.notices).toHaveLength(0); expect(getInstance().component.state.notices).toHaveLength(0);
}); });

View File

@ -1,3 +1,4 @@
import { act } from 'react-dom/test-utils';
import notification, { getInstance } from '..'; import notification, { getInstance } from '..';
import { sleep } from '../../../tests/utils'; import { sleep } from '../../../tests/utils';
@ -17,26 +18,37 @@ describe('notification.config', () => {
}); });
for (let i = 0; i < 10; i += 1) { for (let i = 0; i < 10; i += 1) {
notification.open({ act(() => {
message: 'Notification message', notification.open({
key: i, message: 'Notification message',
key: i,
});
}); });
} }
notification.open({ act(() => {
message: 'Notification last', notification.open({
key: '11', message: 'Notification last',
key: '11',
});
}); });
await Promise.resolve(); await act(async () => {
await Promise.resolve();
});
expect(document.querySelectorAll('.ant-notification-notice').length).toBe(5); expect(document.querySelectorAll('.ant-notification-notice').length).toBe(5);
expect(document.querySelectorAll('.ant-notification-notice')[4].textContent).toBe( expect(document.querySelectorAll('.ant-notification-notice')[4].textContent).toBe(
'Notification last', 'Notification last',
); );
jest.runAllTimers(); act(() => {
await sleep(500); jest.runAllTimers();
});
await act(async () => {
await sleep(500);
});
expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength( expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength(
0, 0,
); );

View File

@ -1,109 +1,171 @@
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import { act } from 'react-dom/test-utils';
import { UserOutlined } from '@ant-design/icons'; import { UserOutlined } from '@ant-design/icons';
import notification, { getInstance } from '..'; import notification, { getInstance } from '..';
import ConfigProvider from '../../config-provider'; import ConfigProvider from '../../config-provider';
import { sleep } from '../../../tests/utils';
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
describe('notification', () => { describe('notification', () => {
beforeEach(() => { beforeEach(() => {
jest.useFakeTimers(); jest.useFakeTimers();
jest.clearAllTimers();
}); });
afterEach(() => { afterEach(() => {
jest.runAllTimers();
jest.useRealTimers(); jest.useRealTimers();
notification.destroy();
act(() => {
notification.destroy();
});
}); });
it('not duplicate create holder', () => { it('not duplicate create holder', async () => {
const originRender = ReactDOM.render;
const argsList = [];
const spyRender = jest.spyOn(ReactDOM, 'render').mockImplementation((...args) => {
argsList.push(args);
});
for (let i = 0; i < 5; i += 1) { for (let i = 0; i < 5; i += 1) {
notification.open({ act(() => {
message: 'Notification Title', notification.open({
duration: 0, message: 'Notification Title',
prefixCls: 'additional-holder', duration: 0,
prefixCls: 'additional-holder',
});
}); });
} }
argsList.forEach(args => { await sleep();
originRender(...args);
});
const count = document.querySelectorAll('.additional-holder').length; const count = document.querySelectorAll('.additional-holder').length;
expect(count).toEqual(1); expect(count).toEqual(1);
spyRender.mockRestore();
}); });
it('should be able to hide manually', async () => { it('should be able to hide manually', async () => {
notification.open({ act(() => {
message: 'Notification Title', notification.open({
duration: 0, message: 'Notification Title 1',
key: '1', duration: 0,
}); key: '1',
notification.open({ });
message: 'Notification Title', jest.runAllTimers();
duration: 0,
key: '2',
}); });
await Promise.resolve(); act(() => {
jest.runAllTimers();
});
act(() => {
notification.open({
message: 'Notification Title 2',
duration: 0,
key: '2',
});
jest.runAllTimers();
});
act(() => {
jest.runAllTimers();
});
await act(async () => {
await Promise.resolve();
});
expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2); expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2);
notification.close('1'); act(() => {
jest.runAllTimers(); notification.close('1');
jest.runAllTimers();
});
await act(async () => {
await Promise.resolve();
});
expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength( expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength(
1, 1,
); );
notification.close('2'); act(() => {
jest.runAllTimers(); notification.close('2');
jest.runAllTimers();
});
await act(async () => {
await Promise.resolve();
});
expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength( expect((await getInstance('ant-notification-topRight')).component.state.notices).toHaveLength(
0, 0,
); );
}); });
it('should be able to destroy globally', async () => { it('should be able to destroy globally', async () => {
notification.open({ act(() => {
message: 'Notification Title', notification.open({
duration: 0, message: 'Notification Title',
duration: 0,
});
}); });
notification.open({
message: 'Notification Title', act(() => {
duration: 0, notification.open({
message: 'Notification Title',
duration: 0,
});
}); });
await Promise.resolve();
await act(async () => {
await Promise.resolve();
});
expect(document.querySelectorAll('.ant-notification').length).toBe(1); expect(document.querySelectorAll('.ant-notification').length).toBe(1);
expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2); expect(document.querySelectorAll('.ant-notification-notice').length).toBe(2);
notification.destroy();
await Promise.resolve(); act(() => {
notification.destroy();
});
await act(async () => {
await Promise.resolve();
});
expect(document.querySelectorAll('.ant-notification').length).toBe(0); expect(document.querySelectorAll('.ant-notification').length).toBe(0);
expect(document.querySelectorAll('.ant-notification-notice').length).toBe(0); expect(document.querySelectorAll('.ant-notification-notice').length).toBe(0);
}); });
it('should be able to destroy after config', () => { it('should be able to destroy after config', () => {
notification.config({ act(() => {
bottom: 100, notification.config({
bottom: 100,
});
});
act(() => {
notification.destroy();
}); });
notification.destroy();
}); });
it('should be able to config rtl', () => { it('should be able to config rtl', () => {
notification.config({ act(() => {
rtl: true, notification.config({
rtl: true,
});
}); });
notification.open({
message: 'whatever', act(() => {
notification.open({
message: 'whatever',
});
}); });
expect(document.querySelectorAll('.ant-notification-rtl').length).toBe(1); expect(document.querySelectorAll('.ant-notification-rtl').length).toBe(1);
}); });
it('should be able to global config rootPrefixCls', () => { it('should be able to global config rootPrefixCls', () => {
ConfigProvider.config({ prefixCls: 'prefix-test', iconPrefixCls: 'bamboo' }); ConfigProvider.config({ prefixCls: 'prefix-test', iconPrefixCls: 'bamboo' });
notification.success({ message: 'Notification Title', duration: 0 });
act(() => {
notification.success({ message: 'Notification Title', duration: 0 });
});
expect(document.querySelectorAll('.ant-notification-notice')).toHaveLength(0); expect(document.querySelectorAll('.ant-notification-notice')).toHaveLength(0);
expect(document.querySelectorAll('.prefix-test-notification-notice')).toHaveLength(1); expect(document.querySelectorAll('.prefix-test-notification-notice')).toHaveLength(1);
expect(document.querySelectorAll('.bamboo-check-circle')).toHaveLength(1); expect(document.querySelectorAll('.bamboo-check-circle')).toHaveLength(1);
@ -114,68 +176,93 @@ describe('notification', () => {
notification.config({ notification.config({
prefixCls: 'prefix-test', prefixCls: 'prefix-test',
}); });
notification.open({
message: 'Notification Title', act(() => {
duration: 0, notification.open({
message: 'Notification Title',
duration: 0,
});
}); });
expect(document.querySelectorAll('.ant-notification-notice')).toHaveLength(0); expect(document.querySelectorAll('.ant-notification-notice')).toHaveLength(0);
expect(document.querySelectorAll('.prefix-test-notice')).toHaveLength(1); expect(document.querySelectorAll('.prefix-test-notice')).toHaveLength(1);
notification.config({ notification.config({
prefixCls: '', prefixCls: '',
}); });
}); });
it('should be able to open with icon', async () => { it('should be able to open with icon', async () => {
const iconPrefix = '.ant-notification-notice-icon';
const openNotificationWithIcon = async type => { const openNotificationWithIcon = async type => {
const iconPrefix = '.ant-notification-notice-icon'; act(() => {
notification[type]({ notification[type]({
message: 'Notification Title', message: 'Notification Title',
duration: 0, duration: 0,
description: 'This is the content of the notification.', description: 'This is the content of the notification.',
});
jest.runAllTimers();
}); });
await Promise.resolve();
expect(document.querySelectorAll(`${iconPrefix}-${type}`).length).toBe(1);
}; };
const promises = ['success', 'info', 'warning', 'error'].map(type => const list = ['success', 'info', 'warning', 'error'];
openNotificationWithIcon(type),
);
await Promise.all(promises); const promises = list.map(type => openNotificationWithIcon(type));
await act(async () => {
await Promise.all(promises);
});
list.forEach(type => {
expect(document.querySelectorAll(`${iconPrefix}-${type}`).length).toBe(1);
});
}); });
it('should be able to add parent class for different notification types', async () => { it('should be able to add parent class for different notification types', async () => {
const openNotificationWithIcon = async type => { const openNotificationWithIcon = async type => {
notification[type]({ act(() => {
message: 'Notification Title', notification[type]({
duration: 0, message: 'Notification Title',
description: 'This is the content of the notification.', duration: 0,
description: 'This is the content of the notification.',
});
jest.runAllTimers();
}); });
await Promise.resolve();
expect(document.querySelectorAll(`.ant-notification-notice-${type}`).length).toBe(1);
}; };
const promises = ['success', 'info', 'warning', 'error'].map(type => const list = ['success', 'info', 'warning', 'error'];
openNotificationWithIcon(type), const promises = list.map(type => openNotificationWithIcon(type));
);
await Promise.all(promises); await act(async () => {
await Promise.all(promises);
});
list.forEach(type => {
expect(document.querySelectorAll(`.ant-notification-notice-${type}`).length).toBe(1);
});
}); });
it('trigger onClick', () => { it('trigger onClick', () => {
notification.open({ act(() => {
message: 'Notification Title', notification.open({
duration: 0, message: 'Notification Title',
duration: 0,
});
}); });
expect(document.querySelectorAll('.ant-notification').length).toBe(1); expect(document.querySelectorAll('.ant-notification').length).toBe(1);
}); });
it('support closeIcon', () => { it('support closeIcon', () => {
notification.open({ act(() => {
message: 'Notification Title', notification.open({
duration: 0, message: 'Notification Title',
closeIcon: <span className="test-customize-icon" />, duration: 0,
closeIcon: <span className="test-customize-icon" />,
});
}); });
expect(document.querySelectorAll('.test-customize-icon').length).toBe(1); expect(document.querySelectorAll('.test-customize-icon').length).toBe(1);
}); });
@ -183,45 +270,64 @@ describe('notification', () => {
notification.config({ notification.config({
closeIcon: <span className="test-customize-icon" />, closeIcon: <span className="test-customize-icon" />,
}); });
notification.open({
message: 'Notification Title', act(() => {
duration: 0, notification.open({
closeIcon: <span className="test-customize-icon" />, message: 'Notification Title',
duration: 0,
closeIcon: <span className="test-customize-icon" />,
});
}); });
expect(document.querySelectorAll('.test-customize-icon').length).toBe(1); expect(document.querySelectorAll('.test-customize-icon').length).toBe(1);
}); });
it('closeIcon should be update', async () => { it('closeIcon should be update', async () => {
const openNotificationWithCloseIcon = async type => { const openNotificationWithCloseIcon = async type => {
notification.open({ act(() => {
message: 'Notification Title', notification.open({
closeIcon: <span className={`test-customize-icon-${type}`} />, message: 'Notification Title',
closeIcon: <span className={`test-customize-icon-${type}`} />,
});
jest.runAllTimers();
}); });
await Promise.resolve();
expect(document.querySelectorAll(`.test-customize-icon-${type}`).length).toBe(1);
}; };
const promises = ['1', '2'].map(type => openNotificationWithCloseIcon(type)); const list = ['1', '2'];
const promises = list.map(type => openNotificationWithCloseIcon(type));
await Promise.all(promises); await act(async () => {
await Promise.all(promises);
});
list.forEach(type => {
expect(document.querySelectorAll(`.test-customize-icon-${type}`).length).toBe(1);
});
}); });
it('support config duration', () => { it('support config duration', () => {
notification.config({ notification.config({
duration: 0, duration: 0,
}); });
notification.open({
message: 'whatever', act(() => {
notification.open({
message: 'whatever',
});
}); });
expect(document.querySelectorAll('.ant-notification').length).toBe(1); expect(document.querySelectorAll('.ant-notification').length).toBe(1);
}); });
it('support icon', () => { it('support icon', () => {
notification.open({ act(() => {
message: 'Notification Title', notification.open({
duration: 0, message: 'Notification Title',
icon: <UserOutlined />, duration: 0,
icon: <UserOutlined />,
});
}); });
expect(document.querySelectorAll('.anticon-user').length).toBe(1); expect(document.querySelectorAll('.anticon-user').length).toBe(1);
}); });
}); });

View File

@ -1,3 +1,4 @@
import { act } from 'react-dom/test-utils';
import notification from '..'; import notification from '..';
describe('Notification.placement', () => { describe('Notification.placement', () => {
@ -25,7 +26,10 @@ describe('Notification.placement', () => {
notification.config({ notification.config({
...args, ...args,
}); });
open();
act(() => {
open();
});
} }
describe('placement', () => { describe('placement', () => {
@ -35,10 +39,13 @@ describe('Notification.placement', () => {
let style; let style;
// top // top
open({ act(() => {
placement: 'top', open({
top: 50, placement: 'top',
top: 50,
});
}); });
style = getStyle($$('.ant-notification-top')[0]); style = getStyle($$('.ant-notification-top')[0]);
expect(style.top).toBe('50px'); expect(style.top).toBe('50px');
expect(style.left).toBe('50%'); expect(style.left).toBe('50%');
@ -46,44 +53,56 @@ describe('Notification.placement', () => {
expect(style.right).toBe(''); expect(style.right).toBe('');
expect(style.bottom).toBe(''); expect(style.bottom).toBe('');
open({ act(() => {
placement: 'top', open({
placement: 'top',
});
}); });
expect($$('.ant-notification-top').length).toBe(1); expect($$('.ant-notification-top').length).toBe(1);
// topLeft // topLeft
open({ act(() => {
placement: 'topLeft', open({
top: 50, placement: 'topLeft',
top: 50,
});
}); });
style = getStyle($$('.ant-notification-topLeft')[0]); style = getStyle($$('.ant-notification-topLeft')[0]);
expect(style.top).toBe('50px'); expect(style.top).toBe('50px');
expect(style.left).toBe('0px'); expect(style.left).toBe('0px');
expect(style.bottom).toBe(''); expect(style.bottom).toBe('');
open({ act(() => {
placement: 'topLeft', open({
placement: 'topLeft',
});
}); });
expect($$('.ant-notification-topLeft').length).toBe(1); expect($$('.ant-notification-topLeft').length).toBe(1);
// topRight // topRight
open({ act(() => {
placement: 'topRight', open({
placement: 'topRight',
});
}); });
style = getStyle($$('.ant-notification-topRight')[0]); style = getStyle($$('.ant-notification-topRight')[0]);
expect(style.top).toBe(defaultTop); expect(style.top).toBe(defaultTop);
expect(style.right).toBe('0px'); expect(style.right).toBe('0px');
expect(style.bottom).toBe(''); expect(style.bottom).toBe('');
open({ act(() => {
placement: 'topRight', open({
placement: 'topRight',
});
}); });
expect($$('.ant-notification-topRight').length).toBe(1); expect($$('.ant-notification-topRight').length).toBe(1);
// bottom // bottom
open({ act(() => {
placement: 'bottom', open({
bottom: 100, placement: 'bottom',
bottom: 100,
});
}); });
style = getStyle($$('.ant-notification-bottom')[0]); style = getStyle($$('.ant-notification-bottom')[0]);
expect(style.top).toBe(''); expect(style.top).toBe('');
@ -92,37 +111,47 @@ describe('Notification.placement', () => {
expect(style.right).toBe(''); expect(style.right).toBe('');
expect(style.bottom).toBe('100px'); expect(style.bottom).toBe('100px');
open({ act(() => {
placement: 'bottom', open({
placement: 'bottom',
});
}); });
expect($$('.ant-notification-bottom').length).toBe(1); expect($$('.ant-notification-bottom').length).toBe(1);
// bottomRight // bottomRight
open({ act(() => {
placement: 'bottomRight', open({
bottom: 100, placement: 'bottomRight',
bottom: 100,
});
}); });
style = getStyle($$('.ant-notification-bottomRight')[0]); style = getStyle($$('.ant-notification-bottomRight')[0]);
expect(style.top).toBe(''); expect(style.top).toBe('');
expect(style.right).toBe('0px'); expect(style.right).toBe('0px');
expect(style.bottom).toBe('100px'); expect(style.bottom).toBe('100px');
open({ act(() => {
placement: 'bottomRight', open({
placement: 'bottomRight',
});
}); });
expect($$('.ant-notification-bottomRight').length).toBe(1); expect($$('.ant-notification-bottomRight').length).toBe(1);
// bottomLeft // bottomLeft
open({ act(() => {
placement: 'bottomLeft', open({
placement: 'bottomLeft',
});
}); });
style = getStyle($$('.ant-notification-bottomLeft')[0]); style = getStyle($$('.ant-notification-bottomLeft')[0]);
expect(style.top).toBe(''); expect(style.top).toBe('');
expect(style.left).toBe('0px'); expect(style.left).toBe('0px');
expect(style.bottom).toBe(defaultBottom); expect(style.bottom).toBe(defaultBottom);
open({ act(() => {
placement: 'bottomLeft', open({
placement: 'bottomLeft',
});
}); });
expect($$('.ant-notification-bottomLeft').length).toBe(1); expect($$('.ant-notification-bottomLeft').length).toBe(1);
}); });
@ -186,16 +215,19 @@ describe('Notification.placement', () => {
}); });
it('can be configured per notification using the `open` method', () => { it('can be configured per notification using the `open` method', () => {
open({ act(() => {
getContainer: () => $container, open({
getContainer: () => $container,
});
}); });
expect($container.querySelector('.ant-notification')).not.toBe(null); expect($container.querySelector('.ant-notification')).not.toBe(null);
notification.destroy(); notification.destroy();
setTimeout(() => { setTimeout(() => {
// Upcoming notifications still use their default mountNode and not $container // Upcoming notifications still use their default mountNode and not $container
open(); act(() => {
open();
});
expect($container.querySelector('.ant-notification')).toBe(null); expect($container.querySelector('.ant-notification')).toBe(null);
}); });
}); });
@ -205,12 +237,12 @@ describe('Notification.placement', () => {
getContainer: () => $container, getContainer: () => $container,
}); });
expect($container.querySelector('.ant-notification')).not.toBe(null); expect($container.querySelector('.ant-notification')).not.toBe(null);
notification.destroy(); notification.destroy();
setTimeout(() => { setTimeout(() => {
// Upcoming notifications are mounted in $container // Upcoming notifications are mounted in $container
open(); act(() => {
open();
});
expect($container.querySelector('.ant-notification')).not.toBe(null); expect($container.querySelector('.ant-notification')).not.toBe(null);
}); });
}); });

View File

@ -156,6 +156,7 @@ function getNotificationInstance(
const cacheKey = `${prefixCls}-${placement}`; const cacheKey = `${prefixCls}-${placement}`;
const cacheInstance = notificationInstance[cacheKey]; const cacheInstance = notificationInstance[cacheKey];
if (cacheInstance) { if (cacheInstance) {
Promise.resolve(cacheInstance).then(instance => { Promise.resolve(cacheInstance).then(instance => {
callback({ prefixCls: `${prefixCls}-notice`, iconPrefixCls, instance }); callback({ prefixCls: `${prefixCls}-notice`, iconPrefixCls, instance });

View File

@ -2,7 +2,6 @@ import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { spyElementPrototype } from 'rc-util/lib/test/domHook'; import { spyElementPrototype } from 'rc-util/lib/test/domHook';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import Popconfirm from '..'; import Popconfirm from '..';
import mountTest from '../../../tests/shared/mountTest'; import mountTest from '../../../tests/shared/mountTest';
import { sleep } from '../../../tests/utils'; import { sleep } from '../../../tests/utils';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import Popover from '..'; import Popover from '..';
import mountTest from '../../../tests/shared/mountTest'; import mountTest from '../../../tests/shared/mountTest';
import ConfigProvider from '../../config-provider'; import ConfigProvider from '../../config-provider';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import Result from '..'; import Result from '..';
import Button from '../../button'; import Button from '../../button';
import mountTest from '../../../tests/shared/mountTest'; import mountTest from '../../../tests/shared/mountTest';

View File

@ -3,7 +3,6 @@ import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import Table from '..'; import Table from '..';
import Input from '../../input'; import Input from '../../input';
import Tooltip from '../../tooltip'; import Tooltip from '../../tooltip';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import Table from '..'; import Table from '..';
import mountTest from '../../../tests/shared/mountTest'; import mountTest from '../../../tests/shared/mountTest';
import rtlTest from '../../../tests/shared/rtlTest'; import rtlTest from '../../../tests/shared/rtlTest';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import Transfer from '../index'; import Transfer from '../index';
describe('Transfer.Customize', () => { describe('Transfer.Customize', () => {

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import Search from '../search'; import Search from '../search';
import Transfer from '../index'; import Transfer from '../index';

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import { SmileOutlined, LikeOutlined, HighlightOutlined, CheckOutlined } from '@ant-design/icons'; import { SmileOutlined, LikeOutlined, HighlightOutlined, CheckOutlined } from '@ant-design/icons';
import KeyCode from 'rc-util/lib/KeyCode'; import KeyCode from 'rc-util/lib/KeyCode';
import { resetWarned } from 'rc-util/lib/warning'; import { resetWarned } from 'rc-util/lib/warning';

View File

@ -2,8 +2,6 @@ import * as React from 'react';
import RcUpload, { UploadProps as RcUploadProps } from 'rc-upload'; import RcUpload, { UploadProps as RcUploadProps } from 'rc-upload';
import useMergedState from 'rc-util/lib/hooks/useMergedState'; import useMergedState from 'rc-util/lib/hooks/useMergedState';
import classNames from 'classnames'; import classNames from 'classnames';
import { useContext } from 'react';
import { FormItemInputContext } from '../form/context';
import Dragger from './Dragger'; import Dragger from './Dragger';
import UploadList from './UploadList'; import UploadList from './UploadList';
import { import {
@ -302,8 +300,6 @@ const InternalUpload: React.ForwardRefRenderFunction<unknown, UploadProps> = (pr
const prefixCls = getPrefixCls('upload', customizePrefixCls); const prefixCls = getPrefixCls('upload', customizePrefixCls);
const { isFormItemInput } = useContext(FormItemInputContext);
const rcUploadProps = { const rcUploadProps = {
onBatchStart, onBatchStart,
onError, onError,
@ -377,7 +373,6 @@ const InternalUpload: React.ForwardRefRenderFunction<unknown, UploadProps> = (pr
[`${prefixCls}-drag-hover`]: dragState === 'dragover', [`${prefixCls}-drag-hover`]: dragState === 'dragover',
[`${prefixCls}-disabled`]: disabled, [`${prefixCls}-disabled`]: disabled,
[`${prefixCls}-rtl`]: direction === 'rtl', [`${prefixCls}-rtl`]: direction === 'rtl',
[`${prefixCls}-in-form-item`]: isFormItemInput,
}, },
className, className,
); );
@ -404,7 +399,6 @@ const InternalUpload: React.ForwardRefRenderFunction<unknown, UploadProps> = (pr
[`${prefixCls}-select-${listType}`]: true, [`${prefixCls}-select-${listType}`]: true,
[`${prefixCls}-disabled`]: disabled, [`${prefixCls}-disabled`]: disabled,
[`${prefixCls}-rtl`]: direction === 'rtl', [`${prefixCls}-rtl`]: direction === 'rtl',
[`${prefixCls}-in-form-item`]: isFormItemInput,
}); });
const renderUploadButton = (uploadButtonStyle?: React.CSSProperties) => ( const renderUploadButton = (uploadButtonStyle?: React.CSSProperties) => (

View File

@ -3806,7 +3806,7 @@ exports[`renders ./components/upload/demo/upload-with-aliyun-oss.md extend conte
class="" class=""
> >
<div <div
class="ant-upload ant-upload-select ant-upload-select-text ant-upload-in-form-item" class="ant-upload ant-upload-select ant-upload-select-text"
> >
<span <span
class="ant-upload" class="ant-upload"

View File

@ -3590,7 +3590,7 @@ exports[`renders ./components/upload/demo/upload-with-aliyun-oss.md correctly 1`
class="" class=""
> >
<div <div
class="ant-upload ant-upload-select ant-upload-select-text ant-upload-in-form-item" class="ant-upload ant-upload-select ant-upload-select-text"
> >
<span <span
class="ant-upload" class="ant-upload"

View File

@ -2,7 +2,6 @@
import React from 'react'; import React from 'react';
import { mount } from 'enzyme'; import { mount } from 'enzyme';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import produce from 'immer'; import produce from 'immer';
import { cloneDeep } from 'lodash'; import { cloneDeep } from 'lodash';

View File

@ -137,14 +137,6 @@
display: inline-block; display: inline-block;
width: 100%; width: 100%;
} }
&&-in-form-item {
background: transparent;
&.@{upload-prefix-cls}-drag {
background: @background-color-light;
}
}
} }
.@{upload-prefix-cls}-list { .@{upload-prefix-cls}-list {

View File

@ -1,9 +0,0 @@
files:
- source: /docs/*/*.md
ignore:
- /docs/*/*.zh-CN.md
- /docs/*/*.en-US.md
translation: /%original_path%/%file_name%.%language%.md
languages_mapping:
language:
en: en-US

View File

@ -1,19 +0,0 @@
module.exports = {
ci: {
collect: {
staticDistDir: './_site',
url: ['http://localhost/', 'http://localhost/components/button/'],
},
upload: {
target: 'temporary-public-storage',
},
assert: {
assertions: {
'categories:performance': ['error', { minScore: 0.1 }],
'categories:accessibility': ['error', { minScore: 0.6 }],
'categories:best-practices': ['error', { minScore: 0.6 }],
'categories:seo': ['error', { minScore: 0.6 }],
},
},
},
};

View File

@ -136,7 +136,7 @@
"rc-mentions": "~1.7.0", "rc-mentions": "~1.7.0",
"rc-menu": "~9.5.1", "rc-menu": "~9.5.1",
"rc-motion": "^2.4.4", "rc-motion": "^2.4.4",
"rc-notification": "~4.5.7", "rc-notification": "~4.6.0",
"rc-pagination": "~3.1.9", "rc-pagination": "~3.1.9",
"rc-picker": "~2.6.4", "rc-picker": "~2.6.4",
"rc-progress": "~3.2.1", "rc-progress": "~3.2.1",

View File

@ -1,3 +1,4 @@
import { toHaveNoViolations } from 'jest-axe'; import { toHaveNoViolations } from 'jest-axe';
import '@testing-library/jest-dom';
expect.extend(toHaveNoViolations); expect.extend(toHaveNoViolations);

View File

@ -1,6 +1,5 @@
import React from 'react'; import React from 'react';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom';
import { mount, ReactWrapper } from 'enzyme'; import { mount, ReactWrapper } from 'enzyme';
import { sleep } from '../utils'; import { sleep } from '../utils';