fix(sidebar): resolve Tailwind compile issue and z-index overlap on calendar table

This commit is contained in:
2026-06-01 16:35:32 +08:00
parent f2e451605b
commit 07b2b37530
899 changed files with 18439 additions and 93704 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1,365 +0,0 @@
"Product Name","Product Code","IMEI or Serial Numbers",Counted
"GIGABYTE B550M DS3H AC R2",97493168,,0.0000
"Jungle Leopard AC-01 Mid Tower ATX Gaming Case Tempered Glass Panel Liquid Cooling Support Black",41002049,,0.0000
"Zotac GeForce RTX 5060 Ti 16GB Twin Edge OC White Edition GDDR7 128-bit Graphics Card",80095628,,0.0000
"Ocypus Delta A40 SE BK ARGB 4 Heat-Pipes Single Tower Air Cooler with ARGB",78010847,DA40BSHB1002810,0.0000
"Thermalright Burst Assassin 120 Vision Forward and Reverse Dual-Fan CPU Air Cooler with LCD Screen white",32948694,,0.0000
"Adata Legend 710 512GB PCIE Gen3 X4 M.2 2280 Internal SSD",19073739,,0.0000
"Adata XPG Spectrix D50 8GB 3200mHz DDR4 RGB Memory Tungsten-Grey",99923625,,0.0000
"ADATA Premier DDR4 16GB 3200MHZ UDIMM 288PINS Desktop Memory",33587997,,0.0000
"G-SKILL RIPJAWS M5 NEO RGB BLACK 16GBX2=32GB 6000MHZ DDR5 CL36-36 XMP EXPO",20932701,,0.0000
"G-SKILL RIPJAWS M5 NEO RGB WHITE 16GBX2=32GB 6000MHZ DDR5 CL36-36 XMP EXPO",57212934,4.71329E+12,1.0000
"KINGSTON FURY BEAST RGB BLACK 16GBX2=32GB 5600MHZ DDR5 CL36 EXPO",26823500,,0.0000
"Gigabyte GP-UD850GM PG5 V2 850W Gold PCIE 5.0 Fully Modular Power Supply",65367803,,0.0000
"ASUS TUF GAMING 850G PCIE 5.0 850W 80+ GOLD FULLY MODULAR",57386115,,0.0000
"TEAMGROUP VULCAN NON-RGB ECO SILVER 16GBX2=32GB 6000MHZ DDR5 CL38 XMP EXPO",97600783,,0.0000
"TEAMGROUP T-FORCE VULCAN UD-D5 BLACK 16GBX2=32GB 6000MHZ DDR5",71032238,EF2509090280038,1.0000
"TEAMGROUP T-FORCE DELTA RGB WHITE 16GBX2=32GB 6000MHZ DDR5",19413268,EF2508010190311,1.0000
"APACER PANTHER OC NON-RGB BLACK GREY 16GBX2=32GB 6000MHZ DDR5",96570193,142529110305,1.0000
"APACER PANTHER RGB BLACK 16GBX2=32GB 6000MHZ DDR5",33902177,,0.0000
"Gigabyte Solid State Drive (1TB)",76413128,,0.0000
"Kingston NV3 500gb M.2 2280 PCIe 4.0 NVMe SSD",39061720,,0.0000
"AMD RYZEN 5 9600X (AM5) WITHOUT COOLER (TRAY TYPE)",13759412,,0.0000
"GEFORCE RTX 5060 TI PALIT INFINITY 3 OC 16GB GDDR7 TRIPLE FAN",86356384,,0.0000
"GEFORCE RTX 5070 GIGABYTE EAGLE OC SFF 12GB GDDR7 TRIPLE FAN",09395816,,0.0000
"Hiksemi Armor 2x16GB DDR4 3200MHz",39637190,,0.0000
"TEAMGROUP T-FORCE DELTA RGB BLACK 8GBX2=16GB 6000MHZ DDR5",60675791,,0.0000
"SIMORCHIP NX-01 NON-RGB BLACK 8GBX1=8GB 3200MHZ DDR4",90517034,,0.0000
"SEAGATE BARRACUDA 500GB HDD/SEAGATE DESKTOP HDD 500GB",11450602,WCC6Z0NV21U4/WCC6Z4YDDKYA/WCC6Z5ZRHCRZ/WCC6Z7NK6J76/WCC6Z0ZVA6TF/WCC6Z3VP7F6H/WCC6Z4VDNVJE/WCC6Z5ZRHVFJ/WCC6Y4UL70R1/WCC6Z6KL9633/WCC6Z5HZ9CJF/WCC6Z3HH57C4/WCC6Z4AVHCA8/WCC6Z6JNRFT8/WCC6Y7XU9913/WCAYUE980911/WCC6Z6LLZKN2/WCC6Z7VYKY0K/WCC6Y7TL7J9J/WCC6Z1ZP513F/WCC6Z5YA6JAN/WCC6Z2NEUXHU/WCC6Z7EYHZ85/WCC6Z5FN27ND/WCC6Z3YPXFN5/WCC6Z4VPHFY3/WCC6Z1TRVP2F,26.0000
"Acer AC-500 500w 80plus Bronze Power Supply - BLACK",12232937,AC500BPlus25124331/AC500BPlus25120986/AC500BPlus25120987/AC500BPlus25121376/AC500BPlus25121377/AC500BPlus25121378/AC500BPlus25121380/AC500BPlus25121375/AC500BPlus25121374/AC500BPlus25121373/AC500BPlus25121372/AC500BPlus25121371/AC500BPlus25120331/AC500BPlus25120332/AC500BPlus25120333/AC500BPlus25120334/AC500BPlus25120335/AC500BPlus25120336`/AC500BPlus25120337/AC500BPlus25120338/AC500BPlus25120339/AC500BPlus25120340,21.0000
"Intel® Core™ i5-12400 Processor (18M Cache, up to 4.40 GHz)",61784340,U56R0P4804877,1.0000
"Gigabyte 240GB SSD 2.5 Sata",26089128,SN254008941021/SN252908904702,0.0000
"Hiksemi Future RGB Single 16GB 3200MHz DDR4",20376191,,0.0000
"Crucial Ballistix 16GB DDR4 2666MHz",76298911,,0.0000
"DEEPCOOL AK400 DIGITAL ARGB 1 FAN AIR COOLER (R-AK400-BKADMN-G)",27275809,,0.0000
"Deepcool LT720 AIO ARGB Liquid Cooler w/ Anti-Leak Tech Black",43851936,,0.0000
"GIGABYTE H610M K DDR4 mATX Motherboard",12760082,SN253350029383,1.0000
"MSI MAG A650BN 650W WATTS 80+ BRONZE ATX NON MODULAR",1090644,,0.0000
"Acer AC-1000 1000W Full Modular Power Supply 80 Plus Bronze",92881546,AC1000B25080119,0.0000
"Acer AC-550 550w Full Modular 80plus Bronze Power Supply",18233907,,0.0000
"ACER AC-650 650W 80+ BRONZE ATX FULLY MODULAR",1983150,,0.0000
"Acer Air 2 Plus with LCD Screen ATX PC Case",18175163,,0.0000
"Aigo Apollo A275 Panoramic Glass M-ATX PC Case",24917033,,0.0000
"Amd Ryzen 5 3400g SocketAm4 3.7ghz 4-core, 8-Thread Desktop Processor with Radeon Vega 11",19005818,9AMV893S50500_YD3400C5M4MFH/9ASA094N60396_YD3400C5M4MFH/9ASA094N60200_YD3400C5M4MFH/9ASA094N60195_YD3400C5M4MFH/9ASA094N60313_YD3400C5M4MFH/9ASA094N60204_YD3400C5M4MFH/9ASA094N60469_YD3400C5M4MFH/9ASA094N60470_YD3400C5M4MFH/9ASA094N60459_YD3400C5M4MFH/9ASA094N60458_YD3400C5M4MFH/9ASA094N60291_YD3400C5M4MFH/9ASA094N60381_YD3400C5M4MFH/9ASA094N60382_YD3400C5M4MFH/9ASA094N60384_YD3400C5M4MFH/9ASA094N60196_YD3400C5M4MFH/9ASA094N60376_YD3400C5M4MFH/9ASA094N60378_YD3400C5M4MFH/9ASA094N60308_YD3400C5M4MFH/9ASA094N60314_YD3400C5M4MFH/9ASA094N60304_YD3400C5M4MFH,19.0000
"AMD RYZEN 5 5500 AM4 4.60GHZ 6-CORE, 12-THREAD TRAY",99717222,9ANT936V50171_100-000000457/9ANT936V50172_100-000000457/9ANT936V50044_100-000000457/9ANT936V50178_100-000000457/9ANT936V50173_100-000000457/9ANT936V50062_100-000000457,6.0000
"AMD RYZEN 5 5500GT 3.60-4.40GHZ 6-CORE, 12-THREAD MPK TRAY",90132569,9MQ3904R50160_100-000001489/9MQ3904R50163_100-000001489/9MQ3904R50162_100-000001489/9MQ3904R50169_100-000001489/9MQ3904R50168_100-000001489/9MQ3904R50151_100-000001489/9MQ3904R50153_100-000001489/9MQ3904R50148_100-000001489/9MQ3904R50154_100-000001489,9.0000
"Amd Ryzen 5 5600 6-CORE,12-THREAD AM4 TRAY",3946340,,0.0000
"AMD Ryzen 5 5600GT 6-Core 12-Thread AM4 APU with Integrated Radeon Graphics",18028773,9ANC469S50082_100-000001488,1.0000
"Amd Ryzen 5 5600X AMD Ryzen 5 5600X 6-Core 12-Thread AM4 3.7GHz Gaming Processor",26845630,,0.0000
"AMD Ryzen 5 7500F Socket AM5 6-Core 12-Thread Gaming Processor",30580637,,0.0000
"AMD Ryzen 7 5700G 8-Core 16-Thread AM4 APU with Radeon Vega 8 Graphics",63489321,9ANS694U50278_100-000000263/9MU8377W50364_100-000000263/9MU8377W50353_100-000000263/9MU8377W50366_100-000000263/9MU8377W50372_100-000000263/9MU8377W50373_100-000000263,5.0000
"AMD Ryzen 7 5700X 8-Core 16-Thread AM4 Desktop Processor",90579984,9APQ860M60377_100-000000926/9APQ860M60375_100-000000926/9AHK828M60425_100-000000926/9APQ860M60205_100-000000926/9APQ860M60204_100-000000926/9APQ860M60236_100-000000926,6.0000
"AMD Ryzen 7 7700 8-Cores 16-Thread Gaming Desktop Processor",3619980,,0.0000
"AOC 24B36X/71 23.8 FHD (1920x1080) 144Hz 4ms GTG / 0.5ms MPRT IPS",3618450,,0.0000
"APACER AP512GAS2280P4-1 NVME 1TB GEN 3",77838156,,0.0000
"APACER AP512GAS2280P4-1 NVME 512GB GEN 3",61935902,,0.0000
"Apacer Panther - GOLDEN 32GB 16GX2 DDR4 3200MHZ",19649720,,0.0000
"APC BVX650I-PH Back-UPS AVR 650va / 360 Watts / 4 Sockets",58210768,,0.0000
"ASRock AMD Radeon RX 9060 XT Challenger 8GB GDDR6 OC Graphics Card",62294462,,0.0000
"Asrock B550M Pro SE Socket Am4 Ddr4 Motherboard",42543638,,0.0000
"ASRock RX 9060 XT Steel Legend 16GB OC RX9060XT SL 16GO",54279719,,0.0000
"AWP AID650 Aide 390W-650VA with AVR Universal Socket Ups",83407937,,0.0000
"BADWOLF EXTENDED MOUSEPAD",80059231,,23.0000
"Badwolf RGB Stereo Gaming Headset - LED - with Volume Knob",11320619,,0.0000
"Biostar Rx 580 Dual Fan 8gb 256bit GDdr5 Gaming Videocard",27196039,T254888589/T254888588/T254888586/T254888582,4.0000
"Biwin Black Opal DW100 RGB 32GB 2x16GB DDR5 CL36 6000Mhz",56572034,,0.0000
"Biwin DW100 RGB 32GB (2x16GB) DDR5 6000MHz CL30 Blanca (white)",21613972,,0.0000
"Colorful GeForce RTX 3050 NB DUO 6GB V4-V Graphics card",19728126,8L02P046JVE00GX/8L02P037NBQ03PW,0.0000
"Colorful GeForce RTX™ 5060 Battle AX DUO 8GB GDDR7 Graphics Card",31930822,,0.0000
"Colorful RTX 3060 NB DUO 12G V2 192bit Ddr6 Gaming Videocard",97303902,,0.0000
"COMFAST WIFI DONGLE 1300MBPS",84131915,,49.0000
"COMFAST WIFI DONGLE 150MBPS",29308479,,1.0000
"COOLER MASTER MWE V3 650W 80+ Bronze",59193769,MPE6501ACABW3BUS1255100661/MPE6501ACABW3BUS1255100664/MPE6501ACABW3BUS1255100665/MPE6501ACABW3BUS1255100021/MPE6501ACABW3BUS1255100022/MPE6501ACABW3BUS1255100023/MPE6501ACABW3BUS1255100024/MPE6501ACABW3BUS1255100642/MPE6501ACABW3BUS1255100643/MPE6501ACABW3BUS1255100644/MPE6501ACABW3BUS1255100645,10.0000
"Coolman Spectra mATX TG Case ( Black | White )",76904790,,0.0000
"Corsair CX650 650W 80+ Bronze ATX Power Supply",23831957,,0.0000
"Corsair RMe Series RM850e Fully Modular Low-Noise ATX Power Supply",96940701,,0.0000
"Dahua C800A 2.5-inch 3D NAND SSD 240GB DHI-SSD",23915066,,0.0000
"Dark Flash DB330M Mesh M-ATX PC Case Black",64509633,,0.0000
"Dark Flash DB330M Mesh M-ATX PC Case White",83486731,,0.0000
"Deepcool CH160 Plus White",21870993,,2.0000
"GALAX REVOLUTION 06 AS BLACK WITH 4PCS STATIC RGB FAN ATX CASE",23184493,,0.0000
"GIGABYTE 750W GP-UD750GM-PG5 80+ Gold Modular Power Supply",88602513,,0.0000
"Gigabyte AMD Radeon RX 7600 Gaming OC 8GB GDDR6 Graphics Card",93570287,,0.0000
"Gigabyte B550M DS3H R2",93409701,SN25503A008345,0.0000
"Gigabyte B550M K",4643100,,0.0000
"Gigabyte B650M D3HP AX WIFI AM5 Micro-ATX Motherboard",3790231,,0.0000
"Gigabyte B650M Gaming WiFi AMD AM5 DDR5 Gaming Motherboard",69009816,SN260250070146/SN260250070147/SN260250070044,1.0000
"Gigabyte B850M FORCE WIFI6E V2 AM5 Micro-ATX Motherboard",20623678,,0.0000
"Gigabyte GA-B450M-DS3H V3 Socket Am4 Ddr4 Motherboard",95297761,SN254960034555/SN254960034556/SN254960034560,3.0000
"Gigabyte GeForce RTX 5060 Ti Aero OC 16GB GDDR7 Graphics Card",20373913,,0.0000
"Gigabyte GeForce RTX 5060 Ti Eagle OC Ice 16GB GDDR7 Graphics Card",39725415,,0.0000
"Gigabyte GeForce RTX 5060 Ti Windforce Max OC 16GB GDDR7 Graphics Card",21193004,,0.0000
"Gigabyte GeForce RTX 5060 Windforce Max OC 8GB GDDR7 Graphics Card",60219964,,0.0000
"GIGABYTE GeForce RTX™ 5060 WINDFORCE 8GB GDDR7 128-bit Graphics Card",92660852,,0.0000
"GIGABYTE GeForce RTX™ 5080 GAMING OC 16GB GDDR7 256-bit Graphics Card",72556018,,0.0000
"GIGABYTE Radeon™ RX 9060 XT GAMING OC 16GB GDDR6 128-bit Graphics Card",26370993,,0.0000
"Gigabyte SSD M.2 500gb Gen4 4000e Nvme",59361645,,0.0000
"HIKSEMI 16GB DDR4 3200Mhz Armor (white)",68034799,,0.0000
"HIKSEMI 512GB WAVE 2.5 Solid State Drive",97974328,,0.0000
"Hiksemi Armor 2x8GB DDR4 3200MHz",69452021,,0.0000
"Hiksemi Armor 16GB single DDR4 3200MHz",9085473,30178955960/30178955961/30178472738/30178472737,4.0000
"HikSemi Armor 8GB 1x8GB DDR4 3200Mhz Black",77826921,30175838829/30175838830/30175838827/30175838828/30175838815/30175838816/30175838813/30175838814/30175838811/30175838812/30175838807/30175838805/30175838806/30175838803/30175838804/30178335603/30178335604/30178335609/30178335610/30178335607/30178335608/30178335619/30178335620/30178335613/30178335614/30178335611/30178335612/30178335583/30178335584/30178335581/30178335582/30178335601/30178335602/30178335597/30178335598/30178335591/30178335592/30178335589/30178335590/30178335585/30178335586/30178335617/30178335618/30178335605/30178335606/30178335595/30178335596/30178335593/30178335594/30178335615/30178335616,51.0000
"Hiksemi Future RGB 16GB 6000MHz DDR5 Desktop Gaming Memory",36190952,,0.0000
"Hiksemi Future 2x16GB RGB 3200MHz DDR4",68402779,,1.0000
"INPLAY STX360 KEYBOARD MOUSE COMBO BLACK",41082091,,35.0000
"Jungle Leopard 3in1,120 ARGB Reverse case Fan,120mm Black",10329047,,0.0000
"Jungle Leopard 3in1,120 ARGB Reverse case Fan,120mm White",34192400,,0.0000
"Jungle Leopard AC-01 Mid Tower ATX Gaming Case Tempered Glass Panel, Liquid Cooling Support White",32271183,,0.0000
"Jungle Leopard Astro V2 ARGB CPU Fan 120mm Infinity Mirror 5V 3PIN Motherboard Lighting Sync 4PIN WHITE",22893273,,0.0000
"Jungle Leopard Astro V2 ARGB CPU Fan 3in1 120mm Infinity Mirror 5V 3PIN Motherboard Lighting Sync 4PIN BLACK",63573298,,0.0000
"Jungle Leopard Astroshel LCD 240 ARGB AIO Liquid Cooler Black",62389912,,0.0000
"Jungle Leopard Astroshel LCD 240 ARGB AIO Liquid Cooler White",82915480,,0.0000
"Jungle Leopard AstroShel V2G CPU AIO Cooler 2.8-inch Smart Display Black ARGB 360mm",22573127,KFL360BS25120223,0.0000
"Jungle Leopard AstroShel V2G CPU AIO Cooler 2.8-inch Smart Display White ARGB 360mm",37853412,KFL360WS25120369,1.0000
"Jungle Leopard Galaxy ARGB FAN Single Black",19231061,,0.0000
"Jungle Leopard Galaxy ARGB FAN Single White",79128394,,0.0000
"Jungle Leopard MS-01 Micro ATX Gaming Tempered Glass, Liquid Cooling Support, Magnetic Dust Filters (Black)",70198805,,0.0000
"Jungle Leopard MS-01 Micro ATX Gaming Tempered Glass, Liquid Cooling Support, Magnetic Dust Filters (White)",22945704,,0.0000
"Jungle Leopard Stellar Realm CPU Aio Cooler Temperature Digital Display 240mm Liquid Cooler 5V 3PIN ARGB Mobo Sync Black",978462,,0.0000
"Jungle Leopard Stellar Realm CPU Aio Cooler Temperature Digital Display 240mm Liquid Cooler 5V 3PIN ARGB Mobo Sync White",97672521,,0.0000
"Keytech Galaxy ARGB PC Cooling Fan (3-in-1 Kit) Black",45380798,,0.0000
"Keytech Galaxy ARGB PC Cooling Fan (3-in-1 Kit) White",72394598,,0.0000
"Keytech T5000 Black MATX",22834009,,2.0000
"Keytech Tornado 3in1 120mm Chassis Fan with Control Hub and Remote Control ARGB",18527930,,0.0000
"Lexar 1tb NM610 Pro M.2 2280 PCIe Gen3x4 NVMe Internal SSD",84291309,,0.0000
"LEXAR 500GB NM710 M.2 2280 PCIe Gen4x4 NVMe",95548120,PC80212001920P2200/PC80212003122P2200/PC80212001632P2200/PC80212001633P2200/PC80212004445P2200/PC80212003613P2200/PC80212001577P2200/PC80212003898P2200/PC80212001586P2200/PC80212003589P2200/PC80212001353P2200,11.0000
"LEXAR 8GB 3200MHz DDR4 THOR",63810397,,0.0000
"Lexar Internal NM610 Pro M.2 2280 PCIe Gen3x4 NVMe SSD 500gb",83142086,,0.0000
"Dark Flash M305 Mesh M-ATX PC Case",47802361,,0.0000
"MSI A520m-A Pro AMD Am4 Ddr4 Micro-ATX PCB Gaming Motherboard",68541931,601-7C96-120B2510057496/601-7C96-120B2511027392,0.0000
"MSI MAG 255XF 24.5 FHD (1920x1080) 300Hz 0.5ms GtG Rapid IPS Gaming Monitor",27036199,,0.0000
"Nexion GK660/GK670/GK680 104 Keys 12 Running Lighting mode Mechanical Keyboard with mouse usb combo",82713495,,0.0000
"Nexion GS-358/359 USB Computer Speaker Wired RGB 2in1 Sound Bar Gaming Speaker",54152132,,0.0000
"NEXION GS356 / GS357 RGB USB Speaker",43323610,,0.0000
"NEXION MK 155 B MECHANICAL KEYBOARD",19765210,,3.0000
"Nexion MK155A (White-Green) Wireless Tri-Mode Mechanical TKL Keyboard",49431260,,2.0000
"Nexion MK155W (Sky Blue) Wireless Tri-Mode Mechanical TKL Keyboard",40931282,,0.0000
"North Bayou F425 Gas-Strut Flexi Wall Mount",5663184,,0.0000
"Nvision EG24XT 23.8 FHD 240Hz IPS Monitor Black",43920975,,0.0000
"Nvision EG24XT 23.8 FHD 240Hz IPS Monitor White",34911323,,0.0000
"Nvision EG27F1 PRO 27 IPS 200Hz 1920X1080 Gaming Monitor",65463110,,0.0000
"Nvision EG27XT 27 IPS 240Hz FHD Monitor Black",21730706,EG270BKCJE02512301733,1.0000
"Nvision EG27XT 27 IPS 240Hz FHD Monitor White",21019696,,0.0000
"Nvision N2455PRO 100Hz IPS Panel 23.8 Monitor Black",72796181,,0.0000
"Nvision N2455PRO 100Hz IPS Panel 23.8 Monitor White",10143242,322,0.0000
"Ocypus Gamma A20 ARGB Dual Heat Pipes, 92mm Fan Small-Tower Air Cooler with ARGB Lighting (Black)",83540301,,0.0000
"Ocypus Gamma A20 ARGB Dual Heat Pipes, 92mm Fan Small-Tower Air Cooler with ARGB Lighting (White)",13951682,GA20WFHB1000210,1.0000
"Ocypus Gamma A40 ARGB CPU Cooler (Black)",95137172,,0.0000
"Ocypus Gamma A40 ARGB CPU Cooler (White)",51731859,,0.0000
"Ocypus Gamma A40 ARGB Digital CPU Cooler (black)",21972319,,0.0000
"Ocypus Gamma A40 ARGB Digital CPU Cooler (white)",43288109,,0.0000
"Ocypus Gamma A40 BK CPU Cooler (Black)",24113094,,0.0000
"Ocypus Iota A40 CPU Air Cooler Digital Black",4152262,,0.0000
"Ocypus Iota A40 CPU Air Cooler Digital White",97369018,,0.0000
"Palit GeForce RTX 3050 StormX 6GB GDDR6 128Bit Graphics Card",1193924,,0.0000
"PATRIOT Viper VP4300 Lite 1TB M.2 2280 PCIe Gen4 SSD",60634929,,0.0000
"Philips 242M8/71 23.8” IPS 144Hz 1920x1080 VGA/HDMI/DP VESA mount Monitor",89175036,,0.0000
"Powercolor Reaper AMD Radeon RX 9060 XT 16GB GDDR6 Graphics Card RX9060XT 16G-A",24903258,,0.0000
"Redragon Cobra Gaming Mouse (M711-2)",67230545,,0.0000
"Redragon Diomedes Honeycomb Gaming Headset (White) (H386-W)",19075306,RDH386-W23051500211,1.0000
"Redragon H389 Arrorain Lite RGB Wired Gaming Headset",33912065,,1.0000
"REDRAGON HYLAS GAMING HEADSET (WHITE) (H260-W)",43573381,,0.0000
"Redragon Hylas H260 Wired Gaming Headset Black",97405320,,0.0000
"Redragon K611-BGB Bes Wired USB Mechanical Gaming Keyboard",32296825,RDK611-BGB25072500273,1.0000
"Redragon K611-GGO Bes Wired USB Mechanical Gaming Keyboard",83112219,,0.0000
"Redragon K686WB-RGB EISA PRO 3-Mode Red Switch Compact Mechanical Keyboard",84462159,,0.0000
"Redragon K728GGY-RGB-PRO Antonium 87 Keys 80% Gasket Mounted TKL Wireless Mechanical Keyboard (RPC Linear Switch) (Grey/Yellow)",80430986,,0.0000
"Redragon K728WBB RGB Antonium Pro 87 Keys 80% Gasket Mounted TKL",67421117,,0.0000
"Redragon Lamia 2 Gaming Headset With Stand (Black) (H320W-RGB)",31475030,RDH320RGB-124110600851/RDH320RGB-124122600685,2.0000
"Redragon Lamia 2 Gaming Headset With Stand (White) (H320W-RGB)",1194257,RDH320W-RGB25052000731/RDH320W-RGB25052000734/RDH320W-RGB25052000735,2.0000
"Redragon M808 Storm Lightweight RGB Gaming Mouse",8073260,,0.0000
"Redragon M916-LIT-1K K1ng Lite 8000DPI Light-Weight Tri-Mode Gaming Mouse (Black)",17929880,,0.0000
"Redragon M916-LIT-1K K1ng Lite 8000DPI Light-Weight Tri-Mode Gaming Mouse (White)",12908870,,0.0000
"Redragon Mitra V2 RGB Mechanical Gaming Keyboard (K551RGB-1 V2)",45096260,,0.0000
"Redragon OTIIM Wired 87 Keys Gasket Mechanical Keyboard (K729WBP-RGB)",28974970,,0.0000
"Redragon Stormhunter Wired 81+1 Keys Rapid Trigger Mechanical Keyboard",54623180,,0.0000
"Redragon Zeus X Virtual 7.1 Surround Sound Gaming Headset",89325756,,1.0000
"RUIX NC 240 WHITE / BLACK AIO Cooling Fans & Components Medium Fan Speed Argb Lighting",30958842,,0.0000
"Ruix NC360 Liquid Cooler CPU Coolers 360mm AIO With ARGB PWM Fan Black",37081289,,0.0000
"Ruix NC360 Liquid Cooler CPU Coolers 360mm AIO With ARGB PWM Fan White",93829346,,0.0000
"SAMSUNG 1TB 990 EVO Plus Gen4 NVMeᵀᴹ Solid State Drive",61072317,,0.0000
"Sapphire Pure AMD Radeon RX 9060 XT Gaming OC 16GB GDDR6 Graphics Card",58092280,,0.0000
"STARLINK DGT 120 BLACK ALUMINUM Live speed display",19785174,,4.0000
"STARLINK DGT 120 BLACK WOOD Live speed display",19094327,,5.0000
"STARLINK DGT 120 WHITE ALUMINUM Live speed display",17842595,,4.0000
"STARLINK DGT 120 WHITE WOOD Live speed display",71268175,,4.0000
"STARLINK DGT 240 BLACK WOOD GRAIN Live speed display",33512920,,9.0000
"STARLINK DGT 240 WHITE WOOD GRAIN Live speed display",23049515,,9.0000
"TeamGroup T-Create Classic 32GB 2 x 16GB 6000Mhz CL48 DDR5",50612918,,0.0000
"TeamGroup T-Create Classic 32GB 2 x 16GB 6000Mhz CL48 DDR5 (white)",23791175,,0.0000
"TeamGroup T-Force Vulcan Z 256B 2.5 SATA III 3D NAND Internal SSD",52969182,1F2508120142859/1F2508120142866/1F2508120142860/1F2508120142865/1F2508120142864/1F2508120142863/1F2508120142854,7.0000
"Teclado Redragon Galatin Pro K719WG Wireless Mint Mambo White-Green",49902381,,0.0000
"TECWARE FLOW M MATX CASE BLACK",23065925,,0.0000
"Tecware NEO M2 Omni 2025 TG mATX with 2X140mm 1X120mm Fans Black",29826294,,0.0000
"Tecware NEO M2 Omni 2025 TG mATX with 2X140mm 1X120mm Fans White",92320614,,0.0000
"Tecware Timber High Airflow ATX TG Case w/ 4X120mm Fan (Black)",1402394,,3.0000
"Tecware Timber High Airflow ATX TG Case w/ 4X120mm Fan (White)",65914332,,0.0000
"Tecware VX Prism M Triple Tempered Glass mATX Case Black",74647253,,0.0000
"Tecware VX Prism M Triple Tempered Glass mATX Case White",3782571,,0.0000
"Tecware VXN EVO Dual Chamber mATX ARGB Case with 3x120mm (Black)",30281782,,0.0000
"Tecware VXN Glow Dual Chamber mATX ARGB Case with 3x120mm (White)",13342456,,0.0000
"Thermalright Assassin Spirit 120 Vision ARGB Air Cooler (Black)",12130597,,0.0000
"Thermalright Assassin Spirit 120 Vision ARGB Air Cooler (White)",26793816,,0.0000
"Thermalright Frozen Warframe 240 ARGB Black TL-P12-S CPU Liquid Cooler",12431034,,0.0000
"Thermalright Frozen Warframe 240 ARGB White TL-P12-S CPU Liquid Cooler",52401266,,0.0000
"Thermalright Frozen Warframe 360 ARGB AIO CPU Liquid Cooler Black",58693936,,0.0000
"Thermalright Frozen Warframe 360 ARGB AIO CPU Liquid Cooler White",50791306,,0.0000
"Thermalright Peerless Assassin 120 Digital ARGB Air Cooler (Black)",33032406,,0.0000
"Thermalright Peerless Assassin 120 Digital ARGB Air Cooler (White)",70652109,,0.0000
"ViewSonic VX2479A-HD-PRO 24 FHD (1920x1080) 240Hz 1ms MPRT SuperClear",29193409,,0.0000
"Whalekom 256gb M.2 PCIe NVMe SSD",97657018,KY256G3250900112,1.0000
"XFX SPEEDSTER SWFT210 RADEON RX 7600 CORE Gaming Graphics Card with 8GB GDDR6",87069543,,0.0000
"XFX Swift AMD Radeon RX 9060 XT OC Gaming Ed. 16GB GDDR6 Graphics Card (black)",62198530,,0.0000
"XFX Swift AMD Radeon RX 9060 XT OC Gaming16GB GDDR6 (white)",3119902,AXV003422,0.0000
"YGT 420D Seaview ARGB Lighting Tempered Glass (White)",87430719,,1.0000
"YGT 420D Seaview ARGB Lighting Tempered Glass Black",10161275,,0.0000
"YGT ARGB Case Fan 3 In 1 Kit (Black)",5828319,,0.0000
"YGT M325 Seaview Room Tempered Glass Micro ATX/ITX Desktop Case Black",3313166,,0.0000
"YGT M325 Seaview Room Tempered Glass Micro ATX/ITX Desktop Case White",97034425,,13.0000
"YGT WDB-100 Tri-Mode Mechanical Keyboard ARGB",40401232,,0.0000
"Zotac GAMING GeForce RTX 5070 AMP White Edition 12GB GDDR7 192-bit Graphics Card",98964924,,0.0000
"Zotac GAMING GeForce RTX 5070 Twin Edge OC 12GB GDDR7 192-bit Graphics Card ZT-B50700H-10P",11229920,,0.0000
"Zotac GeForce RTX 5060 Ti 16GB Twin Edge OC GDDR7 128-bit Graphics Card",80904729,,0.0000
"Hiksemi Wave (S) 2.5″ 1TB SATA3 Solid State Drive",71613407,,0.0000
"Gigabyte GeForce RTX 5060 Ti Eagle Max OC 16GB GDDR7 Graphics Card",49620005,,0.0000
"GEFORCE RTX 5060 PALIT OC 8GB GDDR7 WHITE DUAL FAN",75836519,,0.0000
"Gigabyte GA-A520M-K Socket Am4 Ddr4 Motherboard",93068120,SN254860047141/SN254860047142/SN254860047143/SN254860047145/SN254860047146/SN254860047147/SN254860047041/SN254860047042/SN254860047043/SN254860047044/SN254860047046/SN254860047047/SN254860047048/SN254860047050/SN254860046841/SN254860046842/SN254860046846/SN254860046847,16.0000
"Gigabyte Gaming A16 CTHI3PH893SH Laptop (Black) | 16" FHD+ (1920x1200) 165Hz IPS | Core i7-13620H | 16GB RAM | 512GB SSD | RTX 5050 | Windows 11 Home | Gigabyte Backpack",73982372,,0.0000
"Gigabyte Aero X16 1TH93PH894AH Gaming Laptop (Gray) | 16 FHD+ (1920x1200) 165Hz IPS | Ryzen AI 7 350 | 16GB RAM | 1TB SSD | RTX 5050 | Windows 11 Home | Gigabyte Backpack",83328021,,0.0000
"Gigabyte Aero X16 1VH93PHC94AH Copilot+ PC Laptop (Gray) | 16" QHD+ (2560x1600) 165Hz IPS | Ryzen AI 7 350 | 16GB RAM | 1TB SSD | RTX 5060 | Windows 11 Home | Gigabyte Backpack",10169029,,0.0000
"Gigabyte Aero X16 1VH93PHC94AH Copilot+ PC Laptop (Gray) | 16" QHD+ (2560x1600) 165Hz IPS | Ryzen AI 7 350 | 16GB RAM | 1TB SSD | RTX 5060 | Windows 11 Home | Gigabyte Backpack",57941026,,0.0000
"AORUS ELITE 16 (2025) Intel Core Ultra 9 275HX RTX 5070 8GB GDDR7 16″ 165Hz IPS Gaming Laptop GS-GS-AORUS-ELITE-16-BWHC3PHC94SH",96191853,,0.0000
"MSI GeForce RTX 3050 VENTUS 2X 6GB GDDR6 OC",31687300,,0.0000
"Ground Zero GRID with 3 led fans included Black",38019639,,2.0000
"Ground Zero VM-GRID with 3 led fans included White",94883741,,2.0000
"AORUS FI32U UHD 4K GAMING MONITOR",45212312,,0.0000
"SAMSUNG 990 PRO NVME 2TB GEN 4",33104028,,0.0000
"DEEPCOOL AK620 DUAL TOWER CPU COOLER - BLACK",57417639,,0.0000
"Acer AC-500 500w 80plus Bronze Power Supply - WHITE",94181009,,0.0000
"GIGABYTE GP-GS25F2A-TW 24.5 240HZ SS IPS FHD GAMING MONITOR",91057234,SN25405B006675/SN25435B001540/SN25405B006314/SN25405B006213,4.0000
"Meta A200 Black with 3X RGB FANS",80592437,,2.0000
"Meta A200 White with 3X RGB FANS",94819702,,0.0000
"AMD Ryzen Original Heatsink fan, Wraith Stealth",01893402,,8.0000
"Inplay Moon M05 RGB Fans (black)",42247070,,60.0000
"AMD Ryzen 5 PRO 5655G 6-core 12-thread TRAY TYPE",80592343,,0.0000
"AMD Ryzen 5 4500 6 Core 3.6Hz 12 threads 4.10GHz AM4 Processor Tray",02921866,,0.0000
"MSI 24.5 MP251L E2 PRO IPS 120Hz Gaming Monitor",79213478,PD2M305C02954/PD2M305C02898,2.0000
"MSI MAG 272F X24 27 FHD 240Hz 0.5ms GTG Rapid IPS Gaming Monitor",69137714,,0.0000
"MSI MAG 275CQF E18 27 Reso 180Hz 0.05ms GTG Rapid VA Curved Gaming Monitor",97065541,,0.0000
"Inplay lite X220 Case with Psu",55741631,,0.0000
"Asus Vivobook X1404VAPV14 Core 5 120U 8GB 256GB SSD 14 FHD Display",64558970,T7N0SH015933319/T7N0SH01619931A/T7N0SH01653831D,3.0000
"Lenovo Ideapad slim 3 Core i5- 13th Gen 13420H 8gb RAM 512GB SSD 15.3 WUXGA IPS",60433426,,0.0000
"Viewpro Ryzen 5 8gb Ram 256gb SSD Win 11 Pro",11684294,,0.0000
"Asrock B550m SE wifi",94235903,,0.0000
"GROUND ZERO ILF-120 3X ARGB FANS FORWARD 5V 3PIN+SMALL 4PIN (BLACK)",35063914,,0.0000
"GIGABYTE RTX 5060 EAGLE OC 8GB GRAPHICS CARD",55942209,SN255241013399/SN260241021110/SN260241021108,1.0000
"Ygt 500w PSU 80+ Bronze",03714326,,0.0000
"YGT ARGB Case Fan 3 In 1 Kit (White)",05983965,,3.0000
"Ryzen 7 7800x3d",82531218,9MT4671V50133_100-000000910,1.0000
"ID Cooling FX360 Black",41049637,,0.0000
"ID Cooling FX360 White",47891020,,0.0000
"STARLINK DGT 240 WHITE ALUMINUM",41590373,,4.0000
"STARLINK DGT 240 Black ALUMINUM",35928591,,8.0000
"Inplay OP12-1B",67208360,,9.0000
"Inplay OP12-1W",09132164,,20.0000
"Inplay OP12R-1B Reverse fans",04832594,,4.0000
"Inplay OP12R-1W Reverse Fans white",30491106,,10.0000
"Inplay P9 PWM Fan Hub",11623609,,19.0000
"INPLAY STX 200 KEYBOARD AND MOUSE BUNDLE - WHITE",20378249,,0.0000
"NINGMEI NLR500-R74165",59936524,,0.0000
"Simorchip 512gb SSD Sata",83949024,,0.0000
"Nvision n2455GT 144hz 23.8 Black",61973029,NQ240BBEGE02602300793/NQ240BBEGE02602300034/NQ240BBEGE02602301173/NQ240BBEGE02602301485/NQ240BBEGE02602301496,2.0000
"Deepcool CH160 Plus Black",34273210,,4.0000
"Deepcool CH260 Black",60810323,,0.0000
"Deepcool CH 260 White",02795217,,0.0000
"Jonsbo D32 Pro Black",93881222,,1.0000
"Jonsbo D32 Pro White",94188250,,1.0000
"Sapphire Pulse AMD Radeon RX 7600 Gaming OC 8GB GDDR6 Graphics Card",97212283,A255000008170/A255100005824/A255100005822/A255100005823/A255100005821/A255100005825,6.0000
"Gigabyte B550m Aorus Elite AX",97153208,,0.0000
"Gigabyte B650 Eagle AX",92026750,,0.0000
"Lexar NQ100 240gb SSD Sata",13961276,LDK894R009115/LDK894R013705/LK89752009381/LGW642J008801/LK89752009313/LDK894R005100/LK89752011529/LK89752011543/LDK894R012903/LDK894R011753/LDK894R011914/LK89752011541/LGW642J008796,11.0000
"ASRock AMD Radeon RX 6600 Challenger D 8GB GDDR6 Graphics Card",01764823,,0.0000
"Nvision MG34UF20 34 Ultra Wide 200hz Curved Monitor Black",51276394,,0.0000
"Nvision MG34UF20 34 Ultra Wide 200hz Curved Monitor White",52790311,,0.0000
"Inplay LD-UPS 1000VA Uninterruptible Power Supply UPS with LCD Display",50298385,,0.0000
"Inplay Electric Standing Desk Table 140x60cm",79387184,,0.0000
"DEEPCOOL PF650 650W 80+ STANDARD ATX NON MODULAR",30411023,10000156050BA245200092/10000156050BA245200094/10000156050BA245200101/10000156050BA245200102/10000156050BA245200103/10000156050BA245200105,0.0000
"Gigabyte B450M DS3H WiFi",17951381,,0.0000
"Crucial 1tb P310 PCIe Gen4 NVMe 2280 M.2 SSD",84035236,,0.0000
"NVISION A24K7-R560-1651 All-in-One PC",63970617,,0.0000
"Redragon K728WRB RGB stormhunter Pro 87 Keys 80% Gasket Mounted TKL",43125869,,0.0000
"AMD RYZEN 5 3400G MPK (AM4) WITH WRAITH STEALTH COOLER OVA Box",89702036,,0.0000
"Apacer Panther - GOLDEN 16GB 8GX2 DDR4 3200MHZ",48770960,,0.0000
"Hiksemi Future RGB 16GB 6000MHz DDR5 Desktop Gaming Memory White",17204134,,0.0000
"Gigabyte Eagle Max Oc GeForce RTX 5060 8GB GDDR7 TRIFAN",29381109,,0.0000
"AMD Ryzen 7 9800X3D 4.7GHz Up to 5.2GHz Socket AM5",39684512,,0.0000
"Intel CPU Stock Cooler For LGA 1700 Socket, Blue Lights, Copper heatsink",68047351,,1.0000
"Crucial Ballistix RGB 16GB DDR4 3000MHz",19528611,,0.0000
"Crucial Ballistix Sport 16GB DDR4 3200MHz",91072803,,0.0000
"AMD Ryzen 7 9700X (AM5) Processor 3.80-5.50GHz 8-Core 16-Threads",48921656,,0.0000
"Nvision A24K6-i704-0825 i7 4th gen 8G/256G Set All-in-one PC",07642951,20260325HM87I704162560543,1.0000
"Inplay Moon M05 120MM RGB FANS (WHITE)",63933521,,147.0000
"GSTORM 120MM RGB FANS (BLACK)",29350248,,0.0000
"8GB STORM STORAGE DDR3 1600MHZ UDIMM",95320761,,0.0000
"8GB HKCMemory HU30 DDR3 1600MHZ UDIMM",12913126,,0.0000
"8GB HKCMemory HS30 DDR3 1600MHZ SODIMM",42476951,,0.0000
"8GB STORM DDR3 1600MHZ SODIMM",23144290,,0.0000
"256GB R900 Ramsta M.2 NVME SSD",59248213,,0.0000
"DARKFLASH INFINITY 24 3IN1 ARGB FANS",59942018,,0.0000
"Wj Coolman Seaview",95474107,,0.0000
"Gigabyte B650m Aorus Elite AX",83610329,,0.0000
"Asus ROG Strix B550-A Gaming",43939143,,0.0000
"AMD Ryzen 7 8700F (AM5) Processor 8-Core 16-Threads",65933239,9ANJ977T50857_100-000001590,1.0000
"Gigabyte GeForce RTX 3050 Windforce OC V2 6GB GDDR6 Graphics Card",38061529,SN260651066063/SN260651066064/SN255241002023/SN255241002024/SN260651066066/SN260651066070/SN260651066067/SN260651066054/SN260651066060,9.0000
"Lexar 8GB DDR4 2666MHz CL19 UDIMM Desktop Memory",60406995,,0.0000
"GIGABYTE RTX 5060 EAGLE OC ICE 8GB GRAPHICS CARD",45610203,,0.0000
"Inplay Seaview 240mm ARGB Liquid Cooler Black",31707159,,0.0000
"1 INPLAY SEAVIEW 360 PRO WHITE",46259129,,0.0000
"Msi 5060 ti Gaming Trio 8gb",20910397,,0.0000
"MSI MAG COREFROZR AA13 ARGB CPU Cooler Fan (Black)",24793735,,8.0000
"NVISION 27" QG27P21 210HZ 2k",34679507,,0.0000
"MSI MAG COREFROZR AA13 ARGB CPU Cooler Fan (White)",25364297,,1.0000
"KINGSTON SSD NV3 NVME 4.0 1TB",92117954,,0.0000
"Gigabyte GeForce RTX 5070 Ti Windforce OC SFF 16GB GDDR7 Graphics Card",69032187,,0.0000
"Darkflash DK415M M-ATX PC Case",10223410,,0.0000
"ZHITAI Ti600 1TB SSD M.2 2280 PCle Gen 4x4 7000mb/s",98934423,ZTA601TAB2548300LY/ZTA601TAB254830GMR/ZTA601TAB25483163N/ZTA601TAB254831A2T/ZTA601TAB2548309DW,4.0000
"Colorful GeForce RTX 5060 Ti Gaming DUO 16GB-V Graphics Card",29421918,8L0200439XY00CT,0.0000
"Colorful iGame GeForce RTX 5060 Ti Ultra W Duo OC 16GB-V GDDR7 Graphics Card",04251073,,0.0000
"Kingston Fury Beast 16gb 1x16gb 5600mhz ddr5",00661847,0000009277789-S007498,1.0000
"GIGABYTE M27UP ICE 27" SS IPS GAMING MONITOR 3840x2160 (UHD)GP-M27UP-ICE-AP",63712903,,0.0000
"120MM NON RGB CASE FAN",54982671,,0.0000
"GIGABYTE GEFORCE RTX™ 5070 WINDFORCE OC SFF 12GB VGA CARD",32749369,,0.0000
"Gigabyte GS27FA 27 FHD (1920x1080) 180Hz 1ms MPRT SS IPS Gaming Monitor",09305841,SN26071B001342/SN26071B001435/SN26071B001397/SN26071B001436/SN26071B001437,5.0000
"Gigabyte B760M AORUS ELITE WIFI6E GEN5 MOTHERBOARD",26332880,,0.0000
"INTEL CORE i7-14700KF PROCESSOR (IIDC)",70990523,,0.0000
"OCYPUS SIGMA L36 BK ARGB",81704792,,0.0000
"Ocypus Iota L36 360MM AIO Liquid CPU Cooler with Digital Display",91605272,IL36BNAB1100408/IL36BNAB1100406/IL36BNAB1100407/IL36BNAB1100405,4.0000
"Corsair CX750 750W 80+ Bronze ATX Power Supply",34731023,,0.0000
"Nvision n2455GT 144hz 23.8 White",62036485,,0.0000
"THERMAL PASTE GENERIC INJECTION TYPE",45214072,,0.0000
"INPLAY C1080 PRO USB FHD DIGITAL CAMERA 1080P BLACK",12828102,,0.0000
"COMLINK RC-EZM PASSTRU EZ RJ45 CONNECTOR",05228126,,0.0000
"1TB SEAGATE BARRACUDA HDD/ WESTERN DIGITAL DESKTOP HDD 1TB",20542967,,0.0000
"INPLAY LD UPS 3000VA LCD DISPLAY",17005392,,0.0000
"YGT WD-141 DUAL-MODE WIRELESS CHARGING MOUSE BLACK",53194279,,0.0000
"YGT GM-07 7D WIRED RGB GAMING MOUSE (BLACK)",43965039,,0.0000
"NEXON WIRELESS COMBO WS-01 OFFICE KEYBOARD AND MOUSE",73783245,,0.0000
"NEXION GAMING HEADSET F-06 (BLACK)",91032716,,0.0000
"YGT TOP ONE KY-750W PSU (BLACK)",16952212,KY2512004536/KY2512004532/KY2512004535/KY2512011109/KY2512011110/KY2512011101/KY2512011103/KY2512011105/KY2512011108/KY2512011111/KY2512011106/KY2512011107/KY2512011104/KY2512000804/KY2512000805/KY2512000802/KY2512000809/KY2512000806/KY2512000807/KY2512000808/KY2512001183/KY2512001182/KY2512001181/KY2512001186/KY2512001185/KY2512001184/KY2512001187/KY2512001188/KY2512001189/KY2512001190/KY2512014493/KY2512014495/KY2512014497/KY2512014494/KY2512014492/KY2512014500/KY2512014498/KY2512014496/KY2512014499/KY2512014491,0.0000
"NVISION 23.8" 144HZ BLACK",30270249,,0.0000
"GIGABYTE GEFORCE RTX 5070 Ti EAGLE OC SFF 16G VGA CARD",38941347,,0.0000
"Groundzero Hoica Case",69923789,,1.0000
"Groundzero Vision V2",29901724,,0.0000
"Lian Li V100 Vector ATX Mid-Tower Case",27912092,,0.0000
"MSI B550M PRO VDH WIFI",47038643,,0.0000
"INPLAY STX390-BM BLACK MIX KEYBOARD AND MOUSE",69338815,,0.0000
"YGT MARS 8 CASE ONLY",04133669,,0.0000
"YGT N195 MICRO ATX GAMING CASE (BLACK)",85963541,,0.0000
"YGT N195 MICRO ATX GAMING CASE (WHITE)",50821932,,0.0000
"Tecware Infinity M Dual Tempered Glass MATX PC Case",42253103,,0.0000
"RGB CONTROLLER",68512385,,7.0000
"ASUS DUAL GEFORCE RTX™ 5060 Ti 8GB GDDR7 OC EDITION (PRE ORDER)",62702207,,0.0000
"ASUS PRIME GEFORCE RTX™ 5060 Ti 8GB GDDR7 OC EDITION 3X FANS (PRE ORDER)",81305061,,0.0000
"DARKFLASH C6S SINGLE FAN",82294060,,0.0000
"SECURE AVR",91761912,,0.0000
"Ovation 8GB DDR4 RAM 2666MHz",73884609,,0.0000
1 Product Name Product Code IMEI or Serial Numbers Counted
2 GIGABYTE B550M DS3H AC R2 97493168 0.0000
3 Jungle Leopard AC-01 Mid Tower ATX Gaming Case – Tempered Glass Panel Liquid Cooling Support Black 41002049 0.0000
4 Zotac GeForce RTX 5060 Ti 16GB Twin Edge OC White Edition GDDR7 128-bit Graphics Card 80095628 0.0000
5 Ocypus Delta A40 SE BK ARGB 4 Heat-Pipes Single Tower Air Cooler with ARGB 78010847 DA40BSHB1002810 0.0000
6 Thermalright Burst Assassin 120 Vision Forward and Reverse Dual-Fan CPU Air Cooler with LCD Screen white 32948694 0.0000
7 Adata Legend 710 512GB PCIE Gen3 X4 M.2 2280 Internal SSD 19073739 0.0000
8 Adata XPG Spectrix D50 8GB 3200mHz DDR4 RGB Memory Tungsten-Grey 99923625 0.0000
9 ADATA Premier DDR4 16GB 3200MHZ UDIMM 288PINS Desktop Memory 33587997 0.0000
10 G-SKILL RIPJAWS M5 NEO RGB BLACK 16GBX2=32GB 6000MHZ DDR5 CL36-36 XMP EXPO 20932701 0.0000
11 G-SKILL RIPJAWS M5 NEO RGB WHITE 16GBX2=32GB 6000MHZ DDR5 CL36-36 XMP EXPO 57212934 4.71329E+12 1.0000
12 KINGSTON FURY BEAST RGB BLACK 16GBX2=32GB 5600MHZ DDR5 CL36 EXPO 26823500 0.0000
13 Gigabyte GP-UD850GM PG5 V2 850W Gold PCIE 5.0 Fully Modular Power Supply 65367803 0.0000
14 ASUS TUF GAMING 850G PCIE 5.0 850W 80+ GOLD FULLY MODULAR 57386115 0.0000
15 TEAMGROUP VULCAN NON-RGB ECO SILVER 16GBX2=32GB 6000MHZ DDR5 CL38 XMP EXPO 97600783 0.0000
16 TEAMGROUP T-FORCE VULCAN UD-D5 BLACK 16GBX2=32GB 6000MHZ DDR5 71032238 EF2509090280038 1.0000
17 TEAMGROUP T-FORCE DELTA RGB WHITE 16GBX2=32GB 6000MHZ DDR5 19413268 EF2508010190311 1.0000
18 APACER PANTHER OC NON-RGB BLACK GREY 16GBX2=32GB 6000MHZ DDR5 96570193 142529110305 1.0000
19 APACER PANTHER RGB BLACK 16GBX2=32GB 6000MHZ DDR5 33902177 0.0000
20 Gigabyte Solid State Drive (1TB) 76413128 0.0000
21 Kingston NV3 500gb M.2 2280 PCIe 4.0 NVMe SSD 39061720 0.0000
22 AMD RYZEN 5 9600X (AM5) WITHOUT COOLER (TRAY TYPE) 13759412 0.0000
23 GEFORCE RTX 5060 TI PALIT INFINITY 3 OC 16GB GDDR7 TRIPLE FAN 86356384 0.0000
24 GEFORCE RTX 5070 GIGABYTE EAGLE OC SFF 12GB GDDR7 TRIPLE FAN 09395816 0.0000
25 Hiksemi Armor 2x16GB DDR4 3200MHz 39637190 0.0000
26 TEAMGROUP T-FORCE DELTA RGB BLACK 8GBX2=16GB 6000MHZ DDR5 60675791 0.0000
27 SIMORCHIP NX-01 NON-RGB BLACK 8GBX1=8GB 3200MHZ DDR4 90517034 0.0000
28 SEAGATE BARRACUDA 500GB HDD/SEAGATE DESKTOP HDD 500GB 11450602 WCC6Z0NV21U4/WCC6Z4YDDKYA/WCC6Z5ZRHCRZ/WCC6Z7NK6J76/WCC6Z0ZVA6TF/WCC6Z3VP7F6H/WCC6Z4VDNVJE/WCC6Z5ZRHVFJ/WCC6Y4UL70R1/WCC6Z6KL9633/WCC6Z5HZ9CJF/WCC6Z3HH57C4/WCC6Z4AVHCA8/WCC6Z6JNRFT8/WCC6Y7XU9913/WCAYUE980911/WCC6Z6LLZKN2/WCC6Z7VYKY0K/WCC6Y7TL7J9J/WCC6Z1ZP513F/WCC6Z5YA6JAN/WCC6Z2NEUXHU/WCC6Z7EYHZ85/WCC6Z5FN27ND/WCC6Z3YPXFN5/WCC6Z4VPHFY3/WCC6Z1TRVP2F 26.0000
29 Acer AC-500 500w 80plus Bronze Power Supply - BLACK 12232937 AC500BPlus25124331/AC500BPlus25120986/AC500BPlus25120987/AC500BPlus25121376/AC500BPlus25121377/AC500BPlus25121378/AC500BPlus25121380/AC500BPlus25121375/AC500BPlus25121374/AC500BPlus25121373/AC500BPlus25121372/AC500BPlus25121371/AC500BPlus25120331/AC500BPlus25120332/AC500BPlus25120333/AC500BPlus25120334/AC500BPlus25120335/AC500BPlus25120336`/AC500BPlus25120337/AC500BPlus25120338/AC500BPlus25120339/AC500BPlus25120340 21.0000
30 Intel® Core™ i5-12400 Processor (18M Cache, up to 4.40 GHz) 61784340 U56R0P4804877 1.0000
31 Gigabyte 240GB SSD 2.5 Sata 26089128 SN254008941021/SN252908904702 0.0000
32 Hiksemi Future RGB Single 16GB 3200MHz DDR4 20376191 0.0000
33 Crucial Ballistix 16GB DDR4 2666MHz 76298911 0.0000
34 DEEPCOOL AK400 DIGITAL ARGB 1 FAN AIR COOLER (R-AK400-BKADMN-G) 27275809 0.0000
35 Deepcool LT720 AIO ARGB Liquid Cooler w/ Anti-Leak Tech Black 43851936 0.0000
36 GIGABYTE H610M K DDR4 mATX Motherboard 12760082 SN253350029383 1.0000
37 MSI MAG A650BN 650W WATTS 80+ BRONZE ATX NON MODULAR 1090644 0.0000
38 Acer AC-1000 1000W Full Modular Power Supply 80 Plus Bronze 92881546 AC1000B25080119 0.0000
39 Acer AC-550 550w Full Modular 80plus Bronze Power Supply 18233907 0.0000
40 ACER AC-650 650W 80+ BRONZE ATX FULLY MODULAR 1983150 0.0000
41 Acer Air 2 Plus with LCD Screen ATX PC Case 18175163 0.0000
42 Aigo Apollo A275 Panoramic Glass M-ATX PC Case 24917033 0.0000
43 Amd Ryzen 5 3400g SocketAm4 3.7ghz 4-core, 8-Thread Desktop Processor with Radeon Vega 11 19005818 9AMV893S50500_YD3400C5M4MFH/9ASA094N60396_YD3400C5M4MFH/9ASA094N60200_YD3400C5M4MFH/9ASA094N60195_YD3400C5M4MFH/9ASA094N60313_YD3400C5M4MFH/9ASA094N60204_YD3400C5M4MFH/9ASA094N60469_YD3400C5M4MFH/9ASA094N60470_YD3400C5M4MFH/9ASA094N60459_YD3400C5M4MFH/9ASA094N60458_YD3400C5M4MFH/9ASA094N60291_YD3400C5M4MFH/9ASA094N60381_YD3400C5M4MFH/9ASA094N60382_YD3400C5M4MFH/9ASA094N60384_YD3400C5M4MFH/9ASA094N60196_YD3400C5M4MFH/9ASA094N60376_YD3400C5M4MFH/9ASA094N60378_YD3400C5M4MFH/9ASA094N60308_YD3400C5M4MFH/9ASA094N60314_YD3400C5M4MFH/9ASA094N60304_YD3400C5M4MFH 19.0000
44 AMD RYZEN 5 5500 AM4 4.60GHZ 6-CORE, 12-THREAD TRAY 99717222 9ANT936V50171_100-000000457/9ANT936V50172_100-000000457/9ANT936V50044_100-000000457/9ANT936V50178_100-000000457/9ANT936V50173_100-000000457/9ANT936V50062_100-000000457 6.0000
45 AMD RYZEN 5 5500GT 3.60-4.40GHZ 6-CORE, 12-THREAD MPK TRAY 90132569 9MQ3904R50160_100-000001489/9MQ3904R50163_100-000001489/9MQ3904R50162_100-000001489/9MQ3904R50169_100-000001489/9MQ3904R50168_100-000001489/9MQ3904R50151_100-000001489/9MQ3904R50153_100-000001489/9MQ3904R50148_100-000001489/9MQ3904R50154_100-000001489 9.0000
46 Amd Ryzen 5 5600 6-CORE,12-THREAD AM4 TRAY 3946340 0.0000
47 AMD Ryzen 5 5600GT 6-Core 12-Thread AM4 APU with Integrated Radeon Graphics 18028773 9ANC469S50082_100-000001488 1.0000
48 Amd Ryzen 5 5600X AMD Ryzen 5 5600X 6-Core 12-Thread AM4 3.7GHz Gaming Processor 26845630 0.0000
49 AMD Ryzen 5 7500F Socket AM5 6-Core 12-Thread Gaming Processor 30580637 0.0000
50 AMD Ryzen 7 5700G 8-Core 16-Thread AM4 APU with Radeon Vega 8 Graphics 63489321 9ANS694U50278_100-000000263/9MU8377W50364_100-000000263/9MU8377W50353_100-000000263/9MU8377W50366_100-000000263/9MU8377W50372_100-000000263/9MU8377W50373_100-000000263 5.0000
51 AMD Ryzen 7 5700X 8-Core 16-Thread AM4 Desktop Processor 90579984 9APQ860M60377_100-000000926/9APQ860M60375_100-000000926/9AHK828M60425_100-000000926/9APQ860M60205_100-000000926/9APQ860M60204_100-000000926/9APQ860M60236_100-000000926 6.0000
52 AMD Ryzen 7 7700 8-Cores 16-Thread Gaming Desktop Processor 3619980 0.0000
53 AOC 24B36X/71 23.8 FHD (1920x1080) 144Hz 4ms GTG / 0.5ms MPRT IPS 3618450 0.0000
54 APACER AP512GAS2280P4-1 NVME 1TB GEN 3 77838156 0.0000
55 APACER AP512GAS2280P4-1 NVME 512GB GEN 3 61935902 0.0000
56 Apacer Panther - GOLDEN 32GB 16GX2 DDR4 3200MHZ 19649720 0.0000
57 APC BVX650I-PH Back-UPS AVR 650va / 360 Watts / 4 Sockets 58210768 0.0000
58 ASRock AMD Radeon RX 9060 XT Challenger 8GB GDDR6 OC Graphics Card 62294462 0.0000
59 Asrock B550M Pro SE Socket Am4 Ddr4 Motherboard 42543638 0.0000
60 ASRock RX 9060 XT Steel Legend 16GB OC RX9060XT SL 16GO 54279719 0.0000
61 AWP AID650 Aide 390W-650VA with AVR Universal Socket Ups 83407937 0.0000
62 BADWOLF EXTENDED MOUSEPAD 80059231 23.0000
63 Badwolf RGB Stereo Gaming Headset - LED - with Volume Knob 11320619 0.0000
64 Biostar Rx 580 Dual Fan 8gb 256bit GDdr5 Gaming Videocard 27196039 T254888589/T254888588/T254888586/T254888582 4.0000
65 Biwin Black Opal DW100 RGB 32GB 2x16GB DDR5 CL36 6000Mhz 56572034 0.0000
66 Biwin DW100 RGB 32GB (2x16GB) DDR5 6000MHz CL30 Blanca (white) 21613972 0.0000
67 Colorful GeForce RTX 3050 NB DUO 6GB V4-V Graphics card 19728126 8L02P046JVE00GX/8L02P037NBQ03PW 0.0000
68 Colorful GeForce RTX™ 5060 Battle AX DUO 8GB GDDR7 Graphics Card 31930822 0.0000
69 Colorful RTX 3060 NB DUO 12G V2 192bit Ddr6 Gaming Videocard 97303902 0.0000
70 COMFAST WIFI DONGLE 1300MBPS 84131915 49.0000
71 COMFAST WIFI DONGLE 150MBPS 29308479 1.0000
72 COOLER MASTER MWE V3 650W 80+ Bronze 59193769 MPE6501ACABW3BUS1255100661/MPE6501ACABW3BUS1255100664/MPE6501ACABW3BUS1255100665/MPE6501ACABW3BUS1255100021/MPE6501ACABW3BUS1255100022/MPE6501ACABW3BUS1255100023/MPE6501ACABW3BUS1255100024/MPE6501ACABW3BUS1255100642/MPE6501ACABW3BUS1255100643/MPE6501ACABW3BUS1255100644/MPE6501ACABW3BUS1255100645 10.0000
73 Coolman Spectra mATX TG Case ( Black | White ) 76904790 0.0000
74 Corsair CX650 650W 80+ Bronze ATX Power Supply 23831957 0.0000
75 Corsair RMe Series RM850e Fully Modular Low-Noise ATX Power Supply 96940701 0.0000
76 Dahua C800A 2.5-inch 3D NAND SSD 240GB DHI-SSD 23915066 0.0000
77 Dark Flash DB330M Mesh M-ATX PC Case Black 64509633 0.0000
78 Dark Flash DB330M Mesh M-ATX PC Case White 83486731 0.0000
79 Deepcool CH160 Plus White 21870993 2.0000
80 GALAX REVOLUTION 06 AS BLACK WITH 4PCS STATIC RGB FAN ATX CASE 23184493 0.0000
81 GIGABYTE 750W GP-UD750GM-PG5 80+ Gold Modular Power Supply 88602513 0.0000
82 Gigabyte AMD Radeon RX 7600 Gaming OC 8GB GDDR6 Graphics Card 93570287 0.0000
83 Gigabyte B550M DS3H R2 93409701 SN25503A008345 0.0000
84 Gigabyte B550M K 4643100 0.0000
85 Gigabyte B650M D3HP AX WIFI AM5 Micro-ATX Motherboard 3790231 0.0000
86 Gigabyte B650M Gaming WiFi AMD AM5 DDR5 Gaming Motherboard 69009816 SN260250070146/SN260250070147/SN260250070044 1.0000
87 Gigabyte B850M FORCE WIFI6E V2 AM5 Micro-ATX Motherboard 20623678 0.0000
88 Gigabyte GA-B450M-DS3H V3 Socket Am4 Ddr4 Motherboard 95297761 SN254960034555/SN254960034556/SN254960034560 3.0000
89 Gigabyte GeForce RTX 5060 Ti Aero OC 16GB GDDR7 Graphics Card 20373913 0.0000
90 Gigabyte GeForce RTX 5060 Ti Eagle OC Ice 16GB GDDR7 Graphics Card 39725415 0.0000
91 Gigabyte GeForce RTX 5060 Ti Windforce Max OC 16GB GDDR7 Graphics Card 21193004 0.0000
92 Gigabyte GeForce RTX 5060 Windforce Max OC 8GB GDDR7 Graphics Card 60219964 0.0000
93 GIGABYTE GeForce RTX™ 5060 WINDFORCE 8GB GDDR7 128-bit Graphics Card 92660852 0.0000
94 GIGABYTE GeForce RTX™ 5080 GAMING OC 16GB GDDR7 256-bit Graphics Card 72556018 0.0000
95 GIGABYTE Radeon™ RX 9060 XT GAMING OC 16GB GDDR6 128-bit Graphics Card 26370993 0.0000
96 Gigabyte SSD M.2 500gb Gen4 4000e Nvme 59361645 0.0000
97 HIKSEMI 16GB DDR4 3200Mhz Armor (white) 68034799 0.0000
98 HIKSEMI 512GB WAVE 2.5 Solid State Drive 97974328 0.0000
99 Hiksemi Armor 2x8GB DDR4 3200MHz 69452021 0.0000
100 Hiksemi Armor 16GB single DDR4 3200MHz 9085473 30178955960/30178955961/30178472738/30178472737 4.0000
101 HikSemi Armor 8GB 1x8GB DDR4 3200Mhz Black 77826921 30175838829/30175838830/30175838827/30175838828/30175838815/30175838816/30175838813/30175838814/30175838811/30175838812/30175838807/30175838805/30175838806/30175838803/30175838804/30178335603/30178335604/30178335609/30178335610/30178335607/30178335608/30178335619/30178335620/30178335613/30178335614/30178335611/30178335612/30178335583/30178335584/30178335581/30178335582/30178335601/30178335602/30178335597/30178335598/30178335591/30178335592/30178335589/30178335590/30178335585/30178335586/30178335617/30178335618/30178335605/30178335606/30178335595/30178335596/30178335593/30178335594/30178335615/30178335616 51.0000
102 Hiksemi Future RGB 16GB 6000MHz DDR5 Desktop Gaming Memory 36190952 0.0000
103 Hiksemi Future 2x16GB RGB 3200MHz DDR4 68402779 1.0000
104 INPLAY STX360 KEYBOARD MOUSE COMBO – BLACK 41082091 35.0000
105 Jungle Leopard 3in1,120 ARGB Reverse case Fan,120mm Black 10329047 0.0000
106 Jungle Leopard 3in1,120 ARGB Reverse case Fan,120mm White 34192400 0.0000
107 Jungle Leopard AC-01 Mid Tower ATX Gaming Case – Tempered Glass Panel, Liquid Cooling Support White 32271183 0.0000
108 Jungle Leopard Astro V2 ARGB CPU Fan 120mm Infinity Mirror 5V 3PIN Motherboard Lighting Sync 4PIN WHITE 22893273 0.0000
109 Jungle Leopard Astro V2 ARGB CPU Fan 3in1 120mm Infinity Mirror 5V 3PIN Motherboard Lighting Sync 4PIN BLACK 63573298 0.0000
110 Jungle Leopard Astroshel LCD 240 ARGB AIO Liquid Cooler Black 62389912 0.0000
111 Jungle Leopard Astroshel LCD 240 ARGB AIO Liquid Cooler White 82915480 0.0000
112 Jungle Leopard AstroShel V2G CPU AIO Cooler 2.8-inch Smart Display Black ARGB 360mm 22573127 KFL360BS25120223 0.0000
113 Jungle Leopard AstroShel V2G CPU AIO Cooler 2.8-inch Smart Display White ARGB 360mm 37853412 KFL360WS25120369 1.0000
114 Jungle Leopard Galaxy ARGB FAN Single Black 19231061 0.0000
115 Jungle Leopard Galaxy ARGB FAN Single White 79128394 0.0000
116 Jungle Leopard MS-01 Micro ATX Gaming – Tempered Glass, Liquid Cooling Support, Magnetic Dust Filters (Black) 70198805 0.0000
117 Jungle Leopard MS-01 Micro ATX Gaming – Tempered Glass, Liquid Cooling Support, Magnetic Dust Filters (White) 22945704 0.0000
118 Jungle Leopard Stellar Realm CPU Aio Cooler Temperature Digital Display 240mm Liquid Cooler 5V 3PIN ARGB Mobo Sync Black 978462 0.0000
119 Jungle Leopard Stellar Realm CPU Aio Cooler Temperature Digital Display 240mm Liquid Cooler 5V 3PIN ARGB Mobo Sync White 97672521 0.0000
120 Keytech Galaxy ARGB PC Cooling Fan (3-in-1 Kit) Black 45380798 0.0000
121 Keytech Galaxy ARGB PC Cooling Fan (3-in-1 Kit) White 72394598 0.0000
122 Keytech T5000 Black MATX 22834009 2.0000
123 Keytech Tornado 3in1 120mm Chassis Fan with Control Hub and Remote Control ARGB 18527930 0.0000
124 Lexar 1tb NM610 Pro M.2 2280 PCIe Gen3x4 NVMe Internal SSD 84291309 0.0000
125 LEXAR 500GB NM710 M.2 2280 PCIe Gen4x4 NVMe 95548120 PC80212001920P2200/PC80212003122P2200/PC80212001632P2200/PC80212001633P2200/PC80212004445P2200/PC80212003613P2200/PC80212001577P2200/PC80212003898P2200/PC80212001586P2200/PC80212003589P2200/PC80212001353P2200 11.0000
126 LEXAR 8GB 3200MHz DDR4 THOR 63810397 0.0000
127 Lexar Internal NM610 Pro M.2 2280 PCIe Gen3x4 NVMe SSD 500gb 83142086 0.0000
128 Dark Flash M305 Mesh M-ATX PC Case 47802361 0.0000
129 MSI A520m-A Pro AMD Am4 Ddr4 Micro-ATX PCB Gaming Motherboard 68541931 601-7C96-120B2510057496/601-7C96-120B2511027392 0.0000
130 MSI MAG 255XF 24.5 FHD (1920x1080) 300Hz 0.5ms GtG Rapid IPS Gaming Monitor 27036199 0.0000
131 Nexion GK660/GK670/GK680 104 Keys 12 Running Lighting mode Mechanical Keyboard with mouse usb combo 82713495 0.0000
132 Nexion GS-358/359 USB Computer Speaker Wired RGB 2in1 Sound Bar Gaming Speaker 54152132 0.0000
133 NEXION GS356 / GS357 RGB USB Speaker 43323610 0.0000
134 NEXION MK 155 B MECHANICAL KEYBOARD 19765210 3.0000
135 Nexion MK155A (White-Green) Wireless Tri-Mode Mechanical TKL Keyboard 49431260 2.0000
136 Nexion MK155W (Sky Blue) Wireless Tri-Mode Mechanical TKL Keyboard 40931282 0.0000
137 North Bayou F425 Gas-Strut Flexi Wall Mount 5663184 0.0000
138 Nvision EG24XT 23.8 FHD 240Hz IPS Monitor Black 43920975 0.0000
139 Nvision EG24XT 23.8 FHD 240Hz IPS Monitor White 34911323 0.0000
140 Nvision EG27F1 PRO 27 IPS 200Hz 1920X1080 Gaming Monitor 65463110 0.0000
141 Nvision EG27XT 27 IPS 240Hz FHD Monitor Black 21730706 EG270BKCJE02512301733 1.0000
142 Nvision EG27XT 27 IPS 240Hz FHD Monitor White 21019696 0.0000
143 Nvision N2455PRO 100Hz IPS Panel 23.8 Monitor Black 72796181 0.0000
144 Nvision N2455PRO 100Hz IPS Panel 23.8 Monitor White 10143242 322 0.0000
145 Ocypus Gamma A20 ARGB Dual Heat Pipes, 92mm Fan Small-Tower Air Cooler with ARGB Lighting (Black) 83540301 0.0000
146 Ocypus Gamma A20 ARGB Dual Heat Pipes, 92mm Fan Small-Tower Air Cooler with ARGB Lighting (White) 13951682 GA20WFHB1000210 1.0000
147 Ocypus Gamma A40 ARGB CPU Cooler (Black) 95137172 0.0000
148 Ocypus Gamma A40 ARGB CPU Cooler (White) 51731859 0.0000
149 Ocypus Gamma A40 ARGB Digital CPU Cooler (black) 21972319 0.0000
150 Ocypus Gamma A40 ARGB Digital CPU Cooler (white) 43288109 0.0000
151 Ocypus Gamma A40 BK CPU Cooler (Black) 24113094 0.0000
152 Ocypus Iota A40 CPU Air Cooler Digital Black 4152262 0.0000
153 Ocypus Iota A40 CPU Air Cooler Digital White 97369018 0.0000
154 Palit GeForce RTX 3050 StormX 6GB GDDR6 128Bit Graphics Card 1193924 0.0000
155 PATRIOT Viper VP4300 Lite 1TB M.2 2280 PCIe Gen4 SSD 60634929 0.0000
156 Philips 242M8/71 23.8” IPS 144Hz 1920x1080 VGA/HDMI/DP VESA mount Monitor 89175036 0.0000
157 Powercolor Reaper AMD Radeon RX 9060 XT 16GB GDDR6 Graphics Card RX9060XT 16G-A 24903258 0.0000
158 Redragon Cobra Gaming Mouse (M711-2) 67230545 0.0000
159 Redragon Diomedes Honeycomb Gaming Headset (White) (H386-W) 19075306 RDH386-W23051500211 1.0000
160 Redragon H389 Arrorain Lite RGB Wired Gaming Headset 33912065 1.0000
161 REDRAGON HYLAS GAMING HEADSET (WHITE) (H260-W) 43573381 0.0000
162 Redragon Hylas H260 Wired Gaming Headset Black 97405320 0.0000
163 Redragon K611-BGB Bes Wired USB Mechanical Gaming Keyboard 32296825 RDK611-BGB25072500273 1.0000
164 Redragon K611-GGO Bes Wired USB Mechanical Gaming Keyboard 83112219 0.0000
165 Redragon K686WB-RGB EISA PRO 3-Mode Red Switch Compact Mechanical Keyboard 84462159 0.0000
166 Redragon K728GGY-RGB-PRO Antonium 87 Keys 80% Gasket Mounted TKL Wireless Mechanical Keyboard (RPC Linear Switch) (Grey/Yellow) 80430986 0.0000
167 Redragon K728WBB RGB Antonium Pro 87 Keys 80% Gasket Mounted TKL 67421117 0.0000
168 Redragon Lamia 2 Gaming Headset With Stand (Black) (H320W-RGB) 31475030 RDH320RGB-124110600851/RDH320RGB-124122600685 2.0000
169 Redragon Lamia 2 Gaming Headset With Stand (White) (H320W-RGB) 1194257 RDH320W-RGB25052000731/RDH320W-RGB25052000734/RDH320W-RGB25052000735 2.0000
170 Redragon M808 Storm Lightweight RGB Gaming Mouse 8073260 0.0000
171 Redragon M916-LIT-1K K1ng Lite 8000DPI Light-Weight Tri-Mode Gaming Mouse (Black) 17929880 0.0000
172 Redragon M916-LIT-1K K1ng Lite 8000DPI Light-Weight Tri-Mode Gaming Mouse (White) 12908870 0.0000
173 Redragon Mitra V2 RGB Mechanical Gaming Keyboard (K551RGB-1 V2) 45096260 0.0000
174 Redragon OTIIM Wired 87 Keys Gasket Mechanical Keyboard (K729WBP-RGB) 28974970 0.0000
175 Redragon Stormhunter Wired 81+1 Keys Rapid Trigger Mechanical Keyboard 54623180 0.0000
176 Redragon Zeus X Virtual 7.1 Surround Sound Gaming Headset 89325756 1.0000
177 RUIX NC 240 WHITE / BLACK AIO Cooling Fans & Components Medium Fan Speed Argb Lighting 30958842 0.0000
178 Ruix NC360 Liquid Cooler CPU Coolers 360mm AIO With ARGB PWM Fan Black 37081289 0.0000
179 Ruix NC360 Liquid Cooler CPU Coolers 360mm AIO With ARGB PWM Fan White 93829346 0.0000
180 SAMSUNG 1TB 990 EVO Plus Gen4 NVMeᵀᴹ Solid State Drive 61072317 0.0000
181 Sapphire Pure AMD Radeon RX 9060 XT Gaming OC 16GB GDDR6 Graphics Card 58092280 0.0000
182 STARLINK DGT 120 BLACK ALUMINUM Live speed display 19785174 4.0000
183 STARLINK DGT 120 BLACK WOOD Live speed display 19094327 5.0000
184 STARLINK DGT 120 WHITE ALUMINUM Live speed display 17842595 4.0000
185 STARLINK DGT 120 WHITE WOOD Live speed display 71268175 4.0000
186 STARLINK DGT 240 BLACK WOOD GRAIN Live speed display 33512920 9.0000
187 STARLINK DGT 240 WHITE WOOD GRAIN Live speed display 23049515 9.0000
188 TeamGroup T-Create Classic 32GB 2 x 16GB 6000Mhz CL48 DDR5 50612918 0.0000
189 TeamGroup T-Create Classic 32GB 2 x 16GB 6000Mhz CL48 DDR5 (white) 23791175 0.0000
190 TeamGroup T-Force Vulcan Z 256B 2.5 SATA III 3D NAND Internal SSD 52969182 1F2508120142859/1F2508120142866/1F2508120142860/1F2508120142865/1F2508120142864/1F2508120142863/1F2508120142854 7.0000
191 Teclado Redragon Galatin Pro K719WG Wireless Mint Mambo White-Green 49902381 0.0000
192 TECWARE FLOW M MATX CASE – BLACK 23065925 0.0000
193 Tecware NEO M2 Omni 2025 TG mATX with 2X140mm 1X120mm Fans Black 29826294 0.0000
194 Tecware NEO M2 Omni 2025 TG mATX with 2X140mm 1X120mm Fans White 92320614 0.0000
195 Tecware Timber High Airflow ATX TG Case w/ 4X120mm Fan (Black) 1402394 3.0000
196 Tecware Timber High Airflow ATX TG Case w/ 4X120mm Fan (White) 65914332 0.0000
197 Tecware VX Prism M Triple Tempered Glass mATX Case Black 74647253 0.0000
198 Tecware VX Prism M Triple Tempered Glass mATX Case White 3782571 0.0000
199 Tecware VXN EVO Dual Chamber mATX ARGB Case with 3x120mm (Black) 30281782 0.0000
200 Tecware VXN Glow Dual Chamber mATX ARGB Case with 3x120mm (White) 13342456 0.0000
201 Thermalright Assassin Spirit 120 Vision ARGB Air Cooler (Black) 12130597 0.0000
202 Thermalright Assassin Spirit 120 Vision ARGB Air Cooler (White) 26793816 0.0000
203 Thermalright Frozen Warframe 240 ARGB Black TL-P12-S CPU Liquid Cooler 12431034 0.0000
204 Thermalright Frozen Warframe 240 ARGB White TL-P12-S CPU Liquid Cooler 52401266 0.0000
205 Thermalright Frozen Warframe 360 ARGB AIO CPU Liquid Cooler Black 58693936 0.0000
206 Thermalright Frozen Warframe 360 ARGB AIO CPU Liquid Cooler White 50791306 0.0000
207 Thermalright Peerless Assassin 120 Digital ARGB Air Cooler (Black) 33032406 0.0000
208 Thermalright Peerless Assassin 120 Digital ARGB Air Cooler (White) 70652109 0.0000
209 ViewSonic VX2479A-HD-PRO 24 FHD (1920x1080) 240Hz 1ms MPRT SuperClear 29193409 0.0000
210 Whalekom 256gb M.2 PCIe NVMe SSD 97657018 KY256G3250900112 1.0000
211 XFX SPEEDSTER SWFT210 RADEON RX 7600 CORE Gaming Graphics Card with 8GB GDDR6 87069543 0.0000
212 XFX Swift AMD Radeon RX 9060 XT OC Gaming Ed. 16GB GDDR6 Graphics Card (black) 62198530 0.0000
213 XFX Swift AMD Radeon RX 9060 XT OC Gaming16GB GDDR6 (white) 3119902 AXV003422 0.0000
214 YGT 420D Seaview ARGB Lighting Tempered Glass (White) 87430719 1.0000
215 YGT 420D Seaview ARGB Lighting Tempered Glass Black 10161275 0.0000
216 YGT ARGB Case Fan 3 In 1 Kit (Black) 5828319 0.0000
217 YGT M325 Seaview Room Tempered Glass Micro ATX/ITX Desktop Case Black 3313166 0.0000
218 YGT M325 Seaview Room Tempered Glass Micro ATX/ITX Desktop Case White 97034425 13.0000
219 YGT WDB-100 Tri-Mode Mechanical Keyboard ARGB 40401232 0.0000
220 Zotac GAMING GeForce RTX 5070 AMP White Edition 12GB GDDR7 192-bit Graphics Card 98964924 0.0000
221 Zotac GAMING GeForce RTX 5070 Twin Edge OC 12GB GDDR7 192-bit Graphics Card ZT-B50700H-10P 11229920 0.0000
222 Zotac GeForce RTX 5060 Ti 16GB Twin Edge OC GDDR7 128-bit Graphics Card 80904729 0.0000
223 Hiksemi Wave (S) 2.5″ 1TB SATA3 Solid State Drive 71613407 0.0000
224 Gigabyte GeForce RTX 5060 Ti Eagle Max OC 16GB GDDR7 Graphics Card 49620005 0.0000
225 GEFORCE RTX 5060 PALIT OC 8GB GDDR7 WHITE DUAL FAN 75836519 0.0000
226 Gigabyte GA-A520M-K Socket Am4 Ddr4 Motherboard 93068120 SN254860047141/SN254860047142/SN254860047143/SN254860047145/SN254860047146/SN254860047147/SN254860047041/SN254860047042/SN254860047043/SN254860047044/SN254860047046/SN254860047047/SN254860047048/SN254860047050/SN254860046841/SN254860046842/SN254860046846/SN254860046847 16.0000
227 Gigabyte Gaming A16 CTHI3PH893SH Laptop (Black) | 16" FHD+ (1920x1200) 165Hz IPS | Core i7-13620H | 16GB RAM | 512GB SSD | RTX 5050 | Windows 11 Home | Gigabyte Backpack 73982372 0.0000
228 Gigabyte Aero X16 1TH93PH894AH Gaming Laptop (Gray) | 16 FHD+ (1920x1200) 165Hz IPS | Ryzen AI 7 350 | 16GB RAM | 1TB SSD | RTX 5050 | Windows 11 Home | Gigabyte Backpack 83328021 0.0000
229 Gigabyte Aero X16 1VH93PHC94AH Copilot+ PC Laptop (Gray) | 16" QHD+ (2560x1600) 165Hz IPS | Ryzen AI 7 350 | 16GB RAM | 1TB SSD | RTX 5060 | Windows 11 Home | Gigabyte Backpack 10169029 0.0000
230 Gigabyte Aero X16 1VH93PHC94AH Copilot+ PC Laptop (Gray) | 16" QHD+ (2560x1600) 165Hz IPS | Ryzen AI 7 350 | 16GB RAM | 1TB SSD | RTX 5060 | Windows 11 Home | Gigabyte Backpack 57941026 0.0000
231 AORUS ELITE 16 (2025) Intel Core Ultra 9 275HX RTX 5070 8GB GDDR7 16″ 165Hz IPS Gaming Laptop – GS-GS-AORUS-ELITE-16-BWHC3PHC94SH 96191853 0.0000
232 MSI GeForce RTX 3050 VENTUS 2X 6GB GDDR6 OC 31687300 0.0000
233 Ground Zero GRID with 3 led fans included Black 38019639 2.0000
234 Ground Zero VM-GRID with 3 led fans included White 94883741 2.0000
235 AORUS FI32U UHD 4K GAMING MONITOR 45212312 0.0000
236 SAMSUNG 990 PRO NVME 2TB GEN 4 33104028 0.0000
237 DEEPCOOL AK620 DUAL TOWER CPU COOLER - BLACK 57417639 0.0000
238 Acer AC-500 500w 80plus Bronze Power Supply - WHITE 94181009 0.0000
239 GIGABYTE GP-GS25F2A-TW 24.5 240HZ SS IPS FHD GAMING MONITOR 91057234 SN25405B006675/SN25435B001540/SN25405B006314/SN25405B006213 4.0000
240 Meta A200 Black with 3X RGB FANS 80592437 2.0000
241 Meta A200 White with 3X RGB FANS 94819702 0.0000
242 AMD Ryzen Original Heatsink fan, Wraith Stealth 01893402 8.0000
243 Inplay Moon M05 RGB Fans (black) 42247070 60.0000
244 AMD Ryzen 5 PRO 5655G 6-core 12-thread TRAY TYPE 80592343 0.0000
245 AMD Ryzen 5 4500 6 Core 3.6Hz 12 threads 4.10GHz AM4 Processor Tray 02921866 0.0000
246 MSI 24.5 MP251L E2 PRO IPS 120Hz Gaming Monitor 79213478 PD2M305C02954/PD2M305C02898 2.0000
247 MSI MAG 272F X24 27 FHD 240Hz 0.5ms GTG Rapid IPS Gaming Monitor 69137714 0.0000
248 MSI MAG 275CQF E18 27 Reso 180Hz 0.05ms GTG Rapid VA Curved Gaming Monitor 97065541 0.0000
249 Inplay lite X220 Case with Psu 55741631 0.0000
250 Asus Vivobook X1404VAPV14 Core 5 120U 8GB 256GB SSD 14 FHD Display 64558970 T7N0SH015933319/T7N0SH01619931A/T7N0SH01653831D 3.0000
251 Lenovo Ideapad slim 3 Core i5- 13th Gen 13420H 8gb RAM 512GB SSD 15.3 WUXGA IPS 60433426 0.0000
252 Viewpro Ryzen 5 8gb Ram 256gb SSD Win 11 Pro 11684294 0.0000
253 Asrock B550m SE wifi 94235903 0.0000
254 GROUND ZERO ILF-120 3X ARGB FANS FORWARD 5V 3PIN+SMALL 4PIN (BLACK) 35063914 0.0000
255 GIGABYTE RTX 5060 EAGLE OC 8GB GRAPHICS CARD 55942209 SN255241013399/SN260241021110/SN260241021108 1.0000
256 Ygt 500w PSU 80+ Bronze 03714326 0.0000
257 YGT ARGB Case Fan 3 In 1 Kit (White) 05983965 3.0000
258 Ryzen 7 7800x3d 82531218 9MT4671V50133_100-000000910 1.0000
259 ID Cooling FX360 Black 41049637 0.0000
260 ID Cooling FX360 White 47891020 0.0000
261 STARLINK DGT 240 WHITE ALUMINUM 41590373 4.0000
262 STARLINK DGT 240 Black ALUMINUM 35928591 8.0000
263 Inplay OP12-1B 67208360 9.0000
264 Inplay OP12-1W 09132164 20.0000
265 Inplay OP12R-1B Reverse fans 04832594 4.0000
266 Inplay OP12R-1W Reverse Fans white 30491106 10.0000
267 Inplay P9 PWM Fan Hub 11623609 19.0000
268 INPLAY STX 200 KEYBOARD AND MOUSE BUNDLE - WHITE 20378249 0.0000
269 NINGMEI NLR500-R74165 59936524 0.0000
270 Simorchip 512gb SSD Sata 83949024 0.0000
271 Nvision n2455GT 144hz 23.8 Black 61973029 NQ240BBEGE02602300793/NQ240BBEGE02602300034/NQ240BBEGE02602301173/NQ240BBEGE02602301485/NQ240BBEGE02602301496 2.0000
272 Deepcool CH160 Plus Black 34273210 4.0000
273 Deepcool CH260 Black 60810323 0.0000
274 Deepcool CH 260 White 02795217 0.0000
275 Jonsbo D32 Pro Black 93881222 1.0000
276 Jonsbo D32 Pro White 94188250 1.0000
277 Sapphire Pulse AMD Radeon RX 7600 Gaming OC 8GB GDDR6 Graphics Card 97212283 A255000008170/A255100005824/A255100005822/A255100005823/A255100005821/A255100005825 6.0000
278 Gigabyte B550m Aorus Elite AX 97153208 0.0000
279 Gigabyte B650 Eagle AX 92026750 0.0000
280 Lexar NQ100 240gb SSD Sata 13961276 LDK894R009115/LDK894R013705/LK89752009381/LGW642J008801/LK89752009313/LDK894R005100/LK89752011529/LK89752011543/LDK894R012903/LDK894R011753/LDK894R011914/LK89752011541/LGW642J008796 11.0000
281 ASRock AMD Radeon RX 6600 Challenger D 8GB GDDR6 Graphics Card 01764823 0.0000
282 Nvision MG34UF20 34 Ultra Wide 200hz Curved Monitor Black 51276394 0.0000
283 Nvision MG34UF20 34 Ultra Wide 200hz Curved Monitor White 52790311 0.0000
284 Inplay LD-UPS 1000VA Uninterruptible Power Supply UPS with LCD Display 50298385 0.0000
285 Inplay Electric Standing Desk Table 140x60cm 79387184 0.0000
286 DEEPCOOL PF650 650W 80+ STANDARD ATX NON MODULAR 30411023 10000156050BA245200092/10000156050BA245200094/10000156050BA245200101/10000156050BA245200102/10000156050BA245200103/10000156050BA245200105 0.0000
287 Gigabyte B450M DS3H WiFi 17951381 0.0000
288 Crucial 1tb P310 PCIe Gen4 NVMe 2280 M.2 SSD 84035236 0.0000
289 NVISION A24K7-R560-1651 All-in-One PC 63970617 0.0000
290 Redragon K728WRB RGB stormhunter Pro 87 Keys 80% Gasket Mounted TKL 43125869 0.0000
291 AMD RYZEN 5 3400G MPK (AM4) WITH WRAITH STEALTH COOLER OVA Box 89702036 0.0000
292 Apacer Panther - GOLDEN 16GB 8GX2 DDR4 3200MHZ 48770960 0.0000
293 Hiksemi Future RGB 16GB 6000MHz DDR5 Desktop Gaming Memory White 17204134 0.0000
294 Gigabyte Eagle Max Oc GeForce RTX 5060 8GB GDDR7 TRIFAN 29381109 0.0000
295 AMD Ryzen 7 9800X3D 4.7GHz Up to 5.2GHz Socket AM5 39684512 0.0000
296 Intel CPU Stock Cooler For LGA 1700 Socket, Blue Lights, Copper heatsink 68047351 1.0000
297 Crucial Ballistix RGB 16GB DDR4 3000MHz 19528611 0.0000
298 Crucial Ballistix Sport 16GB DDR4 3200MHz 91072803 0.0000
299 AMD Ryzen 7 9700X (AM5) Processor 3.80-5.50GHz 8-Core 16-Threads 48921656 0.0000
300 Nvision A24K6-i704-0825 i7 4th gen 8G/256G Set All-in-one PC 07642951 20260325HM87I704162560543 1.0000
301 Inplay Moon M05 120MM RGB FANS (WHITE) 63933521 147.0000
302 GSTORM 120MM RGB FANS (BLACK) 29350248 0.0000
303 8GB STORM STORAGE DDR3 1600MHZ UDIMM 95320761 0.0000
304 8GB HKCMemory HU30 DDR3 1600MHZ UDIMM 12913126 0.0000
305 8GB HKCMemory HS30 DDR3 1600MHZ SODIMM 42476951 0.0000
306 8GB STORM DDR3 1600MHZ SODIMM 23144290 0.0000
307 256GB R900 Ramsta M.2 NVME SSD 59248213 0.0000
308 DARKFLASH INFINITY 24 3IN1 ARGB FANS 59942018 0.0000
309 Wj Coolman Seaview 95474107 0.0000
310 Gigabyte B650m Aorus Elite AX 83610329 0.0000
311 Asus ROG Strix B550-A Gaming 43939143 0.0000
312 AMD Ryzen 7 8700F (AM5) Processor 8-Core 16-Threads 65933239 9ANJ977T50857_100-000001590 1.0000
313 Gigabyte GeForce RTX 3050 Windforce OC V2 6GB GDDR6 Graphics Card 38061529 SN260651066063/SN260651066064/SN255241002023/SN255241002024/SN260651066066/SN260651066070/SN260651066067/SN260651066054/SN260651066060 9.0000
314 Lexar 8GB DDR4 2666MHz CL19 UDIMM Desktop Memory 60406995 0.0000
315 GIGABYTE RTX 5060 EAGLE OC ICE 8GB GRAPHICS CARD 45610203 0.0000
316 Inplay Seaview 240mm ARGB Liquid Cooler Black 31707159 0.0000
317 1 INPLAY SEAVIEW 360 PRO WHITE 46259129 0.0000
318 Msi 5060 ti Gaming Trio 8gb 20910397 0.0000
319 MSI MAG COREFROZR AA13 ARGB CPU Cooler Fan (Black) 24793735 8.0000
320 NVISION 27" QG27P21 210HZ 2k 34679507 0.0000
321 MSI MAG COREFROZR AA13 ARGB CPU Cooler Fan (White) 25364297 1.0000
322 KINGSTON SSD NV3 NVME 4.0 1TB 92117954 0.0000
323 Gigabyte GeForce RTX 5070 Ti Windforce OC SFF 16GB GDDR7 Graphics Card 69032187 0.0000
324 Darkflash DK415M M-ATX PC Case 10223410 0.0000
325 ZHITAI Ti600 1TB SSD M.2 2280 PCle Gen 4x4 7000mb/s 98934423 ZTA601TAB2548300LY/ZTA601TAB254830GMR/ZTA601TAB25483163N/ZTA601TAB254831A2T/ZTA601TAB2548309DW 4.0000
326 Colorful GeForce RTX 5060 Ti Gaming DUO 16GB-V Graphics Card 29421918 8L0200439XY00CT 0.0000
327 Colorful iGame GeForce RTX 5060 Ti Ultra W Duo OC 16GB-V GDDR7 Graphics Card 04251073 0.0000
328 Kingston Fury Beast 16gb 1x16gb 5600mhz ddr5 00661847 0000009277789-S007498 1.0000
329 GIGABYTE M27UP ICE 27" SS IPS GAMING MONITOR 3840x2160 (UHD)GP-M27UP-ICE-AP 63712903 0.0000
330 120MM NON RGB CASE FAN 54982671 0.0000
331 GIGABYTE GEFORCE RTX™ 5070 WINDFORCE OC SFF 12GB VGA CARD 32749369 0.0000
332 Gigabyte GS27FA 27 FHD (1920x1080) 180Hz 1ms MPRT SS IPS Gaming Monitor 09305841 SN26071B001342/SN26071B001435/SN26071B001397/SN26071B001436/SN26071B001437 5.0000
333 Gigabyte B760M AORUS ELITE WIFI6E GEN5 MOTHERBOARD 26332880 0.0000
334 INTEL CORE i7-14700KF PROCESSOR (IIDC) 70990523 0.0000
335 OCYPUS SIGMA L36 BK ARGB 81704792 0.0000
336 Ocypus Iota L36 360MM AIO Liquid CPU Cooler with Digital Display 91605272 IL36BNAB1100408/IL36BNAB1100406/IL36BNAB1100407/IL36BNAB1100405 4.0000
337 Corsair CX750 750W 80+ Bronze ATX Power Supply 34731023 0.0000
338 Nvision n2455GT 144hz 23.8 White 62036485 0.0000
339 THERMAL PASTE GENERIC INJECTION TYPE 45214072 0.0000
340 INPLAY C1080 PRO USB FHD DIGITAL CAMERA 1080P BLACK 12828102 0.0000
341 COMLINK RC-EZM PASSTRU EZ RJ45 CONNECTOR 05228126 0.0000
342 1TB SEAGATE BARRACUDA HDD/ WESTERN DIGITAL DESKTOP HDD 1TB 20542967 0.0000
343 INPLAY LD UPS 3000VA LCD DISPLAY 17005392 0.0000
344 YGT WD-141 DUAL-MODE WIRELESS CHARGING MOUSE BLACK 53194279 0.0000
345 YGT GM-07 7D WIRED RGB GAMING MOUSE (BLACK) 43965039 0.0000
346 NEXON WIRELESS COMBO WS-01 OFFICE KEYBOARD AND MOUSE 73783245 0.0000
347 NEXION GAMING HEADSET F-06 (BLACK) 91032716 0.0000
348 YGT TOP ONE KY-750W PSU (BLACK) 16952212 KY2512004536/KY2512004532/KY2512004535/KY2512011109/KY2512011110/KY2512011101/KY2512011103/KY2512011105/KY2512011108/KY2512011111/KY2512011106/KY2512011107/KY2512011104/KY2512000804/KY2512000805/KY2512000802/KY2512000809/KY2512000806/KY2512000807/KY2512000808/KY2512001183/KY2512001182/KY2512001181/KY2512001186/KY2512001185/KY2512001184/KY2512001187/KY2512001188/KY2512001189/KY2512001190/KY2512014493/KY2512014495/KY2512014497/KY2512014494/KY2512014492/KY2512014500/KY2512014498/KY2512014496/KY2512014499/KY2512014491 0.0000
349 NVISION 23.8" 144HZ BLACK 30270249 0.0000
350 GIGABYTE GEFORCE RTX 5070 Ti EAGLE OC SFF 16G VGA CARD 38941347 0.0000
351 Groundzero Hoica Case 69923789 1.0000
352 Groundzero Vision V2 29901724 0.0000
353 Lian Li V100 Vector ATX Mid-Tower Case 27912092 0.0000
354 MSI B550M PRO VDH WIFI 47038643 0.0000
355 INPLAY STX390-BM BLACK MIX KEYBOARD AND MOUSE 69338815 0.0000
356 YGT MARS 8 CASE ONLY 04133669 0.0000
357 YGT N195 MICRO ATX GAMING CASE (BLACK) 85963541 0.0000
358 YGT N195 MICRO ATX GAMING CASE (WHITE) 50821932 0.0000
359 Tecware Infinity M Dual Tempered Glass MATX PC Case 42253103 0.0000
360 RGB CONTROLLER 68512385 7.0000
361 ASUS DUAL GEFORCE RTX™ 5060 Ti 8GB GDDR7 OC EDITION (PRE ORDER) 62702207 0.0000
362 ASUS PRIME GEFORCE RTX™ 5060 Ti 8GB GDDR7 OC EDITION 3X FANS (PRE ORDER) 81305061 0.0000
363 DARKFLASH C6S SINGLE FAN 82294060 0.0000
364 SECURE AVR 91761912 0.0000
365 Ovation 8GB DDR4 RAM 2666MHz 73884609 0.0000

BIN
Barber Dom.docx Normal file

Binary file not shown.

51
PLAN-shift-cell-layout.md Normal file
View File

@@ -0,0 +1,51 @@
# Plan: Shift Calendar Cell Layout and Readability Enhancements
## Overview
The user reported that the text in the Monthly Shift Calendar cells is too small to read, especially the shift times. The objective is to optimize the styling, spacing, and typography of the shift calendar cells inside the React frontend to make the layout clean, readable, and professional.
## Project Type
WEB (React + Tailwind CSS frontend modification)
## Success Criteria
- Shift name and shift time font sizes are increased for clear readability.
- Cell badge height and padding are adjusted so the larger text fits without overlapping or clipping.
- The shift calendar grid maintains its alignment, horizontal scrollability, and aesthetics across screen sizes.
- No purple or violet color schemes are introduced (adhering to styling guidelines).
## Tech Stack
- **React & Inertia.js**: Frontend framework.
- **Tailwind CSS**: Styling utility classes.
## File Structure
- `resources/js/pages/hr/shifts/calendar.tsx` (Target component containing the calendar grid and cell rendering)
## Task Breakdown
### Task 1: Adjust Cell Badge Layout & Dimensions
- **Agent**: `frontend-specialist`
- **Skill**: `frontend-design`, `react-best-practices`
- **Priority**: P1
- **Dependencies**: None
- **INPUT**: The badge container `div` styling inside the `dates.map` render block of `calendar.tsx` (around lines 268-278).
- **OUTPUT**:
- Update cell badge height from `h-10` (40px) to `h-12` (48px) or `h-13` (52px) to provide more vertical space.
- Increase font size from `text-[9px]` to `text-[11px]` (or `text-xs`).
- Align text elements vertically with appropriate line-height (`leading-normal` or `leading-tight`).
- **VERIFY**: Check that the shift labels (`OPS`, `RD`, etc.) render in the new larger font size and are vertically centered.
### Task 2: Enhance Time Label Readability & Formatting
- **Agent**: `frontend-specialist`
- **Skill**: `frontend-design`
- **Priority**: P1
- **Dependencies**: Task 1
- **INPUT**: The shift time `span` rendering within the badge (around lines 274-276).
- **OUTPUT**:
- Increase the time font size from `text-[7px]` to `text-[9.5px]` or `text-[10px]`.
- Format the time string dynamically (e.g., trim leading zeroes from `03:30PM` to `3:30 PM`) for a cleaner look.
- **VERIFY**: Check that times are legible, properly aligned, and styled with high-contrast text colors relative to the badge background.
## Phase X: Verification Checklist
- [ ] Lint: Run `npm run lint` or `npx eslint` to ensure no syntax/type errors.
- [ ] Build: Run `npm run build` on local machine to check compilation success.
- [ ] Visual Audit: Verify the table cells display correctly in light and dark modes.
- [ ] Accessibility Audit: Ensure text meets color contrast standards.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,7 +0,0 @@
ZKTECO_IP=192.168.1.201
ZKTECO_PORT=4370
SERVER_API_URL=https://scxsoftware.com/api/zkteco/sync
API_KEY=default_secure_sync_key_123
BRANCH_ID=1
SYNC_DAYS=7

View File

@@ -1,360 +0,0 @@
{
"name": "zkteco-branch-agent",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"license": "MIT",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz",
"integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.16.0",
"form-data": "^4.0.5",
"https-proxy-agent": "^5.0.1",
"proxy-from-env": "^2.1.0"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/dotenv": {
"version": "16.6.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
"integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/follow-redirects": {
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
"integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
"integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"license": "MIT",
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/proxy-from-env": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
"integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/zklib-js": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/zklib-js/-/zklib-js-1.3.5.tgz",
"integrity": "sha512-sg6xsWss/4Q4KhOf4XyfKhehOy3pSBe35DW04eniPycWL1S2UXxKvyqheiFFZjWk7YWattHeVVrUXb6HDy0KzA==",
"license": "ISC",
"dependencies": {
"zklib-js": "^1.0.0"
}
}
}
}

View File

@@ -1,145 +0,0 @@
agent-base
==========
### Turn a function into an [`http.Agent`][http.Agent] instance
[![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI)
This module provides an `http.Agent` generator. That is, you pass it an async
callback function, and it returns a new `http.Agent` instance that will invoke the
given callback function when sending outbound HTTP requests.
#### Some subclasses:
Here's some more interesting uses of `agent-base`.
Send a pull request to list yours!
* [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints
* [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints
* [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS
* [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS
Installation
------------
Install with `npm`:
``` bash
$ npm install agent-base
```
Example
-------
Here's a minimal example that creates a new `net.Socket` connection to the server
for every HTTP request (i.e. the equivalent of `agent: false` option):
```js
var net = require('net');
var tls = require('tls');
var url = require('url');
var http = require('http');
var agent = require('agent-base');
var endpoint = 'http://nodejs.org/api/';
var parsed = url.parse(endpoint);
// This is the important part!
parsed.agent = agent(function (req, opts) {
var socket;
// `secureEndpoint` is true when using the https module
if (opts.secureEndpoint) {
socket = tls.connect(opts);
} else {
socket = net.connect(opts);
}
return socket;
});
// Everything else works just like normal...
http.get(parsed, function (res) {
console.log('"response" event!', res.headers);
res.pipe(process.stdout);
});
```
Returning a Promise or using an `async` function is also supported:
```js
agent(async function (req, opts) {
await sleep(1000);
// etc…
});
```
Return another `http.Agent` instance to "pass through" the responsibility
for that HTTP request to that agent:
```js
agent(function (req, opts) {
return opts.secureEndpoint ? https.globalAgent : http.globalAgent;
});
```
API
---
## Agent(Function callback[, Object options]) → [http.Agent][]
Creates a base `http.Agent` that will execute the callback function `callback`
for every HTTP request that it is used as the `agent` for. The callback function
is responsible for creating a `stream.Duplex` instance of some kind that will be
used as the underlying socket in the HTTP request.
The `options` object accepts the following properties:
* `timeout` - Number - Timeout for the `callback()` function in milliseconds. Defaults to Infinity (optional).
The callback function should have the following signature:
### callback(http.ClientRequest req, Object options, Function cb) → undefined
The ClientRequest `req` can be accessed to read request headers and
and the path, etc. The `options` object contains the options passed
to the `http.request()`/`https.request()` function call, and is formatted
to be directly passed to `net.connect()`/`tls.connect()`, or however
else you want a Socket to be created. Pass the created socket to
the callback function `cb` once created, and the HTTP request will
continue to proceed.
If the `https` module is used to invoke the HTTP request, then the
`secureEndpoint` property on `options` _will be set to `true`_.
License
-------
(The MIT License)
Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
[http-proxy-agent]: https://github.com/TooTallNate/node-http-proxy-agent
[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent
[pac-proxy-agent]: https://github.com/TooTallNate/node-pac-proxy-agent
[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent
[http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent

View File

@@ -1,78 +0,0 @@
/// <reference types="node" />
import net from 'net';
import http from 'http';
import https from 'https';
import { Duplex } from 'stream';
import { EventEmitter } from 'events';
declare function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent;
declare function createAgent(callback: createAgent.AgentCallback, opts?: createAgent.AgentOptions): createAgent.Agent;
declare namespace createAgent {
interface ClientRequest extends http.ClientRequest {
_last?: boolean;
_hadError?: boolean;
method: string;
}
interface AgentRequestOptions {
host?: string;
path?: string;
port: number;
}
interface HttpRequestOptions extends AgentRequestOptions, Omit<http.RequestOptions, keyof AgentRequestOptions> {
secureEndpoint: false;
}
interface HttpsRequestOptions extends AgentRequestOptions, Omit<https.RequestOptions, keyof AgentRequestOptions> {
secureEndpoint: true;
}
type RequestOptions = HttpRequestOptions | HttpsRequestOptions;
type AgentLike = Pick<createAgent.Agent, 'addRequest'> | http.Agent;
type AgentCallbackReturn = Duplex | AgentLike;
type AgentCallbackCallback = (err?: Error | null, socket?: createAgent.AgentCallbackReturn) => void;
type AgentCallbackPromise = (req: createAgent.ClientRequest, opts: createAgent.RequestOptions) => createAgent.AgentCallbackReturn | Promise<createAgent.AgentCallbackReturn>;
type AgentCallback = typeof Agent.prototype.callback;
type AgentOptions = {
timeout?: number;
};
/**
* Base `http.Agent` implementation.
* No pooling/keep-alive is implemented by default.
*
* @param {Function} callback
* @api public
*/
class Agent extends EventEmitter {
timeout: number | null;
maxFreeSockets: number;
maxTotalSockets: number;
maxSockets: number;
sockets: {
[key: string]: net.Socket[];
};
freeSockets: {
[key: string]: net.Socket[];
};
requests: {
[key: string]: http.IncomingMessage[];
};
options: https.AgentOptions;
private promisifiedCallback?;
private explicitDefaultPort?;
private explicitProtocol?;
constructor(callback?: createAgent.AgentCallback | createAgent.AgentOptions, _opts?: createAgent.AgentOptions);
get defaultPort(): number;
set defaultPort(v: number);
get protocol(): string;
set protocol(v: string);
callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions, fn: createAgent.AgentCallbackCallback): void;
callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions): createAgent.AgentCallbackReturn | Promise<createAgent.AgentCallbackReturn>;
/**
* Called by node-core's "_http_client.js" module when creating
* a new HTTP request with this Agent instance.
*
* @api public
*/
addRequest(req: ClientRequest, _opts: RequestOptions): void;
freeSocket(socket: net.Socket, opts: AgentOptions): void;
destroy(): void;
}
}
export = createAgent;

View File

@@ -1,203 +0,0 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const events_1 = require("events");
const debug_1 = __importDefault(require("debug"));
const promisify_1 = __importDefault(require("./promisify"));
const debug = debug_1.default('agent-base');
function isAgent(v) {
return Boolean(v) && typeof v.addRequest === 'function';
}
function isSecureEndpoint() {
const { stack } = new Error();
if (typeof stack !== 'string')
return false;
return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1);
}
function createAgent(callback, opts) {
return new createAgent.Agent(callback, opts);
}
(function (createAgent) {
/**
* Base `http.Agent` implementation.
* No pooling/keep-alive is implemented by default.
*
* @param {Function} callback
* @api public
*/
class Agent extends events_1.EventEmitter {
constructor(callback, _opts) {
super();
let opts = _opts;
if (typeof callback === 'function') {
this.callback = callback;
}
else if (callback) {
opts = callback;
}
// Timeout for the socket to be returned from the callback
this.timeout = null;
if (opts && typeof opts.timeout === 'number') {
this.timeout = opts.timeout;
}
// These aren't actually used by `agent-base`, but are required
// for the TypeScript definition files in `@types/node` :/
this.maxFreeSockets = 1;
this.maxSockets = 1;
this.maxTotalSockets = Infinity;
this.sockets = {};
this.freeSockets = {};
this.requests = {};
this.options = {};
}
get defaultPort() {
if (typeof this.explicitDefaultPort === 'number') {
return this.explicitDefaultPort;
}
return isSecureEndpoint() ? 443 : 80;
}
set defaultPort(v) {
this.explicitDefaultPort = v;
}
get protocol() {
if (typeof this.explicitProtocol === 'string') {
return this.explicitProtocol;
}
return isSecureEndpoint() ? 'https:' : 'http:';
}
set protocol(v) {
this.explicitProtocol = v;
}
callback(req, opts, fn) {
throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`');
}
/**
* Called by node-core's "_http_client.js" module when creating
* a new HTTP request with this Agent instance.
*
* @api public
*/
addRequest(req, _opts) {
const opts = Object.assign({}, _opts);
if (typeof opts.secureEndpoint !== 'boolean') {
opts.secureEndpoint = isSecureEndpoint();
}
if (opts.host == null) {
opts.host = 'localhost';
}
if (opts.port == null) {
opts.port = opts.secureEndpoint ? 443 : 80;
}
if (opts.protocol == null) {
opts.protocol = opts.secureEndpoint ? 'https:' : 'http:';
}
if (opts.host && opts.path) {
// If both a `host` and `path` are specified then it's most
// likely the result of a `url.parse()` call... we need to
// remove the `path` portion so that `net.connect()` doesn't
// attempt to open that as a unix socket file.
delete opts.path;
}
delete opts.agent;
delete opts.hostname;
delete opts._defaultAgent;
delete opts.defaultPort;
delete opts.createConnection;
// Hint to use "Connection: close"
// XXX: non-documented `http` module API :(
req._last = true;
req.shouldKeepAlive = false;
let timedOut = false;
let timeoutId = null;
const timeoutMs = opts.timeout || this.timeout;
const onerror = (err) => {
if (req._hadError)
return;
req.emit('error', err);
// For Safety. Some additional errors might fire later on
// and we need to make sure we don't double-fire the error event.
req._hadError = true;
};
const ontimeout = () => {
timeoutId = null;
timedOut = true;
const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`);
err.code = 'ETIMEOUT';
onerror(err);
};
const callbackError = (err) => {
if (timedOut)
return;
if (timeoutId !== null) {
clearTimeout(timeoutId);
timeoutId = null;
}
onerror(err);
};
const onsocket = (socket) => {
if (timedOut)
return;
if (timeoutId != null) {
clearTimeout(timeoutId);
timeoutId = null;
}
if (isAgent(socket)) {
// `socket` is actually an `http.Agent` instance, so
// relinquish responsibility for this `req` to the Agent
// from here on
debug('Callback returned another Agent instance %o', socket.constructor.name);
socket.addRequest(req, opts);
return;
}
if (socket) {
socket.once('free', () => {
this.freeSocket(socket, opts);
});
req.onSocket(socket);
return;
}
const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``);
onerror(err);
};
if (typeof this.callback !== 'function') {
onerror(new Error('`callback` is not defined'));
return;
}
if (!this.promisifiedCallback) {
if (this.callback.length >= 3) {
debug('Converting legacy callback function to promise');
this.promisifiedCallback = promisify_1.default(this.callback);
}
else {
this.promisifiedCallback = this.callback;
}
}
if (typeof timeoutMs === 'number' && timeoutMs > 0) {
timeoutId = setTimeout(ontimeout, timeoutMs);
}
if ('port' in opts && typeof opts.port !== 'number') {
opts.port = Number(opts.port);
}
try {
debug('Resolving socket for %o request: %o', opts.protocol, `${req.method} ${req.path}`);
Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError);
}
catch (err) {
Promise.reject(err).catch(callbackError);
}
}
freeSocket(socket, opts) {
debug('Freeing socket %o %o', socket.constructor.name, opts);
socket.destroy();
}
destroy() {
debug('Destroying agent %o', this.constructor.name);
}
}
createAgent.Agent = Agent;
// So that `instanceof` works correctly
createAgent.prototype = createAgent.Agent.prototype;
})(createAgent || (createAgent = {}));
module.exports = createAgent;
//# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +0,0 @@
import { ClientRequest, RequestOptions, AgentCallbackCallback, AgentCallbackPromise } from './index';
declare type LegacyCallback = (req: ClientRequest, opts: RequestOptions, fn: AgentCallbackCallback) => void;
export default function promisify(fn: LegacyCallback): AgentCallbackPromise;
export {};

View File

@@ -1,18 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function promisify(fn) {
return function (req, opts) {
return new Promise((resolve, reject) => {
fn.call(this, req, opts, (err, rtn) => {
if (err) {
reject(err);
}
else {
resolve(rtn);
}
});
});
};
}
exports.default = promisify;
//# sourceMappingURL=promisify.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"promisify.js","sourceRoot":"","sources":["../../src/promisify.ts"],"names":[],"mappings":";;AAeA,SAAwB,SAAS,CAAC,EAAkB;IACnD,OAAO,UAAsB,GAAkB,EAAE,IAAoB;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,EAAE,CAAC,IAAI,CACN,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,CAAC,GAA6B,EAAE,GAAyB,EAAE,EAAE;gBAC5D,IAAI,GAAG,EAAE;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;iBACZ;qBAAM;oBACN,OAAO,CAAC,GAAG,CAAC,CAAC;iBACb;YACF,CAAC,CACD,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAjBD,4BAiBC"}

View File

@@ -1,64 +0,0 @@
{
"name": "agent-base",
"version": "6.0.2",
"description": "Turn a function into an `http.Agent` instance",
"main": "dist/src/index",
"typings": "dist/src/index",
"files": [
"dist/src",
"src"
],
"scripts": {
"prebuild": "rimraf dist",
"build": "tsc",
"postbuild": "cpy --parents src test '!**/*.ts' dist",
"test": "mocha --reporter spec dist/test/*.js",
"test-lint": "eslint src --ext .js,.ts",
"prepublishOnly": "npm run build"
},
"repository": {
"type": "git",
"url": "git://github.com/TooTallNate/node-agent-base.git"
},
"keywords": [
"http",
"agent",
"base",
"barebones",
"https"
],
"author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
"license": "MIT",
"bugs": {
"url": "https://github.com/TooTallNate/node-agent-base/issues"
},
"dependencies": {
"debug": "4"
},
"devDependencies": {
"@types/debug": "4",
"@types/mocha": "^5.2.7",
"@types/node": "^14.0.20",
"@types/semver": "^7.1.0",
"@types/ws": "^6.0.3",
"@typescript-eslint/eslint-plugin": "1.6.0",
"@typescript-eslint/parser": "1.1.0",
"async-listen": "^1.2.0",
"cpy-cli": "^2.0.0",
"eslint": "5.16.0",
"eslint-config-airbnb": "17.1.0",
"eslint-config-prettier": "4.1.0",
"eslint-import-resolver-typescript": "1.1.1",
"eslint-plugin-import": "2.16.0",
"eslint-plugin-jsx-a11y": "6.2.1",
"eslint-plugin-react": "7.12.4",
"mocha": "^6.2.0",
"rimraf": "^3.0.0",
"semver": "^7.1.2",
"typescript": "^3.5.3",
"ws": "^3.0.0"
},
"engines": {
"node": ">= 6.0.0"
}
}

View File

@@ -1,345 +0,0 @@
import net from 'net';
import http from 'http';
import https from 'https';
import { Duplex } from 'stream';
import { EventEmitter } from 'events';
import createDebug from 'debug';
import promisify from './promisify';
const debug = createDebug('agent-base');
function isAgent(v: any): v is createAgent.AgentLike {
return Boolean(v) && typeof v.addRequest === 'function';
}
function isSecureEndpoint(): boolean {
const { stack } = new Error();
if (typeof stack !== 'string') return false;
return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1);
}
function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent;
function createAgent(
callback: createAgent.AgentCallback,
opts?: createAgent.AgentOptions
): createAgent.Agent;
function createAgent(
callback?: createAgent.AgentCallback | createAgent.AgentOptions,
opts?: createAgent.AgentOptions
) {
return new createAgent.Agent(callback, opts);
}
namespace createAgent {
export interface ClientRequest extends http.ClientRequest {
_last?: boolean;
_hadError?: boolean;
method: string;
}
export interface AgentRequestOptions {
host?: string;
path?: string;
// `port` on `http.RequestOptions` can be a string or undefined,
// but `net.TcpNetConnectOpts` expects only a number
port: number;
}
export interface HttpRequestOptions
extends AgentRequestOptions,
Omit<http.RequestOptions, keyof AgentRequestOptions> {
secureEndpoint: false;
}
export interface HttpsRequestOptions
extends AgentRequestOptions,
Omit<https.RequestOptions, keyof AgentRequestOptions> {
secureEndpoint: true;
}
export type RequestOptions = HttpRequestOptions | HttpsRequestOptions;
export type AgentLike = Pick<createAgent.Agent, 'addRequest'> | http.Agent;
export type AgentCallbackReturn = Duplex | AgentLike;
export type AgentCallbackCallback = (
err?: Error | null,
socket?: createAgent.AgentCallbackReturn
) => void;
export type AgentCallbackPromise = (
req: createAgent.ClientRequest,
opts: createAgent.RequestOptions
) =>
| createAgent.AgentCallbackReturn
| Promise<createAgent.AgentCallbackReturn>;
export type AgentCallback = typeof Agent.prototype.callback;
export type AgentOptions = {
timeout?: number;
};
/**
* Base `http.Agent` implementation.
* No pooling/keep-alive is implemented by default.
*
* @param {Function} callback
* @api public
*/
export class Agent extends EventEmitter {
public timeout: number | null;
public maxFreeSockets: number;
public maxTotalSockets: number;
public maxSockets: number;
public sockets: {
[key: string]: net.Socket[];
};
public freeSockets: {
[key: string]: net.Socket[];
};
public requests: {
[key: string]: http.IncomingMessage[];
};
public options: https.AgentOptions;
private promisifiedCallback?: createAgent.AgentCallbackPromise;
private explicitDefaultPort?: number;
private explicitProtocol?: string;
constructor(
callback?: createAgent.AgentCallback | createAgent.AgentOptions,
_opts?: createAgent.AgentOptions
) {
super();
let opts = _opts;
if (typeof callback === 'function') {
this.callback = callback;
} else if (callback) {
opts = callback;
}
// Timeout for the socket to be returned from the callback
this.timeout = null;
if (opts && typeof opts.timeout === 'number') {
this.timeout = opts.timeout;
}
// These aren't actually used by `agent-base`, but are required
// for the TypeScript definition files in `@types/node` :/
this.maxFreeSockets = 1;
this.maxSockets = 1;
this.maxTotalSockets = Infinity;
this.sockets = {};
this.freeSockets = {};
this.requests = {};
this.options = {};
}
get defaultPort(): number {
if (typeof this.explicitDefaultPort === 'number') {
return this.explicitDefaultPort;
}
return isSecureEndpoint() ? 443 : 80;
}
set defaultPort(v: number) {
this.explicitDefaultPort = v;
}
get protocol(): string {
if (typeof this.explicitProtocol === 'string') {
return this.explicitProtocol;
}
return isSecureEndpoint() ? 'https:' : 'http:';
}
set protocol(v: string) {
this.explicitProtocol = v;
}
callback(
req: createAgent.ClientRequest,
opts: createAgent.RequestOptions,
fn: createAgent.AgentCallbackCallback
): void;
callback(
req: createAgent.ClientRequest,
opts: createAgent.RequestOptions
):
| createAgent.AgentCallbackReturn
| Promise<createAgent.AgentCallbackReturn>;
callback(
req: createAgent.ClientRequest,
opts: createAgent.AgentOptions,
fn?: createAgent.AgentCallbackCallback
):
| createAgent.AgentCallbackReturn
| Promise<createAgent.AgentCallbackReturn>
| void {
throw new Error(
'"agent-base" has no default implementation, you must subclass and override `callback()`'
);
}
/**
* Called by node-core's "_http_client.js" module when creating
* a new HTTP request with this Agent instance.
*
* @api public
*/
addRequest(req: ClientRequest, _opts: RequestOptions): void {
const opts: RequestOptions = { ..._opts };
if (typeof opts.secureEndpoint !== 'boolean') {
opts.secureEndpoint = isSecureEndpoint();
}
if (opts.host == null) {
opts.host = 'localhost';
}
if (opts.port == null) {
opts.port = opts.secureEndpoint ? 443 : 80;
}
if (opts.protocol == null) {
opts.protocol = opts.secureEndpoint ? 'https:' : 'http:';
}
if (opts.host && opts.path) {
// If both a `host` and `path` are specified then it's most
// likely the result of a `url.parse()` call... we need to
// remove the `path` portion so that `net.connect()` doesn't
// attempt to open that as a unix socket file.
delete opts.path;
}
delete opts.agent;
delete opts.hostname;
delete opts._defaultAgent;
delete opts.defaultPort;
delete opts.createConnection;
// Hint to use "Connection: close"
// XXX: non-documented `http` module API :(
req._last = true;
req.shouldKeepAlive = false;
let timedOut = false;
let timeoutId: ReturnType<typeof setTimeout> | null = null;
const timeoutMs = opts.timeout || this.timeout;
const onerror = (err: NodeJS.ErrnoException) => {
if (req._hadError) return;
req.emit('error', err);
// For Safety. Some additional errors might fire later on
// and we need to make sure we don't double-fire the error event.
req._hadError = true;
};
const ontimeout = () => {
timeoutId = null;
timedOut = true;
const err: NodeJS.ErrnoException = new Error(
`A "socket" was not created for HTTP request before ${timeoutMs}ms`
);
err.code = 'ETIMEOUT';
onerror(err);
};
const callbackError = (err: NodeJS.ErrnoException) => {
if (timedOut) return;
if (timeoutId !== null) {
clearTimeout(timeoutId);
timeoutId = null;
}
onerror(err);
};
const onsocket = (socket: AgentCallbackReturn) => {
if (timedOut) return;
if (timeoutId != null) {
clearTimeout(timeoutId);
timeoutId = null;
}
if (isAgent(socket)) {
// `socket` is actually an `http.Agent` instance, so
// relinquish responsibility for this `req` to the Agent
// from here on
debug(
'Callback returned another Agent instance %o',
socket.constructor.name
);
(socket as createAgent.Agent).addRequest(req, opts);
return;
}
if (socket) {
socket.once('free', () => {
this.freeSocket(socket as net.Socket, opts);
});
req.onSocket(socket as net.Socket);
return;
}
const err = new Error(
`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``
);
onerror(err);
};
if (typeof this.callback !== 'function') {
onerror(new Error('`callback` is not defined'));
return;
}
if (!this.promisifiedCallback) {
if (this.callback.length >= 3) {
debug('Converting legacy callback function to promise');
this.promisifiedCallback = promisify(this.callback);
} else {
this.promisifiedCallback = this.callback;
}
}
if (typeof timeoutMs === 'number' && timeoutMs > 0) {
timeoutId = setTimeout(ontimeout, timeoutMs);
}
if ('port' in opts && typeof opts.port !== 'number') {
opts.port = Number(opts.port);
}
try {
debug(
'Resolving socket for %o request: %o',
opts.protocol,
`${req.method} ${req.path}`
);
Promise.resolve(this.promisifiedCallback(req, opts)).then(
onsocket,
callbackError
);
} catch (err) {
Promise.reject(err).catch(callbackError);
}
}
freeSocket(socket: net.Socket, opts: AgentOptions) {
debug('Freeing socket %o %o', socket.constructor.name, opts);
socket.destroy();
}
destroy() {
debug('Destroying agent %o', this.constructor.name);
}
}
// So that `instanceof` works correctly
createAgent.prototype = createAgent.Agent.prototype;
}
export = createAgent;

View File

@@ -1,33 +0,0 @@
import {
Agent,
ClientRequest,
RequestOptions,
AgentCallbackCallback,
AgentCallbackPromise,
AgentCallbackReturn
} from './index';
type LegacyCallback = (
req: ClientRequest,
opts: RequestOptions,
fn: AgentCallbackCallback
) => void;
export default function promisify(fn: LegacyCallback): AgentCallbackPromise {
return function(this: Agent, req: ClientRequest, opts: RequestOptions) {
return new Promise((resolve, reject) => {
fn.call(
this,
req,
opts,
(err: Error | null | undefined, rtn?: AgentCallbackReturn) => {
if (err) {
reject(err);
} else {
resolve(rtn);
}
}
);
});
};
}

View File

@@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2016 Alex Indigo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,233 +0,0 @@
# asynckit [![NPM Module](https://img.shields.io/npm/v/asynckit.svg?style=flat)](https://www.npmjs.com/package/asynckit)
Minimal async jobs utility library, with streams support.
[![PhantomJS Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=browser&style=flat)](https://travis-ci.org/alexindigo/asynckit)
[![Linux Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=linux:0.12-6.x&style=flat)](https://travis-ci.org/alexindigo/asynckit)
[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/asynckit/v0.4.0.svg?label=windows:0.12-6.x&style=flat)](https://ci.appveyor.com/project/alexindigo/asynckit)
[![Coverage Status](https://img.shields.io/coveralls/alexindigo/asynckit/v0.4.0.svg?label=code+coverage&style=flat)](https://coveralls.io/github/alexindigo/asynckit?branch=master)
[![Dependency Status](https://img.shields.io/david/alexindigo/asynckit/v0.4.0.svg?style=flat)](https://david-dm.org/alexindigo/asynckit)
[![bitHound Overall Score](https://www.bithound.io/github/alexindigo/asynckit/badges/score.svg)](https://www.bithound.io/github/alexindigo/asynckit)
<!-- [![Readme](https://img.shields.io/badge/readme-tested-brightgreen.svg?style=flat)](https://www.npmjs.com/package/reamde) -->
AsyncKit provides harness for `parallel` and `serial` iterators over list of items represented by arrays or objects.
Optionally it accepts abort function (should be synchronously return by iterator for each item), and terminates left over jobs upon an error event. For specific iteration order built-in (`ascending` and `descending`) and custom sort helpers also supported, via `asynckit.serialOrdered` method.
It ensures async operations to keep behavior more stable and prevent `Maximum call stack size exceeded` errors, from sync iterators.
| compression | size |
| :----------------- | -------: |
| asynckit.js | 12.34 kB |
| asynckit.min.js | 4.11 kB |
| asynckit.min.js.gz | 1.47 kB |
## Install
```sh
$ npm install --save asynckit
```
## Examples
### Parallel Jobs
Runs iterator over provided array in parallel. Stores output in the `result` array,
on the matching positions. In unlikely event of an error from one of the jobs,
will terminate rest of the active jobs (if abort function is provided)
and return error along with salvaged data to the main callback function.
#### Input Array
```javascript
var parallel = require('asynckit').parallel
, assert = require('assert')
;
var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
, expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ]
, expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ]
, target = []
;
parallel(source, asyncJob, function(err, result)
{
assert.deepEqual(result, expectedResult);
assert.deepEqual(target, expectedTarget);
});
// async job accepts one element from the array
// and a callback function
function asyncJob(item, cb)
{
// different delays (in ms) per item
var delay = item * 25;
// pretend different jobs take different time to finish
// and not in consequential order
var timeoutId = setTimeout(function() {
target.push(item);
cb(null, item * 2);
}, delay);
// allow to cancel "leftover" jobs upon error
// return function, invoking of which will abort this job
return clearTimeout.bind(null, timeoutId);
}
```
More examples could be found in [test/test-parallel-array.js](test/test-parallel-array.js).
#### Input Object
Also it supports named jobs, listed via object.
```javascript
var parallel = require('asynckit/parallel')
, assert = require('assert')
;
var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 }
, expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 }
, expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ]
, expectedKeys = [ 'first', 'one', 'two', 'four', 'eight', 'sixteen', 'thirtyTwo', 'sixtyFour' ]
, target = []
, keys = []
;
parallel(source, asyncJob, function(err, result)
{
assert.deepEqual(result, expectedResult);
assert.deepEqual(target, expectedTarget);
assert.deepEqual(keys, expectedKeys);
});
// supports full value, key, callback (shortcut) interface
function asyncJob(item, key, cb)
{
// different delays (in ms) per item
var delay = item * 25;
// pretend different jobs take different time to finish
// and not in consequential order
var timeoutId = setTimeout(function() {
keys.push(key);
target.push(item);
cb(null, item * 2);
}, delay);
// allow to cancel "leftover" jobs upon error
// return function, invoking of which will abort this job
return clearTimeout.bind(null, timeoutId);
}
```
More examples could be found in [test/test-parallel-object.js](test/test-parallel-object.js).
### Serial Jobs
Runs iterator over provided array sequentially. Stores output in the `result` array,
on the matching positions. In unlikely event of an error from one of the jobs,
will not proceed to the rest of the items in the list
and return error along with salvaged data to the main callback function.
#### Input Array
```javascript
var serial = require('asynckit/serial')
, assert = require('assert')
;
var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
, expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ]
, expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ]
, target = []
;
serial(source, asyncJob, function(err, result)
{
assert.deepEqual(result, expectedResult);
assert.deepEqual(target, expectedTarget);
});
// extended interface (item, key, callback)
// also supported for arrays
function asyncJob(item, key, cb)
{
target.push(key);
// it will be automatically made async
// even it iterator "returns" in the same event loop
cb(null, item * 2);
}
```
More examples could be found in [test/test-serial-array.js](test/test-serial-array.js).
#### Input Object
Also it supports named jobs, listed via object.
```javascript
var serial = require('asynckit').serial
, assert = require('assert')
;
var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
, expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ]
, expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ]
, target = []
;
var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 }
, expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 }
, expectedTarget = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
, target = []
;
serial(source, asyncJob, function(err, result)
{
assert.deepEqual(result, expectedResult);
assert.deepEqual(target, expectedTarget);
});
// shortcut interface (item, callback)
// works for object as well as for the arrays
function asyncJob(item, cb)
{
target.push(item);
// it will be automatically made async
// even it iterator "returns" in the same event loop
cb(null, item * 2);
}
```
More examples could be found in [test/test-serial-object.js](test/test-serial-object.js).
_Note: Since _object_ is an _unordered_ collection of properties,
it may produce unexpected results with sequential iterations.
Whenever order of the jobs' execution is important please use `serialOrdered` method._
### Ordered Serial Iterations
TBD
For example [compare-property](compare-property) package.
### Streaming interface
TBD
## Want to Know More?
More examples can be found in [test folder](test/).
Or open an [issue](https://github.com/alexindigo/asynckit/issues) with questions and/or suggestions.
## License
AsyncKit is licensed under the MIT license.

View File

@@ -1,76 +0,0 @@
/* eslint no-console: "off" */
var asynckit = require('./')
, async = require('async')
, assert = require('assert')
, expected = 0
;
var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;
var source = [];
for (var z = 1; z < 100; z++)
{
source.push(z);
expected += z;
}
suite
// add tests
.add('async.map', function(deferred)
{
var total = 0;
async.map(source,
function(i, cb)
{
setImmediate(function()
{
total += i;
cb(null, total);
});
},
function(err, result)
{
assert.ifError(err);
assert.equal(result[result.length - 1], expected);
deferred.resolve();
});
}, {'defer': true})
.add('asynckit.parallel', function(deferred)
{
var total = 0;
asynckit.parallel(source,
function(i, cb)
{
setImmediate(function()
{
total += i;
cb(null, total);
});
},
function(err, result)
{
assert.ifError(err);
assert.equal(result[result.length - 1], expected);
deferred.resolve();
});
}, {'defer': true})
// add listeners
.on('cycle', function(ev)
{
console.log(String(ev.target));
})
.on('complete', function()
{
console.log('Fastest is ' + this.filter('fastest').map('name'));
})
// run async
.run({ 'async': true });

View File

@@ -1,6 +0,0 @@
module.exports =
{
parallel : require('./parallel.js'),
serial : require('./serial.js'),
serialOrdered : require('./serialOrdered.js')
};

View File

@@ -1,29 +0,0 @@
// API
module.exports = abort;
/**
* Aborts leftover active jobs
*
* @param {object} state - current state object
*/
function abort(state)
{
Object.keys(state.jobs).forEach(clean.bind(state));
// reset leftover jobs
state.jobs = {};
}
/**
* Cleans up leftover job by invoking abort function for the provided job id
*
* @this state
* @param {string|number} key - job id to abort
*/
function clean(key)
{
if (typeof this.jobs[key] == 'function')
{
this.jobs[key]();
}
}

View File

@@ -1,34 +0,0 @@
var defer = require('./defer.js');
// API
module.exports = async;
/**
* Runs provided callback asynchronously
* even if callback itself is not
*
* @param {function} callback - callback to invoke
* @returns {function} - augmented callback
*/
function async(callback)
{
var isAsync = false;
// check if async happened
defer(function() { isAsync = true; });
return function async_callback(err, result)
{
if (isAsync)
{
callback(err, result);
}
else
{
defer(function nextTick_callback()
{
callback(err, result);
});
}
};
}

View File

@@ -1,26 +0,0 @@
module.exports = defer;
/**
* Runs provided function on next iteration of the event loop
*
* @param {function} fn - function to run
*/
function defer(fn)
{
var nextTick = typeof setImmediate == 'function'
? setImmediate
: (
typeof process == 'object' && typeof process.nextTick == 'function'
? process.nextTick
: null
);
if (nextTick)
{
nextTick(fn);
}
else
{
setTimeout(fn, 0);
}
}

View File

@@ -1,75 +0,0 @@
var async = require('./async.js')
, abort = require('./abort.js')
;
// API
module.exports = iterate;
/**
* Iterates over each job object
*
* @param {array|object} list - array or object (named list) to iterate over
* @param {function} iterator - iterator to run
* @param {object} state - current job status
* @param {function} callback - invoked when all elements processed
*/
function iterate(list, iterator, state, callback)
{
// store current index
var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;
state.jobs[key] = runJob(iterator, key, list[key], function(error, output)
{
// don't repeat yourself
// skip secondary callbacks
if (!(key in state.jobs))
{
return;
}
// clean up jobs
delete state.jobs[key];
if (error)
{
// don't process rest of the results
// stop still active jobs
// and reset the list
abort(state);
}
else
{
state.results[key] = output;
}
// return salvaged results
callback(error, state.results);
});
}
/**
* Runs iterator over provided job element
*
* @param {function} iterator - iterator to invoke
* @param {string|number} key - key/index of the element in the list of jobs
* @param {mixed} item - job description
* @param {function} callback - invoked after iterator is done with the job
* @returns {function|mixed} - job abort function or something else
*/
function runJob(iterator, key, item, callback)
{
var aborter;
// allow shortcut if iterator expects only two arguments
if (iterator.length == 2)
{
aborter = iterator(item, async(callback));
}
// otherwise go with full three arguments
else
{
aborter = iterator(item, key, async(callback));
}
return aborter;
}

View File

@@ -1,91 +0,0 @@
var streamify = require('./streamify.js')
, defer = require('./defer.js')
;
// API
module.exports = ReadableAsyncKit;
/**
* Base constructor for all streams
* used to hold properties/methods
*/
function ReadableAsyncKit()
{
ReadableAsyncKit.super_.apply(this, arguments);
// list of active jobs
this.jobs = {};
// add stream methods
this.destroy = destroy;
this._start = _start;
this._read = _read;
}
/**
* Destroys readable stream,
* by aborting outstanding jobs
*
* @returns {void}
*/
function destroy()
{
if (this.destroyed)
{
return;
}
this.destroyed = true;
if (typeof this.terminator == 'function')
{
this.terminator();
}
}
/**
* Starts provided jobs in async manner
*
* @private
*/
function _start()
{
// first argument runner function
var runner = arguments[0]
// take away first argument
, args = Array.prototype.slice.call(arguments, 1)
// second argument - input data
, input = args[0]
// last argument - result callback
, endCb = streamify.callback.call(this, args[args.length - 1])
;
args[args.length - 1] = endCb;
// third argument - iterator
args[1] = streamify.iterator.call(this, args[1]);
// allow time for proper setup
defer(function()
{
if (!this.destroyed)
{
this.terminator = runner.apply(null, args);
}
else
{
endCb(null, Array.isArray(input) ? [] : {});
}
}.bind(this));
}
/**
* Implement _read to comply with Readable streams
* Doesn't really make sense for flowing object mode
*
* @private
*/
function _read()
{
}

View File

@@ -1,25 +0,0 @@
var parallel = require('../parallel.js');
// API
module.exports = ReadableParallel;
/**
* Streaming wrapper to `asynckit.parallel`
*
* @param {array|object} list - array or object (named list) to iterate over
* @param {function} iterator - iterator to run
* @param {function} callback - invoked when all elements processed
* @returns {stream.Readable#}
*/
function ReadableParallel(list, iterator, callback)
{
if (!(this instanceof ReadableParallel))
{
return new ReadableParallel(list, iterator, callback);
}
// turn on object mode
ReadableParallel.super_.call(this, {objectMode: true});
this._start(parallel, list, iterator, callback);
}

View File

@@ -1,25 +0,0 @@
var serial = require('../serial.js');
// API
module.exports = ReadableSerial;
/**
* Streaming wrapper to `asynckit.serial`
*
* @param {array|object} list - array or object (named list) to iterate over
* @param {function} iterator - iterator to run
* @param {function} callback - invoked when all elements processed
* @returns {stream.Readable#}
*/
function ReadableSerial(list, iterator, callback)
{
if (!(this instanceof ReadableSerial))
{
return new ReadableSerial(list, iterator, callback);
}
// turn on object mode
ReadableSerial.super_.call(this, {objectMode: true});
this._start(serial, list, iterator, callback);
}

View File

@@ -1,29 +0,0 @@
var serialOrdered = require('../serialOrdered.js');
// API
module.exports = ReadableSerialOrdered;
// expose sort helpers
module.exports.ascending = serialOrdered.ascending;
module.exports.descending = serialOrdered.descending;
/**
* Streaming wrapper to `asynckit.serialOrdered`
*
* @param {array|object} list - array or object (named list) to iterate over
* @param {function} iterator - iterator to run
* @param {function} sortMethod - custom sort function
* @param {function} callback - invoked when all elements processed
* @returns {stream.Readable#}
*/
function ReadableSerialOrdered(list, iterator, sortMethod, callback)
{
if (!(this instanceof ReadableSerialOrdered))
{
return new ReadableSerialOrdered(list, iterator, sortMethod, callback);
}
// turn on object mode
ReadableSerialOrdered.super_.call(this, {objectMode: true});
this._start(serialOrdered, list, iterator, sortMethod, callback);
}

View File

@@ -1,37 +0,0 @@
// API
module.exports = state;
/**
* Creates initial state object
* for iteration over list
*
* @param {array|object} list - list to iterate over
* @param {function|null} sortMethod - function to use for keys sort,
* or `null` to keep them as is
* @returns {object} - initial state object
*/
function state(list, sortMethod)
{
var isNamedList = !Array.isArray(list)
, initState =
{
index : 0,
keyedList: isNamedList || sortMethod ? Object.keys(list) : null,
jobs : {},
results : isNamedList ? {} : [],
size : isNamedList ? Object.keys(list).length : list.length
}
;
if (sortMethod)
{
// sort array keys based on it's values
// sort object's keys just on own merit
initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)
{
return sortMethod(list[a], list[b]);
});
}
return initState;
}

View File

@@ -1,141 +0,0 @@
var async = require('./async.js');
// API
module.exports = {
iterator: wrapIterator,
callback: wrapCallback
};
/**
* Wraps iterators with long signature
*
* @this ReadableAsyncKit#
* @param {function} iterator - function to wrap
* @returns {function} - wrapped function
*/
function wrapIterator(iterator)
{
var stream = this;
return function(item, key, cb)
{
var aborter
, wrappedCb = async(wrapIteratorCallback.call(stream, cb, key))
;
stream.jobs[key] = wrappedCb;
// it's either shortcut (item, cb)
if (iterator.length == 2)
{
aborter = iterator(item, wrappedCb);
}
// or long format (item, key, cb)
else
{
aborter = iterator(item, key, wrappedCb);
}
return aborter;
};
}
/**
* Wraps provided callback function
* allowing to execute snitch function before
* real callback
*
* @this ReadableAsyncKit#
* @param {function} callback - function to wrap
* @returns {function} - wrapped function
*/
function wrapCallback(callback)
{
var stream = this;
var wrapped = function(error, result)
{
return finisher.call(stream, error, result, callback);
};
return wrapped;
}
/**
* Wraps provided iterator callback function
* makes sure snitch only called once,
* but passes secondary calls to the original callback
*
* @this ReadableAsyncKit#
* @param {function} callback - callback to wrap
* @param {number|string} key - iteration key
* @returns {function} wrapped callback
*/
function wrapIteratorCallback(callback, key)
{
var stream = this;
return function(error, output)
{
// don't repeat yourself
if (!(key in stream.jobs))
{
callback(error, output);
return;
}
// clean up jobs
delete stream.jobs[key];
return streamer.call(stream, error, {key: key, value: output}, callback);
};
}
/**
* Stream wrapper for iterator callback
*
* @this ReadableAsyncKit#
* @param {mixed} error - error response
* @param {mixed} output - iterator output
* @param {function} callback - callback that expects iterator results
*/
function streamer(error, output, callback)
{
if (error && !this.error)
{
this.error = error;
this.pause();
this.emit('error', error);
// send back value only, as expected
callback(error, output && output.value);
return;
}
// stream stuff
this.push(output);
// back to original track
// send back value only, as expected
callback(error, output && output.value);
}
/**
* Stream wrapper for finishing callback
*
* @this ReadableAsyncKit#
* @param {mixed} error - error response
* @param {mixed} output - iterator output
* @param {function} callback - callback that expects final results
*/
function finisher(error, output, callback)
{
// signal end of the stream
// only for successfully finished streams
if (!error)
{
this.push(null);
}
// back to original track
callback(error, output);
}

View File

@@ -1,29 +0,0 @@
var abort = require('./abort.js')
, async = require('./async.js')
;
// API
module.exports = terminator;
/**
* Terminates jobs in the attached state context
*
* @this AsyncKitState#
* @param {function} callback - final callback to invoke after termination
*/
function terminator(callback)
{
if (!Object.keys(this.jobs).length)
{
return;
}
// fast forward iteration index
this.index = this.size;
// abort jobs
abort(this);
// send back results we have so far
async(callback)(null, this.results);
}

View File

@@ -1,63 +0,0 @@
{
"name": "asynckit",
"version": "0.4.0",
"description": "Minimal async jobs utility library, with streams support",
"main": "index.js",
"scripts": {
"clean": "rimraf coverage",
"lint": "eslint *.js lib/*.js test/*.js",
"test": "istanbul cover --reporter=json tape -- 'test/test-*.js' | tap-spec",
"win-test": "tape test/test-*.js",
"browser": "browserify -t browserify-istanbul test/lib/browserify_adjustment.js test/test-*.js | obake --coverage | tap-spec",
"report": "istanbul report",
"size": "browserify index.js | size-table asynckit",
"debug": "tape test/test-*.js"
},
"pre-commit": [
"clean",
"lint",
"test",
"browser",
"report",
"size"
],
"repository": {
"type": "git",
"url": "git+https://github.com/alexindigo/asynckit.git"
},
"keywords": [
"async",
"jobs",
"parallel",
"serial",
"iterator",
"array",
"object",
"stream",
"destroy",
"terminate",
"abort"
],
"author": "Alex Indigo <iam@alexindigo.com>",
"license": "MIT",
"bugs": {
"url": "https://github.com/alexindigo/asynckit/issues"
},
"homepage": "https://github.com/alexindigo/asynckit#readme",
"devDependencies": {
"browserify": "^13.0.0",
"browserify-istanbul": "^2.0.0",
"coveralls": "^2.11.9",
"eslint": "^2.9.0",
"istanbul": "^0.4.3",
"obake": "^0.1.2",
"phantomjs-prebuilt": "^2.1.7",
"pre-commit": "^1.1.3",
"reamde": "^1.1.0",
"rimraf": "^2.5.2",
"size-table": "^0.2.0",
"tap-spec": "^4.1.1",
"tape": "^4.5.1"
},
"dependencies": {}
}

View File

@@ -1,43 +0,0 @@
var iterate = require('./lib/iterate.js')
, initState = require('./lib/state.js')
, terminator = require('./lib/terminator.js')
;
// Public API
module.exports = parallel;
/**
* Runs iterator over provided array elements in parallel
*
* @param {array|object} list - array or object (named list) to iterate over
* @param {function} iterator - iterator to run
* @param {function} callback - invoked when all elements processed
* @returns {function} - jobs terminator
*/
function parallel(list, iterator, callback)
{
var state = initState(list);
while (state.index < (state['keyedList'] || list).length)
{
iterate(list, iterator, state, function(error, result)
{
if (error)
{
callback(error, result);
return;
}
// looks like it's the last one
if (Object.keys(state.jobs).length === 0)
{
callback(null, state.results);
return;
}
});
state.index++;
}
return terminator.bind(state, callback);
}

View File

@@ -1,17 +0,0 @@
var serialOrdered = require('./serialOrdered.js');
// Public API
module.exports = serial;
/**
* Runs iterator over provided array elements in series
*
* @param {array|object} list - array or object (named list) to iterate over
* @param {function} iterator - iterator to run
* @param {function} callback - invoked when all elements processed
* @returns {function} - jobs terminator
*/
function serial(list, iterator, callback)
{
return serialOrdered(list, iterator, null, callback);
}

View File

@@ -1,75 +0,0 @@
var iterate = require('./lib/iterate.js')
, initState = require('./lib/state.js')
, terminator = require('./lib/terminator.js')
;
// Public API
module.exports = serialOrdered;
// sorting helpers
module.exports.ascending = ascending;
module.exports.descending = descending;
/**
* Runs iterator over provided sorted array elements in series
*
* @param {array|object} list - array or object (named list) to iterate over
* @param {function} iterator - iterator to run
* @param {function} sortMethod - custom sort function
* @param {function} callback - invoked when all elements processed
* @returns {function} - jobs terminator
*/
function serialOrdered(list, iterator, sortMethod, callback)
{
var state = initState(list, sortMethod);
iterate(list, iterator, state, function iteratorHandler(error, result)
{
if (error)
{
callback(error, result);
return;
}
state.index++;
// are we there yet?
if (state.index < (state['keyedList'] || list).length)
{
iterate(list, iterator, state, iteratorHandler);
return;
}
// done here
callback(null, state.results);
});
return terminator.bind(state, callback);
}
/*
* -- Sort methods
*/
/**
* sort helper to sort array elements in ascending order
*
* @param {mixed} a - an item to compare
* @param {mixed} b - an item to compare
* @returns {number} - comparison result
*/
function ascending(a, b)
{
return a < b ? -1 : a > b ? 1 : 0;
}
/**
* sort helper to sort array elements in descending order
*
* @param {mixed} a - an item to compare
* @param {mixed} b - an item to compare
* @returns {number} - comparison result
*/
function descending(a, b)
{
return -1 * ascending(a, b);
}

View File

@@ -1,21 +0,0 @@
var inherits = require('util').inherits
, Readable = require('stream').Readable
, ReadableAsyncKit = require('./lib/readable_asynckit.js')
, ReadableParallel = require('./lib/readable_parallel.js')
, ReadableSerial = require('./lib/readable_serial.js')
, ReadableSerialOrdered = require('./lib/readable_serial_ordered.js')
;
// API
module.exports =
{
parallel : ReadableParallel,
serial : ReadableSerial,
serialOrdered : ReadableSerialOrdered,
};
inherits(ReadableAsyncKit, Readable);
inherits(ReadableParallel, ReadableAsyncKit);
inherits(ReadableSerial, ReadableAsyncKit);
inherits(ReadableSerialOrdered, ReadableAsyncKit);

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +0,0 @@
# Copyright (c) 2014-present Matt Zabriskie & Collaborators
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -1,877 +0,0 @@
# Axios Migration Guide
> **Migrating from Axios 0.x to 1.x**
>
> This guide helps developers upgrade from Axios 0.x to 1.x by documenting breaking changes, providing migration strategies, and offering solutions to common upgrade challenges.
## Table of Contents
- [Overview](#overview)
- [Breaking Changes](#breaking-changes)
- [Error Handling Migration](#error-handling-migration)
- [API Changes](#api-changes)
- [Configuration Changes](#configuration-changes)
- [Migration Strategies](#migration-strategies)
- [Common Patterns](#common-patterns)
- [Troubleshooting](#troubleshooting)
- [Resources](#resources)
## Overview
Axios 1.x introduced several breaking changes to improve consistency, security, and developer experience. While these changes provide better error handling and more predictable behavior, they require code updates when migrating from 0.x versions.
### Key Changes Summary
| Area | 0.x Behavior | 1.x Behavior | Impact |
|------|--------------|--------------|--------|
| Error Handling | Selective throwing | Consistent throwing | High |
| JSON Parsing | Lenient | Strict | Medium |
| Browser Support | IE11+ | Modern browsers | Low-Medium |
| TypeScript | Partial | Full support | Low |
### Migration Complexity
- **Simple applications**: 1-2 hours
- **Medium applications**: 1-2 days
- **Large applications with complex error handling**: 3-5 days
## Breaking Changes
### 1. Error Handling Changes
**The most significant change in Axios 1.x is how errors are handled.**
#### 0.x Behavior
```javascript
// Axios 0.x - Some HTTP error codes didn't throw
axios.get('/api/data')
.then(response => {
// Response interceptor could handle all errors
console.log('Success:', response.data);
});
// Response interceptor handled everything
axios.interceptors.response.use(
response => response,
error => {
handleError(error);
// Error was "handled" and didn't propagate
}
);
```
#### 1.x Behavior
```javascript
// Axios 1.x - All HTTP errors throw consistently
axios.get('/api/data')
.then(response => {
console.log('Success:', response.data);
})
.catch(error => {
// Must handle errors at call site or they propagate
console.error('Request failed:', error);
});
// Response interceptor must re-throw or return rejected promise
axios.interceptors.response.use(
response => response,
error => {
handleError(error);
// Must explicitly handle propagation
return Promise.reject(error); // or throw error;
}
);
```
#### Impact
- **Response interceptors** can no longer "swallow" errors silently
- **Every API call** must handle errors explicitly or they become unhandled promise rejections
- **Centralized error handling** requires new patterns
### 2. JSON Parsing Changes
#### 0.x Behavior
```javascript
// Axios 0.x - Lenient JSON parsing
// Would attempt to parse even invalid JSON
response.data; // Might contain partial data or fallbacks
```
#### 1.x Behavior
```javascript
// Axios 1.x - Strict JSON parsing
// Throws clear errors for invalid JSON
try {
const data = response.data;
} catch (error) {
// Handle JSON parsing errors explicitly
}
```
### 3. Request/Response Transform Changes
#### 0.x Behavior
```javascript
// Implicit transformations with some edge cases
transformRequest: [function (data) {
// Less predictable behavior
return data;
}]
```
#### 1.x Behavior
```javascript
// More consistent transformation pipeline
transformRequest: [function (data, headers) {
// Headers parameter always available
// More predictable behavior
return data;
}]
```
### 4. Browser Support Changes
- **0.x**: Supported IE11 and older browsers
- **1.x**: Requires modern browsers with Promise support
- **Polyfills**: May be needed for older browser support
## Error Handling Migration
The error handling changes are the most complex part of migrating to Axios 1.x. Here are proven strategies:
### Strategy 1: Centralized Error Handling with Error Boundary
```javascript
// Create a centralized error handler
class ApiErrorHandler {
constructor() {
this.setupInterceptors();
}
setupInterceptors() {
axios.interceptors.response.use(
response => response,
error => {
// Centralized error processing
this.processError(error);
// Return a resolved promise with error info for handled errors
if (this.isHandledError(error)) {
return Promise.resolve({
data: null,
error: this.normalizeError(error),
handled: true
});
}
// Re-throw unhandled errors
return Promise.reject(error);
}
);
}
processError(error) {
// Log errors
console.error('API Error:', error);
// Show user notifications
if (error.response?.status === 401) {
this.handleAuthError();
} else if (error.response?.status >= 500) {
this.showErrorNotification('Server error occurred');
}
}
isHandledError(error) {
// Define which errors are "handled" centrally
const handledStatuses = [401, 403, 404, 422, 500, 502, 503];
return handledStatuses.includes(error.response?.status);
}
normalizeError(error) {
return {
status: error.response?.status,
message: error.response?.data?.message || error.message,
code: error.response?.data?.code || error.code
};
}
handleAuthError() {
// Redirect to login, clear tokens, etc.
localStorage.removeItem('token');
window.location.href = '/login';
}
showErrorNotification(message) {
// Show user-friendly error message
console.error(message); // Replace with your notification system
}
}
// Initialize globally
const errorHandler = new ApiErrorHandler();
// Usage in components/services
async function fetchUserData(userId) {
try {
const response = await axios.get(`/api/users/${userId}`);
// Check if error was handled centrally
if (response.handled) {
return { data: null, error: response.error };
}
return { data: response.data, error: null };
} catch (error) {
// Unhandled errors still need local handling
return { data: null, error: { message: 'Unexpected error occurred' } };
}
}
```
### Strategy 2: Wrapper Function Pattern
```javascript
// Create a wrapper that provides 0.x-like behavior
function createApiWrapper() {
const api = axios.create();
// Add response interceptor for centralized handling
api.interceptors.response.use(
response => response,
error => {
// Handle common errors centrally
if (error.response?.status === 401) {
// Handle auth errors
handleAuthError();
}
if (error.response?.status >= 500) {
// Handle server errors
showServerErrorNotification();
}
// Always reject to maintain error propagation
return Promise.reject(error);
}
);
// Wrapper function that mimics 0.x behavior
function safeRequest(requestConfig, options = {}) {
return api(requestConfig)
.then(response => response)
.catch(error => {
if (options.suppressErrors) {
// Return error info instead of throwing
return {
data: null,
error: {
status: error.response?.status,
message: error.response?.data?.message || error.message
}
};
}
throw error;
});
}
return { safeRequest, axios: api };
}
// Usage
const { safeRequest } = createApiWrapper();
// For calls where you want centralized error handling
const result = await safeRequest(
{ method: 'get', url: '/api/data' },
{ suppressErrors: true }
);
if (result.error) {
// Handle error case
console.log('Request failed:', result.error.message);
} else {
// Handle success case
console.log('Data:', result.data);
}
```
### Strategy 3: Global Error Handler with Custom Events
```javascript
// Set up global error handling with events
class GlobalErrorHandler extends EventTarget {
constructor() {
super();
this.setupInterceptors();
}
setupInterceptors() {
axios.interceptors.response.use(
response => response,
error => {
// Emit custom event for global handling
this.dispatchEvent(new CustomEvent('apiError', {
detail: { error, timestamp: new Date() }
}));
// Always reject to maintain proper error flow
return Promise.reject(error);
}
);
}
}
const globalErrorHandler = new GlobalErrorHandler();
// Set up global listeners
globalErrorHandler.addEventListener('apiError', (event) => {
const { error } = event.detail;
// Centralized error logic
if (error.response?.status === 401) {
handleAuthError();
}
if (error.response?.status >= 500) {
showErrorNotification('Server error occurred');
}
});
// Usage remains clean
async function apiCall() {
try {
const response = await axios.get('/api/data');
return response.data;
} catch (error) {
// Error was already handled globally
// Just handle component-specific logic
return null;
}
}
```
## API Changes
### Request Configuration
#### 0.x to 1.x Changes
```javascript
// 0.x - Some properties had different defaults
const config = {
timeout: 0, // No timeout by default
maxContentLength: -1, // No limit
};
// 1.x - More secure defaults
const config = {
timeout: 0, // Still no timeout, but easier to configure
maxContentLength: 2000, // Default limit for security
maxBodyLength: 2000, // New property
};
```
### Response Object
The response object structure remains largely the same, but error responses are more consistent:
```javascript
// Both 0.x and 1.x
response = {
data: {}, // Response body
status: 200, // HTTP status
statusText: 'OK', // HTTP status message
headers: {}, // Response headers
config: {}, // Request config
request: {} // Request object
};
// Error responses are more consistent in 1.x
error.response = {
data: {}, // Error response body
status: 404, // HTTP error status
statusText: 'Not Found',
headers: {},
config: {},
request: {}
};
```
## Configuration Changes
### Default Configuration Updates
```javascript
// 0.x defaults
axios.defaults.timeout = 0; // No timeout
axios.defaults.maxContentLength = -1; // No limit
// 1.x defaults (more secure)
axios.defaults.timeout = 0; // Still no timeout
axios.defaults.maxContentLength = 2000; // 2MB limit
axios.defaults.maxBodyLength = 2000; // 2MB limit
```
### Instance Configuration
```javascript
// 0.x - Instance creation
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 1000,
});
// 1.x - Same API, but more options available
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 1000,
maxBodyLength: Infinity, // Override default if needed
maxContentLength: Infinity,
});
```
## Migration Strategies
### Step-by-Step Migration Process
#### Phase 1: Preparation
1. **Audit Current Error Handling**
```bash
# Find all axios usage
grep -r "axios\." src/
grep -r "\.catch" src/
grep -r "interceptors" src/
```
2. **Identify Patterns**
- Response interceptors that handle errors
- Components that rely on centralized error handling
- Authentication and retry logic
3. **Create Test Cases**
```javascript
// Test current error handling behavior
describe('Error Handling Migration', () => {
it('should handle 401 errors consistently', async () => {
// Test authentication error flows
});
it('should handle 500 errors with user feedback', async () => {
// Test server error handling
});
});
```
#### Phase 2: Implementation
1. **Update Dependencies**
```bash
npm update axios
```
2. **Implement New Error Handling**
- Choose one of the strategies above
- Update response interceptors
- Add error handling to API calls
3. **Update Authentication Logic**
```javascript
// 0.x pattern
axios.interceptors.response.use(null, error => {
if (error.response?.status === 401) {
logout();
// Error was "handled"
}
});
// 1.x pattern
axios.interceptors.response.use(
response => response,
error => {
if (error.response?.status === 401) {
logout();
}
return Promise.reject(error); // Always propagate
}
);
```
#### Phase 3: Testing and Validation
1. **Test Error Scenarios**
- Network failures
- HTTP error codes (401, 403, 404, 500, etc.)
- Timeout errors
- JSON parsing errors
2. **Validate User Experience**
- Error messages are shown appropriately
- Authentication redirects work
- Loading states are handled correctly
### Gradual Migration Approach
For large applications, consider gradual migration:
```javascript
// Create a compatibility layer
const axiosCompat = {
// Use new axios instance for new code
v1: axios.create({
// 1.x configuration
}),
// Wrapper for legacy code
legacy: createLegacyWrapper(axios.create({
// Configuration that mimics 0.x behavior
}))
};
function createLegacyWrapper(axiosInstance) {
// Add interceptors that provide 0.x-like behavior
axiosInstance.interceptors.response.use(
response => response,
error => {
// Handle errors in 0.x style for legacy code
handleLegacyError(error);
// Don't propagate certain errors
if (shouldSuppressError(error)) {
return Promise.resolve({ data: null, error: true });
}
return Promise.reject(error);
}
);
return axiosInstance;
}
```
## Common Patterns
### Authentication Interceptors
#### Updated Authentication Pattern
```javascript
// Token refresh interceptor for 1.x
let isRefreshing = false;
let refreshSubscribers = [];
function subscribeTokenRefresh(cb) {
refreshSubscribers.push(cb);
}
function onTokenRefreshed(token) {
refreshSubscribers.forEach(cb => cb(token));
refreshSubscribers = [];
}
axios.interceptors.response.use(
response => response,
async error => {
const originalRequest = error.config;
if (error.response?.status === 401 && !originalRequest._retry) {
if (isRefreshing) {
// Wait for token refresh
return new Promise(resolve => {
subscribeTokenRefresh(token => {
originalRequest.headers.Authorization = `Bearer ${token}`;
resolve(axios(originalRequest));
});
});
}
originalRequest._retry = true;
isRefreshing = true;
try {
const newToken = await refreshToken();
onTokenRefreshed(newToken);
isRefreshing = false;
originalRequest.headers.Authorization = `Bearer ${newToken}`;
return axios(originalRequest);
} catch (refreshError) {
isRefreshing = false;
logout();
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
```
### Retry Logic
```javascript
// Retry interceptor for 1.x
function createRetryInterceptor(maxRetries = 3, retryDelay = 1000) {
return axios.interceptors.response.use(
response => response,
async error => {
const config = error.config;
if (!config || !config.retry) {
return Promise.reject(error);
}
config.__retryCount = config.__retryCount || 0;
if (config.__retryCount >= maxRetries) {
return Promise.reject(error);
}
config.__retryCount += 1;
// Exponential backoff
const delay = retryDelay * Math.pow(2, config.__retryCount - 1);
await new Promise(resolve => setTimeout(resolve, delay));
return axios(config);
}
);
}
// Usage
const api = axios.create();
createRetryInterceptor(3, 1000);
// Make request with retry
api.get('/api/data', { retry: true });
```
### Loading State Management
```javascript
// Loading interceptor for 1.x
class LoadingManager {
constructor() {
this.requests = new Set();
this.setupInterceptors();
}
setupInterceptors() {
axios.interceptors.request.use(config => {
this.requests.add(config);
this.updateLoadingState();
return config;
});
axios.interceptors.response.use(
response => {
this.requests.delete(response.config);
this.updateLoadingState();
return response;
},
error => {
this.requests.delete(error.config);
this.updateLoadingState();
return Promise.reject(error);
}
);
}
updateLoadingState() {
const isLoading = this.requests.size > 0;
// Update your loading UI
document.body.classList.toggle('loading', isLoading);
}
}
const loadingManager = new LoadingManager();
```
## Troubleshooting
### Common Migration Issues
#### Issue 1: Unhandled Promise Rejections
**Problem:**
```javascript
// This pattern worked in 0.x but causes unhandled rejections in 1.x
axios.get('/api/data'); // No .catch() handler
```
**Solution:**
```javascript
// Always handle promises
axios.get('/api/data')
.catch(error => {
// Handle error appropriately
console.error('Request failed:', error.message);
});
// Or use async/await with try/catch
async function fetchData() {
try {
const response = await axios.get('/api/data');
return response.data;
} catch (error) {
console.error('Request failed:', error.message);
return null;
}
}
```
#### Issue 2: Response Interceptors Not "Handling" Errors
**Problem:**
```javascript
// 0.x style - interceptor "handled" errors
axios.interceptors.response.use(null, error => {
showErrorMessage(error.message);
// Error was considered "handled"
});
```
**Solution:**
```javascript
// 1.x style - explicitly control error propagation
axios.interceptors.response.use(
response => response,
error => {
showErrorMessage(error.message);
// Choose whether to propagate the error
if (shouldPropagateError(error)) {
return Promise.reject(error);
}
// Return success-like response for "handled" errors
return Promise.resolve({
data: null,
handled: true,
error: normalizeError(error)
});
}
);
```
#### Issue 3: JSON Parsing Errors
**Problem:**
```javascript
// 1.x is stricter about JSON parsing
// This might throw where 0.x was lenient
const data = response.data;
```
**Solution:**
```javascript
// Add response transformer for better error handling
axios.defaults.transformResponse = [
function (data) {
if (typeof data === 'string') {
try {
return JSON.parse(data);
} catch (e) {
// Handle JSON parsing errors gracefully
console.warn('Invalid JSON response:', data);
return { error: 'Invalid JSON', rawData: data };
}
}
return data;
}
];
```
#### Issue 4: TypeScript Errors After Upgrade
**Problem:**
```typescript
// TypeScript errors after upgrade
const response = await axios.get('/api/data');
// Property 'someProperty' does not exist on type 'any'
```
**Solution:**
```typescript
// Define proper interfaces
interface ApiResponse {
data: any;
message: string;
success: boolean;
}
const response = await axios.get<ApiResponse>('/api/data');
// Now properly typed
console.log(response.data.data);
```
### Debug Migration Issues
#### Enable Debug Logging
```javascript
// Add request/response logging
axios.interceptors.request.use(config => {
console.log('Request:', config);
return config;
});
axios.interceptors.response.use(
response => {
console.log('Response:', response);
return response;
},
error => {
console.log('Error:', error);
return Promise.reject(error);
}
);
```
#### Compare Behavior
```javascript
// Create side-by-side comparison during migration
const axios0x = require('axios-0x'); // Keep old version for testing
const axios1x = require('axios');
async function compareRequests(config) {
try {
const [result0x, result1x] = await Promise.allSettled([
axios0x(config),
axios1x(config)
]);
console.log('0.x result:', result0x);
console.log('1.x result:', result1x);
} catch (error) {
console.log('Comparison error:', error);
}
}
```
## Resources
### Official Documentation
- [Axios 1.x Documentation](https://axios-http.com/)
- [Axios GitHub Repository](https://github.com/axios/axios)
- [Axios Changelog](https://github.com/axios/axios/blob/main/CHANGELOG.md)
### Migration Tools
- [Axios Migration Codemod](https://github.com/axios/axios-migration-codemod) *(if available)*
- [ESLint Rules for Axios 1.x](https://github.com/axios/eslint-plugin-axios) *(if available)*
### Community Resources
- [Stack Overflow - Axios Migration Questions](https://stackoverflow.com/questions/tagged/axios+migration)
- [GitHub Discussions](https://github.com/axios/axios/discussions)
- [Axios Discord Community](https://discord.gg/axios) *(if available)*
### Related Issues
- [Error Handling Changes Discussion](https://github.com/axios/axios/issues/7208)
- [Migration Guide Request](https://github.com/axios/axios/issues/xxxx) *(link to related issues)*
---
## Need Help?
If you encounter issues during migration that aren't covered in this guide:
1. **Search existing issues** in the [Axios GitHub repository](https://github.com/axios/axios/issues)
2. **Ask questions** in [GitHub Discussions](https://github.com/axios/axios/discussions)
3. **Contribute improvements** to this migration guide
---
*This migration guide is maintained by the community. If you find errors or have suggestions, please [open an issue](https://github.com/axios/axios/issues) or submit a pull request.*

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,715 +0,0 @@
type MethodsHeaders = Partial<
{
[Key in axios.Method as Lowercase<Key>]: AxiosHeaders;
} & { common: AxiosHeaders }
>;
type AxiosHeaderMatcher =
| string
| RegExp
| ((this: AxiosHeaders, value: string, name: string) => boolean);
type AxiosHeaderParser = (this: AxiosHeaders, value: axios.AxiosHeaderValue, header: string) => any;
type CommonRequestHeadersList =
| 'Accept'
| 'Content-Length'
| 'User-Agent'
| 'Content-Encoding'
| 'Authorization'
| 'Location';
type ContentType =
| axios.AxiosHeaderValue
| 'text/html'
| 'text/plain'
| 'multipart/form-data'
| 'application/json'
| 'application/x-www-form-urlencoded'
| 'application/octet-stream';
type CommonResponseHeadersList =
| 'Server'
| 'Content-Type'
| 'Content-Length'
| 'Cache-Control'
| 'Content-Encoding';
type CommonResponseHeaderKey = CommonResponseHeadersList | Lowercase<CommonResponseHeadersList>;
type BrowserProgressEvent = any;
declare class AxiosHeaders {
constructor(headers?: axios.RawAxiosHeaders | AxiosHeaders | string);
[key: string]: any;
set(
headerName?: string,
value?: axios.AxiosHeaderValue,
rewrite?: boolean | AxiosHeaderMatcher
): AxiosHeaders;
set(headers?: axios.RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders;
get(headerName: string, parser: RegExp): RegExpExecArray | null;
get(headerName: string, matcher?: true | AxiosHeaderParser): axios.AxiosHeaderValue;
has(header: string, matcher?: AxiosHeaderMatcher): boolean;
delete(header: string | string[], matcher?: AxiosHeaderMatcher): boolean;
clear(matcher?: AxiosHeaderMatcher): boolean;
normalize(format: boolean): AxiosHeaders;
concat(
...targets: Array<AxiosHeaders | axios.RawAxiosHeaders | string | undefined | null>
): AxiosHeaders;
toJSON(asStrings?: boolean): axios.RawAxiosHeaders;
static from(thing?: AxiosHeaders | axios.RawAxiosHeaders | string): AxiosHeaders;
static accessor(header: string | string[]): AxiosHeaders;
static concat(
...targets: Array<AxiosHeaders | axios.RawAxiosHeaders | string | undefined | null>
): AxiosHeaders;
setContentType(value: ContentType, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getContentType(parser?: RegExp): RegExpExecArray | null;
getContentType(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasContentType(matcher?: AxiosHeaderMatcher): boolean;
setContentLength(
value: axios.AxiosHeaderValue,
rewrite?: boolean | AxiosHeaderMatcher
): AxiosHeaders;
getContentLength(parser?: RegExp): RegExpExecArray | null;
getContentLength(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasContentLength(matcher?: AxiosHeaderMatcher): boolean;
setAccept(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getAccept(parser?: RegExp): RegExpExecArray | null;
getAccept(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasAccept(matcher?: AxiosHeaderMatcher): boolean;
setUserAgent(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getUserAgent(parser?: RegExp): RegExpExecArray | null;
getUserAgent(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasUserAgent(matcher?: AxiosHeaderMatcher): boolean;
setContentEncoding(
value: axios.AxiosHeaderValue,
rewrite?: boolean | AxiosHeaderMatcher
): AxiosHeaders;
getContentEncoding(parser?: RegExp): RegExpExecArray | null;
getContentEncoding(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasContentEncoding(matcher?: AxiosHeaderMatcher): boolean;
setAuthorization(
value: axios.AxiosHeaderValue,
rewrite?: boolean | AxiosHeaderMatcher
): AxiosHeaders;
getAuthorization(parser?: RegExp): RegExpExecArray | null;
getAuthorization(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasAuthorization(matcher?: AxiosHeaderMatcher): boolean;
getSetCookie(): string[];
[Symbol.iterator](): IterableIterator<[string, axios.AxiosHeaderValue]>;
}
declare class AxiosError<T = unknown, D = any> extends Error {
constructor(
message?: string,
code?: string,
config?: axios.InternalAxiosRequestConfig<D>,
request?: any,
response?: axios.AxiosResponse<T, D>
);
config?: axios.InternalAxiosRequestConfig<D>;
code?: string;
request?: any;
response?: axios.AxiosResponse<T, D>;
isAxiosError: boolean;
status?: number;
toJSON: () => object;
cause?: Error;
event?: BrowserProgressEvent;
static from<T = unknown, D = any>(
error: Error | unknown,
code?: string,
config?: axios.InternalAxiosRequestConfig<D>,
request?: any,
response?: axios.AxiosResponse<T, D>,
customProps?: object
): AxiosError<T, D>;
static readonly ERR_FR_TOO_MANY_REDIRECTS = 'ERR_FR_TOO_MANY_REDIRECTS';
static readonly ERR_BAD_OPTION_VALUE = 'ERR_BAD_OPTION_VALUE';
static readonly ERR_BAD_OPTION = 'ERR_BAD_OPTION';
static readonly ERR_NETWORK = 'ERR_NETWORK';
static readonly ERR_DEPRECATED = 'ERR_DEPRECATED';
static readonly ERR_BAD_RESPONSE = 'ERR_BAD_RESPONSE';
static readonly ERR_BAD_REQUEST = 'ERR_BAD_REQUEST';
static readonly ERR_NOT_SUPPORT = 'ERR_NOT_SUPPORT';
static readonly ERR_INVALID_URL = 'ERR_INVALID_URL';
static readonly ERR_CANCELED = 'ERR_CANCELED';
static readonly ERR_FORM_DATA_DEPTH_EXCEEDED = 'ERR_FORM_DATA_DEPTH_EXCEEDED';
static readonly ECONNABORTED = 'ECONNABORTED';
static readonly ECONNREFUSED = 'ECONNREFUSED';
static readonly ETIMEDOUT = 'ETIMEDOUT';
}
declare class CanceledError<T> extends AxiosError<T> {}
declare class Axios {
constructor(config?: axios.AxiosRequestConfig);
defaults: axios.AxiosDefaults;
interceptors: {
request: axios.AxiosInterceptorManager<axios.InternalAxiosRequestConfig>;
response: axios.AxiosInterceptorManager<axios.AxiosResponse>;
};
getUri(config?: axios.AxiosRequestConfig): string;
request<T = any, R = axios.AxiosResponse<T>, D = any>(
config: axios.AxiosRequestConfig<D>
): Promise<R>;
get<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
delete<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
head<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
options<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
post<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
put<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
patch<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
postForm<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
putForm<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
patchForm<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
query<T = any, R = axios.AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: axios.AxiosRequestConfig<D>
): Promise<R>;
}
declare enum HttpStatusCode {
Continue = 100,
SwitchingProtocols = 101,
Processing = 102,
EarlyHints = 103,
Ok = 200,
Created = 201,
Accepted = 202,
NonAuthoritativeInformation = 203,
NoContent = 204,
ResetContent = 205,
PartialContent = 206,
MultiStatus = 207,
AlreadyReported = 208,
ImUsed = 226,
MultipleChoices = 300,
MovedPermanently = 301,
Found = 302,
SeeOther = 303,
NotModified = 304,
UseProxy = 305,
Unused = 306,
TemporaryRedirect = 307,
PermanentRedirect = 308,
BadRequest = 400,
Unauthorized = 401,
PaymentRequired = 402,
Forbidden = 403,
NotFound = 404,
MethodNotAllowed = 405,
NotAcceptable = 406,
ProxyAuthenticationRequired = 407,
RequestTimeout = 408,
Conflict = 409,
Gone = 410,
LengthRequired = 411,
PreconditionFailed = 412,
PayloadTooLarge = 413,
UriTooLong = 414,
UnsupportedMediaType = 415,
RangeNotSatisfiable = 416,
ExpectationFailed = 417,
ImATeapot = 418,
MisdirectedRequest = 421,
UnprocessableEntity = 422,
Locked = 423,
FailedDependency = 424,
TooEarly = 425,
UpgradeRequired = 426,
PreconditionRequired = 428,
TooManyRequests = 429,
RequestHeaderFieldsTooLarge = 431,
UnavailableForLegalReasons = 451,
InternalServerError = 500,
NotImplemented = 501,
BadGateway = 502,
ServiceUnavailable = 503,
GatewayTimeout = 504,
HttpVersionNotSupported = 505,
VariantAlsoNegotiates = 506,
InsufficientStorage = 507,
LoopDetected = 508,
NotExtended = 510,
NetworkAuthenticationRequired = 511,
}
type InternalAxiosError<T = unknown, D = any> = AxiosError<T, D>;
declare namespace axios {
type AxiosError<T = unknown, D = any> = InternalAxiosError<T, D>;
interface RawAxiosHeaders {
[key: string]: AxiosHeaderValue;
}
type RawAxiosRequestHeaders = Partial<
RawAxiosHeaders & {
[Key in CommonRequestHeadersList]: AxiosHeaderValue;
} & {
'Content-Type': ContentType;
}
>;
type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders;
type AxiosHeaderValue = AxiosHeaders | string | string[] | number | boolean | null;
type RawCommonResponseHeaders = {
[Key in CommonResponseHeaderKey]: AxiosHeaderValue;
} & {
'set-cookie': string[];
};
type RawAxiosResponseHeaders = Partial<RawAxiosHeaders & RawCommonResponseHeaders>;
type AxiosResponseHeaders = RawAxiosResponseHeaders & AxiosHeaders;
interface AxiosRequestTransformer {
(this: InternalAxiosRequestConfig, data: any, headers: AxiosRequestHeaders): any;
}
interface AxiosResponseTransformer {
(
this: InternalAxiosRequestConfig,
data: any,
headers: AxiosResponseHeaders,
status?: number
): any;
}
interface AxiosAdapter {
(config: InternalAxiosRequestConfig): AxiosPromise;
}
interface AxiosBasicCredentials {
username: string;
password: string;
}
interface AxiosProxyConfig {
host: string;
port: number;
auth?: AxiosBasicCredentials;
protocol?: string;
}
type UppercaseMethod =
| 'GET'
| 'DELETE'
| 'HEAD'
| 'OPTIONS'
| 'POST'
| 'PUT'
| 'PATCH'
| 'PURGE'
| 'LINK'
| 'UNLINK'
| 'QUERY';
type Method = (UppercaseMethod | Lowercase<UppercaseMethod>) & {};
type ResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream' | 'formdata';
type UppercaseResponseEncoding =
| 'ASCII'
| 'ANSI'
| 'BINARY'
| 'BASE64'
| 'BASE64URL'
| 'HEX'
| 'LATIN1'
| 'UCS-2'
| 'UCS2'
| 'UTF-8'
| 'UTF8'
| 'UTF16LE';
type responseEncoding = (UppercaseResponseEncoding | Lowercase<UppercaseResponseEncoding>) & {};
interface TransitionalOptions {
silentJSONParsing?: boolean;
forcedJSONParsing?: boolean;
clarifyTimeoutError?: boolean;
legacyInterceptorReqResOrdering?: boolean;
}
interface GenericAbortSignal {
readonly aborted: boolean;
onabort?: ((...args: any) => any) | null;
addEventListener?: (...args: any) => any;
removeEventListener?: (...args: any) => any;
}
interface FormDataVisitorHelpers {
defaultVisitor: SerializerVisitor;
convertValue: (value: any) => any;
isVisitable: (value: any) => boolean;
}
interface SerializerVisitor {
(
this: GenericFormData,
value: any,
key: string | number,
path: null | Array<string | number>,
helpers: FormDataVisitorHelpers
): boolean;
}
interface SerializerOptions {
visitor?: SerializerVisitor;
dots?: boolean;
metaTokens?: boolean;
indexes?: boolean | null;
}
// tslint:disable-next-line
interface FormSerializerOptions extends SerializerOptions {}
interface ParamEncoder {
(value: any, defaultEncoder: (value: any) => any): any;
}
interface CustomParamsSerializer {
(params: Record<string, any>, options?: ParamsSerializerOptions): string;
}
interface ParamsSerializerOptions extends SerializerOptions {
encode?: ParamEncoder;
serialize?: CustomParamsSerializer;
}
type MaxUploadRate = number;
type MaxDownloadRate = number;
interface AxiosProgressEvent {
loaded: number;
total?: number;
progress?: number;
bytes: number;
rate?: number;
estimated?: number;
upload?: boolean;
download?: boolean;
event?: BrowserProgressEvent;
lengthComputable: boolean;
}
type Milliseconds = number;
type AxiosAdapterName = 'fetch' | 'xhr' | 'http' | (string & {});
type AxiosAdapterConfig = AxiosAdapter | AxiosAdapterName;
type AddressFamily = 4 | 6 | undefined;
interface LookupAddressEntry {
address: string;
family?: AddressFamily;
}
type LookupAddress = string | LookupAddressEntry;
interface AxiosRequestConfig<D = any> {
url?: string;
method?: Method | string;
baseURL?: string;
allowAbsoluteUrls?: boolean;
transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[];
transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[];
headers?: (RawAxiosRequestHeaders & MethodsHeaders) | AxiosHeaders;
params?: any;
paramsSerializer?: ParamsSerializerOptions | CustomParamsSerializer;
data?: D;
timeout?: Milliseconds;
timeoutErrorMessage?: string;
withCredentials?: boolean;
adapter?: AxiosAdapterConfig | AxiosAdapterConfig[];
auth?: AxiosBasicCredentials;
responseType?: ResponseType;
responseEncoding?: responseEncoding | string;
xsrfCookieName?: string;
xsrfHeaderName?: string;
onUploadProgress?: (progressEvent: AxiosProgressEvent) => void;
onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void;
maxContentLength?: number;
validateStatus?: ((status: number) => boolean) | null;
maxBodyLength?: number;
maxRedirects?: number;
maxRate?: number | [MaxUploadRate, MaxDownloadRate];
beforeRedirect?: (
options: Record<string, any>,
responseDetails: { headers: Record<string, string>; statusCode: HttpStatusCode },
requestDetails: { headers: Record<string, string>; url: string; method: string },
) => void;
socketPath?: string | null;
allowedSocketPaths?: string | string[] | null;
transport?: any;
httpAgent?: any;
httpsAgent?: any;
proxy?: AxiosProxyConfig | false;
cancelToken?: CancelToken | undefined;
decompress?: boolean;
transitional?: TransitionalOptions;
signal?: GenericAbortSignal;
insecureHTTPParser?: boolean;
env?: {
FormData?: new (...args: any[]) => object;
fetch?: (input: URL | Request | string, init?: RequestInit) => Promise<Response>;
Request?: new (input: URL | Request | string, init?: RequestInit) => Request;
Response?: new (
body?: ArrayBuffer | ArrayBufferView | Blob | FormData | URLSearchParams | string | null,
init?: ResponseInit
) => Response;
};
formSerializer?: FormSerializerOptions;
family?: AddressFamily;
lookup?:
| ((
hostname: string,
options: object,
cb: (
err: Error | null,
address: LookupAddress | LookupAddress[],
family?: AddressFamily
) => void
) => void)
| ((
hostname: string,
options: object
) => Promise<
| [address: LookupAddressEntry | LookupAddressEntry[], family?: AddressFamily]
| LookupAddress
>);
withXSRFToken?: boolean | ((config: InternalAxiosRequestConfig) => boolean | undefined);
parseReviver?: (this: any, key: string, value: any, context?: { source?: string }) => any;
fetchOptions?:
| Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'>
| Record<string, any>;
httpVersion?: 1 | 2;
http2Options?: Record<string, any> & {
sessionTimeout?: number;
};
formDataHeaderPolicy?: 'legacy' | 'content-only';
redact?: string[];
}
// Alias
type RawAxiosRequestConfig<D = any> = AxiosRequestConfig<D>;
interface InternalAxiosRequestConfig<D = any> extends AxiosRequestConfig<D> {
headers: AxiosRequestHeaders;
}
interface HeadersDefaults {
common: RawAxiosRequestHeaders;
delete: RawAxiosRequestHeaders;
get: RawAxiosRequestHeaders;
head: RawAxiosRequestHeaders;
post: RawAxiosRequestHeaders;
put: RawAxiosRequestHeaders;
patch: RawAxiosRequestHeaders;
options?: RawAxiosRequestHeaders;
purge?: RawAxiosRequestHeaders;
link?: RawAxiosRequestHeaders;
unlink?: RawAxiosRequestHeaders;
query?: RawAxiosRequestHeaders;
}
interface AxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
headers: HeadersDefaults;
}
interface CreateAxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
headers?: RawAxiosRequestHeaders | AxiosHeaders | Partial<HeadersDefaults>;
}
interface AxiosResponse<T = any, D = any, H = {}> {
data: T;
status: number;
statusText: string;
headers: (H & RawAxiosResponseHeaders) | AxiosResponseHeaders;
config: InternalAxiosRequestConfig<D>;
request?: any;
}
type AxiosPromise<T = any> = Promise<AxiosResponse<T>>;
interface CancelStatic {
new (message?: string): Cancel;
}
interface Cancel {
message: string | undefined;
}
interface Canceler {
(message?: string, config?: AxiosRequestConfig, request?: any): void;
}
interface CancelTokenStatic {
new (executor: (cancel: Canceler) => void): CancelToken;
source(): CancelTokenSource;
}
interface CancelToken {
promise: Promise<Cancel>;
reason?: Cancel;
throwIfRequested(): void;
}
interface CancelTokenSource {
token: CancelToken;
cancel: Canceler;
}
interface AxiosInterceptorOptions {
synchronous?: boolean;
runWhen?: ((config: InternalAxiosRequestConfig) => boolean) | null;
}
type AxiosInterceptorFulfilled<T> = (value: T) => T | Promise<T>;
type AxiosInterceptorRejected = (error: any) => any;
type AxiosRequestInterceptorUse<T> = (
onFulfilled?: AxiosInterceptorFulfilled<T> | null,
onRejected?: AxiosInterceptorRejected | null,
options?: AxiosInterceptorOptions
) => number;
type AxiosResponseInterceptorUse<T> = (
onFulfilled?: AxiosInterceptorFulfilled<T> | null,
onRejected?: AxiosInterceptorRejected | null
) => number;
interface AxiosInterceptorHandler<T> {
fulfilled: AxiosInterceptorFulfilled<T>;
rejected?: AxiosInterceptorRejected;
synchronous: boolean;
runWhen?: ((config: InternalAxiosRequestConfig) => boolean) | null;
}
interface AxiosInterceptorManager<V> {
use: V extends AxiosResponse ? AxiosResponseInterceptorUse<V> : AxiosRequestInterceptorUse<V>;
eject(id: number): void;
clear(): void;
handlers?: Array<AxiosInterceptorHandler<V>>;
}
interface AxiosInstance extends Axios {
<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>;
<T = any, R = AxiosResponse<T>, D = any>(
url: string,
config?: AxiosRequestConfig<D>
): Promise<R>;
create(config?: CreateAxiosDefaults): AxiosInstance;
defaults: Omit<AxiosDefaults, 'headers'> & {
headers: HeadersDefaults & {
[key: string]: AxiosHeaderValue;
};
};
}
interface GenericFormData {
append(name: string, value: any, options?: any): any;
}
interface GenericHTMLFormElement {
name: string;
method: string;
submit(): void;
}
interface AxiosStatic extends AxiosInstance {
Cancel: CancelStatic;
CancelToken: CancelTokenStatic;
Axios: typeof Axios;
AxiosError: typeof AxiosError;
CanceledError: typeof CanceledError;
HttpStatusCode: typeof HttpStatusCode;
readonly VERSION: string;
isCancel(value: any): value is Cancel;
all<T>(values: Array<T | Promise<T>>): Promise<T[]>;
spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>;
toFormData(
sourceObj: object,
targetFormData?: GenericFormData,
options?: FormSerializerOptions
): GenericFormData;
formToJSON(form: GenericFormData | GenericHTMLFormElement): object;
getAdapter(adapters: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined): AxiosAdapter;
AxiosHeaders: typeof AxiosHeaders;
mergeConfig<D = any>(
config1: AxiosRequestConfig<D>,
config2: AxiosRequestConfig<D>
): AxiosRequestConfig<D>;
}
}
declare const axios: axios.AxiosStatic;
export = axios;

View File

@@ -1,734 +0,0 @@
// TypeScript Version: 4.7
type StringLiteralsOrString<Literals extends string> = Literals | (string & {});
export type AxiosHeaderValue = AxiosHeaders | string | string[] | number | boolean | null;
export interface RawAxiosHeaders {
[key: string]: AxiosHeaderValue;
}
type MethodsHeaders = Partial<
{
[Key in Method as Lowercase<Key>]: AxiosHeaders;
} & { common: AxiosHeaders }
>;
type AxiosHeaderMatcher =
| string
| RegExp
| ((this: AxiosHeaders, value: string, name: string) => boolean);
type AxiosHeaderParser = (this: AxiosHeaders, value: AxiosHeaderValue, header: string) => any;
export class AxiosHeaders {
constructor(headers?: RawAxiosHeaders | AxiosHeaders | string);
[key: string]: any;
set(
headerName?: string,
value?: AxiosHeaderValue,
rewrite?: boolean | AxiosHeaderMatcher
): AxiosHeaders;
set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders;
get(headerName: string, parser: RegExp): RegExpExecArray | null;
get(headerName: string, matcher?: true | AxiosHeaderParser): AxiosHeaderValue;
has(header: string, matcher?: AxiosHeaderMatcher): boolean;
delete(header: string | string[], matcher?: AxiosHeaderMatcher): boolean;
clear(matcher?: AxiosHeaderMatcher): boolean;
normalize(format: boolean): AxiosHeaders;
concat(
...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>
): AxiosHeaders;
toJSON(asStrings?: boolean): RawAxiosHeaders;
static from(thing?: AxiosHeaders | RawAxiosHeaders | string): AxiosHeaders;
static accessor(header: string | string[]): AxiosHeaders;
static concat(
...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>
): AxiosHeaders;
setContentType(value: ContentType, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getContentType(parser?: RegExp): RegExpExecArray | null;
getContentType(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;
hasContentType(matcher?: AxiosHeaderMatcher): boolean;
setContentLength(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getContentLength(parser?: RegExp): RegExpExecArray | null;
getContentLength(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;
hasContentLength(matcher?: AxiosHeaderMatcher): boolean;
setAccept(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getAccept(parser?: RegExp): RegExpExecArray | null;
getAccept(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;
hasAccept(matcher?: AxiosHeaderMatcher): boolean;
setUserAgent(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getUserAgent(parser?: RegExp): RegExpExecArray | null;
getUserAgent(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;
hasUserAgent(matcher?: AxiosHeaderMatcher): boolean;
setContentEncoding(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getContentEncoding(parser?: RegExp): RegExpExecArray | null;
getContentEncoding(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;
hasContentEncoding(matcher?: AxiosHeaderMatcher): boolean;
setAuthorization(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getAuthorization(parser?: RegExp): RegExpExecArray | null;
getAuthorization(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;
hasAuthorization(matcher?: AxiosHeaderMatcher): boolean;
getSetCookie(): string[];
[Symbol.iterator](): IterableIterator<[string, AxiosHeaderValue]>;
}
type CommonRequestHeadersList =
| 'Accept'
| 'Content-Length'
| 'User-Agent'
| 'Content-Encoding'
| 'Authorization'
| 'Location';
type ContentType =
| AxiosHeaderValue
| 'text/html'
| 'text/plain'
| 'multipart/form-data'
| 'application/json'
| 'application/x-www-form-urlencoded'
| 'application/octet-stream';
export type RawAxiosRequestHeaders = Partial<
RawAxiosHeaders & {
[Key in CommonRequestHeadersList]: AxiosHeaderValue;
} & {
'Content-Type': ContentType;
}
>;
export type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders;
type CommonResponseHeadersList =
| 'Server'
| 'Content-Type'
| 'Content-Length'
| 'Cache-Control'
| 'Content-Encoding';
type CommonResponseHeaderKey = CommonResponseHeadersList | Lowercase<CommonResponseHeadersList>;
type RawCommonResponseHeaders = {
[Key in CommonResponseHeaderKey]: AxiosHeaderValue;
} & {
'set-cookie': string[];
};
export type RawAxiosResponseHeaders = Partial<RawAxiosHeaders & RawCommonResponseHeaders>;
export type AxiosResponseHeaders = RawAxiosResponseHeaders & AxiosHeaders;
export interface AxiosRequestTransformer {
(this: InternalAxiosRequestConfig, data: any, headers: AxiosRequestHeaders): any;
}
export interface AxiosResponseTransformer {
(
this: InternalAxiosRequestConfig,
data: any,
headers: AxiosResponseHeaders,
status?: number
): any;
}
export interface AxiosAdapter {
(config: InternalAxiosRequestConfig): AxiosPromise;
}
export interface AxiosBasicCredentials {
username: string;
password: string;
}
export interface AxiosProxyConfig {
host: string;
port: number;
auth?: AxiosBasicCredentials;
protocol?: string;
}
export enum HttpStatusCode {
Continue = 100,
SwitchingProtocols = 101,
Processing = 102,
EarlyHints = 103,
Ok = 200,
Created = 201,
Accepted = 202,
NonAuthoritativeInformation = 203,
NoContent = 204,
ResetContent = 205,
PartialContent = 206,
MultiStatus = 207,
AlreadyReported = 208,
ImUsed = 226,
MultipleChoices = 300,
MovedPermanently = 301,
Found = 302,
SeeOther = 303,
NotModified = 304,
UseProxy = 305,
Unused = 306,
TemporaryRedirect = 307,
PermanentRedirect = 308,
BadRequest = 400,
Unauthorized = 401,
PaymentRequired = 402,
Forbidden = 403,
NotFound = 404,
MethodNotAllowed = 405,
NotAcceptable = 406,
ProxyAuthenticationRequired = 407,
RequestTimeout = 408,
Conflict = 409,
Gone = 410,
LengthRequired = 411,
PreconditionFailed = 412,
PayloadTooLarge = 413,
UriTooLong = 414,
UnsupportedMediaType = 415,
RangeNotSatisfiable = 416,
ExpectationFailed = 417,
ImATeapot = 418,
MisdirectedRequest = 421,
UnprocessableEntity = 422,
Locked = 423,
FailedDependency = 424,
TooEarly = 425,
UpgradeRequired = 426,
PreconditionRequired = 428,
TooManyRequests = 429,
RequestHeaderFieldsTooLarge = 431,
UnavailableForLegalReasons = 451,
InternalServerError = 500,
NotImplemented = 501,
BadGateway = 502,
ServiceUnavailable = 503,
GatewayTimeout = 504,
HttpVersionNotSupported = 505,
VariantAlsoNegotiates = 506,
InsufficientStorage = 507,
LoopDetected = 508,
NotExtended = 510,
NetworkAuthenticationRequired = 511,
}
type UppercaseMethod =
| 'GET'
| 'DELETE'
| 'HEAD'
| 'OPTIONS'
| 'POST'
| 'PUT'
| 'PATCH'
| 'PURGE'
| 'LINK'
| 'UNLINK'
| 'QUERY';
export type Method = (UppercaseMethod | Lowercase<UppercaseMethod>) & {};
export type ResponseType =
| 'arraybuffer'
| 'blob'
| 'document'
| 'json'
| 'text'
| 'stream'
| 'formdata';
type UppercaseResponseEncoding =
| 'ASCII'
| 'ANSI'
| 'BINARY'
| 'BASE64'
| 'BASE64URL'
| 'HEX'
| 'LATIN1'
| 'UCS-2'
| 'UCS2'
| 'UTF-8'
| 'UTF8'
| 'UTF16LE';
export type responseEncoding = (
| UppercaseResponseEncoding
| Lowercase<UppercaseResponseEncoding>
) & {};
export interface TransitionalOptions {
silentJSONParsing?: boolean;
forcedJSONParsing?: boolean;
clarifyTimeoutError?: boolean;
legacyInterceptorReqResOrdering?: boolean;
}
export interface GenericAbortSignal {
readonly aborted: boolean;
onabort?: ((...args: any) => any) | null;
addEventListener?: (...args: any) => any;
removeEventListener?: (...args: any) => any;
}
export interface FormDataVisitorHelpers {
defaultVisitor: SerializerVisitor;
convertValue: (value: any) => any;
isVisitable: (value: any) => boolean;
}
export interface SerializerVisitor {
(
this: GenericFormData,
value: any,
key: string | number,
path: null | Array<string | number>,
helpers: FormDataVisitorHelpers
): boolean;
}
export interface SerializerOptions {
visitor?: SerializerVisitor;
dots?: boolean;
metaTokens?: boolean;
indexes?: boolean | null;
}
// tslint:disable-next-line
export interface FormSerializerOptions extends SerializerOptions {}
export interface ParamEncoder {
(value: any, defaultEncoder: (value: any) => any): any;
}
export interface CustomParamsSerializer {
(params: Record<string, any>, options?: ParamsSerializerOptions): string;
}
export interface ParamsSerializerOptions extends SerializerOptions {
encode?: ParamEncoder;
serialize?: CustomParamsSerializer;
}
type MaxUploadRate = number;
type MaxDownloadRate = number;
type BrowserProgressEvent = any;
export interface AxiosProgressEvent {
loaded: number;
total?: number;
progress?: number;
bytes: number;
rate?: number;
estimated?: number;
upload?: boolean;
download?: boolean;
event?: BrowserProgressEvent;
lengthComputable: boolean;
}
type Milliseconds = number;
type AxiosAdapterName = StringLiteralsOrString<'xhr' | 'http' | 'fetch'>;
type AxiosAdapterConfig = AxiosAdapter | AxiosAdapterName;
export type AddressFamily = 4 | 6 | undefined;
export interface LookupAddressEntry {
address: string;
family?: AddressFamily;
}
export type LookupAddress = string | LookupAddressEntry;
export interface AxiosRequestConfig<D = any> {
url?: string;
method?: StringLiteralsOrString<Method>;
baseURL?: string;
allowAbsoluteUrls?: boolean;
transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[];
transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[];
headers?: (RawAxiosRequestHeaders & MethodsHeaders) | AxiosHeaders;
params?: any;
paramsSerializer?: ParamsSerializerOptions | CustomParamsSerializer;
data?: D;
timeout?: Milliseconds;
timeoutErrorMessage?: string;
withCredentials?: boolean;
adapter?: AxiosAdapterConfig | AxiosAdapterConfig[];
auth?: AxiosBasicCredentials;
responseType?: ResponseType;
responseEncoding?: StringLiteralsOrString<responseEncoding>;
xsrfCookieName?: string;
xsrfHeaderName?: string;
onUploadProgress?: (progressEvent: AxiosProgressEvent) => void;
onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void;
maxContentLength?: number;
validateStatus?: ((status: number) => boolean) | null;
maxBodyLength?: number;
maxRedirects?: number;
maxRate?: number | [MaxUploadRate, MaxDownloadRate];
beforeRedirect?: (
options: Record<string, any>,
responseDetails: {
headers: Record<string, string>;
statusCode: HttpStatusCode;
},
requestDetails: {
headers: Record<string, string>;
url: string;
method: string;
},
) => void;
socketPath?: string | null;
allowedSocketPaths?: string | string[] | null;
transport?: any;
httpAgent?: any;
httpsAgent?: any;
proxy?: AxiosProxyConfig | false;
cancelToken?: CancelToken | undefined;
decompress?: boolean;
transitional?: TransitionalOptions;
signal?: GenericAbortSignal;
insecureHTTPParser?: boolean;
env?: {
FormData?: new (...args: any[]) => object;
fetch?: (input: URL | Request | string, init?: RequestInit) => Promise<Response>;
Request?: new (input: URL | Request | string, init?: RequestInit) => Request;
Response?: new (
body?: ArrayBuffer | ArrayBufferView | Blob | FormData | URLSearchParams | string | null,
init?: ResponseInit
) => Response;
};
formSerializer?: FormSerializerOptions;
family?: AddressFamily;
lookup?:
| ((
hostname: string,
options: object,
cb: (
err: Error | null,
address: LookupAddress | LookupAddress[],
family?: AddressFamily
) => void
) => void)
| ((
hostname: string,
options: object
) => Promise<
[address: LookupAddressEntry | LookupAddressEntry[], family?: AddressFamily] | LookupAddress
>);
withXSRFToken?: boolean | ((config: InternalAxiosRequestConfig) => boolean | undefined);
parseReviver?: (this: any, key: string, value: any, context?: { source?: string }) => any;
fetchOptions?: Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'> | Record<string, any>;
httpVersion?: 1 | 2;
http2Options?: Record<string, any> & {
sessionTimeout?: number;
};
formDataHeaderPolicy?: 'legacy' | 'content-only';
redact?: string[];
}
// Alias
export type RawAxiosRequestConfig<D = any> = AxiosRequestConfig<D>;
export interface InternalAxiosRequestConfig<D = any> extends AxiosRequestConfig<D> {
headers: AxiosRequestHeaders;
}
export interface HeadersDefaults {
common: RawAxiosRequestHeaders;
delete: RawAxiosRequestHeaders;
get: RawAxiosRequestHeaders;
head: RawAxiosRequestHeaders;
post: RawAxiosRequestHeaders;
put: RawAxiosRequestHeaders;
patch: RawAxiosRequestHeaders;
options?: RawAxiosRequestHeaders;
purge?: RawAxiosRequestHeaders;
link?: RawAxiosRequestHeaders;
unlink?: RawAxiosRequestHeaders;
query?: RawAxiosRequestHeaders;
}
export interface AxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
headers: HeadersDefaults;
}
export interface CreateAxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
headers?: RawAxiosRequestHeaders | AxiosHeaders | Partial<HeadersDefaults>;
}
export interface AxiosResponse<T = any, D = any, H = {}> {
data: T;
status: number;
statusText: string;
headers: (H & RawAxiosResponseHeaders) | AxiosResponseHeaders;
config: InternalAxiosRequestConfig<D>;
request?: any;
}
export class AxiosError<T = unknown, D = any> extends Error {
constructor(
message?: string,
code?: string,
config?: InternalAxiosRequestConfig<D>,
request?: any,
response?: AxiosResponse<T, D>
);
config?: InternalAxiosRequestConfig<D>;
code?: string;
request?: any;
response?: AxiosResponse<T, D>;
isAxiosError: boolean;
status?: number;
toJSON: () => object;
cause?: Error;
event?: BrowserProgressEvent;
static from<T = unknown, D = any>(
error: Error | unknown,
code?: string,
config?: InternalAxiosRequestConfig<D>,
request?: any,
response?: AxiosResponse<T, D>,
customProps?: object
): AxiosError<T, D>;
static readonly ERR_FR_TOO_MANY_REDIRECTS = 'ERR_FR_TOO_MANY_REDIRECTS';
static readonly ERR_BAD_OPTION_VALUE = 'ERR_BAD_OPTION_VALUE';
static readonly ERR_BAD_OPTION = 'ERR_BAD_OPTION';
static readonly ERR_NETWORK = 'ERR_NETWORK';
static readonly ERR_DEPRECATED = 'ERR_DEPRECATED';
static readonly ERR_BAD_RESPONSE = 'ERR_BAD_RESPONSE';
static readonly ERR_BAD_REQUEST = 'ERR_BAD_REQUEST';
static readonly ERR_NOT_SUPPORT = 'ERR_NOT_SUPPORT';
static readonly ERR_INVALID_URL = 'ERR_INVALID_URL';
static readonly ERR_CANCELED = 'ERR_CANCELED';
static readonly ERR_FORM_DATA_DEPTH_EXCEEDED = 'ERR_FORM_DATA_DEPTH_EXCEEDED';
static readonly ECONNABORTED = 'ECONNABORTED';
static readonly ECONNREFUSED = 'ECONNREFUSED';
static readonly ETIMEDOUT = 'ETIMEDOUT';
}
export class CanceledError<T> extends AxiosError<T> {
readonly name: 'CanceledError';
}
export type AxiosPromise<T = any> = Promise<AxiosResponse<T>>;
export interface CancelStatic {
new (message?: string): Cancel;
}
export interface Cancel {
message: string | undefined;
}
export interface Canceler {
(message?: string, config?: AxiosRequestConfig, request?: any): void;
}
export interface CancelTokenStatic {
new (executor: (cancel: Canceler) => void): CancelToken;
source(): CancelTokenSource;
}
export interface CancelToken {
promise: Promise<Cancel>;
reason?: Cancel;
throwIfRequested(): void;
}
export interface CancelTokenSource {
token: CancelToken;
cancel: Canceler;
}
export interface AxiosInterceptorOptions {
synchronous?: boolean;
runWhen?: ((config: InternalAxiosRequestConfig) => boolean) | null;
}
type AxiosInterceptorFulfilled<T> = (value: T) => T | Promise<T>;
type AxiosInterceptorRejected = (error: any) => any;
type AxiosRequestInterceptorUse<T> = (
onFulfilled?: AxiosInterceptorFulfilled<T> | null,
onRejected?: AxiosInterceptorRejected | null,
options?: AxiosInterceptorOptions
) => number;
type AxiosResponseInterceptorUse<T> = (
onFulfilled?: AxiosInterceptorFulfilled<T> | null,
onRejected?: AxiosInterceptorRejected | null
) => number;
interface AxiosInterceptorHandler<T> {
fulfilled: AxiosInterceptorFulfilled<T>;
rejected?: AxiosInterceptorRejected;
synchronous: boolean;
runWhen?: ((config: InternalAxiosRequestConfig) => boolean) | null;
}
export interface AxiosInterceptorManager<V> {
use: V extends AxiosResponse ? AxiosResponseInterceptorUse<V> : AxiosRequestInterceptorUse<V>;
eject(id: number): void;
clear(): void;
handlers?: Array<AxiosInterceptorHandler<V>>;
}
export class Axios {
constructor(config?: AxiosRequestConfig);
defaults: AxiosDefaults;
interceptors: {
request: AxiosInterceptorManager<InternalAxiosRequestConfig>;
response: AxiosInterceptorManager<AxiosResponse>;
};
getUri(config?: AxiosRequestConfig): string;
request<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>;
get<T = any, R = AxiosResponse<T>, D = any>(
url: string,
config?: AxiosRequestConfig<D>
): Promise<R>;
delete<T = any, R = AxiosResponse<T>, D = any>(
url: string,
config?: AxiosRequestConfig<D>
): Promise<R>;
head<T = any, R = AxiosResponse<T>, D = any>(
url: string,
config?: AxiosRequestConfig<D>
): Promise<R>;
options<T = any, R = AxiosResponse<T>, D = any>(
url: string,
config?: AxiosRequestConfig<D>
): Promise<R>;
post<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R>;
put<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R>;
patch<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R>;
postForm<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R>;
putForm<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R>;
patchForm<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R>;
query<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R>;
}
export interface AxiosInstance extends Axios {
<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>;
<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
create(config?: CreateAxiosDefaults): AxiosInstance;
defaults: Omit<AxiosDefaults, 'headers'> & {
headers: HeadersDefaults & {
[key: string]: AxiosHeaderValue;
};
};
}
export interface GenericFormData {
append(name: string, value: any, options?: any): any;
}
export interface GenericHTMLFormElement {
name: string;
method: string;
submit(): void;
}
export function getAdapter(
adapters: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined
): AxiosAdapter;
export function toFormData(
sourceObj: object,
targetFormData?: GenericFormData,
options?: FormSerializerOptions
): GenericFormData;
export function formToJSON(form: GenericFormData | GenericHTMLFormElement): object;
export function isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>;
export function spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
export function isCancel<T = any>(value: any): value is CanceledError<T>;
export function all<T>(values: Array<T | Promise<T>>): Promise<T[]>;
export function mergeConfig<D = any>(
config1: AxiosRequestConfig<D>,
config2: AxiosRequestConfig<D>
): AxiosRequestConfig<D>;
export function create(config?: CreateAxiosDefaults): AxiosInstance;
export interface AxiosStatic extends AxiosInstance {
Cancel: CancelStatic;
CancelToken: CancelTokenStatic;
Axios: typeof Axios;
AxiosError: typeof AxiosError;
HttpStatusCode: typeof HttpStatusCode;
readonly VERSION: string;
isCancel: typeof isCancel;
all: typeof all;
spread: typeof spread;
isAxiosError: typeof isAxiosError;
toFormData: typeof toFormData;
formToJSON: typeof formToJSON;
getAdapter: typeof getAdapter;
CanceledError: typeof CanceledError;
AxiosHeaders: typeof AxiosHeaders;
mergeConfig: typeof mergeConfig;
}
declare const axios: AxiosStatic;
export default axios;

View File

@@ -1,45 +0,0 @@
import axios from './lib/axios.js';
// This module is intended to unwrap Axios default export as named.
// Keep top-level export same with static properties
// so that it can keep same with es module or cjs
const {
Axios,
AxiosError,
CanceledError,
isCancel,
CancelToken,
VERSION,
all,
Cancel,
isAxiosError,
spread,
toFormData,
AxiosHeaders,
HttpStatusCode,
formToJSON,
getAdapter,
mergeConfig,
create,
} = axios;
export {
axios as default,
create,
Axios,
AxiosError,
CanceledError,
isCancel,
CancelToken,
VERSION,
all,
Cancel,
isAxiosError,
spread,
toFormData,
AxiosHeaders,
HttpStatusCode,
formToJSON,
getAdapter,
mergeConfig,
};

View File

@@ -1,36 +0,0 @@
# axios // adapters
The modules under `adapters/` are modules that handle dispatching a request and settling a returned `Promise` once a response is received.
## Example
```js
var settle = require('../core/settle');
module.exports = function myAdapter(config) {
// At this point:
// - config has been merged with defaults
// - request transformers have already run
// - request interceptors have already run
// Make the request using config provided
// Upon response settle the Promise
return new Promise(function (resolve, reject) {
var response = {
data: responseData,
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config: config,
request: request,
};
settle(resolve, reject, response);
// From here:
// - response transformers will run
// - response interceptors will run
});
};
```

View File

@@ -1,132 +0,0 @@
import utils from '../utils.js';
import httpAdapter from './http.js';
import xhrAdapter from './xhr.js';
import * as fetchAdapter from './fetch.js';
import AxiosError from '../core/AxiosError.js';
/**
* Known adapters mapping.
* Provides environment-specific adapters for Axios:
* - `http` for Node.js
* - `xhr` for browsers
* - `fetch` for fetch API-based requests
*
* @type {Object<string, Function|Object>}
*/
const knownAdapters = {
http: httpAdapter,
xhr: xhrAdapter,
fetch: {
get: fetchAdapter.getFetch,
},
};
// Assign adapter names for easier debugging and identification
utils.forEach(knownAdapters, (fn, value) => {
if (fn) {
try {
// Null-proto descriptors so a polluted Object.prototype.get cannot turn
// these data descriptors into accessor descriptors on the way in.
Object.defineProperty(fn, 'name', { __proto__: null, value });
} catch (e) {
// eslint-disable-next-line no-empty
}
Object.defineProperty(fn, 'adapterName', { __proto__: null, value });
}
});
/**
* Render a rejection reason string for unknown or unsupported adapters
*
* @param {string} reason
* @returns {string}
*/
const renderReason = (reason) => `- ${reason}`;
/**
* Check if the adapter is resolved (function, null, or false)
*
* @param {Function|null|false} adapter
* @returns {boolean}
*/
const isResolvedHandle = (adapter) =>
utils.isFunction(adapter) || adapter === null || adapter === false;
/**
* Get the first suitable adapter from the provided list.
* Tries each adapter in order until a supported one is found.
* Throws an AxiosError if no adapter is suitable.
*
* @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.
* @param {Object} config - Axios request configuration
* @throws {AxiosError} If no suitable adapter is available
* @returns {Function} The resolved adapter function
*/
function getAdapter(adapters, config) {
adapters = utils.isArray(adapters) ? adapters : [adapters];
const { length } = adapters;
let nameOrAdapter;
let adapter;
const rejectedReasons = {};
for (let i = 0; i < length; i++) {
nameOrAdapter = adapters[i];
let id;
adapter = nameOrAdapter;
if (!isResolvedHandle(nameOrAdapter)) {
adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];
if (adapter === undefined) {
throw new AxiosError(`Unknown adapter '${id}'`);
}
}
if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {
break;
}
rejectedReasons[id || '#' + i] = adapter;
}
if (!adapter) {
const reasons = Object.entries(rejectedReasons).map(
([id, state]) =>
`adapter ${id} ` +
(state === false ? 'is not supported by the environment' : 'is not available in the build')
);
let s = length
? reasons.length > 1
? 'since :\n' + reasons.map(renderReason).join('\n')
: ' ' + renderReason(reasons[0])
: 'as no adapter specified';
throw new AxiosError(
`There is no suitable adapter to dispatch the request ` + s,
'ERR_NOT_SUPPORT'
);
}
return adapter;
}
/**
* Exports Axios adapters and utility to resolve an adapter
*/
export default {
/**
* Resolve an adapter from a list of adapter names or functions.
* @type {Function}
*/
getAdapter,
/**
* Exposes all known adapters
* @type {Object<string, Function|Object>}
*/
adapters: knownAdapters,
};

View File

@@ -1,473 +0,0 @@
import platform from '../platform/index.js';
import utils from '../utils.js';
import AxiosError from '../core/AxiosError.js';
import composeSignals from '../helpers/composeSignals.js';
import { trackStream } from '../helpers/trackStream.js';
import AxiosHeaders from '../core/AxiosHeaders.js';
import {
progressEventReducer,
progressEventDecorator,
asyncDecorator,
} from '../helpers/progressEventReducer.js';
import resolveConfig from '../helpers/resolveConfig.js';
import settle from '../core/settle.js';
import estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';
import { VERSION } from '../env/data.js';
import { toByteStringHeaderObject } from '../helpers/sanitizeHeaderValue.js';
const DEFAULT_CHUNK_SIZE = 64 * 1024;
const { isFunction } = utils;
const test = (fn, ...args) => {
try {
return !!fn(...args);
} catch (e) {
return false;
}
};
const factory = (env) => {
const globalObject =
utils.global !== undefined && utils.global !== null
? utils.global
: globalThis;
const { ReadableStream, TextEncoder } = globalObject;
env = utils.merge.call(
{
skipUndefined: true,
},
{
Request: globalObject.Request,
Response: globalObject.Response,
},
env
);
const { fetch: envFetch, Request, Response } = env;
const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';
const isRequestSupported = isFunction(Request);
const isResponseSupported = isFunction(Response);
if (!isFetchSupported) {
return false;
}
const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);
const encodeText =
isFetchSupported &&
(typeof TextEncoder === 'function'
? (
(encoder) => (str) =>
encoder.encode(str)
)(new TextEncoder())
: async (str) => new Uint8Array(await new Request(str).arrayBuffer()));
const supportsRequestStream =
isRequestSupported &&
isReadableStreamSupported &&
test(() => {
let duplexAccessed = false;
const request = new Request(platform.origin, {
body: new ReadableStream(),
method: 'POST',
get duplex() {
duplexAccessed = true;
return 'half';
},
});
const hasContentType = request.headers.has('Content-Type');
if (request.body != null) {
request.body.cancel();
}
return duplexAccessed && !hasContentType;
});
const supportsResponseStream =
isResponseSupported &&
isReadableStreamSupported &&
test(() => utils.isReadableStream(new Response('').body));
const resolvers = {
stream: supportsResponseStream && ((res) => res.body),
};
isFetchSupported &&
(() => {
['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach((type) => {
!resolvers[type] &&
(resolvers[type] = (res, config) => {
let method = res && res[type];
if (method) {
return method.call(res);
}
throw new AxiosError(
`Response type '${type}' is not supported`,
AxiosError.ERR_NOT_SUPPORT,
config
);
});
});
})();
const getBodyLength = async (body) => {
if (body == null) {
return 0;
}
if (utils.isBlob(body)) {
return body.size;
}
if (utils.isSpecCompliantForm(body)) {
const _request = new Request(platform.origin, {
method: 'POST',
body,
});
return (await _request.arrayBuffer()).byteLength;
}
if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {
return body.byteLength;
}
if (utils.isURLSearchParams(body)) {
body = body + '';
}
if (utils.isString(body)) {
return (await encodeText(body)).byteLength;
}
};
const resolveBodyLength = async (headers, body) => {
const length = utils.toFiniteNumber(headers.getContentLength());
return length == null ? getBodyLength(body) : length;
};
return async (config) => {
let {
url,
method,
data,
signal,
cancelToken,
timeout,
onDownloadProgress,
onUploadProgress,
responseType,
headers,
withCredentials = 'same-origin',
fetchOptions,
maxContentLength,
maxBodyLength,
} = resolveConfig(config);
const hasMaxContentLength = utils.isNumber(maxContentLength) && maxContentLength > -1;
const hasMaxBodyLength = utils.isNumber(maxBodyLength) && maxBodyLength > -1;
let _fetch = envFetch || fetch;
responseType = responseType ? (responseType + '').toLowerCase() : 'text';
let composedSignal = composeSignals(
[signal, cancelToken && cancelToken.toAbortSignal()],
timeout
);
let request = null;
const unsubscribe =
composedSignal &&
composedSignal.unsubscribe &&
(() => {
composedSignal.unsubscribe();
});
let requestContentLength;
try {
// Enforce maxContentLength for data: URLs up-front so we never materialize
// an oversized payload. The HTTP adapter applies the same check (see http.js
// "if (protocol === 'data:')" branch).
if (hasMaxContentLength && typeof url === 'string' && url.startsWith('data:')) {
const estimated = estimateDataURLDecodedBytes(url);
if (estimated > maxContentLength) {
throw new AxiosError(
'maxContentLength size of ' + maxContentLength + ' exceeded',
AxiosError.ERR_BAD_RESPONSE,
config,
request
);
}
}
// Enforce maxBodyLength against the outbound request body before dispatch.
// Mirrors http.js behavior (ERR_BAD_REQUEST / 'Request body larger than
// maxBodyLength limit'). Skip when the body length cannot be determined
// (e.g. a live ReadableStream supplied by the caller).
if (hasMaxBodyLength && method !== 'get' && method !== 'head') {
const outboundLength = await resolveBodyLength(headers, data);
if (
typeof outboundLength === 'number' &&
isFinite(outboundLength) &&
outboundLength > maxBodyLength
) {
throw new AxiosError(
'Request body larger than maxBodyLength limit',
AxiosError.ERR_BAD_REQUEST,
config,
request
);
}
}
if (
onUploadProgress &&
supportsRequestStream &&
method !== 'get' &&
method !== 'head' &&
(requestContentLength = await resolveBodyLength(headers, data)) !== 0
) {
let _request = new Request(url, {
method: 'POST',
body: data,
duplex: 'half',
});
let contentTypeHeader;
if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
headers.setContentType(contentTypeHeader);
}
if (_request.body) {
const [onProgress, flush] = progressEventDecorator(
requestContentLength,
progressEventReducer(asyncDecorator(onUploadProgress))
);
data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
}
}
if (!utils.isString(withCredentials)) {
withCredentials = withCredentials ? 'include' : 'omit';
}
// Cloudflare Workers throws when credentials are defined
// see https://github.com/cloudflare/workerd/issues/902
const isCredentialsSupported = isRequestSupported && 'credentials' in Request.prototype;
// If data is FormData and Content-Type is multipart/form-data without boundary,
// delete it so fetch can set it correctly with the boundary
if (utils.isFormData(data)) {
const contentType = headers.getContentType();
if (
contentType &&
/^multipart\/form-data/i.test(contentType) &&
!/boundary=/i.test(contentType)
) {
headers.delete('content-type');
}
}
// Set User-Agent header if not already set (fetch defaults to 'node' in Node.js)
headers.set('User-Agent', 'axios/' + VERSION, false);
const resolvedOptions = {
...fetchOptions,
signal: composedSignal,
method: method.toUpperCase(),
headers: toByteStringHeaderObject(headers.normalize()),
body: data,
duplex: 'half',
credentials: isCredentialsSupported ? withCredentials : undefined,
};
request = isRequestSupported && new Request(url, resolvedOptions);
let response = await (isRequestSupported
? _fetch(request, fetchOptions)
: _fetch(url, resolvedOptions));
// Cheap pre-check: if the server honestly declares a content-length that
// already exceeds the cap, reject before we start streaming.
if (hasMaxContentLength) {
const declaredLength = utils.toFiniteNumber(response.headers.get('content-length'));
if (declaredLength != null && declaredLength > maxContentLength) {
throw new AxiosError(
'maxContentLength size of ' + maxContentLength + ' exceeded',
AxiosError.ERR_BAD_RESPONSE,
config,
request
);
}
}
const isStreamResponse =
supportsResponseStream && (responseType === 'stream' || responseType === 'response');
if (
supportsResponseStream &&
response.body &&
(onDownloadProgress || hasMaxContentLength || (isStreamResponse && unsubscribe))
) {
const options = {};
['status', 'statusText', 'headers'].forEach((prop) => {
options[prop] = response[prop];
});
const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));
const [onProgress, flush] =
(onDownloadProgress &&
progressEventDecorator(
responseContentLength,
progressEventReducer(asyncDecorator(onDownloadProgress), true)
)) ||
[];
let bytesRead = 0;
const onChunkProgress = (loadedBytes) => {
if (hasMaxContentLength) {
bytesRead = loadedBytes;
if (bytesRead > maxContentLength) {
throw new AxiosError(
'maxContentLength size of ' + maxContentLength + ' exceeded',
AxiosError.ERR_BAD_RESPONSE,
config,
request
);
}
}
onProgress && onProgress(loadedBytes);
};
response = new Response(
trackStream(response.body, DEFAULT_CHUNK_SIZE, onChunkProgress, () => {
flush && flush();
unsubscribe && unsubscribe();
}),
options
);
}
responseType = responseType || 'text';
let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](
response,
config
);
// Fallback enforcement for environments without ReadableStream support
// (legacy runtimes). Detect materialized size from typed output; skip
// streams/Response passthrough since the user will read those themselves.
if (hasMaxContentLength && !supportsResponseStream && !isStreamResponse) {
let materializedSize;
if (responseData != null) {
if (typeof responseData.byteLength === 'number') {
materializedSize = responseData.byteLength;
} else if (typeof responseData.size === 'number') {
materializedSize = responseData.size;
} else if (typeof responseData === 'string') {
materializedSize =
typeof TextEncoder === 'function'
? new TextEncoder().encode(responseData).byteLength
: responseData.length;
}
}
if (typeof materializedSize === 'number' && materializedSize > maxContentLength) {
throw new AxiosError(
'maxContentLength size of ' + maxContentLength + ' exceeded',
AxiosError.ERR_BAD_RESPONSE,
config,
request
);
}
}
!isStreamResponse && unsubscribe && unsubscribe();
return await new Promise((resolve, reject) => {
settle(resolve, reject, {
data: responseData,
headers: AxiosHeaders.from(response.headers),
status: response.status,
statusText: response.statusText,
config,
request,
});
});
} catch (err) {
unsubscribe && unsubscribe();
// Safari can surface fetch aborts as a DOMException-like object whose
// branded getters throw. Prefer our composed signal reason before reading
// the caught error, preserving timeout vs cancellation semantics.
if (composedSignal && composedSignal.aborted && composedSignal.reason instanceof AxiosError) {
const canceledError = composedSignal.reason;
canceledError.config = config;
request && (canceledError.request = request);
err !== canceledError && (canceledError.cause = err);
throw canceledError;
}
if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {
throw Object.assign(
new AxiosError(
'Network Error',
AxiosError.ERR_NETWORK,
config,
request,
err && err.response
),
{
cause: err.cause || err,
}
);
}
throw AxiosError.from(err, err && err.code, config, request, err && err.response);
}
};
};
const seedCache = new Map();
export const getFetch = (config) => {
let env = (config && config.env) || {};
const { fetch, Request, Response } = env;
const seeds = [Request, Response, fetch];
let len = seeds.length,
i = len,
seed,
target,
map = seedCache;
while (i--) {
seed = seeds[i];
target = map.get(seed);
target === undefined && map.set(seed, (target = i ? new Map() : factory(env)));
map = target;
}
return target;
};
const adapter = getFetch();
export default adapter;

File diff suppressed because it is too large Load Diff

View File

@@ -1,227 +0,0 @@
import utils from '../utils.js';
import settle from '../core/settle.js';
import transitionalDefaults from '../defaults/transitional.js';
import AxiosError from '../core/AxiosError.js';
import CanceledError from '../cancel/CanceledError.js';
import parseProtocol from '../helpers/parseProtocol.js';
import platform from '../platform/index.js';
import AxiosHeaders from '../core/AxiosHeaders.js';
import { progressEventReducer } from '../helpers/progressEventReducer.js';
import resolveConfig from '../helpers/resolveConfig.js';
import { toByteStringHeaderObject } from '../helpers/sanitizeHeaderValue.js';
const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
export default isXHRAdapterSupported &&
function (config) {
return new Promise(function dispatchXhrRequest(resolve, reject) {
const _config = resolveConfig(config);
let requestData = _config.data;
const requestHeaders = AxiosHeaders.from(_config.headers).normalize();
let { responseType, onUploadProgress, onDownloadProgress } = _config;
let onCanceled;
let uploadThrottled, downloadThrottled;
let flushUpload, flushDownload;
function done() {
flushUpload && flushUpload(); // flush events
flushDownload && flushDownload(); // flush events
_config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);
_config.signal && _config.signal.removeEventListener('abort', onCanceled);
}
let request = new XMLHttpRequest();
request.open(_config.method.toUpperCase(), _config.url, true);
// Set the request timeout in MS
request.timeout = _config.timeout;
function onloadend() {
if (!request) {
return;
}
// Prepare the response
const responseHeaders = AxiosHeaders.from(
'getAllResponseHeaders' in request && request.getAllResponseHeaders()
);
const responseData =
!responseType || responseType === 'text' || responseType === 'json'
? request.responseText
: request.response;
const response = {
data: responseData,
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config,
request,
};
settle(
function _resolve(value) {
resolve(value);
done();
},
function _reject(err) {
reject(err);
done();
},
response
);
// Clean up request
request = null;
}
if ('onloadend' in request) {
// Use onloadend if available
request.onloadend = onloadend;
} else {
// Listen for ready state to emulate onloadend
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (
request.status === 0 &&
!(request.responseURL && request.responseURL.startsWith('file:'))
) {
return;
}
// readystate handler is calling before onerror or ontimeout handlers,
// so we should call onloadend on the next 'tick'
setTimeout(onloadend);
};
}
// Handle browser request cancellation (as opposed to a manual cancellation)
request.onabort = function handleAbort() {
if (!request) {
return;
}
reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
done();
// Clean up request
request = null;
};
// Handle low level network errors
request.onerror = function handleError(event) {
// Browsers deliver a ProgressEvent in XHR onerror
// (message may be empty; when present, surface it)
// See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event
const msg = event && event.message ? event.message : 'Network Error';
const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);
// attach the underlying event for consumers who want details
err.event = event || null;
reject(err);
done();
request = null;
};
// Handle timeout
request.ontimeout = function handleTimeout() {
let timeoutErrorMessage = _config.timeout
? 'timeout of ' + _config.timeout + 'ms exceeded'
: 'timeout exceeded';
const transitional = _config.transitional || transitionalDefaults;
if (_config.timeoutErrorMessage) {
timeoutErrorMessage = _config.timeoutErrorMessage;
}
reject(
new AxiosError(
timeoutErrorMessage,
transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
config,
request
)
);
done();
// Clean up request
request = null;
};
// Remove Content-Type if data is undefined
requestData === undefined && requestHeaders.setContentType(null);
// Add headers to the request
if ('setRequestHeader' in request) {
utils.forEach(toByteStringHeaderObject(requestHeaders), function setRequestHeader(val, key) {
request.setRequestHeader(key, val);
});
}
// Add withCredentials to request if needed
if (!utils.isUndefined(_config.withCredentials)) {
request.withCredentials = !!_config.withCredentials;
}
// Add responseType to request if needed
if (responseType && responseType !== 'json') {
request.responseType = _config.responseType;
}
// Handle progress if needed
if (onDownloadProgress) {
[downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true);
request.addEventListener('progress', downloadThrottled);
}
// Not all browsers support upload events
if (onUploadProgress && request.upload) {
[uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress);
request.upload.addEventListener('progress', uploadThrottled);
request.upload.addEventListener('loadend', flushUpload);
}
if (_config.cancelToken || _config.signal) {
// Handle cancellation
// eslint-disable-next-line func-names
onCanceled = (cancel) => {
if (!request) {
return;
}
reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
request.abort();
done();
request = null;
};
_config.cancelToken && _config.cancelToken.subscribe(onCanceled);
if (_config.signal) {
_config.signal.aborted
? onCanceled()
: _config.signal.addEventListener('abort', onCanceled);
}
}
const protocol = parseProtocol(_config.url);
if (protocol && !platform.protocols.includes(protocol)) {
reject(
new AxiosError(
'Unsupported protocol ' + protocol + ':',
AxiosError.ERR_BAD_REQUEST,
config
)
);
return;
}
// Send the request
request.send(requestData || null);
});
};

View File

@@ -1,89 +0,0 @@
'use strict';
import utils from './utils.js';
import bind from './helpers/bind.js';
import Axios from './core/Axios.js';
import mergeConfig from './core/mergeConfig.js';
import defaults from './defaults/index.js';
import formDataToJSON from './helpers/formDataToJSON.js';
import CanceledError from './cancel/CanceledError.js';
import CancelToken from './cancel/CancelToken.js';
import isCancel from './cancel/isCancel.js';
import { VERSION } from './env/data.js';
import toFormData from './helpers/toFormData.js';
import AxiosError from './core/AxiosError.js';
import spread from './helpers/spread.js';
import isAxiosError from './helpers/isAxiosError.js';
import AxiosHeaders from './core/AxiosHeaders.js';
import adapters from './adapters/adapters.js';
import HttpStatusCode from './helpers/HttpStatusCode.js';
/**
* Create an instance of Axios
*
* @param {Object} defaultConfig The default config for the instance
*
* @returns {Axios} A new instance of Axios
*/
function createInstance(defaultConfig) {
const context = new Axios(defaultConfig);
const instance = bind(Axios.prototype.request, context);
// Copy axios.prototype to instance
utils.extend(instance, Axios.prototype, context, { allOwnKeys: true });
// Copy context to instance
utils.extend(instance, context, null, { allOwnKeys: true });
// Factory for creating new instances
instance.create = function create(instanceConfig) {
return createInstance(mergeConfig(defaultConfig, instanceConfig));
};
return instance;
}
// Create the default instance to be exported
const axios = createInstance(defaults);
// Expose Axios class to allow class inheritance
axios.Axios = Axios;
// Expose Cancel & CancelToken
axios.CanceledError = CanceledError;
axios.CancelToken = CancelToken;
axios.isCancel = isCancel;
axios.VERSION = VERSION;
axios.toFormData = toFormData;
// Expose AxiosError class
axios.AxiosError = AxiosError;
// alias for CanceledError for backward compatibility
axios.Cancel = axios.CanceledError;
// Expose all/spread
axios.all = function all(promises) {
return Promise.all(promises);
};
axios.spread = spread;
// Expose isAxiosError
axios.isAxiosError = isAxiosError;
// Expose mergeConfig
axios.mergeConfig = mergeConfig;
axios.AxiosHeaders = AxiosHeaders;
axios.formToJSON = (thing) => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
axios.getAdapter = adapters.getAdapter;
axios.HttpStatusCode = HttpStatusCode;
axios.default = axios;
// this module should only have a default export
export default axios;

View File

@@ -1,135 +0,0 @@
'use strict';
import CanceledError from './CanceledError.js';
/**
* A `CancelToken` is an object that can be used to request cancellation of an operation.
*
* @param {Function} executor The executor function.
*
* @returns {CancelToken}
*/
class CancelToken {
constructor(executor) {
if (typeof executor !== 'function') {
throw new TypeError('executor must be a function.');
}
let resolvePromise;
this.promise = new Promise(function promiseExecutor(resolve) {
resolvePromise = resolve;
});
const token = this;
// eslint-disable-next-line func-names
this.promise.then((cancel) => {
if (!token._listeners) return;
let i = token._listeners.length;
while (i-- > 0) {
token._listeners[i](cancel);
}
token._listeners = null;
});
// eslint-disable-next-line func-names
this.promise.then = (onfulfilled) => {
let _resolve;
// eslint-disable-next-line func-names
const promise = new Promise((resolve) => {
token.subscribe(resolve);
_resolve = resolve;
}).then(onfulfilled);
promise.cancel = function reject() {
token.unsubscribe(_resolve);
};
return promise;
};
executor(function cancel(message, config, request) {
if (token.reason) {
// Cancellation has already been requested
return;
}
token.reason = new CanceledError(message, config, request);
resolvePromise(token.reason);
});
}
/**
* Throws a `CanceledError` if cancellation has been requested.
*/
throwIfRequested() {
if (this.reason) {
throw this.reason;
}
}
/**
* Subscribe to the cancel signal
*/
subscribe(listener) {
if (this.reason) {
listener(this.reason);
return;
}
if (this._listeners) {
this._listeners.push(listener);
} else {
this._listeners = [listener];
}
}
/**
* Unsubscribe from the cancel signal
*/
unsubscribe(listener) {
if (!this._listeners) {
return;
}
const index = this._listeners.indexOf(listener);
if (index !== -1) {
this._listeners.splice(index, 1);
}
}
toAbortSignal() {
const controller = new AbortController();
const abort = (err) => {
controller.abort(err);
};
this.subscribe(abort);
controller.signal.unsubscribe = () => this.unsubscribe(abort);
return controller.signal;
}
/**
* Returns an object that contains a new `CancelToken` and a function that, when called,
* cancels the `CancelToken`.
*/
static source() {
let cancel;
const token = new CancelToken(function executor(c) {
cancel = c;
});
return {
token,
cancel,
};
}
}
export default CancelToken;

View File

@@ -1,22 +0,0 @@
'use strict';
import AxiosError from '../core/AxiosError.js';
class CanceledError extends AxiosError {
/**
* A `CanceledError` is an object that is thrown when an operation is canceled.
*
* @param {string=} message The message.
* @param {Object=} config The config.
* @param {Object=} request The request.
*
* @returns {CanceledError} The created error.
*/
constructor(message, config, request) {
super(message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);
this.name = 'CanceledError';
this.__CANCEL__ = true;
}
}
export default CanceledError;

View File

@@ -1,5 +0,0 @@
'use strict';
export default function isCancel(value) {
return !!(value && value.__CANCEL__);
}

View File

@@ -1,281 +0,0 @@
'use strict';
import utils from '../utils.js';
import buildURL from '../helpers/buildURL.js';
import InterceptorManager from './InterceptorManager.js';
import dispatchRequest from './dispatchRequest.js';
import mergeConfig from './mergeConfig.js';
import buildFullPath from './buildFullPath.js';
import validator from '../helpers/validator.js';
import AxiosHeaders from './AxiosHeaders.js';
import transitionalDefaults from '../defaults/transitional.js';
const validators = validator.validators;
/**
* Create a new instance of Axios
*
* @param {Object} instanceConfig The default config for the instance
*
* @return {Axios} A new instance of Axios
*/
class Axios {
constructor(instanceConfig) {
this.defaults = instanceConfig || {};
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager(),
};
}
/**
* Dispatch a request
*
* @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
* @param {?Object} config
*
* @returns {Promise} The Promise to be fulfilled
*/
async request(configOrUrl, config) {
try {
return await this._request(configOrUrl, config);
} catch (err) {
if (err instanceof Error) {
let dummy = {};
Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());
// slice off the Error: ... line
const stack = (() => {
if (!dummy.stack) {
return '';
}
const firstNewlineIndex = dummy.stack.indexOf('\n');
return firstNewlineIndex === -1 ? '' : dummy.stack.slice(firstNewlineIndex + 1);
})();
try {
if (!err.stack) {
err.stack = stack;
// match without the 2 top stack lines
} else if (stack) {
const firstNewlineIndex = stack.indexOf('\n');
const secondNewlineIndex =
firstNewlineIndex === -1 ? -1 : stack.indexOf('\n', firstNewlineIndex + 1);
const stackWithoutTwoTopLines =
secondNewlineIndex === -1 ? '' : stack.slice(secondNewlineIndex + 1);
if (!String(err.stack).endsWith(stackWithoutTwoTopLines)) {
err.stack += '\n' + stack;
}
}
} catch (e) {
// ignore the case where "stack" is an un-writable property
}
}
throw err;
}
}
_request(configOrUrl, config) {
/*eslint no-param-reassign:0*/
// Allow for axios('example/url'[, config]) a la fetch API
if (typeof configOrUrl === 'string') {
config = config || {};
config.url = configOrUrl;
} else {
config = configOrUrl || {};
}
config = mergeConfig(this.defaults, config);
const { transitional, paramsSerializer, headers } = config;
if (transitional !== undefined) {
validator.assertOptions(
transitional,
{
silentJSONParsing: validators.transitional(validators.boolean),
forcedJSONParsing: validators.transitional(validators.boolean),
clarifyTimeoutError: validators.transitional(validators.boolean),
legacyInterceptorReqResOrdering: validators.transitional(validators.boolean),
},
false
);
}
if (paramsSerializer != null) {
if (utils.isFunction(paramsSerializer)) {
config.paramsSerializer = {
serialize: paramsSerializer,
};
} else {
validator.assertOptions(
paramsSerializer,
{
encode: validators.function,
serialize: validators.function,
},
true
);
}
}
// Set config.allowAbsoluteUrls
if (config.allowAbsoluteUrls !== undefined) {
// do nothing
} else if (this.defaults.allowAbsoluteUrls !== undefined) {
config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;
} else {
config.allowAbsoluteUrls = true;
}
validator.assertOptions(
config,
{
baseUrl: validators.spelling('baseURL'),
withXsrfToken: validators.spelling('withXSRFToken'),
},
true
);
// Set config.method
config.method = (config.method || this.defaults.method || 'get').toLowerCase();
// Flatten headers
let contextHeaders = headers && utils.merge(headers.common, headers[config.method]);
headers &&
utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'query', 'common'], (method) => {
delete headers[method];
});
config.headers = AxiosHeaders.concat(contextHeaders, headers);
// filter out skipped interceptors
const requestInterceptorChain = [];
let synchronousRequestInterceptors = true;
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
return;
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
const transitional = config.transitional || transitionalDefaults;
const legacyInterceptorReqResOrdering =
transitional && transitional.legacyInterceptorReqResOrdering;
if (legacyInterceptorReqResOrdering) {
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
} else {
requestInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
}
});
const responseInterceptorChain = [];
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
});
let promise;
let i = 0;
let len;
if (!synchronousRequestInterceptors) {
const chain = [dispatchRequest.bind(this), undefined];
chain.unshift(...requestInterceptorChain);
chain.push(...responseInterceptorChain);
len = chain.length;
promise = Promise.resolve(config);
while (i < len) {
promise = promise.then(chain[i++], chain[i++]);
}
return promise;
}
len = requestInterceptorChain.length;
let newConfig = config;
while (i < len) {
const onFulfilled = requestInterceptorChain[i++];
const onRejected = requestInterceptorChain[i++];
try {
newConfig = onFulfilled(newConfig);
} catch (error) {
onRejected.call(this, error);
break;
}
}
try {
promise = dispatchRequest.call(this, newConfig);
} catch (error) {
return Promise.reject(error);
}
i = 0;
len = responseInterceptorChain.length;
while (i < len) {
promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
}
return promise;
}
getUri(config) {
config = mergeConfig(this.defaults, config);
const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
return buildURL(fullPath, config.params, config.paramsSerializer);
}
}
// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function (url, config) {
return this.request(
mergeConfig(config || {}, {
method,
url,
data: (config || {}).data,
})
);
};
});
utils.forEach(['post', 'put', 'patch', 'query'], function forEachMethodWithData(method) {
function generateHTTPMethod(isForm) {
return function httpMethod(url, data, config) {
return this.request(
mergeConfig(config || {}, {
method,
headers: isForm
? {
'Content-Type': 'multipart/form-data',
}
: {},
url,
data,
})
);
};
}
Axios.prototype[method] = generateHTTPMethod();
// QUERY is a safe/idempotent read method; multipart form bodies don't fit
// its semantics, so no queryForm shorthand is generated.
if (method !== 'query') {
Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
}
});
export default Axios;

View File

@@ -1,176 +0,0 @@
'use strict';
import utils from '../utils.js';
import AxiosHeaders from './AxiosHeaders.js';
const REDACTED = '[REDACTED ****]';
function hasOwnOrPrototypeToJSON(source) {
if (utils.hasOwnProp(source, 'toJSON')) {
return true;
}
let prototype = Object.getPrototypeOf(source);
while (prototype && prototype !== Object.prototype) {
if (utils.hasOwnProp(prototype, 'toJSON')) {
return true;
}
prototype = Object.getPrototypeOf(prototype);
}
return false;
}
// Build a plain-object snapshot of `config` and replace the value of any key
// (case-insensitive) listed in `redactKeys` with REDACTED. Walks through arrays
// and AxiosHeaders, and short-circuits on circular references.
function redactConfig(config, redactKeys) {
const lowerKeys = new Set(redactKeys.map((k) => String(k).toLowerCase()));
const seen = [];
const visit = (source) => {
if (source === null || typeof source !== 'object') return source;
if (utils.isBuffer(source)) return source;
if (seen.indexOf(source) !== -1) return undefined;
if (source instanceof AxiosHeaders) {
source = source.toJSON();
}
seen.push(source);
let result;
if (utils.isArray(source)) {
result = [];
source.forEach((v, i) => {
const reducedValue = visit(v);
if (!utils.isUndefined(reducedValue)) {
result[i] = reducedValue;
}
});
} else {
if (!utils.isPlainObject(source) && hasOwnOrPrototypeToJSON(source)) {
seen.pop();
return source;
}
result = Object.create(null);
for (const [key, value] of Object.entries(source)) {
const reducedValue = lowerKeys.has(key.toLowerCase()) ? REDACTED : visit(value);
if (!utils.isUndefined(reducedValue)) {
result[key] = reducedValue;
}
}
}
seen.pop();
return result;
};
return visit(config);
}
class AxiosError extends Error {
static from(error, code, config, request, response, customProps) {
const axiosError = new AxiosError(error.message, code || error.code, config, request, response);
axiosError.cause = error;
axiosError.name = error.name;
// Preserve status from the original error if not already set from response
if (error.status != null && axiosError.status == null) {
axiosError.status = error.status;
}
customProps && Object.assign(axiosError, customProps);
return axiosError;
}
/**
* Create an Error with the specified message, config, error code, request and response.
*
* @param {string} message The error message.
* @param {string} [code] The error code (for example, 'ECONNABORTED').
* @param {Object} [config] The config.
* @param {Object} [request] The request.
* @param {Object} [response] The response.
*
* @returns {Error} The created error.
*/
constructor(message, code, config, request, response) {
super(message);
// Make message enumerable to maintain backward compatibility
// The native Error constructor sets message as non-enumerable,
// but axios < v1.13.3 had it as enumerable
Object.defineProperty(this, 'message', {
// Null-proto descriptor so a polluted Object.prototype.get cannot turn
// this data descriptor into an accessor descriptor on the way in.
__proto__: null,
value: message,
enumerable: true,
writable: true,
configurable: true,
});
this.name = 'AxiosError';
this.isAxiosError = true;
code && (this.code = code);
config && (this.config = config);
request && (this.request = request);
if (response) {
this.response = response;
this.status = response.status;
}
}
toJSON() {
// Opt-in redaction: when the request config carries a `redact` array, the
// value of any matching key (case-insensitive, at any depth) is replaced
// with REDACTED in the serialized snapshot. Undefined or empty leaves the
// existing serialization behavior unchanged.
const config = this.config;
const redactKeys = config && utils.hasOwnProp(config, 'redact') ? config.redact : undefined;
const serializedConfig =
utils.isArray(redactKeys) && redactKeys.length > 0
? redactConfig(config, redactKeys)
: utils.toJSONObject(config);
return {
// Standard
message: this.message,
name: this.name,
// Microsoft
description: this.description,
number: this.number,
// Mozilla
fileName: this.fileName,
lineNumber: this.lineNumber,
columnNumber: this.columnNumber,
stack: this.stack,
// Axios
config: serializedConfig,
code: this.code,
status: this.status,
};
}
}
// This can be changed to static properties as soon as the parser options in .eslint.cjs are updated.
AxiosError.ERR_BAD_OPTION_VALUE = 'ERR_BAD_OPTION_VALUE';
AxiosError.ERR_BAD_OPTION = 'ERR_BAD_OPTION';
AxiosError.ECONNABORTED = 'ECONNABORTED';
AxiosError.ETIMEDOUT = 'ETIMEDOUT';
AxiosError.ECONNREFUSED = 'ECONNREFUSED';
AxiosError.ERR_NETWORK = 'ERR_NETWORK';
AxiosError.ERR_FR_TOO_MANY_REDIRECTS = 'ERR_FR_TOO_MANY_REDIRECTS';
AxiosError.ERR_DEPRECATED = 'ERR_DEPRECATED';
AxiosError.ERR_BAD_RESPONSE = 'ERR_BAD_RESPONSE';
AxiosError.ERR_BAD_REQUEST = 'ERR_BAD_REQUEST';
AxiosError.ERR_CANCELED = 'ERR_CANCELED';
AxiosError.ERR_NOT_SUPPORT = 'ERR_NOT_SUPPORT';
AxiosError.ERR_INVALID_URL = 'ERR_INVALID_URL';
AxiosError.ERR_FORM_DATA_DEPTH_EXCEEDED = 'ERR_FORM_DATA_DEPTH_EXCEEDED';
export default AxiosError;

View File

@@ -1,348 +0,0 @@
'use strict';
import utils from '../utils.js';
import parseHeaders from '../helpers/parseHeaders.js';
import { sanitizeHeaderValue } from '../helpers/sanitizeHeaderValue.js';
const $internals = Symbol('internals');
function normalizeHeader(header) {
return header && String(header).trim().toLowerCase();
}
function normalizeValue(value) {
if (value === false || value == null) {
return value;
}
return utils.isArray(value) ? value.map(normalizeValue) : sanitizeHeaderValue(String(value));
}
function parseTokens(str) {
const tokens = Object.create(null);
const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
let match;
while ((match = tokensRE.exec(str))) {
tokens[match[1]] = match[2];
}
return tokens;
}
const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());
function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {
if (utils.isFunction(filter)) {
return filter.call(this, value, header);
}
if (isHeaderNameFilter) {
value = header;
}
if (!utils.isString(value)) return;
if (utils.isString(filter)) {
return value.indexOf(filter) !== -1;
}
if (utils.isRegExp(filter)) {
return filter.test(value);
}
}
function formatHeader(header) {
return header
.trim()
.toLowerCase()
.replace(/([a-z\d])(\w*)/g, (w, char, str) => {
return char.toUpperCase() + str;
});
}
function buildAccessors(obj, header) {
const accessorName = utils.toCamelCase(' ' + header);
['get', 'set', 'has'].forEach((methodName) => {
Object.defineProperty(obj, methodName + accessorName, {
// Null-proto descriptor so a polluted Object.prototype.get cannot turn
// this data descriptor into an accessor descriptor on the way in.
__proto__: null,
value: function (arg1, arg2, arg3) {
return this[methodName].call(this, header, arg1, arg2, arg3);
},
configurable: true,
});
});
}
class AxiosHeaders {
constructor(headers) {
headers && this.set(headers);
}
set(header, valueOrRewrite, rewrite) {
const self = this;
function setHeader(_value, _header, _rewrite) {
const lHeader = normalizeHeader(_header);
if (!lHeader) {
throw new Error('header name must be a non-empty string');
}
const key = utils.findKey(self, lHeader);
if (
!key ||
self[key] === undefined ||
_rewrite === true ||
(_rewrite === undefined && self[key] !== false)
) {
self[key || _header] = normalizeValue(_value);
}
}
const setHeaders = (headers, _rewrite) =>
utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
if (utils.isPlainObject(header) || header instanceof this.constructor) {
setHeaders(header, valueOrRewrite);
} else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
setHeaders(parseHeaders(header), valueOrRewrite);
} else if (utils.isObject(header) && utils.isIterable(header)) {
let obj = {},
dest,
key;
for (const entry of header) {
if (!utils.isArray(entry)) {
throw TypeError('Object iterator must return a key-value pair');
}
obj[(key = entry[0])] = (dest = obj[key])
? utils.isArray(dest)
? [...dest, entry[1]]
: [dest, entry[1]]
: entry[1];
}
setHeaders(obj, valueOrRewrite);
} else {
header != null && setHeader(valueOrRewrite, header, rewrite);
}
return this;
}
get(header, parser) {
header = normalizeHeader(header);
if (header) {
const key = utils.findKey(this, header);
if (key) {
const value = this[key];
if (!parser) {
return value;
}
if (parser === true) {
return parseTokens(value);
}
if (utils.isFunction(parser)) {
return parser.call(this, value, key);
}
if (utils.isRegExp(parser)) {
return parser.exec(value);
}
throw new TypeError('parser must be boolean|regexp|function');
}
}
}
has(header, matcher) {
header = normalizeHeader(header);
if (header) {
const key = utils.findKey(this, header);
return !!(
key &&
this[key] !== undefined &&
(!matcher || matchHeaderValue(this, this[key], key, matcher))
);
}
return false;
}
delete(header, matcher) {
const self = this;
let deleted = false;
function deleteHeader(_header) {
_header = normalizeHeader(_header);
if (_header) {
const key = utils.findKey(self, _header);
if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
delete self[key];
deleted = true;
}
}
}
if (utils.isArray(header)) {
header.forEach(deleteHeader);
} else {
deleteHeader(header);
}
return deleted;
}
clear(matcher) {
const keys = Object.keys(this);
let i = keys.length;
let deleted = false;
while (i--) {
const key = keys[i];
if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
delete this[key];
deleted = true;
}
}
return deleted;
}
normalize(format) {
const self = this;
const headers = {};
utils.forEach(this, (value, header) => {
const key = utils.findKey(headers, header);
if (key) {
self[key] = normalizeValue(value);
delete self[header];
return;
}
const normalized = format ? formatHeader(header) : String(header).trim();
if (normalized !== header) {
delete self[header];
}
self[normalized] = normalizeValue(value);
headers[normalized] = true;
});
return this;
}
concat(...targets) {
return this.constructor.concat(this, ...targets);
}
toJSON(asStrings) {
const obj = Object.create(null);
utils.forEach(this, (value, header) => {
value != null &&
value !== false &&
(obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);
});
return obj;
}
[Symbol.iterator]() {
return Object.entries(this.toJSON())[Symbol.iterator]();
}
toString() {
return Object.entries(this.toJSON())
.map(([header, value]) => header + ': ' + value)
.join('\n');
}
getSetCookie() {
return this.get('set-cookie') || [];
}
get [Symbol.toStringTag]() {
return 'AxiosHeaders';
}
static from(thing) {
return thing instanceof this ? thing : new this(thing);
}
static concat(first, ...targets) {
const computed = new this(first);
targets.forEach((target) => computed.set(target));
return computed;
}
static accessor(header) {
const internals =
(this[$internals] =
this[$internals] =
{
accessors: {},
});
const accessors = internals.accessors;
const prototype = this.prototype;
function defineAccessor(_header) {
const lHeader = normalizeHeader(_header);
if (!accessors[lHeader]) {
buildAccessors(prototype, _header);
accessors[lHeader] = true;
}
}
utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
return this;
}
}
AxiosHeaders.accessor([
'Content-Type',
'Content-Length',
'Accept',
'Accept-Encoding',
'User-Agent',
'Authorization',
]);
// reserved names hotfix
utils.reduceDescriptors(AxiosHeaders.prototype, ({ value }, key) => {
let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`
return {
get: () => value,
set(headerValue) {
this[mapped] = headerValue;
},
};
});
utils.freezeMethods(AxiosHeaders);
export default AxiosHeaders;

View File

@@ -1,72 +0,0 @@
'use strict';
import utils from '../utils.js';
class InterceptorManager {
constructor() {
this.handlers = [];
}
/**
* Add a new interceptor to the stack
*
* @param {Function} fulfilled The function to handle `then` for a `Promise`
* @param {Function} rejected The function to handle `reject` for a `Promise`
* @param {Object} options The options for the interceptor, synchronous and runWhen
*
* @return {Number} An ID used to remove interceptor later
*/
use(fulfilled, rejected, options) {
this.handlers.push({
fulfilled,
rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null,
});
return this.handlers.length - 1;
}
/**
* Remove an interceptor from the stack
*
* @param {Number} id The ID that was returned by `use`
*
* @returns {void}
*/
eject(id) {
if (this.handlers[id]) {
this.handlers[id] = null;
}
}
/**
* Clear all interceptors from the stack
*
* @returns {void}
*/
clear() {
if (this.handlers) {
this.handlers = [];
}
}
/**
* Iterate over all the registered interceptors
*
* This method is particularly useful for skipping over any
* interceptors that may have become `null` calling `eject`.
*
* @param {Function} fn The function to call for each interceptor
*
* @returns {void}
*/
forEach(fn) {
utils.forEach(this.handlers, function forEachHandler(h) {
if (h !== null) {
fn(h);
}
});
}
}
export default InterceptorManager;

View File

@@ -1,8 +0,0 @@
# axios // core
The modules found in `core/` should be modules that are specific to the domain logic of axios. These modules would most likely not make sense to be consumed outside of the axios module, as their logic is too specific. Some examples of core modules are:
- Dispatching requests
- Requests sent via `adapters/` (see lib/adapters/README.md)
- Managing interceptors
- Handling config

View File

@@ -1,22 +0,0 @@
'use strict';
import isAbsoluteURL from '../helpers/isAbsoluteURL.js';
import combineURLs from '../helpers/combineURLs.js';
/**
* Creates a new URL by combining the baseURL with the requestedURL,
* only when the requestedURL is not already an absolute URL.
* If the requestURL is absolute, this function returns the requestedURL untouched.
*
* @param {string} baseURL The base URL
* @param {string} requestedURL Absolute or relative URL to combine
*
* @returns {string} The combined full path
*/
export default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
let isRelativeUrl = !isAbsoluteURL(requestedURL);
if (baseURL && (isRelativeUrl || allowAbsoluteUrls === false)) {
return combineURLs(baseURL, requestedURL);
}
return requestedURL;
}

View File

@@ -1,89 +0,0 @@
'use strict';
import transformData from './transformData.js';
import isCancel from '../cancel/isCancel.js';
import defaults from '../defaults/index.js';
import CanceledError from '../cancel/CanceledError.js';
import AxiosHeaders from '../core/AxiosHeaders.js';
import adapters from '../adapters/adapters.js';
/**
* Throws a `CanceledError` if cancellation has been requested.
*
* @param {Object} config The config that is to be used for the request
*
* @returns {void}
*/
function throwIfCancellationRequested(config) {
if (config.cancelToken) {
config.cancelToken.throwIfRequested();
}
if (config.signal && config.signal.aborted) {
throw new CanceledError(null, config);
}
}
/**
* Dispatch a request to the server using the configured adapter.
*
* @param {object} config The config that is to be used for the request
*
* @returns {Promise} The Promise to be fulfilled
*/
export default function dispatchRequest(config) {
throwIfCancellationRequested(config);
config.headers = AxiosHeaders.from(config.headers);
// Transform request data
config.data = transformData.call(config, config.transformRequest);
if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {
config.headers.setContentType('application/x-www-form-urlencoded', false);
}
const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);
return adapter(config).then(
function onAdapterResolution(response) {
throwIfCancellationRequested(config);
// Expose the current response on config so that transformResponse can
// attach it to any AxiosError it throws (e.g. on JSON parse failure).
// We clean it up afterwards to avoid polluting the config object.
config.response = response;
try {
response.data = transformData.call(config, config.transformResponse, response);
} finally {
delete config.response;
}
response.headers = AxiosHeaders.from(response.headers);
return response;
},
function onAdapterRejection(reason) {
if (!isCancel(reason)) {
throwIfCancellationRequested(config);
// Transform response data
if (reason && reason.response) {
config.response = reason.response;
try {
reason.response.data = transformData.call(
config,
config.transformResponse,
reason.response
);
} finally {
delete config.response;
}
reason.response.headers = AxiosHeaders.from(reason.response.headers);
}
}
return Promise.reject(reason);
}
);
}

View File

@@ -1,124 +0,0 @@
'use strict';
import utils from '../utils.js';
import AxiosHeaders from './AxiosHeaders.js';
const headersToObject = (thing) => (thing instanceof AxiosHeaders ? { ...thing } : thing);
/**
* Config-specific merge-function which creates a new config-object
* by merging two configuration objects together.
*
* @param {Object} config1
* @param {Object} config2
*
* @returns {Object} New object resulting from merging config2 to config1
*/
export default function mergeConfig(config1, config2) {
// eslint-disable-next-line no-param-reassign
config2 = config2 || {};
// Use a null-prototype object so that downstream reads such as `config.auth`
// or `config.baseURL` cannot inherit polluted values from Object.prototype.
// `hasOwnProperty` is restored as a non-enumerable own slot to preserve
// ergonomics for user code that relies on it.
const config = Object.create(null);
Object.defineProperty(config, 'hasOwnProperty', {
// Null-proto descriptor so a polluted Object.prototype.get cannot turn
// this data descriptor into an accessor descriptor on the way in.
__proto__: null,
value: Object.prototype.hasOwnProperty,
enumerable: false,
writable: true,
configurable: true,
});
function getMergedValue(target, source, prop, caseless) {
if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
return utils.merge.call({ caseless }, target, source);
} else if (utils.isPlainObject(source)) {
return utils.merge({}, source);
} else if (utils.isArray(source)) {
return source.slice();
}
return source;
}
function mergeDeepProperties(a, b, prop, caseless) {
if (!utils.isUndefined(b)) {
return getMergedValue(a, b, prop, caseless);
} else if (!utils.isUndefined(a)) {
return getMergedValue(undefined, a, prop, caseless);
}
}
// eslint-disable-next-line consistent-return
function valueFromConfig2(a, b) {
if (!utils.isUndefined(b)) {
return getMergedValue(undefined, b);
}
}
// eslint-disable-next-line consistent-return
function defaultToConfig2(a, b) {
if (!utils.isUndefined(b)) {
return getMergedValue(undefined, b);
} else if (!utils.isUndefined(a)) {
return getMergedValue(undefined, a);
}
}
// eslint-disable-next-line consistent-return
function mergeDirectKeys(a, b, prop) {
if (utils.hasOwnProp(config2, prop)) {
return getMergedValue(a, b);
} else if (utils.hasOwnProp(config1, prop)) {
return getMergedValue(undefined, a);
}
}
const mergeMap = {
url: valueFromConfig2,
method: valueFromConfig2,
data: valueFromConfig2,
baseURL: defaultToConfig2,
transformRequest: defaultToConfig2,
transformResponse: defaultToConfig2,
paramsSerializer: defaultToConfig2,
timeout: defaultToConfig2,
timeoutMessage: defaultToConfig2,
withCredentials: defaultToConfig2,
withXSRFToken: defaultToConfig2,
adapter: defaultToConfig2,
responseType: defaultToConfig2,
xsrfCookieName: defaultToConfig2,
xsrfHeaderName: defaultToConfig2,
onUploadProgress: defaultToConfig2,
onDownloadProgress: defaultToConfig2,
decompress: defaultToConfig2,
maxContentLength: defaultToConfig2,
maxBodyLength: defaultToConfig2,
beforeRedirect: defaultToConfig2,
transport: defaultToConfig2,
httpAgent: defaultToConfig2,
httpsAgent: defaultToConfig2,
cancelToken: defaultToConfig2,
socketPath: defaultToConfig2,
allowedSocketPaths: defaultToConfig2,
responseEncoding: defaultToConfig2,
validateStatus: mergeDirectKeys,
headers: (a, b, prop) =>
mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true),
};
utils.forEach(Object.keys({ ...config1, ...config2 }), function computeConfigValue(prop) {
if (prop === '__proto__' || prop === 'constructor' || prop === 'prototype') return;
const merge = utils.hasOwnProp(mergeMap, prop) ? mergeMap[prop] : mergeDeepProperties;
const a = utils.hasOwnProp(config1, prop) ? config1[prop] : undefined;
const b = utils.hasOwnProp(config2, prop) ? config2[prop] : undefined;
const configValue = merge(a, b, prop);
(utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
});
return config;
}

View File

@@ -1,27 +0,0 @@
'use strict';
import AxiosError from './AxiosError.js';
/**
* Resolve or reject a Promise based on response status.
*
* @param {Function} resolve A function that resolves the promise.
* @param {Function} reject A function that rejects the promise.
* @param {object} response The response.
*
* @returns {object} The response.
*/
export default function settle(resolve, reject, response) {
const validateStatus = response.config.validateStatus;
if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(new AxiosError(
'Request failed with status code ' + response.status,
response.status >= 400 && response.status < 500 ? AxiosError.ERR_BAD_REQUEST : AxiosError.ERR_BAD_RESPONSE,
response.config,
response.request,
response
));
}
}

View File

@@ -1,28 +0,0 @@
'use strict';
import utils from '../utils.js';
import defaults from '../defaults/index.js';
import AxiosHeaders from '../core/AxiosHeaders.js';
/**
* Transform the data for a request or a response
*
* @param {Array|Function} fns A single function or Array of functions
* @param {?Object} response The response object
*
* @returns {*} The resulting transformed data
*/
export default function transformData(fns, response) {
const config = this || defaults;
const context = response || config;
const headers = AxiosHeaders.from(context.headers);
let data = context.data;
utils.forEach(fns, function transform(fn) {
data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);
});
headers.normalize();
return data;
}

View File

@@ -1,177 +0,0 @@
'use strict';
import utils from '../utils.js';
import AxiosError from '../core/AxiosError.js';
import transitionalDefaults from './transitional.js';
import toFormData from '../helpers/toFormData.js';
import toURLEncodedForm from '../helpers/toURLEncodedForm.js';
import platform from '../platform/index.js';
import formDataToJSON from '../helpers/formDataToJSON.js';
const own = (obj, key) => (obj != null && utils.hasOwnProp(obj, key) ? obj[key] : undefined);
/**
* It takes a string, tries to parse it, and if it fails, it returns the stringified version
* of the input
*
* @param {any} rawValue - The value to be stringified.
* @param {Function} parser - A function that parses a string into a JavaScript object.
* @param {Function} encoder - A function that takes a value and returns a string.
*
* @returns {string} A stringified version of the rawValue.
*/
function stringifySafely(rawValue, parser, encoder) {
if (utils.isString(rawValue)) {
try {
(parser || JSON.parse)(rawValue);
return utils.trim(rawValue);
} catch (e) {
if (e.name !== 'SyntaxError') {
throw e;
}
}
}
return (encoder || JSON.stringify)(rawValue);
}
const defaults = {
transitional: transitionalDefaults,
adapter: ['xhr', 'http', 'fetch'],
transformRequest: [
function transformRequest(data, headers) {
const contentType = headers.getContentType() || '';
const hasJSONContentType = contentType.indexOf('application/json') > -1;
const isObjectPayload = utils.isObject(data);
if (isObjectPayload && utils.isHTMLForm(data)) {
data = new FormData(data);
}
const isFormData = utils.isFormData(data);
if (isFormData) {
return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
}
if (
utils.isArrayBuffer(data) ||
utils.isBuffer(data) ||
utils.isStream(data) ||
utils.isFile(data) ||
utils.isBlob(data) ||
utils.isReadableStream(data)
) {
return data;
}
if (utils.isArrayBufferView(data)) {
return data.buffer;
}
if (utils.isURLSearchParams(data)) {
headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
return data.toString();
}
let isFileList;
if (isObjectPayload) {
const formSerializer = own(this, 'formSerializer');
if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
return toURLEncodedForm(data, formSerializer).toString();
}
if (
(isFileList = utils.isFileList(data)) ||
contentType.indexOf('multipart/form-data') > -1
) {
const env = own(this, 'env');
const _FormData = env && env.FormData;
return toFormData(
isFileList ? { 'files[]': data } : data,
_FormData && new _FormData(),
formSerializer
);
}
}
if (isObjectPayload || hasJSONContentType) {
headers.setContentType('application/json', false);
return stringifySafely(data);
}
return data;
},
],
transformResponse: [
function transformResponse(data) {
const transitional = own(this, 'transitional') || defaults.transitional;
const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
const responseType = own(this, 'responseType');
const JSONRequested = responseType === 'json';
if (utils.isResponse(data) || utils.isReadableStream(data)) {
return data;
}
if (
data &&
utils.isString(data) &&
((forcedJSONParsing && !responseType) || JSONRequested)
) {
const silentJSONParsing = transitional && transitional.silentJSONParsing;
const strictJSONParsing = !silentJSONParsing && JSONRequested;
try {
return JSON.parse(data, own(this, 'parseReviver'));
} catch (e) {
if (strictJSONParsing) {
if (e.name === 'SyntaxError') {
throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, own(this, 'response'));
}
throw e;
}
}
}
return data;
},
],
/**
* A timeout in milliseconds to abort a request. If set to 0 (default) a
* timeout is not created.
*/
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
env: {
FormData: platform.classes.FormData,
Blob: platform.classes.Blob,
},
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
},
headers: {
common: {
Accept: 'application/json, text/plain, */*',
'Content-Type': undefined,
},
},
};
utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'query'], (method) => {
defaults.headers[method] = {};
});
export default defaults;

View File

@@ -1,8 +0,0 @@
'use strict';
export default {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false,
legacyInterceptorReqResOrdering: true,
};

View File

@@ -1,3 +0,0 @@
# axios // env
The `data.js` file is updated automatically when the package version is upgrading. Please do not edit it manually.

View File

@@ -1,2 +0,0 @@
import _FormData from 'form-data';
export default typeof FormData !== 'undefined' ? FormData : _FormData;

View File

@@ -1 +0,0 @@
export const VERSION = "1.16.1";

View File

@@ -1,156 +0,0 @@
'use strict';
import stream from 'stream';
import utils from '../utils.js';
const kInternals = Symbol('internals');
class AxiosTransformStream extends stream.Transform {
constructor(options) {
options = utils.toFlatObject(
options,
{
maxRate: 0,
chunkSize: 64 * 1024,
minChunkSize: 100,
timeWindow: 500,
ticksRate: 2,
samplesCount: 15,
},
null,
(prop, source) => {
return !utils.isUndefined(source[prop]);
}
);
super({
readableHighWaterMark: options.chunkSize,
});
const internals = (this[kInternals] = {
timeWindow: options.timeWindow,
chunkSize: options.chunkSize,
maxRate: options.maxRate,
minChunkSize: options.minChunkSize,
bytesSeen: 0,
isCaptured: false,
notifiedBytesLoaded: 0,
ts: Date.now(),
bytes: 0,
onReadCallback: null,
});
this.on('newListener', (event) => {
if (event === 'progress') {
if (!internals.isCaptured) {
internals.isCaptured = true;
}
}
});
}
_read(size) {
const internals = this[kInternals];
if (internals.onReadCallback) {
internals.onReadCallback();
}
return super._read(size);
}
_transform(chunk, encoding, callback) {
const internals = this[kInternals];
const maxRate = internals.maxRate;
const readableHighWaterMark = this.readableHighWaterMark;
const timeWindow = internals.timeWindow;
const divider = 1000 / timeWindow;
const bytesThreshold = maxRate / divider;
const minChunkSize =
internals.minChunkSize !== false
? Math.max(internals.minChunkSize, bytesThreshold * 0.01)
: 0;
const pushChunk = (_chunk, _callback) => {
const bytes = Buffer.byteLength(_chunk);
internals.bytesSeen += bytes;
internals.bytes += bytes;
internals.isCaptured && this.emit('progress', internals.bytesSeen);
if (this.push(_chunk)) {
process.nextTick(_callback);
} else {
internals.onReadCallback = () => {
internals.onReadCallback = null;
process.nextTick(_callback);
};
}
};
const transformChunk = (_chunk, _callback) => {
const chunkSize = Buffer.byteLength(_chunk);
let chunkRemainder = null;
let maxChunkSize = readableHighWaterMark;
let bytesLeft;
let passed = 0;
if (maxRate) {
const now = Date.now();
if (!internals.ts || (passed = now - internals.ts) >= timeWindow) {
internals.ts = now;
bytesLeft = bytesThreshold - internals.bytes;
internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;
passed = 0;
}
bytesLeft = bytesThreshold - internals.bytes;
}
if (maxRate) {
if (bytesLeft <= 0) {
// next time window
return setTimeout(() => {
_callback(null, _chunk);
}, timeWindow - passed);
}
if (bytesLeft < maxChunkSize) {
maxChunkSize = bytesLeft;
}
}
if (maxChunkSize && chunkSize > maxChunkSize && chunkSize - maxChunkSize > minChunkSize) {
chunkRemainder = _chunk.subarray(maxChunkSize);
_chunk = _chunk.subarray(0, maxChunkSize);
}
pushChunk(
_chunk,
chunkRemainder
? () => {
process.nextTick(_callback, null, chunkRemainder);
}
: _callback
);
};
transformChunk(chunk, function transformNextChunk(err, _chunk) {
if (err) {
return callback(err);
}
if (_chunk) {
transformChunk(_chunk, transformNextChunk);
} else {
callback(null);
}
});
}
}
export default AxiosTransformStream;

View File

@@ -1,61 +0,0 @@
'use strict';
import toFormData from './toFormData.js';
/**
* It encodes a string by replacing all characters that are not in the unreserved set with
* their percent-encoded equivalents
*
* @param {string} str - The string to encode.
*
* @returns {string} The encoded string.
*/
function encode(str) {
const charMap = {
'!': '%21',
"'": '%27',
'(': '%28',
')': '%29',
'~': '%7E',
'%20': '+',
};
return encodeURIComponent(str).replace(/[!'()~]|%20/g, function replacer(match) {
return charMap[match];
});
}
/**
* It takes a params object and converts it to a FormData object
*
* @param {Object<string, any>} params - The parameters to be converted to a FormData object.
* @param {Object<string, any>} options - The options object passed to the Axios constructor.
*
* @returns {void}
*/
function AxiosURLSearchParams(params, options) {
this._pairs = [];
params && toFormData(params, this, options);
}
const prototype = AxiosURLSearchParams.prototype;
prototype.append = function append(name, value) {
this._pairs.push([name, value]);
};
prototype.toString = function toString(encoder) {
const _encode = encoder
? function (value) {
return encoder.call(this, value, encode);
}
: encode;
return this._pairs
.map(function each(pair) {
return _encode(pair[0]) + '=' + _encode(pair[1]);
}, '')
.join('&');
};
export default AxiosURLSearchParams;

View File

@@ -1,77 +0,0 @@
const HttpStatusCode = {
Continue: 100,
SwitchingProtocols: 101,
Processing: 102,
EarlyHints: 103,
Ok: 200,
Created: 201,
Accepted: 202,
NonAuthoritativeInformation: 203,
NoContent: 204,
ResetContent: 205,
PartialContent: 206,
MultiStatus: 207,
AlreadyReported: 208,
ImUsed: 226,
MultipleChoices: 300,
MovedPermanently: 301,
Found: 302,
SeeOther: 303,
NotModified: 304,
UseProxy: 305,
Unused: 306,
TemporaryRedirect: 307,
PermanentRedirect: 308,
BadRequest: 400,
Unauthorized: 401,
PaymentRequired: 402,
Forbidden: 403,
NotFound: 404,
MethodNotAllowed: 405,
NotAcceptable: 406,
ProxyAuthenticationRequired: 407,
RequestTimeout: 408,
Conflict: 409,
Gone: 410,
LengthRequired: 411,
PreconditionFailed: 412,
PayloadTooLarge: 413,
UriTooLong: 414,
UnsupportedMediaType: 415,
RangeNotSatisfiable: 416,
ExpectationFailed: 417,
ImATeapot: 418,
MisdirectedRequest: 421,
UnprocessableEntity: 422,
Locked: 423,
FailedDependency: 424,
TooEarly: 425,
UpgradeRequired: 426,
PreconditionRequired: 428,
TooManyRequests: 429,
RequestHeaderFieldsTooLarge: 431,
UnavailableForLegalReasons: 451,
InternalServerError: 500,
NotImplemented: 501,
BadGateway: 502,
ServiceUnavailable: 503,
GatewayTimeout: 504,
HttpVersionNotSupported: 505,
VariantAlsoNegotiates: 506,
InsufficientStorage: 507,
LoopDetected: 508,
NotExtended: 510,
NetworkAuthenticationRequired: 511,
WebServerIsDown: 521,
ConnectionTimedOut: 522,
OriginIsUnreachable: 523,
TimeoutOccurred: 524,
SslHandshakeFailed: 525,
InvalidSslCertificate: 526,
};
Object.entries(HttpStatusCode).forEach(([key, value]) => {
HttpStatusCode[value] = key;
});
export default HttpStatusCode;

View File

@@ -1,7 +0,0 @@
# axios // helpers
The modules found in `helpers/` should be generic modules that are _not_ specific to the domain logic of axios. These modules could theoretically be published to npm on their own and consumed by other modules or apps. Some examples of generic modules are things like:
- Browser polyfills
- Managing cookies
- Parsing HTTP headers

View File

@@ -1,29 +0,0 @@
'use strict';
import stream from 'stream';
class ZlibHeaderTransformStream extends stream.Transform {
__transform(chunk, encoding, callback) {
this.push(chunk);
callback();
}
_transform(chunk, encoding, callback) {
if (chunk.length !== 0) {
this._transform = this.__transform;
// Add Default Compression headers if no zlib headers are present
if (chunk[0] !== 120) {
// Hex: 78
const header = Buffer.alloc(2);
header[0] = 120; // Hex: 78
header[1] = 156; // Hex: 9C
this.push(header, encoding);
}
}
this.__transform(chunk, encoding, callback);
}
}
export default ZlibHeaderTransformStream;

View File

@@ -1,14 +0,0 @@
'use strict';
/**
* Create a bound version of a function with a specified `this` context
*
* @param {Function} fn - The function to bind
* @param {*} thisArg - The value to be passed as the `this` parameter
* @returns {Function} A new function that will call the original function with the specified `this` context
*/
export default function bind(fn, thisArg) {
return function wrap() {
return fn.apply(thisArg, arguments);
};
}

View File

@@ -1,66 +0,0 @@
'use strict';
import utils from '../utils.js';
import AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';
/**
* It replaces URL-encoded forms of `:`, `$`, `,`, and spaces with
* their plain counterparts (`:`, `$`, `,`, `+`).
*
* @param {string} val The value to be encoded.
*
* @returns {string} The encoded value.
*/
export function encode(val) {
return encodeURIComponent(val)
.replace(/%3A/gi, ':')
.replace(/%24/g, '$')
.replace(/%2C/gi, ',')
.replace(/%20/g, '+');
}
/**
* Build a URL by appending params to the end
*
* @param {string} url The base of the url (e.g., http://www.google.com)
* @param {object} [params] The params to be appended
* @param {?(object|Function)} options
*
* @returns {string} The formatted url
*/
export default function buildURL(url, params, options) {
if (!params) {
return url;
}
const _encode = (options && options.encode) || encode;
const _options = utils.isFunction(options)
? {
serialize: options,
}
: options;
const serializeFn = _options && _options.serialize;
let serializedParams;
if (serializeFn) {
serializedParams = serializeFn(params, _options);
} else {
serializedParams = utils.isURLSearchParams(params)
? params.toString()
: new AxiosURLSearchParams(params, _options).toString(_encode);
}
if (serializedParams) {
const hashmarkIndex = url.indexOf('#');
if (hashmarkIndex !== -1) {
url = url.slice(0, hashmarkIndex);
}
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
}
return url;
}

View File

@@ -1,18 +0,0 @@
import utils from '../utils.js';
const callbackify = (fn, reducer) => {
return utils.isAsyncFn(fn)
? function (...args) {
const cb = args.pop();
fn.apply(this, args).then((value) => {
try {
reducer ? cb(null, ...reducer(value)) : cb(null, value);
} catch (err) {
cb(err);
}
}, cb);
}
: fn;
};
export default callbackify;

View File

@@ -1,15 +0,0 @@
'use strict';
/**
* Creates a new URL by combining the specified URLs
*
* @param {string} baseURL The base URL
* @param {string} relativeURL The relative URL
*
* @returns {string} The combined URL
*/
export default function combineURLs(baseURL, relativeURL) {
return relativeURL
? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '')
: baseURL;
}

View File

@@ -1,57 +0,0 @@
import CanceledError from '../cancel/CanceledError.js';
import AxiosError from '../core/AxiosError.js';
import utils from '../utils.js';
const composeSignals = (signals, timeout) => {
signals = signals ? signals.filter(Boolean) : [];
if (!timeout && !signals.length) {
return;
}
const controller = new AbortController();
let aborted = false;
const onabort = function (reason) {
if (!aborted) {
aborted = true;
unsubscribe();
const err = reason instanceof Error ? reason : this.reason;
controller.abort(
err instanceof AxiosError
? err
: new CanceledError(err instanceof Error ? err.message : err)
);
}
};
let timer =
timeout &&
setTimeout(() => {
timer = null;
onabort(new AxiosError(`timeout of ${timeout}ms exceeded`, AxiosError.ETIMEDOUT));
}, timeout);
const unsubscribe = () => {
if (!signals) { return; }
timer && clearTimeout(timer);
timer = null;
signals.forEach((signal) => {
signal.unsubscribe
? signal.unsubscribe(onabort)
: signal.removeEventListener('abort', onabort);
});
signals = null;
};
signals.forEach((signal) => signal.addEventListener('abort', onabort));
const { signal } = controller;
signal.unsubscribe = () => utils.asap(unsubscribe);
return signal;
};
export default composeSignals;

View File

@@ -1,60 +0,0 @@
import utils from '../utils.js';
import platform from '../platform/index.js';
export default platform.hasStandardBrowserEnv
? // Standard browser envs support document.cookie
{
write(name, value, expires, path, domain, secure, sameSite) {
if (typeof document === 'undefined') return;
const cookie = [`${name}=${encodeURIComponent(value)}`];
if (utils.isNumber(expires)) {
cookie.push(`expires=${new Date(expires).toUTCString()}`);
}
if (utils.isString(path)) {
cookie.push(`path=${path}`);
}
if (utils.isString(domain)) {
cookie.push(`domain=${domain}`);
}
if (secure === true) {
cookie.push('secure');
}
if (utils.isString(sameSite)) {
cookie.push(`SameSite=${sameSite}`);
}
document.cookie = cookie.join('; ');
},
read(name) {
if (typeof document === 'undefined') return null;
// Match name=value by splitting on the semicolon separator instead of building a
// RegExp from `name` — interpolating an unescaped string into a RegExp would let
// metacharacters (e.g. `.+?` in an attacker-influenced cookie name) cause ReDoS or
// match the wrong cookie. Browsers may serialize cookie pairs as either ";" or
// "; ", so ignore optional whitespace before each cookie name.
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].replace(/^\s+/, '');
const eq = cookie.indexOf('=');
if (eq !== -1 && cookie.slice(0, eq) === name) {
return decodeURIComponent(cookie.slice(eq + 1));
}
}
return null;
},
remove(name) {
this.write(name, '', Date.now() - 86400000, '/');
},
}
: // Non-standard browser env (web workers, react-native) lack needed support.
{
write() {},
read() {
return null;
},
remove() {},
};

View File

@@ -1,31 +0,0 @@
'use strict';
/*eslint no-console:0*/
/**
* Supply a warning to the developer that a method they are using
* has been deprecated.
*
* @param {string} method The name of the deprecated method
* @param {string} [instead] The alternate method to use if applicable
* @param {string} [docs] The documentation URL to get further details
*
* @returns {void}
*/
export default function deprecatedMethod(method, instead, docs) {
try {
console.warn(
'DEPRECATED method `' +
method +
'`.' +
(instead ? ' Use `' + instead + '` instead.' : '') +
' This method will be removed in a future release.'
);
if (docs) {
console.warn('For more information about usage see ' + docs);
}
} catch (e) {
/* Ignore */
}
}

View File

@@ -1,100 +0,0 @@
/**
* Estimate decoded byte length of a data:// URL *without* allocating large buffers.
* - For base64: compute exact decoded size using length and padding;
* handle %XX at the character-count level (no string allocation).
* - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound.
*
* @param {string} url
* @returns {number}
*/
export default function estimateDataURLDecodedBytes(url) {
if (!url || typeof url !== 'string') return 0;
if (!url.startsWith('data:')) return 0;
const comma = url.indexOf(',');
if (comma < 0) return 0;
const meta = url.slice(5, comma);
const body = url.slice(comma + 1);
const isBase64 = /;base64/i.test(meta);
if (isBase64) {
let effectiveLen = body.length;
const len = body.length; // cache length
for (let i = 0; i < len; i++) {
if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) {
const a = body.charCodeAt(i + 1);
const b = body.charCodeAt(i + 2);
const isHex =
((a >= 48 && a <= 57) || (a >= 65 && a <= 70) || (a >= 97 && a <= 102)) &&
((b >= 48 && b <= 57) || (b >= 65 && b <= 70) || (b >= 97 && b <= 102));
if (isHex) {
effectiveLen -= 2;
i += 2;
}
}
}
let pad = 0;
let idx = len - 1;
const tailIsPct3D = (j) =>
j >= 2 &&
body.charCodeAt(j - 2) === 37 && // '%'
body.charCodeAt(j - 1) === 51 && // '3'
(body.charCodeAt(j) === 68 || body.charCodeAt(j) === 100); // 'D' or 'd'
if (idx >= 0) {
if (body.charCodeAt(idx) === 61 /* '=' */) {
pad++;
idx--;
} else if (tailIsPct3D(idx)) {
pad++;
idx -= 3;
}
}
if (pad === 1 && idx >= 0) {
if (body.charCodeAt(idx) === 61 /* '=' */) {
pad++;
} else if (tailIsPct3D(idx)) {
pad++;
}
}
const groups = Math.floor(effectiveLen / 4);
const bytes = groups * 3 - (pad || 0);
return bytes > 0 ? bytes : 0;
}
if (typeof Buffer !== 'undefined' && typeof Buffer.byteLength === 'function') {
return Buffer.byteLength(body, 'utf8');
}
// Compute UTF-8 byte length directly from UTF-16 code units without allocating
// a byte buffer (TextEncoder.encode would defeat the DoS guard on large bodies).
// Using body.length here would undercount non-ASCII (e.g. '€' is 1 code unit
// but 3 UTF-8 bytes).
let bytes = 0;
for (let i = 0, len = body.length; i < len; i++) {
const c = body.charCodeAt(i);
if (c < 0x80) {
bytes += 1;
} else if (c < 0x800) {
bytes += 2;
} else if (c >= 0xd800 && c <= 0xdbff && i + 1 < len) {
const next = body.charCodeAt(i + 1);
if (next >= 0xdc00 && next <= 0xdfff) {
bytes += 4;
i++;
} else {
bytes += 3;
}
} else {
bytes += 3;
}
}
return bytes;
}

View File

@@ -1,97 +0,0 @@
'use strict';
import utils from '../utils.js';
/**
* It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
*
* @param {string} name - The name of the property to get.
*
* @returns An array of strings.
*/
function parsePropPath(name) {
// foo[x][y][z]
// foo.x.y.z
// foo-x-y-z
// foo x y z
return utils.matchAll(/\w+|\[(\w*)]/g, name).map((match) => {
return match[0] === '[]' ? '' : match[1] || match[0];
});
}
/**
* Convert an array to an object.
*
* @param {Array<any>} arr - The array to convert to an object.
*
* @returns An object with the same keys and values as the array.
*/
function arrayToObject(arr) {
const obj = {};
const keys = Object.keys(arr);
let i;
const len = keys.length;
let key;
for (i = 0; i < len; i++) {
key = keys[i];
obj[key] = arr[key];
}
return obj;
}
/**
* It takes a FormData object and returns a JavaScript object
*
* @param {string} formData The FormData object to convert to JSON.
*
* @returns {Object<string, any> | null} The converted object.
*/
function formDataToJSON(formData) {
function buildPath(path, value, target, index) {
let name = path[index++];
if (name === '__proto__') return true;
const isNumericKey = Number.isFinite(+name);
const isLast = index >= path.length;
name = !name && utils.isArray(target) ? target.length : name;
if (isLast) {
if (utils.hasOwnProp(target, name)) {
target[name] = utils.isArray(target[name])
? target[name].concat(value)
: [target[name], value];
} else {
target[name] = value;
}
return !isNumericKey;
}
if (!utils.hasOwnProp(target, name) || !utils.isObject(target[name])) {
target[name] = [];
}
const result = buildPath(path, value, target[name], index);
if (result && utils.isArray(target[name])) {
target[name] = arrayToObject(target[name]);
}
return !isNumericKey;
}
if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
const obj = {};
utils.forEachEntry(formData, (name, value) => {
buildPath(parsePropPath(name), value, obj, 0);
});
return obj;
}
return null;
}
export default formDataToJSON;

View File

@@ -1,119 +0,0 @@
import util from 'util';
import { Readable } from 'stream';
import utils from '../utils.js';
import readBlob from './readBlob.js';
import platform from '../platform/index.js';
const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';
const textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util.TextEncoder();
const CRLF = '\r\n';
const CRLF_BYTES = textEncoder.encode(CRLF);
const CRLF_BYTES_COUNT = 2;
class FormDataPart {
constructor(name, value) {
const { escapeName } = this.constructor;
const isStringValue = utils.isString(value);
let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${
!isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : ''
}${CRLF}`;
if (isStringValue) {
value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF));
} else {
const safeType = String(value.type || 'application/octet-stream').replace(/[\r\n]/g, '');
headers += `Content-Type: ${safeType}${CRLF}`;
}
this.headers = textEncoder.encode(headers + CRLF);
this.contentLength = isStringValue ? value.byteLength : value.size;
this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;
this.name = name;
this.value = value;
}
async *encode() {
yield this.headers;
const { value } = this;
if (utils.isTypedArray(value)) {
yield value;
} else {
yield* readBlob(value);
}
yield CRLF_BYTES;
}
static escapeName(name) {
return String(name).replace(
/[\r\n"]/g,
(match) =>
({
'\r': '%0D',
'\n': '%0A',
'"': '%22',
})[match]
);
}
}
const formDataToStream = (form, headersHandler, options) => {
const {
tag = 'form-data-boundary',
size = 25,
boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET),
} = options || {};
if (!utils.isFormData(form)) {
throw TypeError('FormData instance required');
}
if (boundary.length < 1 || boundary.length > 70) {
throw Error('boundary must be 1-70 characters long');
}
const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);
const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF);
let contentLength = footerBytes.byteLength;
const parts = Array.from(form.entries()).map(([name, value]) => {
const part = new FormDataPart(name, value);
contentLength += part.size;
return part;
});
contentLength += boundaryBytes.byteLength * parts.length;
contentLength = utils.toFiniteNumber(contentLength);
const computedHeaders = {
'Content-Type': `multipart/form-data; boundary=${boundary}`,
};
if (Number.isFinite(contentLength)) {
computedHeaders['Content-Length'] = contentLength;
}
headersHandler && headersHandler(computedHeaders);
return Readable.from(
(async function* () {
for (const part of parts) {
yield boundaryBytes;
yield* part.encode();
}
yield footerBytes;
})()
);
};
export default formDataToStream;

View File

@@ -1,66 +0,0 @@
'use strict';
import AxiosError from '../core/AxiosError.js';
import parseProtocol from './parseProtocol.js';
import platform from '../platform/index.js';
// RFC 2397: data:[<mediatype>][;base64],<data>
// mediatype = type/subtype followed by optional ;name=value parameters
const DATA_URL_PATTERN = /^([^,;]+\/[^,;]+)?((?:;[^,;=]+=[^,;]+)*)(;base64)?,([\s\S]*)$/;
/**
* Parse data uri to a Buffer or Blob
*
* @param {String} uri
* @param {?Boolean} asBlob
* @param {?Object} options
* @param {?Function} options.Blob
*
* @returns {Buffer|Blob}
*/
export default function fromDataURI(uri, asBlob, options) {
const _Blob = (options && options.Blob) || platform.classes.Blob;
const protocol = parseProtocol(uri);
if (asBlob === undefined && _Blob) {
asBlob = true;
}
if (protocol === 'data') {
uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
const match = DATA_URL_PATTERN.exec(uri);
if (!match) {
throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);
}
const type = match[1];
const params = match[2];
const encoding = match[3] ? 'base64' : 'utf8';
const body = match[4];
// RFC 2397 section 3: default mediatype is text/plain;charset=US-ASCII
// Bare `data:,` leaves mime undefined; Blob normalises that to "" per spec.
let mime;
if (type) {
mime = params ? type + params : type;
} else if (params) {
mime = 'text/plain' + params;
}
const buffer = Buffer.from(decodeURIComponent(body), encoding);
if (asBlob) {
if (!_Blob) {
throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
}
return new _Blob([buffer], { type: mime });
}
return buffer;
}
throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);
}

Some files were not shown because too many files have changed in this diff Show More