mirror of
https://github.com/axios/axios.git
synced 2026-04-11 02:11:50 +08:00
feat: implement prettier and fix all issues (#7385)
* feat: implement prettier and fix all issues * fix: failing tests * fix: implement feedback from codel, ai etc * chore: dont throw in trim function Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * fix: incorrect fix --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
This commit is contained in:
parent
335b79ffb6
commit
ef3711d1b3
@ -1,15 +1,16 @@
|
||||
module.exports = {
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2018": true,
|
||||
"node": true
|
||||
env: {
|
||||
browser: true,
|
||||
es2018: true,
|
||||
node: true,
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"sourceType": "module"
|
||||
extends: 'eslint:recommended',
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018,
|
||||
sourceType: 'module',
|
||||
},
|
||||
"rules": {
|
||||
"no-cond-assign": 0
|
||||
}
|
||||
}
|
||||
rules: {
|
||||
'no-cond-assign': 0,
|
||||
'no-unused-vars': ['error', { args: 'none', varsIgnorePattern: '^_' }],
|
||||
},
|
||||
};
|
||||
|
||||
20
.prettierignore
Normal file
20
.prettierignore
Normal file
@ -0,0 +1,20 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
|
||||
# Build output
|
||||
dist/
|
||||
coverage/
|
||||
|
||||
# Lock files
|
||||
package-lock.json
|
||||
**/package-lock.json
|
||||
|
||||
# Generated / vendored
|
||||
*.min.js
|
||||
test/typescript/axios.js*
|
||||
|
||||
# Misc
|
||||
*.iml
|
||||
.idea
|
||||
.DS_Store
|
||||
sauce_connect.log
|
||||
7
.prettierrc
Normal file
7
.prettierrc
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "es5",
|
||||
"printWidth": 100
|
||||
}
|
||||
412
CHANGELOG.md
412
CHANGELOG.md
@ -31,38 +31,38 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/175160345?v=4&s=18" alt="avatar" width="18"/> [Ashvin Tiwari](https://github.com/ashvin2005 "+1752/-4 (#7218 #7218 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/71729144?v=4&s=18" alt="avatar" width="18"/> [Nikunj Mochi](https://github.com/mochinikunj "+940/-12 (#7294 #7294 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/128113546?v=4&s=18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh "+544/-102 (#7169 #7185 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [jasonsaayman](https://github.com/jasonsaayman "+317/-73 (#7334 #7298 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/377911?v=4&s=18" alt="avatar" width="18"/> [Julian Dax](https://github.com/brodo "+99/-120 (#5558 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/184285082?v=4&s=18" alt="avatar" width="18"/> [Akash Dhar Dubey](https://github.com/AKASHDHARDUBEY "+167/-0 (#7287 #7288 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/145687605?v=4&s=18" alt="avatar" width="18"/> [Madhumita](https://github.com/madhumitaaa "+20/-68 (#7198 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/24915252?v=4&s=18" alt="avatar" width="18"/> [Tackoil](https://github.com/Tackoil "+80/-2 (#6269 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/145078271?v=4&s=18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon "+41/-41 (#6324 #6315 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/184138832?v=4&s=18" alt="avatar" width="18"/> [Rudransh](https://github.com/Rudrxxx "+71/-2 (#7257 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/146366930?v=4&s=18" alt="avatar" width="18"/> [WuMingDao](https://github.com/WuMingDao "+36/-36 (#7215 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/46827243?v=4&s=18" alt="avatar" width="18"/> [codenomnom](https://github.com/codenomnom "+70/-0 (#7201 #7201 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/189698992?v=4&s=18" alt="avatar" width="18"/> [Nandan Acharya](https://github.com/Nandann018-ux "+60/-10 (#7272 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/7225168?v=4&s=18" alt="avatar" width="18"/> [Eric Dubé](https://github.com/KernelDeimos "+22/-40 (#7042 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/915045?v=4&s=18" alt="avatar" width="18"/> [Tibor Pilz](https://github.com/tiborpilz "+40/-4 (#5551 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/23138717?v=4&s=18" alt="avatar" width="18"/> [Gabriel Quaresma](https://github.com/joaoGabriel55 "+31/-4 (#6314 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/21505?v=4&s=18" alt="avatar" width="18"/> [Turadg Aleahmad](https://github.com/turadg "+23/-6 (#6265 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4273631?v=4&s=18" alt="avatar" width="18"/> [JohnTitor](https://github.com/kiritosan "+14/-14 (#6155 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/39668736?v=4&s=18" alt="avatar" width="18"/> [rohit miryala](https://github.com/rohitmiryala "+22/-0 (#7250 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/30316250?v=4&s=18" alt="avatar" width="18"/> [Wilson Mun](https://github.com/wmundev "+20/-0 (#6053 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/184506226?v=4&s=18" alt="avatar" width="18"/> [techcodie](https://github.com/techcodie "+7/-7 (#7236 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/187598667?v=4&s=18" alt="avatar" width="18"/> [Ved Vadnere](https://github.com/Archis009 "+5/-6 (#7283 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/115612815?v=4&s=18" alt="avatar" width="18"/> [svihpinc](https://github.com/svihpinc "+5/-3 (#6134 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/123884782?v=4&s=18" alt="avatar" width="18"/> [SANDESH LENDVE](https://github.com/mrsandy1965 "+3/-3 (#7246 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12529395?v=4&s=18" alt="avatar" width="18"/> [Lubos](https://github.com/mrlubos "+5/-1 (#7312 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/709451?v=4&s=18" alt="avatar" width="18"/> [Jarred Sumner](https://github.com/Jarred-Sumner "+5/-1 (#5754 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/17907922?v=4&s=18" alt="avatar" width="18"/> [Adam Hines](https://github.com/thebanjomatic "+2/-1 (#5756 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/177472603?v=4&s=18" alt="avatar" width="18"/> [Subhan Kumar Rai](https://github.com/Subhan030 "+2/-1 (#7256 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/6473925?v=4&s=18" alt="avatar" width="18"/> [Joseph Frazier](https://github.com/josephfrazier "+1/-1 (#7311 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/184906930?v=4&s=18" alt="avatar" width="18"/> [KT0803](https://github.com/KT0803 "+0/-2 (#7229 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/6703955?v=4&s=18" alt="avatar" width="18"/> [Albie](https://github.com/AlbertoSadoc "+1/-1 (#5560 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/9452325?v=4&s=18" alt="avatar" width="18"/> [Jake Hayes](https://github.com/thejayhaykid "+1/-0 (#5999 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/175160345?v=4&s=18" alt="avatar" width="18"/> [Ashvin Tiwari](https://github.com/ashvin2005 '+1752/-4 (#7218 #7218 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/71729144?v=4&s=18" alt="avatar" width="18"/> [Nikunj Mochi](https://github.com/mochinikunj '+940/-12 (#7294 #7294 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/128113546?v=4&s=18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh '+544/-102 (#7169 #7185 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [jasonsaayman](https://github.com/jasonsaayman '+317/-73 (#7334 #7298 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/377911?v=4&s=18" alt="avatar" width="18"/> [Julian Dax](https://github.com/brodo '+99/-120 (#5558 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/184285082?v=4&s=18" alt="avatar" width="18"/> [Akash Dhar Dubey](https://github.com/AKASHDHARDUBEY '+167/-0 (#7287 #7288 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/145687605?v=4&s=18" alt="avatar" width="18"/> [Madhumita](https://github.com/madhumitaaa '+20/-68 (#7198 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/24915252?v=4&s=18" alt="avatar" width="18"/> [Tackoil](https://github.com/Tackoil '+80/-2 (#6269 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/145078271?v=4&s=18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon '+41/-41 (#6324 #6315 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/184138832?v=4&s=18" alt="avatar" width="18"/> [Rudransh](https://github.com/Rudrxxx '+71/-2 (#7257 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/146366930?v=4&s=18" alt="avatar" width="18"/> [WuMingDao](https://github.com/WuMingDao '+36/-36 (#7215 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/46827243?v=4&s=18" alt="avatar" width="18"/> [codenomnom](https://github.com/codenomnom '+70/-0 (#7201 #7201 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/189698992?v=4&s=18" alt="avatar" width="18"/> [Nandan Acharya](https://github.com/Nandann018-ux '+60/-10 (#7272 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/7225168?v=4&s=18" alt="avatar" width="18"/> [Eric Dubé](https://github.com/KernelDeimos '+22/-40 (#7042 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/915045?v=4&s=18" alt="avatar" width="18"/> [Tibor Pilz](https://github.com/tiborpilz '+40/-4 (#5551 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/23138717?v=4&s=18" alt="avatar" width="18"/> [Gabriel Quaresma](https://github.com/joaoGabriel55 '+31/-4 (#6314 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/21505?v=4&s=18" alt="avatar" width="18"/> [Turadg Aleahmad](https://github.com/turadg '+23/-6 (#6265 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4273631?v=4&s=18" alt="avatar" width="18"/> [JohnTitor](https://github.com/kiritosan '+14/-14 (#6155 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/39668736?v=4&s=18" alt="avatar" width="18"/> [rohit miryala](https://github.com/rohitmiryala '+22/-0 (#7250 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/30316250?v=4&s=18" alt="avatar" width="18"/> [Wilson Mun](https://github.com/wmundev '+20/-0 (#6053 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/184506226?v=4&s=18" alt="avatar" width="18"/> [techcodie](https://github.com/techcodie '+7/-7 (#7236 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/187598667?v=4&s=18" alt="avatar" width="18"/> [Ved Vadnere](https://github.com/Archis009 '+5/-6 (#7283 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/115612815?v=4&s=18" alt="avatar" width="18"/> [svihpinc](https://github.com/svihpinc '+5/-3 (#6134 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/123884782?v=4&s=18" alt="avatar" width="18"/> [SANDESH LENDVE](https://github.com/mrsandy1965 '+3/-3 (#7246 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12529395?v=4&s=18" alt="avatar" width="18"/> [Lubos](https://github.com/mrlubos '+5/-1 (#7312 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/709451?v=4&s=18" alt="avatar" width="18"/> [Jarred Sumner](https://github.com/Jarred-Sumner '+5/-1 (#5754 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/17907922?v=4&s=18" alt="avatar" width="18"/> [Adam Hines](https://github.com/thebanjomatic '+2/-1 (#5756 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/177472603?v=4&s=18" alt="avatar" width="18"/> [Subhan Kumar Rai](https://github.com/Subhan030 '+2/-1 (#7256 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/6473925?v=4&s=18" alt="avatar" width="18"/> [Joseph Frazier](https://github.com/josephfrazier '+1/-1 (#7311 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/184906930?v=4&s=18" alt="avatar" width="18"/> [KT0803](https://github.com/KT0803 '+0/-2 (#7229 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/6703955?v=4&s=18" alt="avatar" width="18"/> [Albie](https://github.com/AlbertoSadoc '+1/-1 (#5560 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/9452325?v=4&s=18" alt="avatar" width="18"/> [Jake Hayes](https://github.com/thejayhaykid '+1/-0 (#5999 )')
|
||||
|
||||
## [1.13.2](https://github.com/axios/axios/compare/v1.13.1...v1.13.2) (2025-11-04)
|
||||
|
||||
@ -77,8 +77,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+28/-9 (#7206 #7202 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1174718?v=4&s=18" alt="avatar" width="18"/> [Kasper Isager Dalsgarð](https://github.com/kasperisager "+9/-9 (#7196 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+28/-9 (#7206 #7202 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/1174718?v=4&s=18" alt="avatar" width="18"/> [Kasper Isager Dalsgarð](https://github.com/kasperisager '+9/-9 (#7196 )')
|
||||
|
||||
## [1.13.1](https://github.com/axios/axios/compare/v1.13.0...v1.13.1) (2025-10-28)
|
||||
|
||||
@ -88,8 +88,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/128113546?v=4&s=18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh "+220/-111 (#7173 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+18/-1 (#7193 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/128113546?v=4&s=18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh '+220/-111 (#7173 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+18/-1 (#7193 )')
|
||||
|
||||
# [1.13.0](https://github.com/axios/axios/compare/v1.12.2...v1.13.0) (2025-10-27)
|
||||
|
||||
@ -104,23 +104,23 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+794/-180 (#7186 #7150 #7039 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+24/-509 (#7032 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/195581631?v=4&s=18" alt="avatar" width="18"/> [Aviraj2929](https://github.com/Aviraj2929 "+211/-93 (#7136 #7135 #7134 #7112 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/181717941?v=4&s=18" alt="avatar" width="18"/> [prasoon patel](https://github.com/Prasoon52 "+167/-6 (#7099 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/141911040?v=4&s=18" alt="avatar" width="18"/> [Samyak Dandge](https://github.com/Samy-in "+134/-0 (#7171 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/128113546?v=4&s=18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh "+53/-56 (#7170 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/146073621?v=4&s=18" alt="avatar" width="18"/> [Rahul Kumar](https://github.com/jaiyankargupta "+28/-28 (#7073 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/148716794?v=4&s=18" alt="avatar" width="18"/> [Amit Verma](https://github.com/Amitverma0509 "+24/-13 (#7129 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/141427581?v=4&s=18" alt="avatar" width="18"/> [Abhishek3880](https://github.com/abhishekmaniy "+23/-4 (#7119 #7117 #7116 #7115 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/91522146?v=4&s=18" alt="avatar" width="18"/> [Dhvani Maktuporia](https://github.com/Dhvani365 "+14/-5 (#7175 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/41838423?v=4&s=18" alt="avatar" width="18"/> [Usama Ayoub](https://github.com/sam3690 "+4/-4 (#7133 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/79366821?v=4&s=18" alt="avatar" width="18"/> [ikuy1203](https://github.com/ikuy1203 "+3/-3 (#7166 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/74639234?v=4&s=18" alt="avatar" width="18"/> [Nikhil Simon Toppo](https://github.com/Kirito-Excalibur "+1/-1 (#7172 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/200562195?v=4&s=18" alt="avatar" width="18"/> [Jane Wangari](https://github.com/Wangarijane "+1/-1 (#7155 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/78318848?v=4&s=18" alt="avatar" width="18"/> [Supakorn Ieamgomol](https://github.com/Supakornn "+1/-1 (#7065 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/134518?v=4&s=18" alt="avatar" width="18"/> [Kian-Meng Ang](https://github.com/kianmeng "+1/-1 (#7046 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/13148112?v=4&s=18" alt="avatar" width="18"/> [UTSUMI Keiji](https://github.com/k-utsumi "+1/-1 (#7037 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+794/-180 (#7186 #7150 #7039 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 '+24/-509 (#7032 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/195581631?v=4&s=18" alt="avatar" width="18"/> [Aviraj2929](https://github.com/Aviraj2929 '+211/-93 (#7136 #7135 #7134 #7112 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/181717941?v=4&s=18" alt="avatar" width="18"/> [prasoon patel](https://github.com/Prasoon52 '+167/-6 (#7099 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/141911040?v=4&s=18" alt="avatar" width="18"/> [Samyak Dandge](https://github.com/Samy-in '+134/-0 (#7171 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/128113546?v=4&s=18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh '+53/-56 (#7170 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/146073621?v=4&s=18" alt="avatar" width="18"/> [Rahul Kumar](https://github.com/jaiyankargupta '+28/-28 (#7073 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/148716794?v=4&s=18" alt="avatar" width="18"/> [Amit Verma](https://github.com/Amitverma0509 '+24/-13 (#7129 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/141427581?v=4&s=18" alt="avatar" width="18"/> [Abhishek3880](https://github.com/abhishekmaniy '+23/-4 (#7119 #7117 #7116 #7115 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/91522146?v=4&s=18" alt="avatar" width="18"/> [Dhvani Maktuporia](https://github.com/Dhvani365 '+14/-5 (#7175 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/41838423?v=4&s=18" alt="avatar" width="18"/> [Usama Ayoub](https://github.com/sam3690 '+4/-4 (#7133 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/79366821?v=4&s=18" alt="avatar" width="18"/> [ikuy1203](https://github.com/ikuy1203 '+3/-3 (#7166 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/74639234?v=4&s=18" alt="avatar" width="18"/> [Nikhil Simon Toppo](https://github.com/Kirito-Excalibur '+1/-1 (#7172 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/200562195?v=4&s=18" alt="avatar" width="18"/> [Jane Wangari](https://github.com/Wangarijane '+1/-1 (#7155 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/78318848?v=4&s=18" alt="avatar" width="18"/> [Supakorn Ieamgomol](https://github.com/Supakornn '+1/-1 (#7065 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/134518?v=4&s=18" alt="avatar" width="18"/> [Kian-Meng Ang](https://github.com/kianmeng '+1/-1 (#7046 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/13148112?v=4&s=18" alt="avatar" width="18"/> [UTSUMI Keiji](https://github.com/k-utsumi '+1/-1 (#7037 )')
|
||||
|
||||
## [1.12.2](https://github.com/axios/axios/compare/v1.12.1...v1.12.2) (2025-09-14)
|
||||
|
||||
@ -130,8 +130,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+247/-16 (#7030 #7022 #7024 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+2/-6 (#7028 #7029 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+247/-16 (#7030 #7022 #7024 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 '+2/-6 (#7028 #7029 )')
|
||||
|
||||
## [1.12.1](https://github.com/axios/axios/compare/v1.12.0...v1.12.1) (2025-09-12)
|
||||
|
||||
@ -141,7 +141,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+10/-4 (#7020 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+10/-4 (#7020 )')
|
||||
|
||||
# [1.12.0](https://github.com/axios/axios/compare/v1.11.0...v1.12.0) (2025-09-11)
|
||||
|
||||
@ -165,16 +165,16 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+132/-16760 (#7002 #5926 #6782 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+4263/-293 (#7006 #7003 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/53833811?v=4&s=18" alt="avatar" width="18"/> [khani](https://github.com/mkhani01 "+111/-15 (#6982 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/7712804?v=4&s=18" alt="avatar" width="18"/> [Ameer Assadi](https://github.com/AmeerAssadi "+123/-0 (#7011 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/70265727?v=4&s=18" alt="avatar" width="18"/> [Emiedonmokumo Dick-Boro](https://github.com/emiedonmokumo "+55/-35 (#6998 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/47859767?v=4&s=18" alt="avatar" width="18"/> [Zeroday BYTE](https://github.com/opsysdebug "+8/-8 (#6980 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jason Saayman](https://github.com/jasonsaayman "+7/-7 (#6985 #6985 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/13010755?v=4&s=18" alt="avatar" width="18"/> [최예찬](https://github.com/HealGaren "+5/-7 (#5715 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/7002604?v=4&s=18" alt="avatar" width="18"/> [Gligor Kotushevski](https://github.com/gligorkot "+3/-1 (#5627 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/15893?v=4&s=18" alt="avatar" width="18"/> [Aleksandar Dimitrov](https://github.com/adimit "+2/-1 (#5595 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini '+132/-16760 (#7002 #5926 #6782 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+4263/-293 (#7006 #7003 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/53833811?v=4&s=18" alt="avatar" width="18"/> [khani](https://github.com/mkhani01 '+111/-15 (#6982 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/7712804?v=4&s=18" alt="avatar" width="18"/> [Ameer Assadi](https://github.com/AmeerAssadi '+123/-0 (#7011 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/70265727?v=4&s=18" alt="avatar" width="18"/> [Emiedonmokumo Dick-Boro](https://github.com/emiedonmokumo '+55/-35 (#6998 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/47859767?v=4&s=18" alt="avatar" width="18"/> [Zeroday BYTE](https://github.com/opsysdebug '+8/-8 (#6980 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jason Saayman](https://github.com/jasonsaayman '+7/-7 (#6985 #6985 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/13010755?v=4&s=18" alt="avatar" width="18"/> [최예찬](https://github.com/HealGaren '+5/-7 (#5715 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/7002604?v=4&s=18" alt="avatar" width="18"/> [Gligor Kotushevski](https://github.com/gligorkot '+3/-1 (#5627 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/15893?v=4&s=18" alt="avatar" width="18"/> [Aleksandar Dimitrov](https://github.com/adimit '+2/-1 (#5595 )')
|
||||
|
||||
# [1.11.0](https://github.com/axios/axios/compare/v1.10.0...v1.11.0) (2025-07-22)
|
||||
|
||||
@ -186,11 +186,11 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12534341?v=4&s=18" alt="avatar" width="18"/> [izzy goldman](https://github.com/izzygld "+186/-93 (#6970 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/142807367?v=4&s=18" alt="avatar" width="18"/> [Manish Sahani](https://github.com/manishsahanidev "+70/-0 (#6961 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+12/-10 (#6938 #6939 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/392612?v=4&s=18" alt="avatar" width="18"/> [James Nail](https://github.com/jrnail23 "+13/-2 (#6956 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/163745239?v=4&s=18" alt="avatar" width="18"/> [Tejaswi1305](https://github.com/Tejaswi1305 "+1/-1 (#6894 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12534341?v=4&s=18" alt="avatar" width="18"/> [izzy goldman](https://github.com/izzygld '+186/-93 (#6970 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/142807367?v=4&s=18" alt="avatar" width="18"/> [Manish Sahani](https://github.com/manishsahanidev '+70/-0 (#6961 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 '+12/-10 (#6938 #6939 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/392612?v=4&s=18" alt="avatar" width="18"/> [James Nail](https://github.com/jrnail23 '+13/-2 (#6956 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/163745239?v=4&s=18" alt="avatar" width="18"/> [Tejaswi1305](https://github.com/Tejaswi1305 '+1/-1 (#6894 )')
|
||||
|
||||
# [1.10.0](https://github.com/axios/axios/compare/v1.9.0...v1.10.0) (2025-06-14)
|
||||
|
||||
@ -206,13 +206,13 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+30/-19 (#6933 #6920 #6893 #6892 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+2/-6 (#6922 #6923 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/48370490?v=4&s=18" alt="avatar" width="18"/> [Dimitrios Lazanas](https://github.com/dimitry-lzs "+4/-0 (#6917 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/71047946?v=4&s=18" alt="avatar" width="18"/> [Adrian Knapp](https://github.com/AdrianKnapp "+2/-2 (#6867 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/16129206?v=4&s=18" alt="avatar" width="18"/> [Howie Zhao](https://github.com/howiezhao "+3/-1 (#6872 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/6788611?v=4&s=18" alt="avatar" width="18"/> [Uhyeon Park](https://github.com/warpdev "+1/-1 (#6883 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/20028934?v=4&s=18" alt="avatar" width="18"/> [Sampo Silvennoinen](https://github.com/stscoundrel "+1/-1 (#6913 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+30/-19 (#6933 #6920 #6893 #6892 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/189505037?v=4&s=18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 '+2/-6 (#6922 #6923 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/48370490?v=4&s=18" alt="avatar" width="18"/> [Dimitrios Lazanas](https://github.com/dimitry-lzs '+4/-0 (#6917 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/71047946?v=4&s=18" alt="avatar" width="18"/> [Adrian Knapp](https://github.com/AdrianKnapp '+2/-2 (#6867 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/16129206?v=4&s=18" alt="avatar" width="18"/> [Howie Zhao](https://github.com/howiezhao '+3/-1 (#6872 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/6788611?v=4&s=18" alt="avatar" width="18"/> [Uhyeon Park](https://github.com/warpdev '+1/-1 (#6883 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/20028934?v=4&s=18" alt="avatar" width="18"/> [Sampo Silvennoinen](https://github.com/stscoundrel '+1/-1 (#6913 )')
|
||||
|
||||
# [1.9.0](https://github.com/axios/axios/compare/v1.8.4...v1.9.0) (2025-04-24)
|
||||
|
||||
@ -232,12 +232,12 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+200/-34 (#6890 #6889 #6888 #6885 #6881 #6767 #6874 #6873 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+26/-1 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+21/-0 (#5707 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/2500247?v=4&s=18" alt="avatar" width="18"/> [George Cheng](https://github.com/Gerhut "+3/-3 (#5096 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/30260221?v=4&s=18" alt="avatar" width="18"/> [FatahChan](https://github.com/FatahChan "+2/-2 (#6855 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/49002?v=4&s=18" alt="avatar" width="18"/> [Ionuț G. Stan](https://github.com/igstan "+1/-1 (#6661 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+200/-34 (#6890 #6889 #6888 #6885 #6881 #6767 #6874 #6873 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+26/-1 ()')
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini '+21/-0 (#5707 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/2500247?v=4&s=18" alt="avatar" width="18"/> [George Cheng](https://github.com/Gerhut '+3/-3 (#5096 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/30260221?v=4&s=18" alt="avatar" width="18"/> [FatahChan](https://github.com/FatahChan '+2/-2 (#6855 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/49002?v=4&s=18" alt="avatar" width="18"/> [Ionuț G. Stan](https://github.com/igstan '+1/-1 (#6661 )')
|
||||
|
||||
## [1.8.4](https://github.com/axios/axios/compare/v1.8.3...v1.8.4) (2025-03-19)
|
||||
|
||||
@ -247,7 +247,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/8029107?v=4&s=18" alt="avatar" width="18"/> [Marc Hassan](https://github.com/mhassan1 "+5/-1 (#6833 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/8029107?v=4&s=18" alt="avatar" width="18"/> [Marc Hassan](https://github.com/mhassan1 '+5/-1 (#6833 )')
|
||||
|
||||
## [1.8.3](https://github.com/axios/axios/compare/v1.8.2...v1.8.3) (2025-03-10)
|
||||
|
||||
@ -258,9 +258,9 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/3238291?v=4&s=18" alt="avatar" width="18"/> [Ashcon Partovi](https://github.com/Electroid "+6/-0 (#6811 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/28559054?v=4&s=18" alt="avatar" width="18"/> [StefanBRas](https://github.com/StefanBRas "+4/-0 (#6818 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/8029107?v=4&s=18" alt="avatar" width="18"/> [Marc Hassan](https://github.com/mhassan1 "+2/-2 (#6814 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/3238291?v=4&s=18" alt="avatar" width="18"/> [Ashcon Partovi](https://github.com/Electroid '+6/-0 (#6811 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/28559054?v=4&s=18" alt="avatar" width="18"/> [StefanBRas](https://github.com/StefanBRas '+4/-0 (#6818 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/8029107?v=4&s=18" alt="avatar" width="18"/> [Marc Hassan](https://github.com/mhassan1 '+2/-2 (#6814 )')
|
||||
|
||||
## [1.8.2](https://github.com/axios/axios/compare/v1.8.1...v1.8.2) (2025-03-07)
|
||||
|
||||
@ -270,7 +270,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/14166260?v=4&s=18" alt="avatar" width="18"/> [Fasoro-Joseph Alexander](https://github.com/lexcorp16 "+1/-1 (#6810 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/14166260?v=4&s=18" alt="avatar" width="18"/> [Fasoro-Joseph Alexander](https://github.com/lexcorp16 '+1/-1 (#6810 )')
|
||||
|
||||
## [1.8.1](https://github.com/axios/axios/compare/v1.8.0...v1.8.1) (2025-02-26)
|
||||
|
||||
@ -280,7 +280,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+51/-47 (#6789 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+51/-47 (#6789 )')
|
||||
|
||||
# [1.8.0](https://github.com/axios/axios/compare/v1.7.9...v1.8.0) (2025-02-25)
|
||||
|
||||
@ -310,23 +310,23 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/7661715?v=4&s=18" alt="avatar" width="18"/> [Michael Toscano](https://github.com/GethosTheWalrus "+42/-8 (#6192 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+26/-3 (#6788 #6777 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/72578270?v=4&s=18" alt="avatar" width="18"/> [Naron](https://github.com/naronchen "+27/-0 (#5901 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/47430686?v=4&s=18" alt="avatar" width="18"/> [shravan || श्रvan](https://github.com/shravan20 "+7/-3 (#6116 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/145078271?v=4&s=18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon "+0/-7 (#6312 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/30925732?v=4&s=18" alt="avatar" width="18"/> [yionr](https://github.com/yionr "+5/-1 (#6129 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/534166?v=4&s=18" alt="avatar" width="18"/> [Shin'ya Ueoka](https://github.com/ueokande "+3/-3 (#5935 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/33569?v=4&s=18" alt="avatar" width="18"/> [Dan Dascalescu](https://github.com/dandv "+3/-3 (#5908 #6757 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/16476523?v=4&s=18" alt="avatar" width="18"/> [Nitin Ramnani](https://github.com/NitinRamnani "+2/-2 (#5938 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/152275799?v=4&s=18" alt="avatar" width="18"/> [Shay Molcho](https://github.com/shaymolcho "+2/-2 (#6770 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+0/-3 (#6732 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/7661715?v=4&s=18" alt="avatar" width="18"/> [Michael Toscano](https://github.com/GethosTheWalrus '+42/-8 (#6192 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini '+26/-3 (#6788 #6777 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/72578270?v=4&s=18" alt="avatar" width="18"/> [Naron](https://github.com/naronchen '+27/-0 (#5901 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/47430686?v=4&s=18" alt="avatar" width="18"/> [shravan || श्रvan](https://github.com/shravan20 '+7/-3 (#6116 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/145078271?v=4&s=18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon '+0/-7 (#6312 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/30925732?v=4&s=18" alt="avatar" width="18"/> [yionr](https://github.com/yionr '+5/-1 (#6129 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/534166?v=4&s=18" alt="avatar" width="18"/> [Shin'ya Ueoka](https://github.com/ueokande '+3/-3 (#5935 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/33569?v=4&s=18" alt="avatar" width="18"/> [Dan Dascalescu](https://github.com/dandv '+3/-3 (#5908 #6757 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/16476523?v=4&s=18" alt="avatar" width="18"/> [Nitin Ramnani](https://github.com/NitinRamnani '+2/-2 (#5938 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/152275799?v=4&s=18" alt="avatar" width="18"/> [Shay Molcho](https://github.com/shaymolcho '+2/-2 (#6770 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+0/-3 (#6732 )')
|
||||
- fancy45daddy
|
||||
- <img src="https://avatars.githubusercontent.com/u/127725897?v=4&s=18" alt="avatar" width="18"/> [Habip Akyol](https://github.com/habipakyol "+1/-1 (#6030 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/54869395?v=4&s=18" alt="avatar" width="18"/> [Bailey Lissington](https://github.com/llamington "+1/-1 (#6771 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/14969290?v=4&s=18" alt="avatar" width="18"/> [Bernardo da Eira Duarte](https://github.com/bernardoduarte "+1/-1 (#6480 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/117800149?v=4&s=18" alt="avatar" width="18"/> [Shivam Batham](https://github.com/Shivam-Batham "+1/-1 (#5949 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/67861627?v=4&s=18" alt="avatar" width="18"/> [Lipin Kariappa](https://github.com/lipinnnnn "+1/-1 (#5936 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/127725897?v=4&s=18" alt="avatar" width="18"/> [Habip Akyol](https://github.com/habipakyol '+1/-1 (#6030 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/54869395?v=4&s=18" alt="avatar" width="18"/> [Bailey Lissington](https://github.com/llamington '+1/-1 (#6771 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/14969290?v=4&s=18" alt="avatar" width="18"/> [Bernardo da Eira Duarte](https://github.com/bernardoduarte '+1/-1 (#6480 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/117800149?v=4&s=18" alt="avatar" width="18"/> [Shivam Batham](https://github.com/Shivam-Batham '+1/-1 (#5949 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/67861627?v=4&s=18" alt="avatar" width="18"/> [Lipin Kariappa](https://github.com/lipinnnnn '+1/-1 (#5936 )')
|
||||
|
||||
## [1.7.9](https://github.com/axios/axios/compare/v1.7.8...v1.7.9) (2024-12-04)
|
||||
|
||||
@ -336,7 +336,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+596/-108 (#6729 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+596/-108 (#6729 )')
|
||||
|
||||
## [1.7.8](https://github.com/axios/axios/compare/v1.7.7...v1.7.8) (2024-11-25)
|
||||
|
||||
@ -356,24 +356,24 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/779047?v=4&s=18" alt="avatar" width="18"/> [Remco Haszing](https://github.com/remcohaszing "+108/-596 (#6218 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+281/-19 (#6640 #6619 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/140250471?v=4&s=18" alt="avatar" width="18"/> [Aayush Yadav](https://github.com/aayushyadav020 "+124/-111 (#6617 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+12/-65 (#6714 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/479715?v=4&s=18" alt="avatar" width="18"/> [Ell Bradshaw](https://github.com/cincodenada "+29/-0 (#6489 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/60218780?v=4&s=18" alt="avatar" width="18"/> [Amit Saini](https://github.com/amitsainii "+13/-3 (#5237 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/19817867?v=4&s=18" alt="avatar" width="18"/> [Tommaso Paulon](https://github.com/guuido "+14/-1 (#6680 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/63336443?v=4&s=18" alt="avatar" width="18"/> [Akki](https://github.com/Aakash-Rana "+5/-5 (#6668 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/20028934?v=4&s=18" alt="avatar" width="18"/> [Sampo Silvennoinen](https://github.com/stscoundrel "+3/-3 (#6633 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1174718?v=4&s=18" alt="avatar" width="18"/> [Kasper Isager Dalsgarð](https://github.com/kasperisager "+2/-2 (#6634 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/3709715?v=4&s=18" alt="avatar" width="18"/> [Christian Clauss](https://github.com/cclauss "+4/-0 (#6683 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1639119?v=4&s=18" alt="avatar" width="18"/> [Pavan Welihinda](https://github.com/pavan168 "+2/-2 (#5222 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/5742900?v=4&s=18" alt="avatar" width="18"/> [Taylor Flatt](https://github.com/taylorflatt "+2/-2 (#6615 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/79452224?v=4&s=18" alt="avatar" width="18"/> [Kenzo Wada](https://github.com/Kenzo-Wada "+2/-2 (#6608 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/50064240?v=4&s=18" alt="avatar" width="18"/> [Ngole Lawson](https://github.com/echelonnought "+3/-0 (#6644 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1262198?v=4&s=18" alt="avatar" width="18"/> [Haven](https://github.com/Baoyx007 "+3/-0 (#6590 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/149003676?v=4&s=18" alt="avatar" width="18"/> [Shrivali Dutt](https://github.com/shrivalidutt "+1/-1 (#6637 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1304290?v=4&s=18" alt="avatar" width="18"/> [Henco Appel](https://github.com/hencoappel "+1/-1 (#6605 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/779047?v=4&s=18" alt="avatar" width="18"/> [Remco Haszing](https://github.com/remcohaszing '+108/-596 (#6218 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+281/-19 (#6640 #6619 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/140250471?v=4&s=18" alt="avatar" width="18"/> [Aayush Yadav](https://github.com/aayushyadav020 '+124/-111 (#6617 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+12/-65 (#6714 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/479715?v=4&s=18" alt="avatar" width="18"/> [Ell Bradshaw](https://github.com/cincodenada '+29/-0 (#6489 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/60218780?v=4&s=18" alt="avatar" width="18"/> [Amit Saini](https://github.com/amitsainii '+13/-3 (#5237 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/19817867?v=4&s=18" alt="avatar" width="18"/> [Tommaso Paulon](https://github.com/guuido '+14/-1 (#6680 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/63336443?v=4&s=18" alt="avatar" width="18"/> [Akki](https://github.com/Aakash-Rana '+5/-5 (#6668 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/20028934?v=4&s=18" alt="avatar" width="18"/> [Sampo Silvennoinen](https://github.com/stscoundrel '+3/-3 (#6633 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/1174718?v=4&s=18" alt="avatar" width="18"/> [Kasper Isager Dalsgarð](https://github.com/kasperisager '+2/-2 (#6634 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/3709715?v=4&s=18" alt="avatar" width="18"/> [Christian Clauss](https://github.com/cclauss '+4/-0 (#6683 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/1639119?v=4&s=18" alt="avatar" width="18"/> [Pavan Welihinda](https://github.com/pavan168 '+2/-2 (#5222 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/5742900?v=4&s=18" alt="avatar" width="18"/> [Taylor Flatt](https://github.com/taylorflatt '+2/-2 (#6615 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/79452224?v=4&s=18" alt="avatar" width="18"/> [Kenzo Wada](https://github.com/Kenzo-Wada '+2/-2 (#6608 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/50064240?v=4&s=18" alt="avatar" width="18"/> [Ngole Lawson](https://github.com/echelonnought '+3/-0 (#6644 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/1262198?v=4&s=18" alt="avatar" width="18"/> [Haven](https://github.com/Baoyx007 '+3/-0 (#6590 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/149003676?v=4&s=18" alt="avatar" width="18"/> [Shrivali Dutt](https://github.com/shrivalidutt '+1/-1 (#6637 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/1304290?v=4&s=18" alt="avatar" width="18"/> [Henco Appel](https://github.com/hencoappel '+1/-1 (#6605 )')
|
||||
|
||||
## [1.7.7](https://github.com/axios/axios/compare/v1.7.6...v1.7.7) (2024-08-31)
|
||||
|
||||
@ -384,8 +384,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/10539109?v=4&s=18" alt="avatar" width="18"/> [Rishi556](https://github.com/Rishi556 "+39/-1 (#5731 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+27/-7 (#6584 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/10539109?v=4&s=18" alt="avatar" width="18"/> [Rishi556](https://github.com/Rishi556 '+39/-1 (#5731 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+27/-7 (#6584 )')
|
||||
|
||||
## [1.7.6](https://github.com/axios/axios/compare/v1.7.5...v1.7.6) (2024-08-30)
|
||||
|
||||
@ -396,9 +396,9 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+98/-46 (#6582 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/3534453?v=4&s=18" alt="avatar" width="18"/> [Jacques Germishuys](https://github.com/jacquesg "+5/-1 (#6524 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/53894505?v=4&s=18" alt="avatar" width="18"/> [kuroino721](https://github.com/kuroino721 "+3/-1 (#6575 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+98/-46 (#6582 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/3534453?v=4&s=18" alt="avatar" width="18"/> [Jacques Germishuys](https://github.com/jacquesg '+5/-1 (#6524 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/53894505?v=4&s=18" alt="avatar" width="18"/> [kuroino721](https://github.com/kuroino721 '+3/-1 (#6575 )')
|
||||
|
||||
## [1.7.5](https://github.com/axios/axios/compare/v1.7.4...v1.7.5) (2024-08-23)
|
||||
|
||||
@ -411,9 +411,9 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+187/-83 (#6573 #6567 #6566 #6564 #6563 #6557 #6556 #6555 #6554 #6552 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/2495809?v=4&s=18" alt="avatar" width="18"/> [Antonin Bas](https://github.com/antoninbas "+6/-6 (#6572 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/5406212?v=4&s=18" alt="avatar" width="18"/> [Hans Otto Wirtz](https://github.com/hansottowirtz "+4/-1 (#6533 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+187/-83 (#6573 #6567 #6566 #6564 #6563 #6557 #6556 #6555 #6554 #6552 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/2495809?v=4&s=18" alt="avatar" width="18"/> [Antonin Bas](https://github.com/antoninbas '+6/-6 (#6572 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/5406212?v=4&s=18" alt="avatar" width="18"/> [Hans Otto Wirtz](https://github.com/hansottowirtz '+4/-1 (#6533 )')
|
||||
|
||||
## [1.7.4](https://github.com/axios/axios/compare/v1.7.3...v1.7.4) (2024-08-13)
|
||||
|
||||
@ -424,8 +424,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/31389480?v=4&s=18" alt="avatar" width="18"/> [Lev Pachmanov](https://github.com/levpachmanov "+47/-11 (#6543 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/41283691?v=4&s=18" alt="avatar" width="18"/> [Đỗ Trọng Hải](https://github.com/hainenber "+49/-4 (#6539 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/31389480?v=4&s=18" alt="avatar" width="18"/> [Lev Pachmanov](https://github.com/levpachmanov '+47/-11 (#6543 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/41283691?v=4&s=18" alt="avatar" width="18"/> [Đỗ Trọng Hải](https://github.com/hainenber '+49/-4 (#6539 )')
|
||||
|
||||
## [1.7.3](https://github.com/axios/axios/compare/v1.7.2...v1.7.3) (2024-08-01)
|
||||
|
||||
@ -437,9 +437,9 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+211/-159 (#6518 #6519 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/10867286?v=4&s=18" alt="avatar" width="18"/> [Valerii Sidorenko](https://github.com/ValeraS "+3/-3 (#6515 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/8599535?v=4&s=18" alt="avatar" width="18"/> [prianYu](https://github.com/prianyu "+2/-2 (#6505 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+211/-159 (#6518 #6519 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/10867286?v=4&s=18" alt="avatar" width="18"/> [Valerii Sidorenko](https://github.com/ValeraS '+3/-3 (#6515 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/8599535?v=4&s=18" alt="avatar" width="18"/> [prianYu](https://github.com/prianyu '+2/-2 (#6505 )')
|
||||
|
||||
## [1.7.2](https://github.com/axios/axios/compare/v1.7.1...v1.7.2) (2024-05-21)
|
||||
|
||||
@ -449,7 +449,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+3/-3 (#6413 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+3/-3 (#6413 )')
|
||||
|
||||
## [1.7.1](https://github.com/axios/axios/compare/v1.7.0...v1.7.1) (2024-05-20)
|
||||
|
||||
@ -459,7 +459,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+14/-9 (#6410 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+14/-9 (#6410 )')
|
||||
|
||||
# [1.7.0](https://github.com/axios/axios/compare/v1.7.0-beta.2...v1.7.0) (2024-05-19)
|
||||
|
||||
@ -473,9 +473,9 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+1015/-127 (#6371 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+30/-14 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/16711696?v=4&s=18" alt="avatar" width="18"/> [Alexandre ABRIOUX](https://github.com/alexandre-abrioux "+56/-6 (#6362 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+1015/-127 (#6371 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+30/-14 ()')
|
||||
- <img src="https://avatars.githubusercontent.com/u/16711696?v=4&s=18" alt="avatar" width="18"/> [Alexandre ABRIOUX](https://github.com/alexandre-abrioux '+56/-6 (#6362 )')
|
||||
|
||||
# [1.7.0-beta.2](https://github.com/axios/axios/compare/v1.7.0-beta.1...v1.7.0-beta.2) (2024-05-19)
|
||||
|
||||
@ -487,7 +487,7 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+99/-46 (#6405 #6404 #6401 #6400 #6395 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+99/-46 (#6405 #6404 #6401 #6400 #6395 )')
|
||||
|
||||
# [1.7.0-beta.1](https://github.com/axios/axios/compare/v1.7.0-beta.0...v1.7.0-beta.1) (2024-05-07)
|
||||
|
||||
@ -499,8 +499,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/16711696?v=4&s=18" alt="avatar" width="18"/> [Alexandre ABRIOUX](https://github.com/alexandre-abrioux "+56/-6 (#6362 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+42/-17 (#6380 #6377 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/16711696?v=4&s=18" alt="avatar" width="18"/> [Alexandre ABRIOUX](https://github.com/alexandre-abrioux '+56/-6 (#6362 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+42/-17 (#6380 #6377 )')
|
||||
|
||||
# [1.7.0-beta.0](https://github.com/axios/axios/compare/v1.6.8...v1.7.0-beta.0) (2024-04-28)
|
||||
|
||||
@ -510,8 +510,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+1015/-127 (#6371 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+30/-14 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+1015/-127 (#6371 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+30/-14 ()')
|
||||
|
||||
## [1.6.8](https://github.com/axios/axios/compare/v1.6.7...v1.6.8) (2024-03-15)
|
||||
|
||||
@ -523,13 +523,13 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+4572/-3446 (#6238 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+30/-0 (#6231 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/68230846?v=4&s=18" alt="avatar" width="18"/> [Mitchell](https://github.com/Creaous "+9/-9 (#6300 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/53797821?v=4&s=18" alt="avatar" width="18"/> [Emmanuel](https://github.com/mannoeu "+2/-2 (#6196 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/44109284?v=4&s=18" alt="avatar" width="18"/> [Lucas Keller](https://github.com/ljkeller "+3/-0 (#6194 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/72791488?v=4&s=18" alt="avatar" width="18"/> [Aditya Mogili](https://github.com/ADITYA-176 "+1/-1 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/46135319?v=4&s=18" alt="avatar" width="18"/> [Miroslav Petrov](https://github.com/petrovmiroslav "+1/-1 (#6243 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+4572/-3446 (#6238 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+30/-0 (#6231 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/68230846?v=4&s=18" alt="avatar" width="18"/> [Mitchell](https://github.com/Creaous '+9/-9 (#6300 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/53797821?v=4&s=18" alt="avatar" width="18"/> [Emmanuel](https://github.com/mannoeu '+2/-2 (#6196 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/44109284?v=4&s=18" alt="avatar" width="18"/> [Lucas Keller](https://github.com/ljkeller '+3/-0 (#6194 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/72791488?v=4&s=18" alt="avatar" width="18"/> [Aditya Mogili](https://github.com/ADITYA-176 '+1/-1 ()')
|
||||
- <img src="https://avatars.githubusercontent.com/u/46135319?v=4&s=18" alt="avatar" width="18"/> [Miroslav Petrov](https://github.com/petrovmiroslav '+1/-1 (#6243 )')
|
||||
|
||||
## [1.6.7](https://github.com/axios/axios/compare/v1.6.6...v1.6.7) (2024-01-25)
|
||||
|
||||
@ -539,8 +539,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+30/-26 (#6203 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/73059627?v=4&s=18" alt="avatar" width="18"/> [zhoulixiang](https://github.com/zh-lx "+0/-3 (#6186 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+30/-26 (#6203 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/73059627?v=4&s=18" alt="avatar" width="18"/> [zhoulixiang](https://github.com/zh-lx '+0/-3 (#6186 )')
|
||||
|
||||
## [1.6.6](https://github.com/axios/axios/compare/v1.6.5...v1.6.6) (2024-01-24)
|
||||
|
||||
@ -551,8 +551,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/1186084?v=4&s=18" alt="avatar" width="18"/> [Ilya Priven](https://github.com/ikonst "+91/-8 (#5987 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1884246?v=4&s=18" alt="avatar" width="18"/> [Zao Soula](https://github.com/zaosoula "+6/-6 (#5778 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1186084?v=4&s=18" alt="avatar" width="18"/> [Ilya Priven](https://github.com/ikonst '+91/-8 (#5987 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/1884246?v=4&s=18" alt="avatar" width="18"/> [Zao Soula](https://github.com/zaosoula '+6/-6 (#5778 )')
|
||||
|
||||
## [1.6.5](https://github.com/axios/axios/compare/v1.6.4...v1.6.5) (2024-01-05)
|
||||
|
||||
@ -563,8 +563,8 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+41/-6 (#6176 #6175 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+6/-1 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+41/-6 (#6176 #6175 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+6/-1 ()')
|
||||
|
||||
## [1.6.4](https://github.com/axios/axios/compare/v1.6.3...v1.6.4) (2024-01-03)
|
||||
|
||||
@ -575,9 +575,9 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+34/-6 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+34/-3 (#6172 #6167 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/1402060?v=4&s=18" alt="avatar" width="18"/> [Guy Nesher](https://github.com/gnesher "+10/-10 (#6163 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+34/-6 ()')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+34/-3 (#6172 #6167 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/1402060?v=4&s=18" alt="avatar" width="18"/> [Guy Nesher](https://github.com/gnesher '+10/-10 (#6163 )')
|
||||
|
||||
## [1.6.3](https://github.com/axios/axios/compare/v1.6.2...v1.6.3) (2023-12-26)
|
||||
|
||||
@ -587,9 +587,9 @@
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+15/-6 (#6145 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+17/-2 (#6132 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+3/-0 (#6084 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4814473?v=4&s=18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+15/-6 (#6145 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/22686401?v=4&s=18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini '+17/-2 (#6132 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+3/-0 (#6084 )')
|
||||
|
||||
## [1.6.2](https://github.com/axios/axios/compare/v1.6.1...v1.6.2) (2023-11-14)
|
||||
|
||||
@ -610,9 +610,9 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+271/-146 (#6081 #6080 #6079 #6078 #6046 #6064 #6063 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/79681367?v=4&s=18" alt="avatar" width="18"/> [Ng Choon Khon (CK)](https://github.com/ckng0221 "+4/-4 (#6073 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/9162827?v=4&s=18" alt="avatar" width="18"/> [Muhammad Noman](https://github.com/mnomanmemon "+2/-2 (#6048 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+271/-146 (#6081 #6080 #6079 #6078 #6046 #6064 #6063 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/79681367?v=4&s=18" alt="avatar" width="18"/> [Ng Choon Khon (CK)](https://github.com/ckng0221 '+4/-4 (#6073 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/9162827?v=4&s=18" alt="avatar" width="18"/> [Muhammad Noman](https://github.com/mnomanmemon '+2/-2 (#6048 )')
|
||||
|
||||
## [1.6.1](https://github.com/axios/axios/compare/v1.6.0...v1.6.1) (2023-11-08)
|
||||
|
||||
@ -623,8 +623,8 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+432/-65 (#6059 #6056 #6055 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/3982806?v=4&s=18" alt="avatar" width="18"/> [Fabian Meyer](https://github.com/meyfa "+5/-2 (#5835 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+432/-65 (#6059 #6056 #6055 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/3982806?v=4&s=18" alt="avatar" width="18"/> [Fabian Meyer](https://github.com/meyfa '+5/-2 (#5835 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -656,9 +656,9 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+449/-114 (#6032 #6021 #6011 #5932 #5931 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/63700910?v=4&s=18" alt="avatar" width="18"/> [Valentin Panov](https://github.com/valentin-panov "+4/-4 (#6028 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/76877078?v=4&s=18" alt="avatar" width="18"/> [Rinku Chaudhari](https://github.com/therealrinku "+1/-1 (#5889 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+449/-114 (#6032 #6021 #6011 #5932 #5931 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/63700910?v=4&s=18" alt="avatar" width="18"/> [Valentin Panov](https://github.com/valentin-panov '+4/-4 (#6028 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/76877078?v=4&s=18" alt="avatar" width="18"/> [Rinku Chaudhari](https://github.com/therealrinku '+1/-1 (#5889 )')
|
||||
|
||||
## [1.5.1](https://github.com/axios/axios/compare/v1.5.0...v1.5.1) (2023-09-26)
|
||||
|
||||
@ -671,12 +671,12 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+89/-18 (#5919 #5917 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/110460234?v=4&s=18" alt="avatar" width="18"/> [David Dallas](https://github.com/DavidJDallas "+11/-5 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/71556073?v=4&s=18" alt="avatar" width="18"/> [Sean Sattler](https://github.com/fb-sean "+2/-8 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/4294069?v=4&s=18" alt="avatar" width="18"/> [Mustafa Ateş Uzun](https://github.com/0o001 "+4/-4 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/132928043?v=4&s=18" alt="avatar" width="18"/> [Przemyslaw Motacki](https://github.com/sfc-gh-pmotacki "+2/-1 (#5892 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+1/-1 ()")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+89/-18 (#5919 #5917 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/110460234?v=4&s=18" alt="avatar" width="18"/> [David Dallas](https://github.com/DavidJDallas '+11/-5 ()')
|
||||
- <img src="https://avatars.githubusercontent.com/u/71556073?v=4&s=18" alt="avatar" width="18"/> [Sean Sattler](https://github.com/fb-sean '+2/-8 ()')
|
||||
- <img src="https://avatars.githubusercontent.com/u/4294069?v=4&s=18" alt="avatar" width="18"/> [Mustafa Ateş Uzun](https://github.com/0o001 '+4/-4 ()')
|
||||
- <img src="https://avatars.githubusercontent.com/u/132928043?v=4&s=18" alt="avatar" width="18"/> [Przemyslaw Motacki](https://github.com/sfc-gh-pmotacki '+2/-1 (#5892 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+1/-1 ()')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -703,10 +703,10 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+66/-29 (#5839 #5837 #5836 #5832 #5831 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/102841186?v=4&s=18" alt="avatar" width="18"/> [夜葬](https://github.com/geekact "+42/-0 (#5324 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/65978976?v=4&s=18" alt="avatar" width="18"/> [Jonathan Budiman](https://github.com/JBudiman00 "+30/-0 (#5788 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+3/-5 (#5791 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+66/-29 (#5839 #5837 #5836 #5832 #5831 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/102841186?v=4&s=18" alt="avatar" width="18"/> [夜葬](https://github.com/geekact '+42/-0 (#5324 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/65978976?v=4&s=18" alt="avatar" width="18"/> [Jonathan Budiman](https://github.com/JBudiman00 '+30/-0 (#5788 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+3/-5 (#5791 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -735,9 +735,9 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+151/-16 (#5684 #5339 #5679 #5678 #5677 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/47537704?v=4&s=18" alt="avatar" width="18"/> [Arthur Fiorette](https://github.com/arthurfiorette "+19/-19 (#5525 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/43876655?v=4&s=18" alt="avatar" width="18"/> [PIYUSH NEGI](https://github.com/npiyush97 "+2/-18 (#5670 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+151/-16 (#5684 #5339 #5679 #5678 #5677 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/47537704?v=4&s=18" alt="avatar" width="18"/> [Arthur Fiorette](https://github.com/arthurfiorette '+19/-19 (#5525 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/43876655?v=4&s=18" alt="avatar" width="18"/> [PIYUSH NEGI](https://github.com/npiyush97 '+2/-18 (#5670 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -757,8 +757,8 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+48/-10 (#5665 #5661 #5663 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+2/-0 (#5445 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+48/-10 (#5665 #5661 #5663 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+2/-0 (#5445 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -778,7 +778,7 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+28/-10 (#5633 #5584 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+28/-10 (#5633 #5584 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -798,9 +798,9 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+38/-26 (#5564 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/19550000?v=4&s=18" alt="avatar" width="18"/> [lcysgsg](https://github.com/lcysgsg "+4/-0 (#5548 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+3/-0 (#5444 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+38/-26 (#5564 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/19550000?v=4&s=18" alt="avatar" width="18"/> [lcysgsg](https://github.com/lcysgsg '+4/-0 (#5548 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/5492927?v=4&s=18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+3/-0 (#5444 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -821,8 +821,8 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+11/-7 (#5545 #5535 #5542 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/19842213?v=4&s=18" alt="avatar" width="18"/> [陈若枫](https://github.com/ruofee "+2/-2 (#5467 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+11/-7 (#5545 #5535 #5542 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/19842213?v=4&s=18" alt="avatar" width="18"/> [陈若枫](https://github.com/ruofee '+2/-2 (#5467 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -842,7 +842,7 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+2/-1 (#5530 #5528 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+2/-1 (#5530 #5528 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -862,7 +862,7 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+27/-8 (#5521 #5518 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+27/-8 (#5521 #5518 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -886,8 +886,8 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+352/-67 (#5514 #5512 #5510 #5509 #5508 #5316 #5507 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/35015993?v=4&s=18" alt="avatar" width="18"/> [ItsNotGoodName](https://github.com/ItsNotGoodName "+43/-2 (#5497 )")
|
||||
- <img src="https://avatars.githubusercontent.com/u/12586868?v=4&s=18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+352/-67 (#5514 #5512 #5510 #5509 #5508 #5316 #5507 )')
|
||||
- <img src="https://avatars.githubusercontent.com/u/35015993?v=4&s=18" alt="avatar" width="18"/> [ItsNotGoodName](https://github.com/ItsNotGoodName '+43/-2 (#5497 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -907,7 +907,7 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+24/-9 (#5503 #5502 )")
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+24/-9 (#5503 #5502 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -926,8 +926,8 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+82/-54 (#5499 )")
|
||||
-  [Elliot Ford](https://github.com/EFord36 "+1/-1 (#5462 )")
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+82/-54 (#5499 )')
|
||||
-  [Elliot Ford](https://github.com/EFord36 '+1/-1 (#5462 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -947,8 +947,8 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+242/-108 (#5486 #5482 )")
|
||||
-  [Daniel Hillmann](https://github.com/hilleer "+1/-1 (#5478 )")
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+242/-108 (#5486 #5482 )')
|
||||
-  [Daniel Hillmann](https://github.com/hilleer '+1/-1 (#5478 )')
|
||||
|
||||
### PRs
|
||||
|
||||
@ -967,7 +967,7 @@ This functionality is considered as a fix.
|
||||
|
||||
### Contributors to this release
|
||||
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+938/-442 (#5456 #5455 #5453 #5451 #5449 #5447 #5446 #5443 #5442 #5439 #5420 )")
|
||||
-  [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+938/-442 (#5456 #5455 #5453 #5451 #5449 #5447 #5446 #5443 #5442 #5439 #5420 )')
|
||||
|
||||
### PRs
|
||||
|
||||
|
||||
@ -18,4 +18,4 @@ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) f
|
||||
|
||||
---
|
||||
|
||||
*This list is manually maintained. If you've contributed and would like to be added, please submit a pull request!*
|
||||
_This list is manually maintained. If you've contributed and would like to be added, please submit a pull request!_
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import util from "util";
|
||||
import cp from "child_process";
|
||||
import {parseVersion} from "./helpers/parser.js";
|
||||
import githubAxios from "./githubAxios.js";
|
||||
import util from 'util';
|
||||
import cp from 'child_process';
|
||||
import { parseVersion } from './helpers/parser.js';
|
||||
import githubAxios from './githubAxios.js';
|
||||
import memoize from 'memoizee';
|
||||
|
||||
const exec = util.promisify(cp.exec);
|
||||
@ -20,15 +20,19 @@ export default class GithubAPI {
|
||||
this.owner = owner;
|
||||
this.axios = githubAxios.create({
|
||||
baseURL: `https://api.github.com/repos/${this.owner}/${this.repo}/`,
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
async createComment(issue, body) {
|
||||
return (await this.axios.post(`/issues/${issue}/comments`, {body})).data;
|
||||
return (await this.axios.post(`/issues/${issue}/comments`, { body })).data;
|
||||
}
|
||||
|
||||
async getComments(issue, {desc = false, per_page= 100, page = 1} = {}) {
|
||||
return (await this.axios.get(`/issues/${issue}/comments`, {params: {direction: desc ? 'desc' : 'asc', per_page, page}})).data;
|
||||
async getComments(issue, { desc = false, per_page = 100, page = 1 } = {}) {
|
||||
return (
|
||||
await this.axios.get(`/issues/${issue}/comments`, {
|
||||
params: { direction: desc ? 'desc' : 'asc', per_page, page },
|
||||
})
|
||||
).data;
|
||||
}
|
||||
|
||||
async getComment(id) {
|
||||
@ -36,11 +40,11 @@ export default class GithubAPI {
|
||||
}
|
||||
|
||||
async updateComment(id, body) {
|
||||
return (await this.axios.patch(`/issues/comments/${id}`, {body})).data;
|
||||
return (await this.axios.patch(`/issues/comments/${id}`, { body })).data;
|
||||
}
|
||||
|
||||
async appendLabels(issue, labels) {
|
||||
return (await this.axios.post(`/issues/${issue}/labels`, {labels})).data;
|
||||
return (await this.axios.post(`/issues/${issue}/labels`, { labels })).data;
|
||||
}
|
||||
|
||||
async getUser(user) {
|
||||
@ -51,7 +55,7 @@ export default class GithubAPI {
|
||||
try {
|
||||
return (await this.axios.get(`/collaborators/${user}`)).status === 204;
|
||||
} catch (e) {
|
||||
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
@ -67,8 +71,19 @@ export default class GithubAPI {
|
||||
return (await this.axios.get(`/pulls/${issue}`)).data;
|
||||
}
|
||||
|
||||
async getIssues({state= 'open', labels, sort = 'created', desc = false, per_page = 100, page = 1}) {
|
||||
return (await this.axios.get(`/issues`, {params: {state, labels, sort, direction: desc ? 'desc' : 'asc', per_page, page}})).data;
|
||||
async getIssues({
|
||||
state = 'open',
|
||||
labels,
|
||||
sort = 'created',
|
||||
desc = false,
|
||||
per_page = 100,
|
||||
page = 1,
|
||||
}) {
|
||||
return (
|
||||
await this.axios.get(`/issues`, {
|
||||
params: { state, labels, sort, direction: desc ? 'desc' : 'asc', per_page, page },
|
||||
})
|
||||
).data;
|
||||
}
|
||||
|
||||
async updateIssue(issue, data) {
|
||||
@ -77,55 +92,66 @@ export default class GithubAPI {
|
||||
|
||||
async closeIssue(issue) {
|
||||
return this.updateIssue(issue, {
|
||||
state: "closed"
|
||||
})
|
||||
state: 'closed',
|
||||
});
|
||||
}
|
||||
|
||||
async getReleases({per_page = 30, page= 1} = {}) {
|
||||
return (await this.axios.get(`/releases`, {params: {per_page, page}})).data;
|
||||
async getReleases({ per_page = 30, page = 1 } = {}) {
|
||||
return (await this.axios.get(`/releases`, { params: { per_page, page } })).data;
|
||||
}
|
||||
|
||||
async getRelease(release = 'latest') {
|
||||
return (await this.axios.get(parseVersion(release) ? `/releases/tags/${release}` : `/releases/${release}`)).data;
|
||||
return (
|
||||
await this.axios.get(
|
||||
parseVersion(release) ? `/releases/tags/${release}` : `/releases/${release}`
|
||||
)
|
||||
).data;
|
||||
}
|
||||
|
||||
async getTags({per_page = 30, page= 1} = {}) {
|
||||
return (await this.axios.get(`/tags`, {params: {per_page, page}})).data;
|
||||
async getTags({ per_page = 30, page = 1 } = {}) {
|
||||
return (await this.axios.get(`/tags`, { params: { per_page, page } })).data;
|
||||
}
|
||||
|
||||
async reopenIssue(issue) {
|
||||
return this.updateIssue(issue, {
|
||||
state: "open"
|
||||
})
|
||||
state: 'open',
|
||||
});
|
||||
}
|
||||
|
||||
static async getTagRef(tag) {
|
||||
try {
|
||||
return (await exec(`git show-ref --tags "refs/tags/${tag}"`)).stdout.split(' ')[0];
|
||||
} catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
static async getLatestTag() {
|
||||
try{
|
||||
const {stdout} = await exec(`git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1`);
|
||||
try {
|
||||
const { stdout } = await exec(
|
||||
`git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1`
|
||||
);
|
||||
|
||||
return stdout.split('/').pop();
|
||||
} catch (e) {}
|
||||
} catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
static normalizeTag(tag){
|
||||
static normalizeTag(tag) {
|
||||
return tag ? 'v' + tag.replace(/^v/, '') : '';
|
||||
}
|
||||
}
|
||||
|
||||
const {prototype} = GithubAPI;
|
||||
const { prototype } = GithubAPI;
|
||||
|
||||
['getUser', 'isCollaborator'].forEach(methodName => {
|
||||
prototype[methodName] = memoize(prototype[methodName], { promise: true })
|
||||
});
|
||||
|
||||
['get', 'post', 'put', 'delete', 'isAxiosError'].forEach((method) => prototype[method] = function(...args){
|
||||
return this.axios[method](...args);
|
||||
['getUser', 'isCollaborator'].forEach((methodName) => {
|
||||
prototype[methodName] = memoize(prototype[methodName], { promise: true });
|
||||
});
|
||||
|
||||
['get', 'post', 'put', 'delete', 'isAxiosError'].forEach(
|
||||
(method) =>
|
||||
(prototype[method] = function (...args) {
|
||||
return this.axios[method](...args);
|
||||
})
|
||||
);
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
import GithubAPI from "./GithubAPI.js";
|
||||
import GithubAPI from './GithubAPI.js';
|
||||
import api from './api.js';
|
||||
import Handlebars from "handlebars";
|
||||
import fs from "fs/promises";
|
||||
import {colorize} from "./helpers/colorize.js";
|
||||
import {getReleaseInfo} from "./contributors.js";
|
||||
import path from "path";
|
||||
import {fileURLToPath} from "url";
|
||||
import Handlebars from 'handlebars';
|
||||
import fs from 'fs/promises';
|
||||
import { colorize } from './helpers/colorize.js';
|
||||
import { getReleaseInfo } from './contributors.js';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
const NOTIFY_PR_TEMPLATE = path.resolve(__dirname, '../templates/pr_published.hbs');
|
||||
|
||||
const normalizeTag = (tag) => tag ? 'v' + tag.replace(/^v/, '') : '';
|
||||
const normalizeTag = (tag) => (tag ? 'v' + tag.replace(/^v/, '') : '');
|
||||
|
||||
const GITHUB_BOT_LOGIN = 'github-actions[bot]';
|
||||
|
||||
@ -19,14 +19,11 @@ const skipCollaboratorPRs = true;
|
||||
|
||||
class RepoBot {
|
||||
constructor(options) {
|
||||
const {
|
||||
owner, repo,
|
||||
templates
|
||||
} = options || {};
|
||||
const { owner, repo, templates } = options || {};
|
||||
|
||||
this.templates = {
|
||||
published: NOTIFY_PR_TEMPLATE,
|
||||
...templates
|
||||
...templates,
|
||||
};
|
||||
|
||||
this.github = api || new GithubAPI(owner, repo);
|
||||
@ -45,7 +42,7 @@ class RepoBot {
|
||||
try {
|
||||
pr = await this.github.getPR(id);
|
||||
} catch (err) {
|
||||
if(err.response?.status === 404) {
|
||||
if (err.response?.status === 404) {
|
||||
throw new Error(`PR #${id} not found (404)`);
|
||||
}
|
||||
|
||||
@ -54,25 +51,33 @@ class RepoBot {
|
||||
|
||||
tag = normalizeTag(tag);
|
||||
|
||||
const {merged, labels, user: {login, type}} = pr;
|
||||
const {
|
||||
merged,
|
||||
labels,
|
||||
user: { login, type },
|
||||
} = pr;
|
||||
|
||||
const isBot = type === 'Bot';
|
||||
|
||||
if (!merged) {
|
||||
return false
|
||||
return false;
|
||||
}
|
||||
|
||||
await this.github.appendLabels(id, [tag]);
|
||||
|
||||
if (isBot || labels.find(({name}) => name === 'automated pr') || (skipCollaboratorPRs && await this.github.isCollaborator(login))) {
|
||||
if (
|
||||
isBot ||
|
||||
labels.find(({ name }) => name === 'automated pr') ||
|
||||
(skipCollaboratorPRs && (await this.github.isCollaborator(login)))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const comments = await this.github.getComments(id, {desc: true});
|
||||
const comments = await this.github.getComments(id, { desc: true });
|
||||
|
||||
const comment = comments.find(
|
||||
({body, user}) => user.login === GITHUB_BOT_LOGIN && body.indexOf('published in') >= 0
|
||||
)
|
||||
({ body, user }) => user.login === GITHUB_BOT_LOGIN && body.indexOf('published in') >= 0
|
||||
);
|
||||
|
||||
if (comment) {
|
||||
console.log(colorize()`Release comment [${comment.html_url}] already exists in #${pr.id}`);
|
||||
@ -88,8 +93,8 @@ class RepoBot {
|
||||
author,
|
||||
release: {
|
||||
tag,
|
||||
url: `https://github.com/${this.owner}/${this.repo}/releases/tag/${tag}`
|
||||
}
|
||||
url: `https://github.com/${this.owner}/${this.repo}/releases/tag/${tag}`,
|
||||
},
|
||||
});
|
||||
|
||||
return await this.addComment(id, message);
|
||||
@ -104,7 +109,7 @@ class RepoBot {
|
||||
throw Error(colorize()`Can't get release info for ${tag}`);
|
||||
}
|
||||
|
||||
const {merges} = release;
|
||||
const { merges } = release;
|
||||
|
||||
console.log(colorize()`Found ${merges.length} PRs in ${tag}:`);
|
||||
|
||||
@ -112,7 +117,7 @@ class RepoBot {
|
||||
|
||||
for (const pr of merges) {
|
||||
try {
|
||||
console.log(colorize()`${i++}) Notify PR #${pr.id}`)
|
||||
console.log(colorize()`${i++}) Notify PR #${pr.id}`);
|
||||
const result = await this.notifyPRPublished(pr.id, tag);
|
||||
console.log('✔️', result ? 'Label, comment' : 'Label');
|
||||
} catch (err) {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import minimist from "minimist";
|
||||
import minimist from 'minimist';
|
||||
import RepoBot from '../RepoBot.js';
|
||||
import fs from 'fs/promises';
|
||||
|
||||
@ -13,7 +13,6 @@ let { tag } = argv;
|
||||
|
||||
tag = 'v' + version;
|
||||
} else if (typeof tag !== 'string') {
|
||||
|
||||
throw new Error('tag must be a string');
|
||||
}
|
||||
|
||||
@ -25,4 +24,3 @@ let { tag } = argv;
|
||||
console.warn('Error:', err.message);
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
import GithubAPI from "./GithubAPI.js";
|
||||
import GithubAPI from './GithubAPI.js';
|
||||
|
||||
export default new GithubAPI('axios', 'axios');
|
||||
|
||||
@ -3,9 +3,9 @@ import assert from 'assert';
|
||||
import axios from '../index.js';
|
||||
import axiosBuild from '../dist/node/axios.cjs';
|
||||
|
||||
const {version} = JSON.parse(fs.readFileSync('./package.json'));
|
||||
const { version } = JSON.parse(fs.readFileSync('./package.json'));
|
||||
|
||||
console.log('Checking versions...\n----------------------------')
|
||||
console.log('Checking versions...\n----------------------------');
|
||||
|
||||
console.log(`Package version: v${version}`);
|
||||
console.log(`Axios version: v${axios.VERSION}`);
|
||||
@ -25,5 +25,3 @@ assert.strictEqual(
|
||||
);
|
||||
|
||||
console.log('✔️ PASSED\n');
|
||||
|
||||
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import axios from "./githubAxios.js";
|
||||
import util from "util";
|
||||
import cp from "child_process";
|
||||
import Handlebars from "handlebars";
|
||||
import fs from "fs/promises";
|
||||
import {colorize} from "./helpers/colorize.js";
|
||||
import axios from './githubAxios.js';
|
||||
import util from 'util';
|
||||
import cp from 'child_process';
|
||||
import Handlebars from 'handlebars';
|
||||
import fs from 'fs/promises';
|
||||
import { colorize } from './helpers/colorize.js';
|
||||
|
||||
const exec = util.promisify(cp.exec);
|
||||
|
||||
@ -11,48 +11,49 @@ const ONE_MB = 1024 * 1024;
|
||||
|
||||
const removeExtraLineBreaks = (str) => str.replace(/(?:\r\n|\r|\n){3,}/gm, '\r\n\r\n');
|
||||
|
||||
const cleanTemplate = template => template
|
||||
.replace(/\n +/g, '\n')
|
||||
.replace(/^ +/, '')
|
||||
.replace(/\n\n\n+/g, '\n\n')
|
||||
.replace(/\n\n$/, '\n');
|
||||
const cleanTemplate = (template) =>
|
||||
template
|
||||
.replace(/\n +/g, '\n')
|
||||
.replace(/^ +/, '')
|
||||
.replace(/\n\n\n+/g, '\n\n')
|
||||
.replace(/\n\n$/, '\n');
|
||||
|
||||
const getUserFromCommit = ((commitCache) => async (sha) => {
|
||||
try {
|
||||
if(commitCache[sha] !== undefined) {
|
||||
if (commitCache[sha] !== undefined) {
|
||||
return commitCache[sha];
|
||||
}
|
||||
|
||||
console.log(colorize()`fetch github commit info (${sha})`);
|
||||
|
||||
const {data} = await axios.get(`https://api.github.com/repos/axios/axios/commits/${sha}`);
|
||||
const { data } = await axios.get(`https://api.github.com/repos/axios/axios/commits/${sha}`);
|
||||
|
||||
return commitCache[sha] = {
|
||||
return (commitCache[sha] = {
|
||||
...data.commit.author,
|
||||
...data.author,
|
||||
avatar_url_sm: data.author.avatar_url ? data.author.avatar_url + '&s=18' : '',
|
||||
};
|
||||
});
|
||||
} catch (err) {
|
||||
return commitCache[sha] = null;
|
||||
return (commitCache[sha] = null);
|
||||
}
|
||||
})({});
|
||||
|
||||
const getIssueById = ((cache) => async (id) => {
|
||||
if(cache[id] !== undefined) {
|
||||
if (cache[id] !== undefined) {
|
||||
return cache[id];
|
||||
}
|
||||
|
||||
try {
|
||||
const {data} = await axios.get(`https://api.github.com/repos/axios/axios/issues/${id}`);
|
||||
const { data } = await axios.get(`https://api.github.com/repos/axios/axios/issues/${id}`);
|
||||
|
||||
return cache[id] = data;
|
||||
return (cache[id] = data);
|
||||
} catch (err) {
|
||||
return null;
|
||||
}
|
||||
})({});
|
||||
|
||||
const getUserInfo = ((userCache) => async (userEntry) => {
|
||||
const {email, commits} = userEntry;
|
||||
const { email, commits } = userEntry;
|
||||
|
||||
if (userCache[email] !== undefined) {
|
||||
return userCache[email];
|
||||
@ -60,32 +61,32 @@ const getUserInfo = ((userCache) => async (userEntry) => {
|
||||
|
||||
console.log(colorize()`fetch github user info [${userEntry.name}]`);
|
||||
|
||||
return userCache[email] = {
|
||||
return (userCache[email] = {
|
||||
...userEntry,
|
||||
...await getUserFromCommit(commits[0].hash)
|
||||
}
|
||||
...(await getUserFromCommit(commits[0].hash)),
|
||||
});
|
||||
})({});
|
||||
|
||||
const deduplicate = (authors) => {
|
||||
const loginsMap = {};
|
||||
const combined= {};
|
||||
const combined = {};
|
||||
|
||||
const assign = (a, b) => {
|
||||
const {insertions, deletions, points, ...rest} = b;
|
||||
const { insertions, _deletions, _points, ...rest } = b;
|
||||
|
||||
Object.assign(a, rest);
|
||||
|
||||
a.insertions += insertions;
|
||||
a.deletions += insertions;
|
||||
a.insertions += insertions;
|
||||
}
|
||||
};
|
||||
|
||||
for(const [email, user] of Object.entries(authors)) {
|
||||
const {login} = user;
|
||||
for (const [email, user] of Object.entries(authors)) {
|
||||
const { login } = user;
|
||||
let entry;
|
||||
|
||||
if(login && (entry = loginsMap[login])) {
|
||||
assign(entry, user);
|
||||
if (login && (entry = loginsMap[login])) {
|
||||
assign(entry, user);
|
||||
} else {
|
||||
login && (loginsMap[login] = user);
|
||||
combined[email] = user;
|
||||
@ -93,10 +94,10 @@ const deduplicate = (authors) => {
|
||||
}
|
||||
|
||||
return combined;
|
||||
}
|
||||
};
|
||||
|
||||
const getReleaseInfo = ((releaseCache) => async (tag) => {
|
||||
if(releaseCache[tag] !== undefined) {
|
||||
if (releaseCache[tag] !== undefined) {
|
||||
return releaseCache[tag];
|
||||
}
|
||||
|
||||
@ -104,47 +105,48 @@ const getReleaseInfo = ((releaseCache) => async (tag) => {
|
||||
|
||||
const version = 'v' + tag.replace(/^v/, '');
|
||||
|
||||
const command = isUnreleasedTag ?
|
||||
`npx auto-changelog --unreleased-only --stdout --commit-limit false --template json` :
|
||||
`npx auto-changelog ${
|
||||
version ? '--starting-version ' + version + ' --ending-version ' + version : ''
|
||||
} --stdout --commit-limit false --template json`;
|
||||
const command = isUnreleasedTag
|
||||
? `npx auto-changelog --unreleased-only --stdout --commit-limit false --template json`
|
||||
: `npx auto-changelog ${
|
||||
version ? '--starting-version ' + version + ' --ending-version ' + version : ''
|
||||
} --stdout --commit-limit false --template json`;
|
||||
|
||||
console.log(command);
|
||||
|
||||
const {stdout} = await exec(command, {maxBuffer: 10 * ONE_MB});
|
||||
const { stdout } = await exec(command, { maxBuffer: 10 * ONE_MB });
|
||||
|
||||
const release = JSON.parse(stdout)[0];
|
||||
|
||||
if(release) {
|
||||
if (release) {
|
||||
const authors = {};
|
||||
|
||||
const commits = [
|
||||
...release.commits,
|
||||
...release.fixes.map(fix => fix.commit),
|
||||
...release.merges.map(fix => fix.commit)
|
||||
...release.fixes.map((fix) => fix.commit),
|
||||
...release.merges.map((fix) => fix.commit),
|
||||
].filter(Boolean);
|
||||
|
||||
const commitMergeMap = {};
|
||||
|
||||
for(const merge of release.merges) {
|
||||
for (const merge of release.merges) {
|
||||
commitMergeMap[merge.commit.hash] = merge.id;
|
||||
}
|
||||
|
||||
for (const {hash, author, email, insertions, deletions} of commits) {
|
||||
const entry = authors[email] = (authors[email] || {
|
||||
for (const { hash, author, email, insertions, deletions } of commits) {
|
||||
const entry = (authors[email] = authors[email] || {
|
||||
name: author,
|
||||
prs: [],
|
||||
email,
|
||||
commits: [],
|
||||
insertions: 0, deletions: 0
|
||||
insertions: 0,
|
||||
deletions: 0,
|
||||
});
|
||||
|
||||
entry.commits.push({hash});
|
||||
entry.commits.push({ hash });
|
||||
|
||||
let pr;
|
||||
|
||||
if((pr = commitMergeMap[hash])) {
|
||||
if ((pr = commitMergeMap[hash])) {
|
||||
entry.prs.push(pr);
|
||||
}
|
||||
|
||||
@ -160,13 +162,12 @@ const getReleaseInfo = ((releaseCache) => async (tag) => {
|
||||
}
|
||||
|
||||
for (const [email, author] of Object.entries(authors)) {
|
||||
const entry = authors[email] = await getUserInfo(author);
|
||||
const entry = (authors[email] = await getUserInfo(author));
|
||||
|
||||
entry.isBot = entry.type === "Bot";
|
||||
entry.isBot = entry.type === 'Bot';
|
||||
}
|
||||
|
||||
release.authors = Object.values(deduplicate(authors))
|
||||
.sort((a, b) => b.points - a.points);
|
||||
release.authors = Object.values(deduplicate(authors)).sort((a, b) => b.points - a.points);
|
||||
|
||||
release.allCommits = commits;
|
||||
}
|
||||
@ -179,27 +180,36 @@ const getReleaseInfo = ((releaseCache) => async (tag) => {
|
||||
const renderContributorsList = async (tag, template) => {
|
||||
const release = await getReleaseInfo(tag);
|
||||
|
||||
const compile = Handlebars.compile(String(await fs.readFile(template)))
|
||||
const compile = Handlebars.compile(String(await fs.readFile(template)));
|
||||
|
||||
const content = compile(release);
|
||||
|
||||
return removeExtraLineBreaks(cleanTemplate(content));
|
||||
}
|
||||
};
|
||||
|
||||
const renderPRsList = async (tag, template, {comments_threshold= 5, awesome_threshold= 5, label = 'add_to_changelog'} = {}) => {
|
||||
const renderPRsList = async (
|
||||
tag,
|
||||
template,
|
||||
{ comments_threshold = 5, awesome_threshold = 5, label = 'add_to_changelog' } = {}
|
||||
) => {
|
||||
const release = await getReleaseInfo(tag);
|
||||
|
||||
const prs = {};
|
||||
|
||||
for(const merge of release.merges) {
|
||||
for (const merge of release.merges) {
|
||||
const pr = await getIssueById(merge.id);
|
||||
|
||||
if (pr && pr.labels.find(({name}) => name === label)) {
|
||||
const {reactions, body} = pr;
|
||||
if (pr && pr.labels.find(({ name }) => name === label)) {
|
||||
const { reactions, body } = pr;
|
||||
prs[pr.number] = pr;
|
||||
pr.isHot = pr.comments > comments_threshold;
|
||||
const points = reactions['+1'] +
|
||||
reactions['hooray'] + reactions['rocket'] + reactions['heart'] + reactions['laugh'] - reactions['-1'];
|
||||
const points =
|
||||
reactions['+1'] +
|
||||
reactions['hooray'] +
|
||||
reactions['rocket'] +
|
||||
reactions['heart'] +
|
||||
reactions['laugh'] -
|
||||
reactions['-1'];
|
||||
|
||||
pr.isAwesome = points > awesome_threshold;
|
||||
|
||||
@ -210,7 +220,7 @@ const renderPRsList = async (tag, template, {comments_threshold= 5, awesome_thre
|
||||
if (body) {
|
||||
const reg = /```+changelog\n*(.+?)?\n*```/gms;
|
||||
|
||||
while((match = reg.exec(body))) {
|
||||
while ((match = reg.exec(body))) {
|
||||
match[1] && pr.messages.push(match[1]);
|
||||
}
|
||||
}
|
||||
@ -219,23 +229,19 @@ const renderPRsList = async (tag, template, {comments_threshold= 5, awesome_thre
|
||||
|
||||
release.prs = Object.values(prs);
|
||||
|
||||
const compile = Handlebars.compile(String(await fs.readFile(template)))
|
||||
const compile = Handlebars.compile(String(await fs.readFile(template)));
|
||||
|
||||
const content = compile(release);
|
||||
|
||||
return removeExtraLineBreaks(cleanTemplate(content));
|
||||
}
|
||||
};
|
||||
|
||||
const getTagRef = async (tag) => {
|
||||
try {
|
||||
return (await exec(`git show-ref --tags "refs/tags/${tag}"`)).stdout.split(' ')[0];
|
||||
} catch(e) {
|
||||
} catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export {
|
||||
renderContributorsList,
|
||||
getReleaseInfo,
|
||||
renderPRsList,
|
||||
getTagRef
|
||||
}
|
||||
export { renderContributorsList, getReleaseInfo, renderPRsList, getTagRef };
|
||||
|
||||
@ -1,19 +1,24 @@
|
||||
import axios from '../index.js';
|
||||
import {colorize} from "./helpers/colorize.js";
|
||||
import { colorize } from './helpers/colorize.js';
|
||||
|
||||
const {GITHUB_TOKEN} = process.env;
|
||||
const { GITHUB_TOKEN } = process.env;
|
||||
|
||||
GITHUB_TOKEN ? console.log(`[GITHUB_TOKEN OK]`) : console.warn(`[GITHUB_TOKEN is not defined]`);
|
||||
|
||||
const defaultTransform = axios.defaults.transformRequest;
|
||||
|
||||
export default axios.create({
|
||||
transformRequest: [defaultTransform[0], function (data) {
|
||||
console.log(colorize()`[${this.method.toUpperCase()}] Request [${new URL(axios.getUri(this)).pathname}]`);
|
||||
return data;
|
||||
}],
|
||||
transformRequest: [
|
||||
defaultTransform[0],
|
||||
function (data) {
|
||||
console.log(
|
||||
colorize()`[${this.method.toUpperCase()}] Request [${new URL(axios.getUri(this)).pathname}]`
|
||||
);
|
||||
return data;
|
||||
},
|
||||
],
|
||||
baseURL: 'https://api.github.com/',
|
||||
headers: {
|
||||
Authorization: GITHUB_TOKEN ? `token ${GITHUB_TOKEN}` : null
|
||||
}
|
||||
Authorization: GITHUB_TOKEN ? `token ${GITHUB_TOKEN}` : null,
|
||||
},
|
||||
});
|
||||
|
||||
@ -1,14 +1,16 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
export const colorize = (...colors) => {
|
||||
if(!colors.length) {
|
||||
if (!colors.length) {
|
||||
colors = ['green', 'cyan', 'magenta', 'blue', 'yellow', 'red'];
|
||||
}
|
||||
|
||||
const colorsCount = colors.length;
|
||||
|
||||
return (strings, ...values) => {
|
||||
const {length} = values;
|
||||
return strings.map((str, i) => i < length ? str + chalk[colors[i%colorsCount]].bold(values[i]) : str).join('');
|
||||
}
|
||||
}
|
||||
const { length } = values;
|
||||
return strings
|
||||
.map((str, i) => (i < length ? str + chalk[colors[i % colorsCount]].bold(values[i]) : str))
|
||||
.join('');
|
||||
};
|
||||
};
|
||||
|
||||
@ -1,12 +1,13 @@
|
||||
export const matchAll = (text, regexp, cb) => {
|
||||
let match;
|
||||
while((match = regexp.exec(text))) {
|
||||
|
||||
while ((match = regexp.exec(text))) {
|
||||
cb(match);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const parseSection = (body, name, cb) => {
|
||||
matchAll(body, new RegExp(`^(#+)\\s+${name}?(.*?)^\\1\\s+\\w+`, 'gims'), cb);
|
||||
}
|
||||
};
|
||||
|
||||
export const parseVersion = (rawVersion) => /^v?(\d+).(\d+).(\d+)/.exec(rawVersion);
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import fs from 'fs/promises';
|
||||
import path from 'path';
|
||||
import {renderContributorsList, getTagRef, renderPRsList} from './contributors.js';
|
||||
import { renderContributorsList, getTagRef, renderPRsList } from './contributors.js';
|
||||
import asyncReplace from 'string-replace-async';
|
||||
import {fileURLToPath} from "url";
|
||||
import {colorize} from "./helpers/colorize.js";
|
||||
import { fileURLToPath } from 'url';
|
||||
import { colorize } from './helpers/colorize.js';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
@ -16,7 +16,7 @@ const injectSection = async (name, contributorsRE, injector, infile = '../CHANGE
|
||||
infile = path.resolve(__dirname, infile);
|
||||
|
||||
const content = String(await fs.readFile(infile));
|
||||
const headerRE = /^#+\s+\[([-_\d.\w]+)].+?$/mig;
|
||||
const headerRE = /^#+\s+\[([-_\d.\w]+)].+?$/gim;
|
||||
|
||||
let tag;
|
||||
let index = 0;
|
||||
@ -32,11 +32,11 @@ const injectSection = async (name, contributorsRE, injector, infile = '../CHANGE
|
||||
tag = nextTag;
|
||||
index = offset + match.length;
|
||||
|
||||
if(currentTag) {
|
||||
if (currentTag) {
|
||||
if (hasSection) {
|
||||
console.log(colorize()`[${currentTag}]: ✓ OK`);
|
||||
} else {
|
||||
const target = isFirstTag && (!await getTagRef(currentTag)) ? '' : currentTag;
|
||||
const target = isFirstTag && !(await getTagRef(currentTag)) ? '' : currentTag;
|
||||
|
||||
console.log(colorize()`[${currentTag}]: ❌ MISSED` + (!target ? ' (UNRELEASED)' : ''));
|
||||
|
||||
@ -63,16 +63,12 @@ const injectSection = async (name, contributorsRE, injector, infile = '../CHANGE
|
||||
});
|
||||
|
||||
await fs.writeFile(infile, newContent);
|
||||
}
|
||||
};
|
||||
|
||||
await injectSection(
|
||||
'PRs',
|
||||
/^\s*### PRs/mi,
|
||||
(tag) => tag ? '' : renderPRsList(tag, PRS_TEMPLATE, {awesome_threshold: 5, comments_threshold: 7}),
|
||||
await injectSection('PRs', /^\s*### PRs/im, (tag) =>
|
||||
tag ? '' : renderPRsList(tag, PRS_TEMPLATE, { awesome_threshold: 5, comments_threshold: 7 })
|
||||
);
|
||||
|
||||
await injectSection(
|
||||
'contributors',
|
||||
/^\s*### Contributors/mi,
|
||||
(tag) => renderContributorsList(tag, CONTRIBUTORS_TEMPLATE)
|
||||
await injectSection('contributors', /^\s*### Contributors/im, (tag) =>
|
||||
renderContributorsList(tag, CONTRIBUTORS_TEMPLATE)
|
||||
);
|
||||
|
||||
107
bin/pr.js
107
bin/pr.js
@ -1,22 +1,22 @@
|
||||
import Handlebars from "handlebars";
|
||||
import fs from "fs/promises";
|
||||
import Handlebars from 'handlebars';
|
||||
import fs from 'fs/promises';
|
||||
import prettyBytes from 'pretty-bytes';
|
||||
import {getBlobHistory} from './repo.js';
|
||||
import pacote from "pacote";
|
||||
import zlib from "zlib";
|
||||
import tar from "tar-stream";
|
||||
import { Readable } from "stream";
|
||||
import { getBlobHistory } from './repo.js';
|
||||
import pacote from 'pacote';
|
||||
import zlib from 'zlib';
|
||||
import tar from 'tar-stream';
|
||||
import { Readable } from 'stream';
|
||||
|
||||
const FILE_SIZE_DIFF_THRESHOLD = 512; // 0.5KB
|
||||
|
||||
const readJSONFile = async (file) => JSON.parse(String(await fs.readFile(file)));
|
||||
|
||||
const {version} = await readJSONFile('./package.json');
|
||||
const { version } = await readJSONFile('./package.json');
|
||||
|
||||
const parseVersion = (tag) => {
|
||||
const [, major, minor, patch] = /^v?(\d+)\.(\d+)\.(\d+)/.exec(tag) || [];
|
||||
return [major, minor, patch];
|
||||
}
|
||||
};
|
||||
|
||||
const [MAJOR_NUMBER] = parseVersion(version);
|
||||
|
||||
@ -27,14 +27,14 @@ async function getFilesFromNPM(pkg) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const extract = tar.extract();
|
||||
|
||||
extract.on("entry", (header, stream, next) => {
|
||||
extract.on('entry', (header, stream, next) => {
|
||||
const buffers = [];
|
||||
|
||||
stream.on('data', (buffer) => {
|
||||
buffers.push(buffer);
|
||||
});
|
||||
|
||||
stream.on("end", () => {
|
||||
stream.on('end', () => {
|
||||
const content = Buffer.concat(buffers);
|
||||
|
||||
const gzipped = zlib.gzipSync(content);
|
||||
@ -42,7 +42,7 @@ async function getFilesFromNPM(pkg) {
|
||||
files[header.name.replace(/^package\//, '')] = {
|
||||
gzip: gzipped.length,
|
||||
compressed: header.size ? gzipped.length / header.size : 1,
|
||||
...header
|
||||
...header,
|
||||
};
|
||||
|
||||
next();
|
||||
@ -52,51 +52,50 @@ async function getFilesFromNPM(pkg) {
|
||||
Readable.from(tgzData)
|
||||
.pipe(zlib.createGunzip())
|
||||
.pipe(extract)
|
||||
.on("error", reject)
|
||||
.on('error', reject)
|
||||
.on('finish', () => resolve(files));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
const generateFileReport = async (files, historyCount = 3) => {
|
||||
const allFilesStat = {};
|
||||
const commits = (await getBlobHistory('package.json', historyCount)).filter(({tag}) => {
|
||||
const commits = (await getBlobHistory('package.json', historyCount)).filter(({ tag }) => {
|
||||
return MAJOR_NUMBER === parseVersion(tag)[0];
|
||||
});
|
||||
const warns = [];
|
||||
|
||||
const npmHistory = {};
|
||||
|
||||
await Promise.all(commits.map(async ({tag}) => {
|
||||
npmHistory[tag] = await getFilesFromNPM(`axios@${tag.replace(/^v/, '')}`);
|
||||
}));
|
||||
await Promise.all(
|
||||
commits.map(async ({ tag }) => {
|
||||
npmHistory[tag] = await getFilesFromNPM(`axios@${tag.replace(/^v/, '')}`);
|
||||
})
|
||||
);
|
||||
|
||||
for(const [name, filename] of Object.entries(files)) {
|
||||
for (const [name, filename] of Object.entries(files)) {
|
||||
const file = await fs.stat(filename).catch(console.warn);
|
||||
const gzip = file ? zlib.gzipSync(await fs.readFile(filename)).length : 0;
|
||||
|
||||
const stat = allFilesStat[filename] = file ? {
|
||||
name,
|
||||
size: file.size,
|
||||
path: filename,
|
||||
gzip,
|
||||
compressed: file.size ? gzip / file.size : 1,
|
||||
history: commits.map(({tag}) => {
|
||||
const files = npmHistory[tag];
|
||||
const file = files && files[filename] || null;
|
||||
const stat = (allFilesStat[filename] = file
|
||||
? {
|
||||
name,
|
||||
size: file.size,
|
||||
path: filename,
|
||||
gzip,
|
||||
compressed: file.size ? gzip / file.size : 1,
|
||||
history: commits.map(({ tag }) => {
|
||||
const files = npmHistory[tag];
|
||||
const file = (files && files[filename]) || null;
|
||||
|
||||
return {
|
||||
tag,
|
||||
...file
|
||||
};
|
||||
})
|
||||
} : null;
|
||||
return {
|
||||
tag,
|
||||
...file,
|
||||
};
|
||||
}),
|
||||
}
|
||||
: null);
|
||||
|
||||
|
||||
|
||||
if(stat.history[0]) {
|
||||
if (stat.history[0]) {
|
||||
const diff = stat.gzip - stat.history[0].gzip;
|
||||
|
||||
if (diff > FILE_SIZE_DIFF_THRESHOLD) {
|
||||
@ -113,22 +112,28 @@ const generateFileReport = async (files, historyCount = 3) => {
|
||||
return {
|
||||
version,
|
||||
files: allFilesStat,
|
||||
warns
|
||||
warns,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const generateBody = async ({files, template = './templates/pr.hbs'} = {}) => {
|
||||
const generateBody = async ({ files, template = './templates/pr.hbs' } = {}) => {
|
||||
const data = await generateFileReport(files);
|
||||
|
||||
Handlebars.registerHelper('filesize', (bytes) => bytes != null ? prettyBytes(bytes) : '<unknown>');
|
||||
Handlebars.registerHelper('percent', (value) => Number.isFinite(value) ? `${(value * 100).toFixed(1)}%` : `---` );
|
||||
Handlebars.registerHelper('filesize', (bytes) =>
|
||||
bytes != null ? prettyBytes(bytes) : '<unknown>'
|
||||
);
|
||||
Handlebars.registerHelper('percent', (value) =>
|
||||
Number.isFinite(value) ? `${(value * 100).toFixed(1)}%` : `---`
|
||||
);
|
||||
|
||||
return Handlebars.compile(String(await fs.readFile(template)))(data);
|
||||
}
|
||||
};
|
||||
|
||||
console.log(await generateBody({
|
||||
files: {
|
||||
'Browser build (UMD)' : 'dist/axios.min.js',
|
||||
'Browser build (ESM)' : 'dist/esm/axios.min.js',
|
||||
}
|
||||
}));
|
||||
console.log(
|
||||
await generateBody({
|
||||
files: {
|
||||
'Browser build (UMD)': 'dist/axios.min.js',
|
||||
'Browser build (ESM)': 'dist/esm/axios.min.js',
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
36
bin/repo.js
36
bin/repo.js
@ -1,20 +1,20 @@
|
||||
import util from "util";
|
||||
import cp from "child_process";
|
||||
import util from 'util';
|
||||
import cp from 'child_process';
|
||||
|
||||
export const exec = util.promisify(cp.exec);
|
||||
|
||||
export const getBlobSize = async (filepath, sha ='HEAD') => {
|
||||
const size = (await exec(
|
||||
`git cat-file -s ${sha}:${filepath}`
|
||||
)).stdout;
|
||||
export const getBlobSize = async (filepath, sha = 'HEAD') => {
|
||||
const size = (await exec(`git cat-file -s ${sha}:${filepath}`)).stdout;
|
||||
|
||||
return size ? +size : 0;
|
||||
}
|
||||
};
|
||||
|
||||
export const getBlobHistory = async (filepath, maxCount= 5) => {
|
||||
const log = (await exec(
|
||||
`git log --max-count=${maxCount} --no-walk --tags=v* --oneline --format=%H%d -- ${filepath}`
|
||||
)).stdout;
|
||||
export const getBlobHistory = async (filepath, maxCount = 5) => {
|
||||
const log = (
|
||||
await exec(
|
||||
`git log --max-count=${maxCount} --no-walk --tags=v* --oneline --format=%H%d -- ${filepath}`
|
||||
)
|
||||
).stdout;
|
||||
|
||||
const commits = [];
|
||||
|
||||
@ -22,21 +22,19 @@ export const getBlobHistory = async (filepath, maxCount= 5) => {
|
||||
|
||||
const regexp = /^(\w+) \(tag: (v?[.\d]+)\)$/gm;
|
||||
|
||||
while((match = regexp.exec(log))) {
|
||||
while ((match = regexp.exec(log))) {
|
||||
commits.push({
|
||||
sha: match[1],
|
||||
tag: match[2],
|
||||
size: await getBlobSize(filepath, match[1])
|
||||
})
|
||||
size: await getBlobSize(filepath, match[1]),
|
||||
});
|
||||
}
|
||||
|
||||
return commits;
|
||||
}
|
||||
};
|
||||
|
||||
export const getTags = async (pattern = 'v*', sort = '-v:refname') => {
|
||||
const log = (await exec(
|
||||
`git tag -l ${pattern} --sort=${sort}`
|
||||
)).stdout;
|
||||
const log = (await exec(`git tag -l ${pattern} --sort=${sort}`)).stdout;
|
||||
|
||||
return log.split(/\r?\n/);
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import {exec, getTags} from "./repo.js";
|
||||
import fs from "fs";
|
||||
import {colorize} from "./helpers/colorize.js";
|
||||
import { exec, getTags } from './repo.js';
|
||||
import fs from 'fs';
|
||||
import { colorize } from './helpers/colorize.js';
|
||||
|
||||
const {version} = JSON.parse(fs.readFileSync('./package.json'));
|
||||
const { version } = JSON.parse(fs.readFileSync('./package.json'));
|
||||
|
||||
const [major] = version.split('.');
|
||||
const tags = await getTags();
|
||||
@ -13,6 +13,8 @@ const isLatest = latestTag === version;
|
||||
|
||||
let tag = isBeta ? 'next' : isLatest ? 'latest' : `v${major}`;
|
||||
|
||||
console.log(colorize()`Version [${version}] [${isBeta ? 'prerelease' : 'release'}] latest [${latestTag}]=> NPM Tag [${tag}]`);
|
||||
console.log(
|
||||
colorize()`Version [${version}] [${isBeta ? 'prerelease' : 'release'}] latest [${latestTag}]=> NPM Tag [${tag}]`
|
||||
);
|
||||
|
||||
await exec(`echo "tag=${tag}" >> $GITHUB_OUTPUT`);
|
||||
|
||||
@ -1,11 +1,10 @@
|
||||
import { startTestServer, stopHTTPServer } from '../test/helpers/server.js';
|
||||
import { spawn } from 'child_process';
|
||||
import chalk from "chalk";
|
||||
import chalk from 'chalk';
|
||||
|
||||
let server;
|
||||
|
||||
async function run() {
|
||||
|
||||
console.log(chalk.red.bold(`[ Starting HTTP server... ]`));
|
||||
|
||||
server = await startTestServer(3000);
|
||||
@ -13,25 +12,19 @@ async function run() {
|
||||
await new Promise((resolve, reject) => {
|
||||
console.log('Starting karma runner...');
|
||||
|
||||
const karma = spawn(
|
||||
'npx',
|
||||
['karma', 'start', 'karma.conf.cjs', '--single-run'],
|
||||
{
|
||||
stdio: 'inherit',
|
||||
shell: true,
|
||||
env: { ...process.env, LISTEN_ADDR: '0.0.0.0' },
|
||||
});
|
||||
const karma = spawn('npx', ['karma', 'start', 'karma.conf.cjs', '--single-run'], {
|
||||
stdio: 'inherit',
|
||||
shell: true,
|
||||
env: { ...process.env, LISTEN_ADDR: '0.0.0.0' },
|
||||
});
|
||||
|
||||
karma.on('exit', (code) => {
|
||||
code ? reject(new Error(`Karma tests failed with exit code ${code}`)) : resolve();
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
(async() => {
|
||||
(async () => {
|
||||
try {
|
||||
await run();
|
||||
} finally {
|
||||
@ -42,5 +35,3 @@ async function run() {
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
import fs from "fs/promises";
|
||||
import _axios from "../index.js";
|
||||
import { exec } from "./repo.js";
|
||||
import { colorize } from "./helpers/colorize.js";
|
||||
import fs from 'fs/promises';
|
||||
import _axios from '../index.js';
|
||||
import { exec } from './repo.js';
|
||||
import { colorize } from './helpers/colorize.js';
|
||||
|
||||
const axios = _axios.create({
|
||||
headers: {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
|
||||
'User-Agent':
|
||||
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
|
||||
},
|
||||
});
|
||||
|
||||
@ -19,9 +19,7 @@ const getWithRetry = (url, retries = 3) => {
|
||||
if (counter++ >= retries) {
|
||||
throw err;
|
||||
}
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, counter ** counter * 1000),
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, counter ** counter * 1000));
|
||||
return doRequest();
|
||||
}
|
||||
};
|
||||
@ -29,11 +27,7 @@ const getWithRetry = (url, retries = 3) => {
|
||||
return doRequest();
|
||||
};
|
||||
|
||||
const updateReadmeSponsors = async (
|
||||
url,
|
||||
path,
|
||||
marker = "<!--<div>marker</div>-->",
|
||||
) => {
|
||||
const updateReadmeSponsors = async (url, path, marker = '<!--<div>marker</div>-->') => {
|
||||
let fileContent = (await fs.readFile(path)).toString();
|
||||
|
||||
const index = fileContent.indexOf(marker);
|
||||
@ -42,7 +36,7 @@ const updateReadmeSponsors = async (
|
||||
const readmeContent = fileContent.slice(index);
|
||||
|
||||
let { data: sponsorContent } = await getWithRetry(url);
|
||||
sponsorContent += "\n";
|
||||
sponsorContent += '\n';
|
||||
|
||||
const currentSponsorContent = fileContent.slice(0, index);
|
||||
|
||||
@ -54,22 +48,18 @@ const updateReadmeSponsors = async (
|
||||
console.log(colorize()`Sponsor block in [${path}] is up to date`);
|
||||
}
|
||||
} else {
|
||||
console.warn(
|
||||
colorize()`Can not find marker (${marker}) in ${path} to inject sponsor block`,
|
||||
);
|
||||
console.warn(colorize()`Can not find marker (${marker}) in ${path} to inject sponsor block`);
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
(async (url) => {
|
||||
const newContent = await updateReadmeSponsors(url, "./README.md");
|
||||
const newContent = await updateReadmeSponsors(url, './README.md');
|
||||
|
||||
await exec(
|
||||
`echo "changed=${newContent ? "true" : "false"}" >> $GITHUB_OUTPUT`,
|
||||
);
|
||||
await exec(`echo "changed=${newContent ? 'true' : 'false'}" >> $GITHUB_OUTPUT`);
|
||||
if (newContent !== false) {
|
||||
await fs.mkdir("./temp").catch(() => {});
|
||||
await fs.writeFile("./temp/sponsors.md", newContent);
|
||||
await fs.mkdir('./temp').catch(() => {});
|
||||
await fs.writeFile('./temp/sponsors.md', newContent);
|
||||
}
|
||||
})("https://axios-http.com/data/sponsors.md");
|
||||
})('https://axios-http.com/data/sponsors.md');
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import {spawn} from 'child_process';
|
||||
import { spawn } from 'child_process';
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
@ -10,13 +10,15 @@ const isHotfixNeeded = match && match[1] > 16;
|
||||
|
||||
isHotfixNeeded && console.warn('Setting --openssl-legacy-provider as ssl hotfix');
|
||||
|
||||
const test = spawn('cross-env',
|
||||
isHotfixNeeded ? ['NODE_OPTIONS=--openssl-legacy-provider', ...args] : args, {
|
||||
const test = spawn(
|
||||
'cross-env',
|
||||
isHotfixNeeded ? ['NODE_OPTIONS=--openssl-legacy-provider', ...args] : args,
|
||||
{
|
||||
shell: true,
|
||||
stdio: 'inherit'
|
||||
stdio: 'inherit',
|
||||
}
|
||||
);
|
||||
|
||||
test.on('exit', function (code) {
|
||||
process.exit(code)
|
||||
})
|
||||
process.exit(code);
|
||||
});
|
||||
|
||||
@ -1,69 +1,73 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>axios - abort controller example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
|
||||
<style>
|
||||
.status { margin-top: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
<body class="container">
|
||||
<h1>axios.AbortController</h1>
|
||||
|
||||
<div class="row" style="margin-top: 20px;">
|
||||
<div class="col-md-12">
|
||||
<h3>1. Single Request Cancellation</h3>
|
||||
<p>Click "Start Request" to begin a 3-second request. Click "Cancel Request" to abort it.</p>
|
||||
<button id="startBtn" class="btn btn-primary">Start Request</button>
|
||||
<button id="cancelBtn" class="btn btn-danger" disabled>Cancel Request</button>
|
||||
<div id="singleStatus" class="status"></div>
|
||||
</div>
|
||||
<head>
|
||||
<title>axios - abort controller example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
|
||||
<style>
|
||||
.status {
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="container">
|
||||
<h1>axios.AbortController</h1>
|
||||
|
||||
<div class="row" style="margin-top: 20px;">
|
||||
<div class="col-md-12">
|
||||
<h3>1. Single Request Cancellation</h3>
|
||||
<p>Click "Start Request" to begin a 3-second request. Click "Cancel Request" to abort it.</p>
|
||||
<button id="startBtn" class="btn btn-primary">Start Request</button>
|
||||
<button id="cancelBtn" class="btn btn-danger" disabled>Cancel Request</button>
|
||||
<div id="singleStatus" class="status"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr/>
|
||||
<hr />
|
||||
|
||||
<div class="row" style="margin-top: 20px;">
|
||||
<div class="col-md-12">
|
||||
<h3>2. Search-as-you-type (Race Condition Handling)</h3>
|
||||
<p>Type quickly. Previous pending requests will be cancelled automatically.</p>
|
||||
<div class="form-group">
|
||||
<input type="text" id="searchInput" class="form-control" placeholder="Type to search...">
|
||||
</div>
|
||||
<div id="searchStatus" class="status"></div>
|
||||
<ul id="searchLog" class="list-group" style="margin-top: 10px; max-height: 200px; overflow-y: auto;"></ul>
|
||||
<div class="row" style="margin-top: 20px;">
|
||||
<div class="col-md-12">
|
||||
<h3>2. Search-as-you-type (Race Condition Handling)</h3>
|
||||
<p>Type quickly. Previous pending requests will be cancelled automatically.</p>
|
||||
<div class="form-group">
|
||||
<input type="text" id="searchInput" class="form-control" placeholder="Type to search...">
|
||||
</div>
|
||||
<div id="searchStatus" class="status"></div>
|
||||
<ul id="searchLog" class="list-group" style="margin-top: 10px; max-height: 200px; overflow-y: auto;"></ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
// -----------------------------------------------------------------------
|
||||
// 1. Single Request Cancellation
|
||||
// -----------------------------------------------------------------------
|
||||
const startBtn = document.getElementById('startBtn');
|
||||
const cancelBtn = document.getElementById('cancelBtn');
|
||||
const singleStatus = document.getElementById('singleStatus');
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
// -----------------------------------------------------------------------
|
||||
// 1. Single Request Cancellation
|
||||
// -----------------------------------------------------------------------
|
||||
const startBtn = document.getElementById('startBtn');
|
||||
const cancelBtn = document.getElementById('cancelBtn');
|
||||
const singleStatus = document.getElementById('singleStatus');
|
||||
|
||||
let controller;
|
||||
let controller;
|
||||
|
||||
startBtn.onclick = function() {
|
||||
// Create a new AbortController instance for this request
|
||||
controller = new AbortController();
|
||||
startBtn.onclick = function () {
|
||||
// Create a new AbortController instance for this request
|
||||
controller = new AbortController();
|
||||
|
||||
startBtn.disabled = true;
|
||||
cancelBtn.disabled = false;
|
||||
singleStatus.innerHTML = '<span class="text-info">Request pending... (3s delay)</span>';
|
||||
startBtn.disabled = true;
|
||||
cancelBtn.disabled = false;
|
||||
singleStatus.innerHTML = '<span class="text-info">Request pending... (3s delay)</span>';
|
||||
|
||||
axios.get('/abort-controller/server?delay=3000', {
|
||||
signal: controller.signal
|
||||
})
|
||||
axios.get('/abort-controller/server?delay=3000', {
|
||||
signal: controller.signal
|
||||
})
|
||||
.then(function (response) {
|
||||
singleStatus.innerHTML = '<span class="text-success">' + response.data.message + '</span>';
|
||||
})
|
||||
.catch(function (err) {
|
||||
if (axios.isCancel(err)) {
|
||||
singleStatus.innerHTML = '<span class="text-warning">Request canceled: ' + err.message + '</span>';
|
||||
singleStatus.innerHTML = '<span class="text-warning">Request canceled: ' + err.message + '</span>';
|
||||
} else {
|
||||
singleStatus.innerHTML = '<span class="text-danger">Error: ' + err.message + '</span>';
|
||||
singleStatus.innerHTML = '<span class="text-danger">Error: ' + err.message + '</span>';
|
||||
}
|
||||
})
|
||||
.finally(function () {
|
||||
@ -71,42 +75,42 @@
|
||||
cancelBtn.disabled = true;
|
||||
controller = null;
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
cancelBtn.onclick = function() {
|
||||
if (controller) {
|
||||
// Abort the request
|
||||
controller.abort();
|
||||
}
|
||||
};
|
||||
cancelBtn.onclick = function () {
|
||||
if (controller) {
|
||||
// Abort the request
|
||||
controller.abort();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 2. Search-as-you-type
|
||||
// -----------------------------------------------------------------------
|
||||
const searchInput = document.getElementById('searchInput');
|
||||
const searchStatus = document.getElementById('searchStatus');
|
||||
const searchLog = document.getElementById('searchLog');
|
||||
// -----------------------------------------------------------------------
|
||||
// 2. Search-as-you-type
|
||||
// -----------------------------------------------------------------------
|
||||
const searchInput = document.getElementById('searchInput');
|
||||
const searchStatus = document.getElementById('searchStatus');
|
||||
const searchLog = document.getElementById('searchLog');
|
||||
|
||||
let searchController;
|
||||
let searchController;
|
||||
|
||||
searchInput.addEventListener('input', function(e) {
|
||||
const query = e.target.value;
|
||||
searchInput.addEventListener('input', function (e) {
|
||||
const query = e.target.value;
|
||||
|
||||
if (searchController) {
|
||||
// Cancel the previous request
|
||||
searchController.abort();
|
||||
}
|
||||
if (searchController) {
|
||||
// Cancel the previous request
|
||||
searchController.abort();
|
||||
}
|
||||
|
||||
// Create a new controller for the new request
|
||||
searchController = new AbortController();
|
||||
// Create a new controller for the new request
|
||||
searchController = new AbortController();
|
||||
|
||||
log('New search for: "' + query + '"');
|
||||
searchStatus.innerHTML = '<span class="text-info">Searching...</span>';
|
||||
log('New search for: "' + query + '"');
|
||||
searchStatus.innerHTML = '<span class="text-info">Searching...</span>';
|
||||
|
||||
axios.get('/abort-controller/server?delay=1000', {
|
||||
signal: searchController.signal
|
||||
})
|
||||
axios.get('/abort-controller/server?delay=1000', {
|
||||
signal: searchController.signal
|
||||
})
|
||||
.then(function (response) {
|
||||
searchStatus.innerHTML = '<span class="text-success">Result for "' + query + '": ' + response.data.message + '</span>';
|
||||
log('Success: ' + query);
|
||||
@ -119,14 +123,15 @@
|
||||
log('Error: ' + query);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function log(msg) {
|
||||
const li = document.createElement('li');
|
||||
li.className = 'list-group-item py-1';
|
||||
li.textContent = new Date().toLocaleTimeString() + ' - ' + msg;
|
||||
searchLog.prepend(li);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
function log(msg) {
|
||||
const li = document.createElement('li');
|
||||
li.className = 'list-group-item py-1';
|
||||
li.textContent = new Date().toLocaleTimeString() + ' - ' + msg;
|
||||
searchLog.prepend(li);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -6,11 +6,13 @@ export default function (req, res) {
|
||||
|
||||
setTimeout(() => {
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/json'
|
||||
'Content-Type': 'text/json',
|
||||
});
|
||||
res.write(JSON.stringify({
|
||||
message: 'Response completed successfully after ' + delay + 'ms'
|
||||
}));
|
||||
res.write(
|
||||
JSON.stringify({
|
||||
message: 'Response completed successfully after ' + delay + 'ms',
|
||||
})
|
||||
);
|
||||
res.end();
|
||||
}, delay);
|
||||
};
|
||||
}
|
||||
|
||||
@ -1,44 +1,47 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>axios - all example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
|
||||
</head>
|
||||
<body class="container">
|
||||
<h1>axios.all</h1>
|
||||
|
||||
<div>
|
||||
<h3>User</h3>
|
||||
<div class="row">
|
||||
<img id="useravatar" src="" class="col-md-1"/>
|
||||
<div class="col-md-3">
|
||||
<strong id="username"></strong>
|
||||
</div>
|
||||
<head>
|
||||
<title>axios - all example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
|
||||
</head>
|
||||
|
||||
<body class="container">
|
||||
<h1>axios.all</h1>
|
||||
|
||||
<div>
|
||||
<h3>User</h3>
|
||||
<div class="row">
|
||||
<img id="useravatar" src="" class="col-md-1" />
|
||||
<div class="col-md-3">
|
||||
<strong id="username"></strong>
|
||||
</div>
|
||||
<hr/>
|
||||
<h3>Orgs</h3>
|
||||
<ul id="orgs" class="list-unstyled"></ul>
|
||||
</div>
|
||||
<hr />
|
||||
<h3>Orgs</h3>
|
||||
<ul id="orgs" class="list-unstyled"></ul>
|
||||
</div>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
axios.all([
|
||||
axios.get('https://api.github.com/users/mzabriskie'),
|
||||
axios.get('https://api.github.com/users/mzabriskie/orgs')
|
||||
]).then(axios.spread(function (user, orgs) {
|
||||
document.getElementById('useravatar').src = user.data.avatar_url;
|
||||
document.getElementById('username').innerHTML = user.data.name;
|
||||
document.getElementById('orgs').innerHTML = orgs.data.map(function (org) {
|
||||
return (
|
||||
'<li class="row">' +
|
||||
'<img src="' + org.avatar_url + '" class="col-md-1"/>' +
|
||||
'<div class="col-md-3">' +
|
||||
'<strong>' + org.login + '</strong>' +
|
||||
'</div>' +
|
||||
'</li>'
|
||||
);
|
||||
}).join('');
|
||||
}));
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
axios.all([
|
||||
axios.get('https://api.github.com/users/mzabriskie'),
|
||||
axios.get('https://api.github.com/users/mzabriskie/orgs')
|
||||
]).then(axios.spread(function (user, orgs) {
|
||||
document.getElementById('useravatar').src = user.data.avatar_url;
|
||||
document.getElementById('username').innerHTML = user.data.name;
|
||||
document.getElementById('orgs').innerHTML = orgs.data.map(function (org) {
|
||||
return (
|
||||
'<li class="row">' +
|
||||
'<img src="' + org.avatar_url + '" class="col-md-1"/>' +
|
||||
'<div class="col-md-3">' +
|
||||
'<strong>' + org.login + '</strong>' +
|
||||
'</div>' +
|
||||
'</li>'
|
||||
);
|
||||
}).join('');
|
||||
}));
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,37 +1,40 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>AMD</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
|
||||
</head>
|
||||
<body class="container">
|
||||
<h1>AMD</h1>
|
||||
|
||||
<div>
|
||||
<h3>User</h3>
|
||||
<div class="row">
|
||||
<img id="useravatar" src="" class="col-md-1"/>
|
||||
<div class="col-md-3">
|
||||
<strong id="username"></strong>
|
||||
</div>
|
||||
<head>
|
||||
<title>AMD</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
|
||||
</head>
|
||||
|
||||
<body class="container">
|
||||
<h1>AMD</h1>
|
||||
|
||||
<div>
|
||||
<h3>User</h3>
|
||||
<div class="row">
|
||||
<img id="useravatar" src="" class="col-md-1" />
|
||||
<div class="col-md-3">
|
||||
<strong id="username"></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.16/require.min.js"></script>
|
||||
<script>
|
||||
requirejs.config({
|
||||
paths: {
|
||||
axios: '/axios.min'
|
||||
}
|
||||
});
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.16/require.min.js"></script>
|
||||
<script>
|
||||
requirejs.config({
|
||||
paths: {
|
||||
axios: '/axios.min'
|
||||
}
|
||||
});
|
||||
|
||||
requirejs(['axios'], function (axios) {
|
||||
axios.get('https://api.github.com/users/mzabriskie')
|
||||
.then(function (user) {
|
||||
document.getElementById('useravatar').src = user.data.avatar_url;
|
||||
document.getElementById('username').innerHTML = user.data.name;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
requirejs(['axios'], function (axios) {
|
||||
axios.get('https://api.github.com/users/mzabriskie')
|
||||
.then(function (user) {
|
||||
document.getElementById('useravatar').src = user.data.avatar_url;
|
||||
document.getElementById('username').innerHTML = user.data.name;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,33 +1,36 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>axios - get example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
|
||||
</head>
|
||||
<body class="container">
|
||||
<h1>axios.get</h1>
|
||||
<ul id="people" class="list-unstyled"></ul>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
axios.get('/get/server')
|
||||
.then(function (response) {
|
||||
document.getElementById('people').innerHTML = response.data.map(function (person) {
|
||||
return (
|
||||
'<li class="row">' +
|
||||
'<img src="https://avatars.githubusercontent.com/u/' + person.avatar + '?s=50" class="col-md-1"/>' +
|
||||
'<div class="col-md-3">' +
|
||||
'<strong>' + person.name + '</strong>' +
|
||||
'<div>GitHub: <a href="https://github.com/' + person.github + '" target="_blank">' + person.github + '</a></div>' +
|
||||
'<div>Twitter: <a href="https://twitter.com/' + person.twitter + '" target="_blank">' + person.twitter + '</a></div>' +
|
||||
'</div>' +
|
||||
'</li><br/>'
|
||||
);
|
||||
}).join('');
|
||||
})
|
||||
.catch(function (err) {
|
||||
document.getElementById('people').innerHTML = '<li class="text-danger">' + err.message + '</li>';
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
<head>
|
||||
<title>axios - get example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
|
||||
</head>
|
||||
|
||||
<body class="container">
|
||||
<h1>axios.get</h1>
|
||||
<ul id="people" class="list-unstyled"></ul>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
axios.get('/get/server')
|
||||
.then(function (response) {
|
||||
document.getElementById('people').innerHTML = response.data.map(function (person) {
|
||||
return (
|
||||
'<li class="row">' +
|
||||
'<img src="https://avatars.githubusercontent.com/u/' + person.avatar + '?s=50" class="col-md-1"/>' +
|
||||
'<div class="col-md-3">' +
|
||||
'<strong>' + person.name + '</strong>' +
|
||||
'<div>GitHub: <a href="https://github.com/' + person.github + '" target="_blank" rel="noopener noreferrer">' + person.github + '</a></div>' +
|
||||
'<div>Twitter: <a href="https://twitter.com/' + person.twitter + '" target="_blank" rel="noopener noreferrer">' + person.twitter + '</a></div>' +
|
||||
'</div>' +
|
||||
'</li><br/>'
|
||||
);
|
||||
}).join('');
|
||||
})
|
||||
.catch(function (err) {
|
||||
document.getElementById('people').innerHTML = '<li class="text-danger">' + err.message + '</li>';
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,34 +1,34 @@
|
||||
const people = [
|
||||
{
|
||||
"name": "Matt Zabriskie",
|
||||
"github": "mzabriskie",
|
||||
"twitter": "mzabriskie",
|
||||
"avatar": "199035"
|
||||
name: 'Matt Zabriskie',
|
||||
github: 'mzabriskie',
|
||||
twitter: 'mzabriskie',
|
||||
avatar: '199035',
|
||||
},
|
||||
{
|
||||
"name": "Ryan Florence",
|
||||
"github": "rpflorence",
|
||||
"twitter": "ryanflorence",
|
||||
"avatar": "100200"
|
||||
name: 'Ryan Florence',
|
||||
github: 'rpflorence',
|
||||
twitter: 'ryanflorence',
|
||||
avatar: '100200',
|
||||
},
|
||||
{
|
||||
"name": "Kent C. Dodds",
|
||||
"github": "kentcdodds",
|
||||
"twitter": "kentcdodds",
|
||||
"avatar": "1500684"
|
||||
name: 'Kent C. Dodds',
|
||||
github: 'kentcdodds',
|
||||
twitter: 'kentcdodds',
|
||||
avatar: '1500684',
|
||||
},
|
||||
{
|
||||
"name": "Chris Esplin",
|
||||
"github": "deltaepsilon",
|
||||
"twitter": "chrisesplin",
|
||||
"avatar": "878947"
|
||||
}
|
||||
name: 'Chris Esplin',
|
||||
github: 'deltaepsilon',
|
||||
twitter: 'chrisesplin',
|
||||
avatar: '878947',
|
||||
},
|
||||
];
|
||||
|
||||
export default function (req, res) {
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'application/json'
|
||||
'Content-Type': 'application/json',
|
||||
});
|
||||
res.write(JSON.stringify(people));
|
||||
res.end();
|
||||
};
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ Our approach adds clear, categorised error messages for different network issues
|
||||
|
||||
==> Problem
|
||||
Axios currently throws the same `Network Error` message for many different cases:
|
||||
|
||||
- The Internet is disconnected
|
||||
- DNS lookup fails
|
||||
- Server is down or refusing connections
|
||||
@ -18,11 +19,11 @@ Axios currently throws the same `Network Error` message for many different cases
|
||||
|
||||
These cases all look the same to developers and users, making debugging harder.
|
||||
|
||||
|
||||
--> Our Approach — Wrapper / Middleware
|
||||
|
||||
We created a small wrapper function called `enhanceNetworkError()` that:
|
||||
- Detects Common network problems using `error.code`, `error.message`, and response status.
|
||||
|
||||
- Detects Common network problems using `error.code`, `error.message`, and response status.
|
||||
- Adds a new field `error.detailedMessage` with a short, clear explanation.
|
||||
- Assigns a new `error.code` (like `ERR_TIMEOUT`, `ERR_DNS_FAILURE`, etc.).
|
||||
- Works for both browser and Node.js environments.
|
||||
@ -42,16 +43,16 @@ The wrapper is used inside an Axios instance via a Response interceptor.
|
||||
- Other → `ERR_NETWORK_GENERIC`
|
||||
3. It returns a more descriptive error with both `code` and `detailedMessage`.
|
||||
|
||||
|
||||
-> Example Usage
|
||||
|
||||
```javascript
|
||||
const api = createEnhancedClient({ baseURL: 'https://example.com' });
|
||||
|
||||
api.get('/data')
|
||||
.then(res => console.log(res.data))
|
||||
.catch(err => {
|
||||
console.error(err.code); // e.g., ERR_TIMEOUT
|
||||
api
|
||||
.get('/data')
|
||||
.then((res) => console.log(res.data))
|
||||
.catch((err) => {
|
||||
console.error(err.code); // e.g., ERR_TIMEOUT
|
||||
console.error(err.detailedMessage); // e.g., "The request took too long to respond."
|
||||
});
|
||||
```
|
||||
|
||||
@ -25,29 +25,25 @@ function enhanceNetworkError(error) {
|
||||
// when Request timeout happens
|
||||
else if (error.code === 'ETIMEDOUT' || /timeout/i.test(error.message)) {
|
||||
error.code = 'ERR_TIMEOUT';
|
||||
error.detailedMessage =
|
||||
'The request took too long to respond. Please try again later.';
|
||||
error.detailedMessage = 'The request took too long to respond. Please try again later.';
|
||||
}
|
||||
|
||||
// when CORS restriction happens (for browser only)
|
||||
else if (/CORS/i.test(error.message)) {
|
||||
error.code = 'ERR_CORS_BLOCKED';
|
||||
error.detailedMessage =
|
||||
'The request was blocked due to cross-origin restrictions.';
|
||||
error.detailedMessage = 'The request was blocked due to cross-origin restrictions.';
|
||||
}
|
||||
|
||||
// when Server-side error occurs
|
||||
else if (error.response && error.response.status >= 500) {
|
||||
error.code = 'ERR_SERVER';
|
||||
error.detailedMessage =
|
||||
'A server-side issue occurred. Please try again later.';
|
||||
error.detailedMessage = 'A server-side issue occurred. Please try again later.';
|
||||
}
|
||||
|
||||
// when Client-side error occurs
|
||||
else if (error.response && error.response.status >= 400) {
|
||||
error.code = 'ERR_CLIENT';
|
||||
error.detailedMessage =
|
||||
'A client-side error occurred. Please check your request.';
|
||||
error.detailedMessage = 'A client-side error occurred. Please check your request.';
|
||||
}
|
||||
|
||||
// when unknown network issue occurs
|
||||
@ -60,13 +56,12 @@ function enhanceNetworkError(error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
export function createEnhancedClient(config = {}) {
|
||||
const client = axios.create(config);
|
||||
|
||||
client.interceptors.response.use(
|
||||
response => response,
|
||||
error => {
|
||||
(response) => response,
|
||||
(error) => {
|
||||
throw enhanceNetworkError(error);
|
||||
}
|
||||
);
|
||||
|
||||
@ -1,40 +1,43 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>axios - post example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
|
||||
</head>
|
||||
<body class="container">
|
||||
<h1>axios.post</h1>
|
||||
|
||||
<form role="form" class="form" onsubmit="return false;">
|
||||
<div class="form-group">
|
||||
<label for="data">JSON</label>
|
||||
<textarea id="data" class="form-control" rows="5"></textarea>
|
||||
</div>
|
||||
<button id="post" type="button" class="btn btn-primary">POST</button>
|
||||
</form>
|
||||
<head>
|
||||
<title>axios - post example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
|
||||
</head>
|
||||
|
||||
<div id="output" class="container"></div>
|
||||
<body class="container">
|
||||
<h1>axios.post</h1>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
(function () {
|
||||
var output = document.getElementById('output');
|
||||
document.getElementById('post').onclick = function () {
|
||||
var data = document.getElementById('data').value;
|
||||
<form role="form" class="form" onsubmit="return false;">
|
||||
<div class="form-group">
|
||||
<label for="data">JSON</label>
|
||||
<textarea id="data" class="form-control" rows="5"></textarea>
|
||||
</div>
|
||||
<button id="post" type="button" class="btn btn-primary">POST</button>
|
||||
</form>
|
||||
|
||||
<div id="output" class="container"></div>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
(function () {
|
||||
var output = document.getElementById('output');
|
||||
document.getElementById('post').onclick = function () {
|
||||
var data = document.getElementById('data').value;
|
||||
|
||||
axios.post('/post/server', JSON.parse(data))
|
||||
.then(function (res) {
|
||||
output.className = 'container';
|
||||
output.innerHTML = res.data;
|
||||
})
|
||||
.catch(function (err) {
|
||||
output.className = 'container text-danger';
|
||||
output.innerHTML = err.message;
|
||||
});
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
axios.post('/post/server', JSON.parse(data))
|
||||
.then(function (res) {
|
||||
output.className = 'container';
|
||||
output.innerHTML = res.data;
|
||||
})
|
||||
.catch(function (err) {
|
||||
output.className = 'container text-danger';
|
||||
output.innerHTML = err.message;
|
||||
});
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -8,9 +8,9 @@ export default function (req, res) {
|
||||
req.on('end', function () {
|
||||
console.log('POST data received');
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'application/json'
|
||||
'Content-Type': 'application/json',
|
||||
});
|
||||
res.write(JSON.stringify(data));
|
||||
res.end();
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,13 +1,11 @@
|
||||
export default function (req, res) {
|
||||
|
||||
req.on('data', function (chunk) {
|
||||
});
|
||||
req.on('data', function (chunk) {});
|
||||
|
||||
req.on('end', function () {
|
||||
console.log('POST received');
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'application/json'
|
||||
'Content-Type': 'application/json',
|
||||
});
|
||||
res.end();
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@ import fs from 'fs';
|
||||
import path from 'path';
|
||||
import http from 'http';
|
||||
import minimist from 'minimist';
|
||||
import url from "url";
|
||||
import url from 'url';
|
||||
|
||||
const argv = minimist(process.argv.slice(2));
|
||||
let server;
|
||||
@ -31,7 +31,9 @@ function listDirs(root) {
|
||||
function getIndexTemplate() {
|
||||
const links = dirs.map(function (dir) {
|
||||
const url = '/' + dir;
|
||||
return '<li onclick="document.location=\'' + url + '\'"><a href="' + url + '">' + url + '</a></li>';
|
||||
return (
|
||||
'<li onclick="document.location=\'' + url + '\'"><a href="' + url + '">' + url + '</a></li>'
|
||||
);
|
||||
});
|
||||
|
||||
return (
|
||||
@ -89,7 +91,7 @@ function pipeFileToResponse(res, file, type) {
|
||||
|
||||
if (type) {
|
||||
res.writeHead(200, {
|
||||
"Content-Type": type
|
||||
'Content-Type': type,
|
||||
});
|
||||
} else {
|
||||
res.writeHead(200);
|
||||
@ -97,21 +99,21 @@ function pipeFileToResponse(res, file, type) {
|
||||
|
||||
const stream = fs.createReadStream(resolvedPath);
|
||||
|
||||
stream.on("error", (err) => {
|
||||
console.error("Error while reading file:", err.message);
|
||||
stream.on('error', (err) => {
|
||||
console.error('Error while reading file:', err.message);
|
||||
if (!res.headersSent) {
|
||||
res.writeHead(500, { "Content-Type": "text/plain" });
|
||||
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
||||
}
|
||||
res.end("File read error");
|
||||
res.end('File read error');
|
||||
});
|
||||
|
||||
stream.pipe(res);
|
||||
} catch (err) {
|
||||
console.error("Unexpected error:", err.message);
|
||||
console.error('Unexpected error:', err.message);
|
||||
if (!res.headersSent) {
|
||||
res.writeHead(500, { "Content-Type": "text/plain" });
|
||||
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
||||
}
|
||||
res.end("Internal server error");
|
||||
res.end('Internal server error');
|
||||
}
|
||||
}
|
||||
|
||||
@ -168,18 +170,19 @@ server = http.createServer(function (req, res) {
|
||||
// Process server request
|
||||
else if (new RegExp('(' + dirs.join('|') + ')\/server').test(url)) {
|
||||
if (fs.existsSync(path.join(__dirname, url + '.js'))) {
|
||||
import('file://' + path.join(__dirname, url + '.js')).then((server) => {
|
||||
server.default(req, res);
|
||||
}).catch(err => {
|
||||
console.error('Error importing server:', err);
|
||||
send404(res);
|
||||
});
|
||||
import('file://' + path.join(__dirname, url + '.js'))
|
||||
.then((server) => {
|
||||
server.default(req, res);
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error('Error importing server:', err);
|
||||
send404(res);
|
||||
});
|
||||
} else {
|
||||
send404(res);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
send404(res);
|
||||
}
|
||||
});
|
||||
|
||||
@ -1,44 +1,47 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>axios - transform response example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
|
||||
</head>
|
||||
<body class="container">
|
||||
<h1>transformResponse</h1>
|
||||
|
||||
<div class="row">
|
||||
<img id="useravatar" src="" class="col-md-1"/>
|
||||
<div class="col-md-3">
|
||||
<strong id="username"></strong><br/>
|
||||
Created: <span id="created"></span><br/>
|
||||
Updated: <span id="updated"></span>
|
||||
</div>
|
||||
<head>
|
||||
<title>axios - transform response example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
|
||||
</head>
|
||||
|
||||
<body class="container">
|
||||
<h1>transformResponse</h1>
|
||||
|
||||
<div class="row">
|
||||
<img id="useravatar" src="" class="col-md-1" />
|
||||
<div class="col-md-3">
|
||||
<strong id="username"></strong><br />
|
||||
Created: <span id="created"></span><br />
|
||||
Updated: <span id="updated"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
var ISO_8601 = /(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})Z/;
|
||||
function formatDate(d) {
|
||||
return (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
|
||||
}
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
var ISO_8601 = /(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})Z/;
|
||||
function formatDate(d) {
|
||||
return (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
|
||||
}
|
||||
|
||||
axios.get('https://api.github.com/users/mzabriskie', {
|
||||
transformResponse: axios.defaults.transformResponse.concat(function (data, headers) {
|
||||
Object.keys(data).forEach(function (k) {
|
||||
if (ISO_8601.test(data[k])) {
|
||||
data[k] = new Date(Date.parse(data[k]));
|
||||
}
|
||||
});
|
||||
return data;
|
||||
})
|
||||
})
|
||||
.then(function (res) {
|
||||
document.getElementById('useravatar').src = res.data.avatar_url;
|
||||
document.getElementById('username').innerHTML = res.data.name;
|
||||
document.getElementById('created').innerHTML = formatDate(res.data.created_at);
|
||||
document.getElementById('updated').innerHTML = formatDate(res.data.updated_at);
|
||||
axios.get('https://api.github.com/users/mzabriskie', {
|
||||
transformResponse: axios.defaults.transformResponse.concat(function (data, headers) {
|
||||
Object.keys(data).forEach(function (k) {
|
||||
if (ISO_8601.test(data[k])) {
|
||||
data[k] = new Date(Date.parse(data[k]));
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
return data;
|
||||
})
|
||||
})
|
||||
.then(function (res) {
|
||||
document.getElementById('useravatar').src = res.data.avatar_url;
|
||||
document.getElementById('username').innerHTML = res.data.name;
|
||||
document.getElementById('created').innerHTML = formatDate(res.data.created_at);
|
||||
document.getElementById('updated').innerHTML = formatDate(res.data.updated_at);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,48 +1,53 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>axios - file upload example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
|
||||
</head>
|
||||
<body class="container">
|
||||
<h1>file upload</h1>
|
||||
|
||||
<form role="form" class="form" onsubmit="return false;">
|
||||
<div class="form-group">
|
||||
<label for="file">File</label>
|
||||
<input id="file" type="file" class="form-control"/>
|
||||
</div>
|
||||
<button id="upload" type="button" class="btn btn-primary">Upload</button>
|
||||
</form>
|
||||
<head>
|
||||
<title>axios - file upload example</title>
|
||||
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
|
||||
</head>
|
||||
|
||||
<div id="output" class="container"></div>
|
||||
<body class="container">
|
||||
<h1>file upload</h1>
|
||||
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
(function () {
|
||||
var output = document.getElementById('output');
|
||||
document.getElementById('upload').onclick = function () {
|
||||
var data = new FormData();
|
||||
data.append('foo', 'bar');
|
||||
data.append('file', document.getElementById('file').files[0]);
|
||||
<form role="form" class="form" onsubmit="return false;">
|
||||
<div class="form-group">
|
||||
<label for="file">File</label>
|
||||
<input id="file" type="file" class="form-control" />
|
||||
</div>
|
||||
<button id="upload" type="button" class="btn btn-primary">Upload</button>
|
||||
</form>
|
||||
|
||||
var config = {
|
||||
onUploadProgress: function(progressEvent) {
|
||||
var percentCompleted = Math.round( (progressEvent.loaded * 100) / progressEvent.total );
|
||||
}
|
||||
};
|
||||
<div id="output" class="container"></div>
|
||||
|
||||
axios.put('/upload/server', data, config)
|
||||
.then(function (res) {
|
||||
output.className = 'container';
|
||||
output.innerHTML = res.data;
|
||||
})
|
||||
.catch(function (err) {
|
||||
output.className = 'container text-danger';
|
||||
output.innerHTML = err.message;
|
||||
});
|
||||
<script src="/axios.min.js"></script>
|
||||
<script>
|
||||
(function () {
|
||||
var output = document.getElementById('output');
|
||||
document.getElementById('upload').onclick = function () {
|
||||
var data = new FormData();
|
||||
data.append('foo', 'bar');
|
||||
data.append('file', document.getElementById('file').files[0]);
|
||||
|
||||
var config = {
|
||||
onUploadProgress: function (progressEvent) {
|
||||
var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
|
||||
output.className = 'container';
|
||||
output.textContent = 'Upload progress: ' + percentCompleted + '%';
|
||||
}
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
axios.put('/upload/server', data, config)
|
||||
.then(function (res) {
|
||||
output.className = 'container';
|
||||
output.textContent = res.data;
|
||||
})
|
||||
.catch(function (err) {
|
||||
output.className = 'container text-danger';
|
||||
output.textContent = err.message;
|
||||
});
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,8 +1,8 @@
|
||||
export default function (req, res) {
|
||||
let data = '';
|
||||
let _data = '';
|
||||
|
||||
req.on('data', function (chunk) {
|
||||
data += chunk;
|
||||
_data += chunk;
|
||||
});
|
||||
|
||||
req.on('end', function () {
|
||||
@ -10,4 +10,4 @@ export default function (req, res) {
|
||||
res.writeHead(200);
|
||||
res.end();
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
70
gulpfile.js
70
gulpfile.js
@ -1,30 +1,23 @@
|
||||
import gulp from 'gulp';
|
||||
import fs from 'fs-extra';
|
||||
import axios from './bin/githubAxios.js';
|
||||
import minimist from 'minimist'
|
||||
import minimist from 'minimist';
|
||||
|
||||
const argv = minimist(process.argv.slice(2));
|
||||
|
||||
gulp.task('default', async function(){
|
||||
gulp.task('default', async function () {
|
||||
console.log('hello!');
|
||||
});
|
||||
|
||||
const clear = gulp.task('clear', async function() {
|
||||
await fs.emptyDir('./dist/')
|
||||
const clear = gulp.task('clear', async function () {
|
||||
await fs.emptyDir('./dist/');
|
||||
});
|
||||
|
||||
const bower = gulp.task('bower', async function () {
|
||||
const npm = JSON.parse(await fs.readFile('package.json'));
|
||||
const bower = JSON.parse(await fs.readFile('bower.json'));
|
||||
|
||||
const fields = [
|
||||
'name',
|
||||
'description',
|
||||
'version',
|
||||
'homepage',
|
||||
'license',
|
||||
'keywords'
|
||||
];
|
||||
const fields = ['name', 'description', 'version', 'homepage', 'license', 'keywords'];
|
||||
|
||||
for (let i = 0, l = fields.length; i < l; i++) {
|
||||
const field = fields[i];
|
||||
@ -35,16 +28,23 @@ const bower = gulp.task('bower', async function () {
|
||||
});
|
||||
|
||||
async function getContributors(user, repo, maxCount = 1) {
|
||||
const contributors = (await axios.get(
|
||||
`https://api.github.com/repos/${encodeURIComponent(user)}/${encodeURIComponent(repo)}/contributors`,
|
||||
{ params: { per_page: maxCount } }
|
||||
)).data;
|
||||
const contributors = (
|
||||
await axios.get(
|
||||
`https://api.github.com/repos/${encodeURIComponent(user)}/${encodeURIComponent(repo)}/contributors`,
|
||||
{ params: { per_page: maxCount } }
|
||||
)
|
||||
).data;
|
||||
|
||||
return Promise.all(contributors.map(async (contributor) => {
|
||||
return {...contributor, ...(await axios.get(
|
||||
`https://api.github.com/users/${encodeURIComponent(contributor.login)}`
|
||||
)).data};
|
||||
}))
|
||||
return Promise.all(
|
||||
contributors.map(async (contributor) => {
|
||||
return {
|
||||
...contributor,
|
||||
...(
|
||||
await axios.get(`https://api.github.com/users/${encodeURIComponent(contributor.login)}`)
|
||||
).data,
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
const packageJSON = gulp.task('package', async function () {
|
||||
@ -57,9 +57,10 @@ const packageJSON = gulp.task('package', async function () {
|
||||
|
||||
npm.contributors = contributors
|
||||
.filter(
|
||||
({type, contributions}) => type.toLowerCase() === 'user' && contributions >= CONTRIBUTION_THRESHOLD
|
||||
({ type, contributions }) =>
|
||||
type.toLowerCase() === 'user' && contributions >= CONTRIBUTION_THRESHOLD
|
||||
)
|
||||
.map(({login, name, url}) => `${name || login} (https://github.com/${login})`);
|
||||
.map(({ login, name, _ }) => `${name || login} (https://github.com/${login})`);
|
||||
|
||||
await fs.writeFile('package.json', JSON.stringify(npm, null, 2));
|
||||
} catch (err) {
|
||||
@ -75,19 +76,18 @@ const env = gulp.task('env', async function () {
|
||||
|
||||
const envFilePath = './lib/env/data.js';
|
||||
|
||||
await fs.writeFile(envFilePath, Object.entries({
|
||||
VERSION: (argv.bump || npm.version).replace(/^v/, '')
|
||||
}).map(([key, value]) => {
|
||||
return `export const ${key} = ${JSON.stringify(value)};`
|
||||
}).join('\n'));
|
||||
await fs.writeFile(
|
||||
envFilePath,
|
||||
Object.entries({
|
||||
VERSION: (argv.bump || npm.version).replace(/^v/, ''),
|
||||
})
|
||||
.map(([key, value]) => {
|
||||
return `export const ${key} = ${JSON.stringify(value)};`;
|
||||
})
|
||||
.join('\n')
|
||||
);
|
||||
});
|
||||
|
||||
const version = gulp.series('bower', 'env', 'package');
|
||||
|
||||
export {
|
||||
bower,
|
||||
env,
|
||||
clear,
|
||||
version,
|
||||
packageJSON
|
||||
}
|
||||
export { bower, env, clear, version, packageJSON };
|
||||
|
||||
337
index.d.cts
337
index.d.cts
@ -2,30 +2,54 @@ interface RawAxiosHeaders {
|
||||
[key: string]: axios.AxiosHeaderValue;
|
||||
}
|
||||
|
||||
type MethodsHeaders = Partial<{
|
||||
[Key in axios.Method as Lowercase<Key>]: AxiosHeaders;
|
||||
} & {common: AxiosHeaders}>;
|
||||
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 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';
|
||||
type CommonRequestHeadersList =
|
||||
| 'Accept'
|
||||
| 'Content-Length'
|
||||
| 'User-Agent'
|
||||
| 'Content-Encoding'
|
||||
| 'Authorization';
|
||||
|
||||
type ContentType = axios.AxiosHeaderValue | 'text/html' | 'text/plain' | 'multipart/form-data' | 'application/json' | 'application/x-www-form-urlencoded' | 'application/octet-stream';
|
||||
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 CommonResponseHeadersList =
|
||||
| 'Server'
|
||||
| 'Content-Type'
|
||||
| 'Content-Length'
|
||||
| 'Cache-Control'
|
||||
| 'Content-Encoding';
|
||||
|
||||
type BrowserProgressEvent = any;
|
||||
|
||||
declare class AxiosHeaders {
|
||||
constructor(
|
||||
headers?: RawAxiosHeaders | AxiosHeaders | string
|
||||
);
|
||||
constructor(headers?: RawAxiosHeaders | AxiosHeaders | string);
|
||||
|
||||
[key: string]: any;
|
||||
|
||||
set(headerName?: string, value?: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
|
||||
set(
|
||||
headerName?: string,
|
||||
value?: axios.AxiosHeaderValue,
|
||||
rewrite?: boolean | AxiosHeaderMatcher
|
||||
): AxiosHeaders;
|
||||
set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders;
|
||||
|
||||
get(headerName: string, parser: RegExp): RegExpExecArray | null;
|
||||
@ -39,7 +63,9 @@ declare class AxiosHeaders {
|
||||
|
||||
normalize(format: boolean): AxiosHeaders;
|
||||
|
||||
concat(...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>): AxiosHeaders;
|
||||
concat(
|
||||
...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>
|
||||
): AxiosHeaders;
|
||||
|
||||
toJSON(asStrings?: boolean): RawAxiosHeaders;
|
||||
|
||||
@ -47,14 +73,19 @@ declare class AxiosHeaders {
|
||||
|
||||
static accessor(header: string | string[]): AxiosHeaders;
|
||||
|
||||
static concat(...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>): 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): axios.AxiosHeaderValue;
|
||||
hasContentType(matcher?: AxiosHeaderMatcher): boolean;
|
||||
|
||||
setContentLength(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
|
||||
setContentLength(
|
||||
value: axios.AxiosHeaderValue,
|
||||
rewrite?: boolean | AxiosHeaderMatcher
|
||||
): AxiosHeaders;
|
||||
getContentLength(parser?: RegExp): RegExpExecArray | null;
|
||||
getContentLength(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
|
||||
hasContentLength(matcher?: AxiosHeaderMatcher): boolean;
|
||||
@ -69,12 +100,18 @@ declare class AxiosHeaders {
|
||||
getUserAgent(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
|
||||
hasUserAgent(matcher?: AxiosHeaderMatcher): boolean;
|
||||
|
||||
setContentEncoding(value: axios.AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
|
||||
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;
|
||||
setAuthorization(
|
||||
value: axios.AxiosHeaderValue,
|
||||
rewrite?: boolean | AxiosHeaderMatcher
|
||||
): AxiosHeaders;
|
||||
getAuthorization(parser?: RegExp): RegExpExecArray | null;
|
||||
getAuthorization(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
|
||||
hasAuthorization(matcher?: AxiosHeaderMatcher): boolean;
|
||||
@ -86,11 +123,11 @@ declare class AxiosHeaders {
|
||||
|
||||
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>
|
||||
message?: string,
|
||||
code?: string,
|
||||
config?: axios.InternalAxiosRequestConfig<D>,
|
||||
request?: any,
|
||||
response?: axios.AxiosResponse<T, D>
|
||||
);
|
||||
|
||||
config?: axios.InternalAxiosRequestConfig<D>;
|
||||
@ -108,24 +145,23 @@ declare class AxiosError<T = unknown, D = any> extends Error {
|
||||
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 ECONNABORTED = "ECONNABORTED";
|
||||
static readonly ETIMEDOUT = "ETIMEDOUT";
|
||||
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 ECONNABORTED = 'ECONNABORTED';
|
||||
static readonly ETIMEDOUT = 'ETIMEDOUT';
|
||||
}
|
||||
|
||||
declare class CanceledError<T> extends AxiosError<T> {
|
||||
}
|
||||
declare class CanceledError<T> extends AxiosError<T> {}
|
||||
|
||||
declare class Axios {
|
||||
constructor(config?: axios.AxiosRequestConfig);
|
||||
@ -135,17 +171,55 @@ declare class Axios {
|
||||
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>;
|
||||
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>;
|
||||
}
|
||||
|
||||
declare enum HttpStatusCode {
|
||||
@ -219,11 +293,13 @@ type InternalAxiosError<T = unknown, D = any> = AxiosError<T, D>;
|
||||
declare namespace axios {
|
||||
type AxiosError<T = unknown, D = any> = InternalAxiosError<T, D>;
|
||||
|
||||
type RawAxiosRequestHeaders = Partial<RawAxiosHeaders & {
|
||||
[Key in CommonRequestHeadersList]: AxiosHeaderValue;
|
||||
} & {
|
||||
'Content-Type': ContentType
|
||||
}>;
|
||||
type RawAxiosRequestHeaders = Partial<
|
||||
RawAxiosHeaders & {
|
||||
[Key in CommonRequestHeadersList]: AxiosHeaderValue;
|
||||
} & {
|
||||
'Content-Type': ContentType;
|
||||
}
|
||||
>;
|
||||
|
||||
type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders;
|
||||
|
||||
@ -232,7 +308,7 @@ declare namespace axios {
|
||||
type RawCommonResponseHeaders = {
|
||||
[Key in CommonResponseHeadersList]: AxiosHeaderValue;
|
||||
} & {
|
||||
"set-cookie": string[];
|
||||
'set-cookie': string[];
|
||||
};
|
||||
|
||||
type RawAxiosResponseHeaders = Partial<RawAxiosHeaders & RawCommonResponseHeaders>;
|
||||
@ -244,7 +320,12 @@ declare namespace axios {
|
||||
}
|
||||
|
||||
interface AxiosResponseTransformer {
|
||||
(this: InternalAxiosRequestConfig, data: any, headers: AxiosResponseHeaders, status?: number): any;
|
||||
(
|
||||
this: InternalAxiosRequestConfig,
|
||||
data: any,
|
||||
headers: AxiosResponseHeaders,
|
||||
status?: number
|
||||
): any;
|
||||
}
|
||||
|
||||
interface AxiosAdapter {
|
||||
@ -264,39 +345,54 @@ declare namespace axios {
|
||||
}
|
||||
|
||||
type Method =
|
||||
| 'get' | 'GET'
|
||||
| 'delete' | 'DELETE'
|
||||
| 'head' | 'HEAD'
|
||||
| 'options' | 'OPTIONS'
|
||||
| 'post' | 'POST'
|
||||
| 'put' | 'PUT'
|
||||
| 'patch' | 'PATCH'
|
||||
| 'purge' | 'PURGE'
|
||||
| 'link' | 'LINK'
|
||||
| 'unlink' | 'UNLINK';
|
||||
| 'get'
|
||||
| 'GET'
|
||||
| 'delete'
|
||||
| 'DELETE'
|
||||
| 'head'
|
||||
| 'HEAD'
|
||||
| 'options'
|
||||
| 'OPTIONS'
|
||||
| 'post'
|
||||
| 'POST'
|
||||
| 'put'
|
||||
| 'PUT'
|
||||
| 'patch'
|
||||
| 'PATCH'
|
||||
| 'purge'
|
||||
| 'PURGE'
|
||||
| 'link'
|
||||
| 'LINK'
|
||||
| 'unlink'
|
||||
| 'UNLINK';
|
||||
|
||||
type ResponseType =
|
||||
| 'arraybuffer'
|
||||
| 'blob'
|
||||
| 'document'
|
||||
| 'json'
|
||||
| 'text'
|
||||
| 'stream'
|
||||
| 'formdata';
|
||||
type ResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream' | 'formdata';
|
||||
|
||||
type responseEncoding =
|
||||
| 'ascii' | 'ASCII'
|
||||
| 'ansi' | 'ANSI'
|
||||
| 'binary' | 'BINARY'
|
||||
| 'base64' | 'BASE64'
|
||||
| 'base64url' | 'BASE64URL'
|
||||
| 'hex' | 'HEX'
|
||||
| 'latin1' | 'LATIN1'
|
||||
| 'ucs-2' | 'UCS-2'
|
||||
| 'ucs2' | 'UCS2'
|
||||
| 'utf-8' | 'UTF-8'
|
||||
| 'utf8' | 'UTF8'
|
||||
| 'utf16le' | 'UTF16LE';
|
||||
| 'ascii'
|
||||
| 'ASCII'
|
||||
| 'ansi'
|
||||
| 'ANSI'
|
||||
| 'binary'
|
||||
| 'BINARY'
|
||||
| 'base64'
|
||||
| 'BASE64'
|
||||
| 'base64url'
|
||||
| 'BASE64URL'
|
||||
| 'hex'
|
||||
| 'HEX'
|
||||
| 'latin1'
|
||||
| 'LATIN1'
|
||||
| 'ucs-2'
|
||||
| 'UCS-2'
|
||||
| 'ucs2'
|
||||
| 'UCS2'
|
||||
| 'utf-8'
|
||||
| 'UTF-8'
|
||||
| 'utf8'
|
||||
| 'UTF8'
|
||||
| 'utf16le'
|
||||
| 'UTF16LE';
|
||||
|
||||
interface TransitionalOptions {
|
||||
silentJSONParsing?: boolean;
|
||||
@ -320,11 +416,11 @@ declare namespace axios {
|
||||
|
||||
interface SerializerVisitor {
|
||||
(
|
||||
this: GenericFormData,
|
||||
value: any,
|
||||
key: string | number,
|
||||
path: null | Array<string | number>,
|
||||
helpers: FormDataVisitorHelpers
|
||||
this: GenericFormData,
|
||||
value: any,
|
||||
key: string | number,
|
||||
path: null | Array<string | number>,
|
||||
helpers: FormDataVisitorHelpers
|
||||
): boolean;
|
||||
}
|
||||
|
||||
@ -336,8 +432,7 @@ declare namespace axios {
|
||||
}
|
||||
|
||||
// tslint:disable-next-line
|
||||
interface FormSerializerOptions extends SerializerOptions {
|
||||
}
|
||||
interface FormSerializerOptions extends SerializerOptions {}
|
||||
|
||||
interface ParamEncoder {
|
||||
(value: any, defaultEncoder: (value: any) => any): any;
|
||||
@ -411,7 +506,10 @@ declare namespace axios {
|
||||
maxBodyLength?: number;
|
||||
maxRedirects?: number;
|
||||
maxRate?: number | [MaxUploadRate, MaxDownloadRate];
|
||||
beforeRedirect?: (options: Record<string, any>, responseDetails: {headers: Record<string, string>, statusCode: HttpStatusCode}) => void;
|
||||
beforeRedirect?: (
|
||||
options: Record<string, any>,
|
||||
responseDetails: { headers: Record<string, string>; statusCode: HttpStatusCode }
|
||||
) => void;
|
||||
socketPath?: string | null;
|
||||
transport?: any;
|
||||
httpAgent?: any;
|
||||
@ -427,16 +525,33 @@ declare namespace axios {
|
||||
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
|
||||
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>);
|
||||
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);
|
||||
fetchOptions?: Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'> | Record<string, any>;
|
||||
fetchOptions?:
|
||||
| Omit<RequestInit, 'body' | 'headers' | 'method' | 'signal'>
|
||||
| Record<string, any>;
|
||||
httpVersion?: 1 | 2;
|
||||
http2Options?: Record<string, any> & {
|
||||
sessionTimeout?: number;
|
||||
@ -472,11 +587,11 @@ declare namespace axios {
|
||||
headers?: RawAxiosRequestHeaders | AxiosHeaders | Partial<HeadersDefaults>;
|
||||
}
|
||||
|
||||
interface AxiosResponse<T = any, D = any, H = {}> {
|
||||
interface AxiosResponse<T = any, D = any, H = {}> {
|
||||
data: T;
|
||||
status: number;
|
||||
statusText: string;
|
||||
headers: H & RawAxiosResponseHeaders | AxiosResponseHeaders;
|
||||
headers: (H & RawAxiosResponseHeaders) | AxiosResponseHeaders;
|
||||
config: InternalAxiosRequestConfig<D>;
|
||||
request?: any;
|
||||
}
|
||||
@ -546,13 +661,16 @@ declare namespace axios {
|
||||
|
||||
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>;
|
||||
<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
|
||||
}
|
||||
[key: string]: AxiosHeaderValue;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@ -578,11 +696,18 @@ declare namespace axios {
|
||||
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;
|
||||
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>;
|
||||
mergeConfig<D = any>(
|
||||
config1: AxiosRequestConfig<D>,
|
||||
config2: AxiosRequestConfig<D>
|
||||
): AxiosRequestConfig<D>;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
6
index.js
6
index.js
@ -19,7 +19,7 @@ const {
|
||||
HttpStatusCode,
|
||||
formToJSON,
|
||||
getAdapter,
|
||||
mergeConfig
|
||||
mergeConfig,
|
||||
} = axios;
|
||||
|
||||
export {
|
||||
@ -39,5 +39,5 @@ export {
|
||||
HttpStatusCode,
|
||||
formToJSON,
|
||||
getAdapter,
|
||||
mergeConfig
|
||||
}
|
||||
mergeConfig,
|
||||
};
|
||||
|
||||
@ -14,11 +14,11 @@ function createCustomLauncher(browser, version, platform) {
|
||||
base: 'SauceLabs',
|
||||
browserName: browser,
|
||||
version: version,
|
||||
platform: platform
|
||||
platform: platform,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function(config) {
|
||||
module.exports = function (config) {
|
||||
var customLaunchers = {};
|
||||
var browsers = process.env.Browsers && process.env.Browsers.split(',');
|
||||
var sauceLabs;
|
||||
@ -35,10 +35,10 @@ module.exports = function(config) {
|
||||
'SAUCE_IE',
|
||||
'SAUCE_EDGE',
|
||||
'SAUCE_IOS',
|
||||
'SAUCE_ANDROID'
|
||||
'SAUCE_ANDROID',
|
||||
];
|
||||
|
||||
options.forEach(function(opt) {
|
||||
options.forEach(function (opt) {
|
||||
if (process.env[opt]) {
|
||||
runAll = false;
|
||||
}
|
||||
@ -62,21 +62,9 @@ module.exports = function(config) {
|
||||
if (runAll || process.env.SAUCE_SAFARI) {
|
||||
// customLaunchers.SL_Safari7 = createCustomLauncher('safari', 7);
|
||||
// customLaunchers.SL_Safari8 = createCustomLauncher('safari', 8);
|
||||
customLaunchers.SL_Safari9 = createCustomLauncher(
|
||||
'safari',
|
||||
9.0,
|
||||
'OS X 10.11'
|
||||
);
|
||||
customLaunchers.SL_Safari10 = createCustomLauncher(
|
||||
'safari',
|
||||
'10.1',
|
||||
'macOS 10.12'
|
||||
);
|
||||
customLaunchers.SL_Safari11 = createCustomLauncher(
|
||||
'safari',
|
||||
'11.1',
|
||||
'macOS 10.13'
|
||||
);
|
||||
customLaunchers.SL_Safari9 = createCustomLauncher('safari', 9.0, 'OS X 10.11');
|
||||
customLaunchers.SL_Safari10 = createCustomLauncher('safari', '10.1', 'macOS 10.12');
|
||||
customLaunchers.SL_Safari11 = createCustomLauncher('safari', '11.1', 'macOS 10.13');
|
||||
}
|
||||
|
||||
// Opera
|
||||
@ -118,14 +106,14 @@ module.exports = function(config) {
|
||||
recordScreenshots: false,
|
||||
connectOptions: {
|
||||
// port: 5757,
|
||||
logfile: 'sauce_connect.log'
|
||||
logfile: 'sauce_connect.log',
|
||||
},
|
||||
public: 'public'
|
||||
public: 'public',
|
||||
};
|
||||
} else if (process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false') {
|
||||
console.log(
|
||||
'Cannot run on Sauce Labs as encrypted environment variables are not available to PRs. ' +
|
||||
'Running on Travis.'
|
||||
'Running on Travis.'
|
||||
);
|
||||
browsers = ['Firefox'];
|
||||
} else if (process.env.GITHUB_ACTIONS === 'true') {
|
||||
@ -133,50 +121,44 @@ module.exports = function(config) {
|
||||
browsers = ['FirefoxHeadless', 'ChromeHeadless'];
|
||||
} else {
|
||||
browsers = browsers || ['Chrome'];
|
||||
console.log(`Running ${browsers} locally since SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables are not set.`);
|
||||
console.log(
|
||||
`Running ${browsers} locally since SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables are not set.`
|
||||
);
|
||||
}
|
||||
|
||||
config.set({
|
||||
// base path that will be used to resolve all patterns (eg. files, exclude)
|
||||
basePath: '',
|
||||
|
||||
|
||||
// frameworks to use
|
||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||
frameworks: ['jasmine-ajax', 'jasmine', 'sinon'],
|
||||
|
||||
|
||||
// list of files / patterns to load in the browser
|
||||
files: [
|
||||
{pattern: 'test/specs/__helpers.js', watched: false},
|
||||
{pattern: 'test/specs/**/*.spec.js', watched: false}
|
||||
{ pattern: 'test/specs/__helpers.js', watched: false },
|
||||
{ pattern: 'test/specs/**/*.spec.js', watched: false },
|
||||
],
|
||||
|
||||
|
||||
// list of files to exclude
|
||||
exclude: [],
|
||||
|
||||
|
||||
// preprocess matching files before serving them to the browser
|
||||
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
|
||||
preprocessors: {
|
||||
'test/specs/__helpers.js': ['rollup'],
|
||||
'test/specs/**/*.spec.js': ['rollup']
|
||||
'test/specs/**/*.spec.js': ['rollup'],
|
||||
},
|
||||
|
||||
rollupPreprocessor: {
|
||||
plugins: [
|
||||
resolve({browser: true}),
|
||||
commonjs()
|
||||
],
|
||||
plugins: [resolve({ browser: true }), commonjs()],
|
||||
output: {
|
||||
format: 'iife',
|
||||
name: '_axios',
|
||||
sourcemap: 'inline'
|
||||
}
|
||||
sourcemap: 'inline',
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
// test results reporter to use
|
||||
// possible values: 'dots', 'progress'
|
||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||
@ -184,36 +166,29 @@ module.exports = function(config) {
|
||||
// reporters: ['dots', 'coverage', 'saucelabs'],
|
||||
reporters: ['progress'],
|
||||
|
||||
|
||||
// web server port
|
||||
port: 9876,
|
||||
|
||||
|
||||
// Increase timeouts to prevent the issue with disconnected tests (https://goo.gl/nstA69)
|
||||
captureTimeout: 4 * 60 * 1000,
|
||||
browserDisconnectTimeout: 10000,
|
||||
browserDisconnectTolerance: 1,
|
||||
browserNoActivityTimeout: 4 * 60 * 1000,
|
||||
|
||||
|
||||
// enable / disable colors in the output (reporters and logs)
|
||||
colors: true,
|
||||
|
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
logLevel: config.LOG_INFO,
|
||||
|
||||
|
||||
// enable / disable watching file and executing tests whenever any file changes
|
||||
autoWatch: false,
|
||||
|
||||
|
||||
// start these browsers
|
||||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
||||
browsers: browsers,
|
||||
|
||||
|
||||
// Continuous Integration mode
|
||||
// if true, Karma captures browsers, runs the tests and exits
|
||||
singleRun: false,
|
||||
@ -225,26 +200,25 @@ module.exports = function(config) {
|
||||
devtool: 'inline-source-map',
|
||||
externals: [
|
||||
{
|
||||
'./adapters/http': 'var undefined'
|
||||
}
|
||||
]
|
||||
'./adapters/http': 'var undefined',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
webpackServer: {
|
||||
stats: {
|
||||
colors: true
|
||||
}
|
||||
colors: true,
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
// Coverage reporting
|
||||
coverageReporter: {
|
||||
type: 'lcov',
|
||||
dir: 'coverage/',
|
||||
subdir: '.'
|
||||
subdir: '.',
|
||||
},
|
||||
|
||||
sauceLabs: sauceLabs,
|
||||
customLaunchers: customLaunchers
|
||||
customLaunchers: customLaunchers,
|
||||
});
|
||||
};
|
||||
|
||||
@ -16,15 +16,14 @@ module.exports = function myAdapter(config) {
|
||||
// Make the request using config provided
|
||||
// Upon response settle the Promise
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
var response = {
|
||||
data: responseData,
|
||||
status: request.status,
|
||||
statusText: request.statusText,
|
||||
headers: responseHeaders,
|
||||
config: config,
|
||||
request: request
|
||||
request: request,
|
||||
};
|
||||
|
||||
settle(resolve, reject, response);
|
||||
@ -33,5 +32,5 @@ module.exports = function myAdapter(config) {
|
||||
// - response transformers will run
|
||||
// - response interceptors will run
|
||||
});
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
@ -2,7 +2,7 @@ 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";
|
||||
import AxiosError from '../core/AxiosError.js';
|
||||
|
||||
/**
|
||||
* Known adapters mapping.
|
||||
@ -18,7 +18,7 @@ const knownAdapters = {
|
||||
xhr: xhrAdapter,
|
||||
fetch: {
|
||||
get: fetchAdapter.getFetch,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
// Assign adapter names for easier debugging and identification
|
||||
@ -47,7 +47,8 @@ const renderReason = (reason) => `- ${reason}`;
|
||||
* @param {Function|null|false} adapter
|
||||
* @returns {boolean}
|
||||
*/
|
||||
const isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;
|
||||
const isResolvedHandle = (adapter) =>
|
||||
utils.isFunction(adapter) || adapter === null || adapter === false;
|
||||
|
||||
/**
|
||||
* Get the first suitable adapter from the provided list.
|
||||
@ -90,14 +91,17 @@ function getAdapter(adapters, config) {
|
||||
}
|
||||
|
||||
if (!adapter) {
|
||||
const reasons = Object.entries(rejectedReasons)
|
||||
.map(([id, state]) => `adapter ${id} ` +
|
||||
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';
|
||||
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,
|
||||
@ -122,5 +126,5 @@ export default {
|
||||
* Exposes all known adapters
|
||||
* @type {Object<string, Function|Object>}
|
||||
*/
|
||||
adapters: knownAdapters
|
||||
adapters: knownAdapters,
|
||||
};
|
||||
|
||||
@ -1,40 +1,46 @@
|
||||
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 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';
|
||||
|
||||
const DEFAULT_CHUNK_SIZE = 64 * 1024;
|
||||
|
||||
const {isFunction} = utils;
|
||||
const { isFunction } = utils;
|
||||
|
||||
const globalFetchAPI = (({Request, Response}) => ({
|
||||
Request, Response
|
||||
const globalFetchAPI = (({ Request, Response }) => ({
|
||||
Request,
|
||||
Response,
|
||||
}))(utils.global);
|
||||
|
||||
const {
|
||||
ReadableStream, TextEncoder
|
||||
} = utils.global;
|
||||
|
||||
const { ReadableStream, TextEncoder } = utils.global;
|
||||
|
||||
const test = (fn, ...args) => {
|
||||
try {
|
||||
return !!fn(...args);
|
||||
} catch (e) {
|
||||
return false
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const factory = (env) => {
|
||||
env = utils.merge.call({
|
||||
skipUndefined: true
|
||||
}, globalFetchAPI, env);
|
||||
env = utils.merge.call(
|
||||
{
|
||||
skipUndefined: true,
|
||||
},
|
||||
globalFetchAPI,
|
||||
env
|
||||
);
|
||||
|
||||
const {fetch: envFetch, Request, Response} = env;
|
||||
const { fetch: envFetch, Request, Response } = env;
|
||||
const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';
|
||||
const isRequestSupported = isFunction(Request);
|
||||
const isResponseSupported = isFunction(Response);
|
||||
@ -45,46 +51,61 @@ const factory = (env) => {
|
||||
|
||||
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 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 supportsRequestStream =
|
||||
isRequestSupported &&
|
||||
isReadableStreamSupported &&
|
||||
test(() => {
|
||||
let duplexAccessed = false;
|
||||
|
||||
const hasContentType = new Request(platform.origin, {
|
||||
body: new ReadableStream(),
|
||||
method: 'POST',
|
||||
get duplex() {
|
||||
duplexAccessed = true;
|
||||
return 'half';
|
||||
},
|
||||
}).headers.has('Content-Type');
|
||||
const hasContentType = new Request(platform.origin, {
|
||||
body: new ReadableStream(),
|
||||
method: 'POST',
|
||||
get duplex() {
|
||||
duplexAccessed = true;
|
||||
return 'half';
|
||||
},
|
||||
}).headers.has('Content-Type');
|
||||
|
||||
return duplexAccessed && !hasContentType;
|
||||
});
|
||||
return duplexAccessed && !hasContentType;
|
||||
});
|
||||
|
||||
const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&
|
||||
const supportsResponseStream =
|
||||
isResponseSupported &&
|
||||
isReadableStreamSupported &&
|
||||
test(() => utils.isReadableStream(new Response('').body));
|
||||
|
||||
const resolvers = {
|
||||
stream: supportsResponseStream && ((res) => res.body)
|
||||
stream: supportsResponseStream && ((res) => res.body),
|
||||
};
|
||||
|
||||
isFetchSupported && ((() => {
|
||||
['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {
|
||||
!resolvers[type] && (resolvers[type] = (res, config) => {
|
||||
let method = res && res[type];
|
||||
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);
|
||||
}
|
||||
if (method) {
|
||||
return method.call(res);
|
||||
}
|
||||
|
||||
throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);
|
||||
})
|
||||
});
|
||||
})());
|
||||
throw new AxiosError(
|
||||
`Response type '${type}' is not supported`,
|
||||
AxiosError.ERR_NOT_SUPPORT,
|
||||
config
|
||||
);
|
||||
});
|
||||
});
|
||||
})();
|
||||
|
||||
const getBodyLength = async (body) => {
|
||||
if (body == null) {
|
||||
@ -114,13 +135,13 @@ const factory = (env) => {
|
||||
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 {
|
||||
@ -135,38 +156,47 @@ const factory = (env) => {
|
||||
responseType,
|
||||
headers,
|
||||
withCredentials = 'same-origin',
|
||||
fetchOptions
|
||||
fetchOptions,
|
||||
} = resolveConfig(config);
|
||||
|
||||
let _fetch = envFetch || fetch;
|
||||
|
||||
responseType = responseType ? (responseType + '').toLowerCase() : 'text';
|
||||
|
||||
let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
|
||||
let composedSignal = composeSignals(
|
||||
[signal, cancelToken && cancelToken.toAbortSignal()],
|
||||
timeout
|
||||
);
|
||||
|
||||
let request = null;
|
||||
|
||||
const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
|
||||
composedSignal.unsubscribe();
|
||||
});
|
||||
const unsubscribe =
|
||||
composedSignal &&
|
||||
composedSignal.unsubscribe &&
|
||||
(() => {
|
||||
composedSignal.unsubscribe();
|
||||
});
|
||||
|
||||
let requestContentLength;
|
||||
|
||||
try {
|
||||
if (
|
||||
onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&
|
||||
onUploadProgress &&
|
||||
supportsRequestStream &&
|
||||
method !== 'get' &&
|
||||
method !== 'head' &&
|
||||
(requestContentLength = await resolveBodyLength(headers, data)) !== 0
|
||||
) {
|
||||
let _request = new Request(url, {
|
||||
method: 'POST',
|
||||
body: data,
|
||||
duplex: "half"
|
||||
duplex: 'half',
|
||||
});
|
||||
|
||||
let contentTypeHeader;
|
||||
|
||||
if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
|
||||
headers.setContentType(contentTypeHeader)
|
||||
headers.setContentType(contentTypeHeader);
|
||||
}
|
||||
|
||||
if (_request.body) {
|
||||
@ -185,7 +215,7 @@ const factory = (env) => {
|
||||
|
||||
// Cloudflare Workers throws when credentials are defined
|
||||
// see https://github.com/cloudflare/workerd/issues/902
|
||||
const isCredentialsSupported = isRequestSupported && "credentials" in Request.prototype;
|
||||
const isCredentialsSupported = isRequestSupported && 'credentials' in Request.prototype;
|
||||
|
||||
const resolvedOptions = {
|
||||
...fetchOptions,
|
||||
@ -193,29 +223,35 @@ const factory = (env) => {
|
||||
method: method.toUpperCase(),
|
||||
headers: headers.normalize().toJSON(),
|
||||
body: data,
|
||||
duplex: "half",
|
||||
credentials: isCredentialsSupported ? withCredentials : undefined
|
||||
duplex: 'half',
|
||||
credentials: isCredentialsSupported ? withCredentials : undefined,
|
||||
};
|
||||
|
||||
request = isRequestSupported && new Request(url, resolvedOptions);
|
||||
|
||||
let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));
|
||||
let response = await (isRequestSupported
|
||||
? _fetch(request, fetchOptions)
|
||||
: _fetch(url, resolvedOptions));
|
||||
|
||||
const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');
|
||||
const isStreamResponse =
|
||||
supportsResponseStream && (responseType === 'stream' || responseType === 'response');
|
||||
|
||||
if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
|
||||
const options = {};
|
||||
|
||||
['status', 'statusText', 'headers'].forEach(prop => {
|
||||
['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)
|
||||
) || [];
|
||||
const [onProgress, flush] =
|
||||
(onDownloadProgress &&
|
||||
progressEventDecorator(
|
||||
responseContentLength,
|
||||
progressEventReducer(asyncDecorator(onDownloadProgress), true)
|
||||
)) ||
|
||||
[];
|
||||
|
||||
response = new Response(
|
||||
trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
|
||||
@ -228,7 +264,10 @@ const factory = (env) => {
|
||||
|
||||
responseType = responseType || 'text';
|
||||
|
||||
let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);
|
||||
let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](
|
||||
response,
|
||||
config
|
||||
);
|
||||
|
||||
!isStreamResponse && unsubscribe && unsubscribe();
|
||||
|
||||
@ -239,43 +278,50 @@ const factory = (env) => {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
config,
|
||||
request
|
||||
})
|
||||
})
|
||||
request,
|
||||
});
|
||||
});
|
||||
} catch (err) {
|
||||
unsubscribe && unsubscribe();
|
||||
|
||||
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),
|
||||
new AxiosError(
|
||||
'Network Error',
|
||||
AxiosError.ERR_NETWORK,
|
||||
config,
|
||||
request,
|
||||
err && err.response
|
||||
),
|
||||
{
|
||||
cause: err.cause || err
|
||||
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
|
||||
];
|
||||
const { fetch, Request, Response } = env;
|
||||
const seeds = [Request, Response, fetch];
|
||||
|
||||
let len = seeds.length, i = len,
|
||||
seed, target, map = seedCache;
|
||||
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)))
|
||||
target === undefined && map.set(seed, (target = i ? new Map() : factory(env)));
|
||||
|
||||
map = target;
|
||||
}
|
||||
|
||||
1267
lib/adapters/http.js
1267
lib/adapters/http.js
File diff suppressed because it is too large
Load Diff
@ -6,195 +6,217 @@ 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 { progressEventReducer } from '../helpers/progressEventReducer.js';
|
||||
import resolveConfig from '../helpers/resolveConfig.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;
|
||||
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
|
||||
function done() {
|
||||
flushUpload && flushUpload(); // flush events
|
||||
flushDownload && flushDownload(); // flush events
|
||||
|
||||
_config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);
|
||||
_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.indexOf('file:') === 0)) {
|
||||
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;
|
||||
_config.signal && _config.signal.removeEventListener('abort', onCanceled);
|
||||
}
|
||||
|
||||
reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
|
||||
let request = new XMLHttpRequest();
|
||||
|
||||
// Clean up request
|
||||
request = null;
|
||||
};
|
||||
request.open(_config.method.toUpperCase(), _config.url, true);
|
||||
|
||||
// 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);
|
||||
request = null;
|
||||
};
|
||||
// Set the request timeout in MS
|
||||
request.timeout = _config.timeout;
|
||||
|
||||
// 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));
|
||||
|
||||
// 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(requestHeaders.toJSON(), 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 => {
|
||||
function onloadend() {
|
||||
if (!request) {
|
||||
return;
|
||||
}
|
||||
reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
|
||||
request.abort();
|
||||
// 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.indexOf('file:') === 0)
|
||||
) {
|
||||
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));
|
||||
|
||||
// Clean up request
|
||||
request = null;
|
||||
};
|
||||
|
||||
_config.cancelToken && _config.cancelToken.subscribe(onCanceled);
|
||||
if (_config.signal) {
|
||||
_config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);
|
||||
// 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);
|
||||
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
|
||||
)
|
||||
);
|
||||
|
||||
// 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(requestHeaders.toJSON(), function setRequestHeader(val, key) {
|
||||
request.setRequestHeader(key, val);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const protocol = parseProtocol(_config.url);
|
||||
// Add withCredentials to request if needed
|
||||
if (!utils.isUndefined(_config.withCredentials)) {
|
||||
request.withCredentials = !!_config.withCredentials;
|
||||
}
|
||||
|
||||
if (protocol && platform.protocols.indexOf(protocol) === -1) {
|
||||
reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
|
||||
return;
|
||||
}
|
||||
// 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);
|
||||
}
|
||||
|
||||
// Send the request
|
||||
request.send(requestData || null);
|
||||
});
|
||||
}
|
||||
// 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();
|
||||
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.indexOf(protocol) === -1) {
|
||||
reject(
|
||||
new AxiosError(
|
||||
'Unsupported protocol ' + protocol + ':',
|
||||
AxiosError.ERR_BAD_REQUEST,
|
||||
config
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// Send the request
|
||||
request.send(requestData || null);
|
||||
});
|
||||
};
|
||||
|
||||
12
lib/axios.js
12
lib/axios.js
@ -9,12 +9,12 @@ 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 { 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 AxiosHeaders from './core/AxiosHeaders.js';
|
||||
import adapters from './adapters/adapters.js';
|
||||
import HttpStatusCode from './helpers/HttpStatusCode.js';
|
||||
|
||||
@ -30,10 +30,10 @@ function createInstance(defaultConfig) {
|
||||
const instance = bind(Axios.prototype.request, context);
|
||||
|
||||
// Copy axios.prototype to instance
|
||||
utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});
|
||||
utils.extend(instance, Axios.prototype, context, { allOwnKeys: true });
|
||||
|
||||
// Copy context to instance
|
||||
utils.extend(instance, context, null, {allOwnKeys: true});
|
||||
utils.extend(instance, context, null, { allOwnKeys: true });
|
||||
|
||||
// Factory for creating new instances
|
||||
instance.create = function create(instanceConfig) {
|
||||
@ -77,7 +77,7 @@ axios.mergeConfig = mergeConfig;
|
||||
|
||||
axios.AxiosHeaders = AxiosHeaders;
|
||||
|
||||
axios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
|
||||
axios.formToJSON = (thing) => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
|
||||
|
||||
axios.getAdapter = adapters.getAdapter;
|
||||
|
||||
@ -86,4 +86,4 @@ axios.HttpStatusCode = HttpStatusCode;
|
||||
axios.default = axios;
|
||||
|
||||
// this module should only have a default export
|
||||
export default axios
|
||||
export default axios;
|
||||
|
||||
@ -24,7 +24,7 @@ class CancelToken {
|
||||
const token = this;
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
this.promise.then(cancel => {
|
||||
this.promise.then((cancel) => {
|
||||
if (!token._listeners) return;
|
||||
|
||||
let i = token._listeners.length;
|
||||
@ -36,10 +36,10 @@ class CancelToken {
|
||||
});
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
this.promise.then = onfulfilled => {
|
||||
this.promise.then = (onfulfilled) => {
|
||||
let _resolve;
|
||||
// eslint-disable-next-line func-names
|
||||
const promise = new Promise(resolve => {
|
||||
const promise = new Promise((resolve) => {
|
||||
token.subscribe(resolve);
|
||||
_resolve = resolve;
|
||||
}).then(onfulfilled);
|
||||
@ -127,7 +127,7 @@ class CancelToken {
|
||||
});
|
||||
return {
|
||||
token,
|
||||
cancel
|
||||
cancel,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ class Axios {
|
||||
this.defaults = instanceConfig || {};
|
||||
this.interceptors = {
|
||||
request: new InterceptorManager(),
|
||||
response: new InterceptorManager()
|
||||
response: new InterceptorManager(),
|
||||
};
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ class Axios {
|
||||
err.stack = stack;
|
||||
// match without the 2 top stack lines
|
||||
} else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ''))) {
|
||||
err.stack += '\n' + stack
|
||||
err.stack += '\n' + stack;
|
||||
}
|
||||
} catch (e) {
|
||||
// ignore the case where "stack" is an un-writable property
|
||||
@ -75,27 +75,35 @@ class Axios {
|
||||
|
||||
config = mergeConfig(this.defaults, config);
|
||||
|
||||
const {transitional, paramsSerializer, headers} = 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);
|
||||
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
|
||||
}
|
||||
serialize: paramsSerializer,
|
||||
};
|
||||
} else {
|
||||
validator.assertOptions(paramsSerializer, {
|
||||
encode: validators.function,
|
||||
serialize: validators.function
|
||||
}, true);
|
||||
validator.assertOptions(
|
||||
paramsSerializer,
|
||||
{
|
||||
encode: validators.function,
|
||||
serialize: validators.function,
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -108,26 +116,25 @@ class Axios {
|
||||
config.allowAbsoluteUrls = true;
|
||||
}
|
||||
|
||||
validator.assertOptions(config, {
|
||||
baseUrl: validators.spelling('baseURL'),
|
||||
withXsrfToken: validators.spelling('withXSRFToken')
|
||||
}, 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]
|
||||
);
|
||||
let contextHeaders = headers && utils.merge(headers.common, headers[config.method]);
|
||||
|
||||
headers && utils.forEach(
|
||||
['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
|
||||
(method) => {
|
||||
headers &&
|
||||
utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], (method) => {
|
||||
delete headers[method];
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
config.headers = AxiosHeaders.concat(contextHeaders, headers);
|
||||
|
||||
@ -142,7 +149,8 @@ class Axios {
|
||||
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
|
||||
|
||||
const transitional = config.transitional || transitionalDefaults;
|
||||
const legacyInterceptorReqResOrdering = transitional && transitional.legacyInterceptorReqResOrdering;
|
||||
const legacyInterceptorReqResOrdering =
|
||||
transitional && transitional.legacyInterceptorReqResOrdering;
|
||||
|
||||
if (legacyInterceptorReqResOrdering) {
|
||||
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
|
||||
@ -216,12 +224,14 @@ class Axios {
|
||||
// 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
|
||||
}));
|
||||
Axios.prototype[method] = function (url, config) {
|
||||
return this.request(
|
||||
mergeConfig(config || {}, {
|
||||
method,
|
||||
url,
|
||||
data: (config || {}).data,
|
||||
})
|
||||
);
|
||||
};
|
||||
});
|
||||
|
||||
@ -230,14 +240,18 @@ utils.forEach(['post', 'put', 'patch'], 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
|
||||
}));
|
||||
return this.request(
|
||||
mergeConfig(config || {}, {
|
||||
method,
|
||||
headers: isForm
|
||||
? {
|
||||
'Content-Type': 'multipart/form-data',
|
||||
}
|
||||
: {},
|
||||
url,
|
||||
data,
|
||||
})
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -3,57 +3,57 @@
|
||||
import utils from '../utils.js';
|
||||
|
||||
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;
|
||||
customProps && Object.assign(axiosError, customProps);
|
||||
return axiosError;
|
||||
}
|
||||
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;
|
||||
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);
|
||||
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;
|
||||
}
|
||||
/**
|
||||
* 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);
|
||||
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() {
|
||||
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: utils.toJSONObject(this.config),
|
||||
code: this.code,
|
||||
status: this.status,
|
||||
};
|
||||
}
|
||||
toJSON() {
|
||||
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: utils.toJSONObject(this.config),
|
||||
code: this.code,
|
||||
status: this.status,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// This can be changed to static properties as soon as the parser options in .eslint.cjs are updated.
|
||||
|
||||
@ -52,8 +52,10 @@ function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {
|
||||
}
|
||||
|
||||
function formatHeader(header) {
|
||||
return header.trim()
|
||||
.toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
|
||||
return header
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/([a-z\d])(\w*)/g, (w, char, str) => {
|
||||
return char.toUpperCase() + str;
|
||||
});
|
||||
}
|
||||
@ -61,12 +63,12 @@ function formatHeader(header) {
|
||||
function buildAccessors(obj, header) {
|
||||
const accessorName = utils.toCamelCase(' ' + header);
|
||||
|
||||
['get', 'set', 'has'].forEach(methodName => {
|
||||
['get', 'set', 'has'].forEach((methodName) => {
|
||||
Object.defineProperty(obj, methodName + accessorName, {
|
||||
value: function(arg1, arg2, arg3) {
|
||||
value: function (arg1, arg2, arg3) {
|
||||
return this[methodName].call(this, header, arg1, arg2, arg3);
|
||||
},
|
||||
configurable: true
|
||||
configurable: true,
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -88,7 +90,12 @@ class AxiosHeaders {
|
||||
|
||||
const key = utils.findKey(self, lHeader);
|
||||
|
||||
if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {
|
||||
if (
|
||||
!key ||
|
||||
self[key] === undefined ||
|
||||
_rewrite === true ||
|
||||
(_rewrite === undefined && self[key] !== false)
|
||||
) {
|
||||
self[key || _header] = normalizeValue(_value);
|
||||
}
|
||||
}
|
||||
@ -97,21 +104,26 @@ class AxiosHeaders {
|
||||
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(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;
|
||||
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];
|
||||
obj[(key = entry[0])] = (dest = obj[key])
|
||||
? utils.isArray(dest)
|
||||
? [...dest, entry[1]]
|
||||
: [dest, entry[1]]
|
||||
: entry[1];
|
||||
}
|
||||
|
||||
setHeaders(obj, valueOrRewrite)
|
||||
setHeaders(obj, valueOrRewrite);
|
||||
} else {
|
||||
header != null && setHeader(valueOrRewrite, header, rewrite);
|
||||
}
|
||||
@ -155,7 +167,11 @@ class AxiosHeaders {
|
||||
if (header) {
|
||||
const key = utils.findKey(this, header);
|
||||
|
||||
return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
|
||||
return !!(
|
||||
key &&
|
||||
this[key] !== undefined &&
|
||||
(!matcher || matchHeaderValue(this, this[key], key, matcher))
|
||||
);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -195,7 +211,7 @@ class AxiosHeaders {
|
||||
|
||||
while (i--) {
|
||||
const key = keys[i];
|
||||
if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
|
||||
if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
|
||||
delete this[key];
|
||||
deleted = true;
|
||||
}
|
||||
@ -239,7 +255,9 @@ class AxiosHeaders {
|
||||
const obj = Object.create(null);
|
||||
|
||||
utils.forEach(this, (value, header) => {
|
||||
value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);
|
||||
value != null &&
|
||||
value !== false &&
|
||||
(obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);
|
||||
});
|
||||
|
||||
return obj;
|
||||
@ -250,11 +268,13 @@ class AxiosHeaders {
|
||||
}
|
||||
|
||||
toString() {
|
||||
return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n');
|
||||
return Object.entries(this.toJSON())
|
||||
.map(([header, value]) => header + ': ' + value)
|
||||
.join('\n');
|
||||
}
|
||||
|
||||
getSetCookie() {
|
||||
return this.get("set-cookie") || [];
|
||||
return this.get('set-cookie') || [];
|
||||
}
|
||||
|
||||
get [Symbol.toStringTag]() {
|
||||
@ -274,9 +294,12 @@ class AxiosHeaders {
|
||||
}
|
||||
|
||||
static accessor(header) {
|
||||
const internals = this[$internals] = (this[$internals] = {
|
||||
accessors: {}
|
||||
});
|
||||
const internals =
|
||||
(this[$internals] =
|
||||
this[$internals] =
|
||||
{
|
||||
accessors: {},
|
||||
});
|
||||
|
||||
const accessors = internals.accessors;
|
||||
const prototype = this.prototype;
|
||||
@ -296,17 +319,24 @@ class AxiosHeaders {
|
||||
}
|
||||
}
|
||||
|
||||
AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);
|
||||
AxiosHeaders.accessor([
|
||||
'Content-Type',
|
||||
'Content-Length',
|
||||
'Accept',
|
||||
'Accept-Encoding',
|
||||
'User-Agent',
|
||||
'Authorization',
|
||||
]);
|
||||
|
||||
// reserved names hotfix
|
||||
utils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {
|
||||
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);
|
||||
|
||||
@ -21,7 +21,7 @@ class InterceptorManager {
|
||||
fulfilled,
|
||||
rejected,
|
||||
synchronous: options ? options.synchronous : false,
|
||||
runWhen: options ? options.runWhen : null
|
||||
runWhen: options ? options.runWhen : null,
|
||||
});
|
||||
return this.handlers.length - 1;
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@ 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";
|
||||
import adapters from '../adapters/adapters.js';
|
||||
|
||||
/**
|
||||
* Throws a `CanceledError` if cancellation has been requested.
|
||||
@ -37,10 +37,7 @@ export default function dispatchRequest(config) {
|
||||
config.headers = AxiosHeaders.from(config.headers);
|
||||
|
||||
// Transform request data
|
||||
config.data = transformData.call(
|
||||
config,
|
||||
config.transformRequest
|
||||
);
|
||||
config.data = transformData.call(config, config.transformRequest);
|
||||
|
||||
if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {
|
||||
config.headers.setContentType('application/x-www-form-urlencoded', false);
|
||||
@ -48,34 +45,33 @@ export default function dispatchRequest(config) {
|
||||
|
||||
const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);
|
||||
|
||||
return adapter(config).then(function onAdapterResolution(response) {
|
||||
throwIfCancellationRequested(config);
|
||||
|
||||
// Transform response data
|
||||
response.data = transformData.call(
|
||||
config,
|
||||
config.transformResponse,
|
||||
response
|
||||
);
|
||||
|
||||
response.headers = AxiosHeaders.from(response.headers);
|
||||
|
||||
return response;
|
||||
}, function onAdapterRejection(reason) {
|
||||
if (!isCancel(reason)) {
|
||||
return adapter(config).then(
|
||||
function onAdapterResolution(response) {
|
||||
throwIfCancellationRequested(config);
|
||||
|
||||
// Transform response data
|
||||
if (reason && reason.response) {
|
||||
reason.response.data = transformData.call(
|
||||
config,
|
||||
config.transformResponse,
|
||||
reason.response
|
||||
);
|
||||
reason.response.headers = AxiosHeaders.from(reason.response.headers);
|
||||
}
|
||||
}
|
||||
response.data = transformData.call(config, config.transformResponse, response);
|
||||
|
||||
return Promise.reject(reason);
|
||||
});
|
||||
response.headers = AxiosHeaders.from(response.headers);
|
||||
|
||||
return response;
|
||||
},
|
||||
function onAdapterRejection(reason) {
|
||||
if (!isCancel(reason)) {
|
||||
throwIfCancellationRequested(config);
|
||||
|
||||
// Transform response data
|
||||
if (reason && reason.response) {
|
||||
reason.response.data = transformData.call(
|
||||
config,
|
||||
config.transformResponse,
|
||||
reason.response
|
||||
);
|
||||
reason.response.headers = AxiosHeaders.from(reason.response.headers);
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.reject(reason);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,10 +1,9 @@
|
||||
"use strict";
|
||||
'use strict';
|
||||
|
||||
import utils from "../utils.js";
|
||||
import AxiosHeaders from "./AxiosHeaders.js";
|
||||
import utils from '../utils.js';
|
||||
import AxiosHeaders from './AxiosHeaders.js';
|
||||
|
||||
const headersToObject = (thing) =>
|
||||
thing instanceof AxiosHeaders ? { ...thing } : thing;
|
||||
const headersToObject = (thing) => (thing instanceof AxiosHeaders ? { ...thing } : thing);
|
||||
|
||||
/**
|
||||
* Config-specific merge-function which creates a new config-object
|
||||
@ -97,23 +96,12 @@ export default function mergeConfig(config1, config2) {
|
||||
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 configValue = merge(config1[prop], config2[prop], prop);
|
||||
(utils.isUndefined(configValue) && merge !== mergeDirectKeys) ||
|
||||
(config[prop] = configValue);
|
||||
},
|
||||
);
|
||||
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 configValue = merge(config1[prop], config2[prop], prop);
|
||||
(utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
|
||||
});
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
@ -16,12 +16,16 @@ export default function settle(resolve, reject, response) {
|
||||
if (!response.status || !validateStatus || validateStatus(response.status)) {
|
||||
resolve(response);
|
||||
} else {
|
||||
reject(new AxiosError(
|
||||
'Request failed with status code ' + response.status,
|
||||
[AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
|
||||
response.config,
|
||||
response.request,
|
||||
response
|
||||
));
|
||||
reject(
|
||||
new AxiosError(
|
||||
'Request failed with status code ' + response.status,
|
||||
[AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][
|
||||
Math.floor(response.status / 100) - 4
|
||||
],
|
||||
response.config,
|
||||
response.request,
|
||||
response
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,96 +34,107 @@ function stringifySafely(rawValue, parser, encoder) {
|
||||
}
|
||||
|
||||
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);
|
||||
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) {
|
||||
if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
|
||||
return toURLEncodedForm(data, this.formSerializer).toString();
|
||||
if (isObjectPayload && utils.isHTMLForm(data)) {
|
||||
data = new FormData(data);
|
||||
}
|
||||
|
||||
if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
|
||||
const _FormData = this.env && this.env.FormData;
|
||||
const isFormData = utils.isFormData(data);
|
||||
|
||||
return toFormData(
|
||||
isFileList ? {'files[]': data} : data,
|
||||
_FormData && new _FormData(),
|
||||
this.formSerializer
|
||||
);
|
||||
if (isFormData) {
|
||||
return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
|
||||
}
|
||||
}
|
||||
|
||||
if (isObjectPayload || hasJSONContentType ) {
|
||||
headers.setContentType('application/json', false);
|
||||
return stringifySafely(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();
|
||||
}
|
||||
|
||||
return data;
|
||||
}],
|
||||
let isFileList;
|
||||
|
||||
transformResponse: [function transformResponse(data) {
|
||||
const transitional = this.transitional || defaults.transitional;
|
||||
const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
|
||||
const JSONRequested = this.responseType === 'json';
|
||||
if (isObjectPayload) {
|
||||
if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
|
||||
return toURLEncodedForm(data, this.formSerializer).toString();
|
||||
}
|
||||
|
||||
if (utils.isResponse(data) || utils.isReadableStream(data)) {
|
||||
return data;
|
||||
}
|
||||
if (
|
||||
(isFileList = utils.isFileList(data)) ||
|
||||
contentType.indexOf('multipart/form-data') > -1
|
||||
) {
|
||||
const _FormData = this.env && this.env.FormData;
|
||||
|
||||
if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
|
||||
const silentJSONParsing = transitional && transitional.silentJSONParsing;
|
||||
const strictJSONParsing = !silentJSONParsing && JSONRequested;
|
||||
|
||||
try {
|
||||
return JSON.parse(data, this.parseReviver);
|
||||
} catch (e) {
|
||||
if (strictJSONParsing) {
|
||||
if (e.name === 'SyntaxError') {
|
||||
throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
|
||||
}
|
||||
throw e;
|
||||
return toFormData(
|
||||
isFileList ? { 'files[]': data } : data,
|
||||
_FormData && new _FormData(),
|
||||
this.formSerializer
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}],
|
||||
if (isObjectPayload || hasJSONContentType) {
|
||||
headers.setContentType('application/json', false);
|
||||
return stringifySafely(data);
|
||||
}
|
||||
|
||||
return data;
|
||||
},
|
||||
],
|
||||
|
||||
transformResponse: [
|
||||
function transformResponse(data) {
|
||||
const transitional = this.transitional || defaults.transitional;
|
||||
const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
|
||||
const JSONRequested = this.responseType === 'json';
|
||||
|
||||
if (utils.isResponse(data) || utils.isReadableStream(data)) {
|
||||
return data;
|
||||
}
|
||||
|
||||
if (
|
||||
data &&
|
||||
utils.isString(data) &&
|
||||
((forcedJSONParsing && !this.responseType) || JSONRequested)
|
||||
) {
|
||||
const silentJSONParsing = transitional && transitional.silentJSONParsing;
|
||||
const strictJSONParsing = !silentJSONParsing && JSONRequested;
|
||||
|
||||
try {
|
||||
return JSON.parse(data, this.parseReviver);
|
||||
} catch (e) {
|
||||
if (strictJSONParsing) {
|
||||
if (e.name === 'SyntaxError') {
|
||||
throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
},
|
||||
],
|
||||
|
||||
/**
|
||||
* A timeout in milliseconds to abort a request. If set to 0 (default) a
|
||||
@ -139,7 +150,7 @@ const defaults = {
|
||||
|
||||
env: {
|
||||
FormData: platform.classes.FormData,
|
||||
Blob: platform.classes.Blob
|
||||
Blob: platform.classes.Blob,
|
||||
},
|
||||
|
||||
validateStatus: function validateStatus(status) {
|
||||
@ -148,10 +159,10 @@ const defaults = {
|
||||
|
||||
headers: {
|
||||
common: {
|
||||
'Accept': 'application/json, text/plain, */*',
|
||||
'Content-Type': undefined
|
||||
}
|
||||
}
|
||||
Accept: 'application/json, text/plain, */*',
|
||||
'Content-Type': undefined,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {
|
||||
|
||||
@ -4,5 +4,5 @@ export default {
|
||||
silentJSONParsing: true,
|
||||
forcedJSONParsing: true,
|
||||
clarifyTimeoutError: false,
|
||||
legacyInterceptorReqResOrdering: true
|
||||
legacyInterceptorReqResOrdering: true,
|
||||
};
|
||||
|
||||
2
lib/env/data.js
vendored
2
lib/env/data.js
vendored
@ -1 +1 @@
|
||||
export const VERSION = "1.13.5";
|
||||
export const VERSION = '1.13.5';
|
||||
|
||||
@ -5,24 +5,29 @@ import utils from '../utils.js';
|
||||
|
||||
const kInternals = Symbol('internals');
|
||||
|
||||
class AxiosTransformStream extends stream.Transform{
|
||||
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]);
|
||||
});
|
||||
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
|
||||
readableHighWaterMark: options.chunkSize,
|
||||
});
|
||||
|
||||
const internals = this[kInternals] = {
|
||||
const internals = (this[kInternals] = {
|
||||
timeWindow: options.timeWindow,
|
||||
chunkSize: options.chunkSize,
|
||||
maxRate: options.maxRate,
|
||||
@ -32,10 +37,10 @@ class AxiosTransformStream extends stream.Transform{
|
||||
notifiedBytesLoaded: 0,
|
||||
ts: Date.now(),
|
||||
bytes: 0,
|
||||
onReadCallback: null
|
||||
};
|
||||
onReadCallback: null,
|
||||
});
|
||||
|
||||
this.on('newListener', event => {
|
||||
this.on('newListener', (event) => {
|
||||
if (event === 'progress') {
|
||||
if (!internals.isCaptured) {
|
||||
internals.isCaptured = true;
|
||||
@ -63,8 +68,11 @@ class AxiosTransformStream extends stream.Transform{
|
||||
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 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);
|
||||
@ -81,7 +89,7 @@ class AxiosTransformStream extends stream.Transform{
|
||||
process.nextTick(_callback);
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const transformChunk = (_chunk, _callback) => {
|
||||
const chunkSize = Buffer.byteLength(_chunk);
|
||||
@ -93,7 +101,7 @@ class AxiosTransformStream extends stream.Transform{
|
||||
if (maxRate) {
|
||||
const now = Date.now();
|
||||
|
||||
if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {
|
||||
if (!internals.ts || (passed = now - internals.ts) >= timeWindow) {
|
||||
internals.ts = now;
|
||||
bytesLeft = bytesThreshold - internals.bytes;
|
||||
internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;
|
||||
@ -116,14 +124,19 @@ class AxiosTransformStream extends stream.Transform{
|
||||
}
|
||||
}
|
||||
|
||||
if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {
|
||||
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);
|
||||
pushChunk(
|
||||
_chunk,
|
||||
chunkRemainder
|
||||
? () => {
|
||||
process.nextTick(_callback, null, chunkRemainder);
|
||||
}
|
||||
: _callback
|
||||
);
|
||||
};
|
||||
|
||||
transformChunk(chunk, function transformNextChunk(err, _chunk) {
|
||||
|
||||
@ -18,7 +18,7 @@ function encode(str) {
|
||||
')': '%29',
|
||||
'~': '%7E',
|
||||
'%20': '+',
|
||||
'%00': '\x00'
|
||||
'%00': '\x00',
|
||||
};
|
||||
return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
|
||||
return charMap[match];
|
||||
@ -46,13 +46,17 @@ prototype.append = function append(name, value) {
|
||||
};
|
||||
|
||||
prototype.toString = function toString(encoder) {
|
||||
const _encode = encoder ? function(value) {
|
||||
return encoder.call(this, value, encode);
|
||||
} : encode;
|
||||
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('&');
|
||||
return this._pairs
|
||||
.map(function each(pair) {
|
||||
return _encode(pair[0]) + '=' + _encode(pair[1]);
|
||||
}, '')
|
||||
.join('&');
|
||||
};
|
||||
|
||||
export default AxiosURLSearchParams;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
"use strict";
|
||||
'use strict';
|
||||
|
||||
import stream from "stream";
|
||||
import stream from 'stream';
|
||||
|
||||
class ZlibHeaderTransformStream extends stream.Transform {
|
||||
__transform(chunk, encoding, callback) {
|
||||
@ -13,7 +13,8 @@ class ZlibHeaderTransformStream extends stream.Transform {
|
||||
this._transform = this.__transform;
|
||||
|
||||
// Add Default Compression headers if no zlib headers are present
|
||||
if (chunk[0] !== 120) { // Hex: 78
|
||||
if (chunk[0] !== 120) {
|
||||
// Hex: 78
|
||||
const header = Buffer.alloc(2);
|
||||
header[0] = 120; // Hex: 78
|
||||
header[1] = 156; // Hex: 9C
|
||||
|
||||
@ -12,11 +12,11 @@ import AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';
|
||||
* @returns {string} The encoded value.
|
||||
*/
|
||||
function encode(val) {
|
||||
return encodeURIComponent(val).
|
||||
replace(/%3A/gi, ':').
|
||||
replace(/%24/g, '$').
|
||||
replace(/%2C/gi, ',').
|
||||
replace(/%20/g, '+');
|
||||
return encodeURIComponent(val)
|
||||
.replace(/%3A/gi, ':')
|
||||
.replace(/%24/g, '$')
|
||||
.replace(/%2C/gi, ',')
|
||||
.replace(/%20/g, '+');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -33,11 +33,13 @@ export default function buildURL(url, params, options) {
|
||||
return url;
|
||||
}
|
||||
|
||||
const _encode = options && options.encode || encode;
|
||||
const _encode = (options && options.encode) || encode;
|
||||
|
||||
const _options = utils.isFunction(options) ? {
|
||||
serialize: options
|
||||
} : options;
|
||||
const _options = utils.isFunction(options)
|
||||
? {
|
||||
serialize: options,
|
||||
}
|
||||
: options;
|
||||
|
||||
const serializeFn = _options && _options.serialize;
|
||||
|
||||
@ -46,13 +48,13 @@ export default function buildURL(url, params, options) {
|
||||
if (serializeFn) {
|
||||
serializedParams = serializeFn(params, _options);
|
||||
} else {
|
||||
serializedParams = utils.isURLSearchParams(params) ?
|
||||
params.toString() :
|
||||
new AxiosURLSearchParams(params, _options).toString(_encode);
|
||||
serializedParams = utils.isURLSearchParams(params)
|
||||
? params.toString()
|
||||
: new AxiosURLSearchParams(params, _options).toString(_encode);
|
||||
}
|
||||
|
||||
if (serializedParams) {
|
||||
const hashmarkIndex = url.indexOf("#");
|
||||
const hashmarkIndex = url.indexOf('#');
|
||||
|
||||
if (hashmarkIndex !== -1) {
|
||||
url = url.slice(0, hashmarkIndex);
|
||||
|
||||
@ -1,16 +1,18 @@
|
||||
import utils from "../utils.js";
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}, cb);
|
||||
} : fn;
|
||||
}
|
||||
: fn;
|
||||
};
|
||||
|
||||
export default callbackify;
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import CanceledError from "../cancel/CanceledError.js";
|
||||
import AxiosError from "../core/AxiosError.js";
|
||||
import CanceledError from '../cancel/CanceledError.js';
|
||||
import AxiosError from '../core/AxiosError.js';
|
||||
import utils from '../utils.js';
|
||||
|
||||
const composeSignals = (signals, timeout) => {
|
||||
const {length} = (signals = signals ? signals.filter(Boolean) : []);
|
||||
const { length } = (signals = signals ? signals.filter(Boolean) : []);
|
||||
|
||||
if (timeout || length) {
|
||||
let controller = new AbortController();
|
||||
@ -15,34 +15,42 @@ const composeSignals = (signals, timeout) => {
|
||||
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));
|
||||
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)
|
||||
let timer =
|
||||
timeout &&
|
||||
setTimeout(() => {
|
||||
timer = null;
|
||||
onabort(new AxiosError(`timeout of ${timeout}ms exceeded`, AxiosError.ETIMEDOUT));
|
||||
}, timeout);
|
||||
|
||||
const unsubscribe = () => {
|
||||
if (signals) {
|
||||
timer && clearTimeout(timer);
|
||||
timer = null;
|
||||
signals.forEach(signal => {
|
||||
signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);
|
||||
signals.forEach((signal) => {
|
||||
signal.unsubscribe
|
||||
? signal.unsubscribe(onabort)
|
||||
: signal.removeEventListener('abort', onabort);
|
||||
});
|
||||
signals = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
signals.forEach((signal) => signal.addEventListener('abort', onabort));
|
||||
|
||||
const {signal} = controller;
|
||||
const { signal } = controller;
|
||||
|
||||
signal.unsubscribe = () => utils.asap(unsubscribe);
|
||||
|
||||
return signal;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default composeSignals;
|
||||
|
||||
@ -1,53 +1,48 @@
|
||||
import utils from '../utils.js';
|
||||
import platform from '../platform/index.js';
|
||||
|
||||
export default platform.hasStandardBrowserEnv ?
|
||||
export default platform.hasStandardBrowserEnv
|
||||
? // Standard browser envs support document.cookie
|
||||
{
|
||||
write(name, value, expires, path, domain, secure, sameSite) {
|
||||
if (typeof document === 'undefined') return;
|
||||
|
||||
// Standard browser envs support document.cookie
|
||||
{
|
||||
write(name, value, expires, path, domain, secure, sameSite) {
|
||||
if (typeof document === 'undefined') return;
|
||||
const cookie = [`${name}=${encodeURIComponent(value)}`];
|
||||
|
||||
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}`);
|
||||
}
|
||||
|
||||
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('; ');
|
||||
},
|
||||
|
||||
document.cookie = cookie.join('; ');
|
||||
},
|
||||
read(name) {
|
||||
if (typeof document === 'undefined') return null;
|
||||
const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));
|
||||
return match ? decodeURIComponent(match[1]) : null;
|
||||
},
|
||||
|
||||
read(name) {
|
||||
if (typeof document === 'undefined') return null;
|
||||
const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));
|
||||
return match ? decodeURIComponent(match[1]) : null;
|
||||
},
|
||||
|
||||
remove(name) {
|
||||
this.write(name, '', Date.now() - 86400000, '/');
|
||||
remove(name) {
|
||||
this.write(name, '', Date.now() - 86400000, '/');
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
:
|
||||
|
||||
// Non-standard browser env (web workers, react-native) lack needed support.
|
||||
{
|
||||
write() {},
|
||||
read() {
|
||||
return null;
|
||||
},
|
||||
remove() {}
|
||||
};
|
||||
|
||||
: // Non-standard browser env (web workers, react-native) lack needed support.
|
||||
{
|
||||
write() {},
|
||||
read() {
|
||||
return null;
|
||||
},
|
||||
remove() {},
|
||||
};
|
||||
|
||||
@ -15,12 +15,17 @@
|
||||
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.');
|
||||
'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 */ }
|
||||
} catch (e) {
|
||||
/* Ignore */
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ function parsePropPath(name) {
|
||||
// foo.x.y.z
|
||||
// foo-x-y-z
|
||||
// foo x y z
|
||||
return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => {
|
||||
return utils.matchAll(/\w+|\[(\w*)]/g, name).map((match) => {
|
||||
return match[0] === '[]' ? '' : match[1] || match[0];
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import util from 'util';
|
||||
import {Readable} from 'stream';
|
||||
import utils from "../utils.js";
|
||||
import readBlob from "./readBlob.js";
|
||||
import platform from "../platform/index.js";
|
||||
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 + '-_';
|
||||
|
||||
@ -14,7 +14,7 @@ const CRLF_BYTES_COUNT = 2;
|
||||
|
||||
class FormDataPart {
|
||||
constructor(name, value) {
|
||||
const {escapeName} = this.constructor;
|
||||
const { escapeName } = this.constructor;
|
||||
const isStringValue = utils.isString(value);
|
||||
|
||||
let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${
|
||||
@ -24,7 +24,7 @@ class FormDataPart {
|
||||
if (isStringValue) {
|
||||
value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF));
|
||||
} else {
|
||||
headers += `Content-Type: ${value.type || "application/octet-stream"}${CRLF}`
|
||||
headers += `Content-Type: ${value.type || 'application/octet-stream'}${CRLF}`;
|
||||
}
|
||||
|
||||
this.headers = textEncoder.encode(headers + CRLF);
|
||||
@ -37,12 +37,12 @@ class FormDataPart {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
async *encode(){
|
||||
async *encode() {
|
||||
yield this.headers;
|
||||
|
||||
const {value} = this;
|
||||
const { value } = this;
|
||||
|
||||
if(utils.isTypedArray(value)) {
|
||||
if (utils.isTypedArray(value)) {
|
||||
yield value;
|
||||
} else {
|
||||
yield* readBlob(value);
|
||||
@ -52,11 +52,15 @@ class FormDataPart {
|
||||
}
|
||||
|
||||
static escapeName(name) {
|
||||
return String(name).replace(/[\r\n"]/g, (match) => ({
|
||||
'\r' : '%0D',
|
||||
'\n' : '%0A',
|
||||
'"' : '%22',
|
||||
}[match]));
|
||||
return String(name).replace(
|
||||
/[\r\n"]/g,
|
||||
(match) =>
|
||||
({
|
||||
'\r': '%0D',
|
||||
'\n': '%0A',
|
||||
'"': '%22',
|
||||
})[match]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,15 +68,15 @@ const formDataToStream = (form, headersHandler, options) => {
|
||||
const {
|
||||
tag = 'form-data-boundary',
|
||||
size = 25,
|
||||
boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)
|
||||
boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET),
|
||||
} = options || {};
|
||||
|
||||
if(!utils.isFormData(form)) {
|
||||
if (!utils.isFormData(form)) {
|
||||
throw TypeError('FormData instance required');
|
||||
}
|
||||
|
||||
if (boundary.length < 1 || boundary.length > 70) {
|
||||
throw Error('boundary must be 10-70 characters long')
|
||||
throw Error('boundary must be 10-70 characters long');
|
||||
}
|
||||
|
||||
const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);
|
||||
@ -90,8 +94,8 @@ const formDataToStream = (form, headersHandler, options) => {
|
||||
contentLength = utils.toFiniteNumber(contentLength);
|
||||
|
||||
const computedHeaders = {
|
||||
'Content-Type': `multipart/form-data; boundary=${boundary}`
|
||||
}
|
||||
'Content-Type': `multipart/form-data; boundary=${boundary}`,
|
||||
};
|
||||
|
||||
if (Number.isFinite(contentLength)) {
|
||||
computedHeaders['Content-Length'] = contentLength;
|
||||
@ -99,14 +103,16 @@ const formDataToStream = (form, headersHandler, options) => {
|
||||
|
||||
headersHandler && headersHandler(computedHeaders);
|
||||
|
||||
return Readable.from((async function *() {
|
||||
for(const part of parts) {
|
||||
yield boundaryBytes;
|
||||
yield* part.encode();
|
||||
}
|
||||
return Readable.from(
|
||||
(async function* () {
|
||||
for (const part of parts) {
|
||||
yield boundaryBytes;
|
||||
yield* part.encode();
|
||||
}
|
||||
|
||||
yield footerBytes;
|
||||
})());
|
||||
yield footerBytes;
|
||||
})()
|
||||
);
|
||||
};
|
||||
|
||||
export default formDataToStream;
|
||||
|
||||
@ -17,7 +17,7 @@ const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
|
||||
* @returns {Buffer|Blob}
|
||||
*/
|
||||
export default function fromDataURI(uri, asBlob, options) {
|
||||
const _Blob = options && options.Blob || platform.classes.Blob;
|
||||
const _Blob = (options && options.Blob) || platform.classes.Blob;
|
||||
const protocol = parseProtocol(uri);
|
||||
|
||||
if (asBlob === undefined && _Blob) {
|
||||
@ -43,7 +43,7 @@ export default function fromDataURI(uri, asBlob, options) {
|
||||
throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
|
||||
}
|
||||
|
||||
return new _Blob([buffer], {type: mime});
|
||||
return new _Blob([buffer], { type: mime });
|
||||
}
|
||||
|
||||
return buffer;
|
||||
|
||||
@ -17,4 +17,3 @@ export default function isAbsoluteURL(url) {
|
||||
|
||||
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
|
||||
}
|
||||
|
||||
|
||||
@ -10,5 +10,5 @@ import utils from '../utils.js';
|
||||
* @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
|
||||
*/
|
||||
export default function isAxiosError(payload) {
|
||||
return utils.isObject(payload) && (payload.isAxiosError === true);
|
||||
return utils.isObject(payload) && payload.isAxiosError === true;
|
||||
}
|
||||
|
||||
@ -1,14 +1,16 @@
|
||||
import platform from '../platform/index.js';
|
||||
|
||||
export default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {
|
||||
url = new URL(url, platform.origin);
|
||||
export default platform.hasStandardBrowserEnv
|
||||
? ((origin, isMSIE) => (url) => {
|
||||
url = new URL(url, platform.origin);
|
||||
|
||||
return (
|
||||
origin.protocol === url.protocol &&
|
||||
origin.host === url.host &&
|
||||
(isMSIE || origin.port === url.port)
|
||||
);
|
||||
})(
|
||||
new URL(platform.origin),
|
||||
platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)
|
||||
) : () => true;
|
||||
return (
|
||||
origin.protocol === url.protocol &&
|
||||
origin.host === url.host &&
|
||||
(isMSIE || origin.port === url.port)
|
||||
);
|
||||
})(
|
||||
new URL(platform.origin),
|
||||
platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)
|
||||
)
|
||||
: () => true;
|
||||
|
||||
@ -5,10 +5,23 @@ import utils from '../utils.js';
|
||||
// RawAxiosHeaders whose duplicates are ignored by node
|
||||
// c.f. https://nodejs.org/api/http.html#http_message_headers
|
||||
const ignoreDuplicateOf = utils.toObjectSet([
|
||||
'age', 'authorization', 'content-length', 'content-type', 'etag',
|
||||
'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
|
||||
'last-modified', 'location', 'max-forwards', 'proxy-authorization',
|
||||
'referer', 'retry-after', 'user-agent'
|
||||
'age',
|
||||
'authorization',
|
||||
'content-length',
|
||||
'content-type',
|
||||
'etag',
|
||||
'expires',
|
||||
'from',
|
||||
'host',
|
||||
'if-modified-since',
|
||||
'if-unmodified-since',
|
||||
'last-modified',
|
||||
'location',
|
||||
'max-forwards',
|
||||
'proxy-authorization',
|
||||
'referer',
|
||||
'retry-after',
|
||||
'user-agent',
|
||||
]);
|
||||
|
||||
/**
|
||||
@ -25,31 +38,32 @@ const ignoreDuplicateOf = utils.toObjectSet([
|
||||
*
|
||||
* @returns {Object} Headers parsed into an object
|
||||
*/
|
||||
export default rawHeaders => {
|
||||
export default (rawHeaders) => {
|
||||
const parsed = {};
|
||||
let key;
|
||||
let val;
|
||||
let i;
|
||||
|
||||
rawHeaders && rawHeaders.split('\n').forEach(function parser(line) {
|
||||
i = line.indexOf(':');
|
||||
key = line.substring(0, i).trim().toLowerCase();
|
||||
val = line.substring(i + 1).trim();
|
||||
rawHeaders &&
|
||||
rawHeaders.split('\n').forEach(function parser(line) {
|
||||
i = line.indexOf(':');
|
||||
key = line.substring(0, i).trim().toLowerCase();
|
||||
val = line.substring(i + 1).trim();
|
||||
|
||||
if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (key === 'set-cookie') {
|
||||
if (parsed[key]) {
|
||||
parsed[key].push(val);
|
||||
} else {
|
||||
parsed[key] = [val];
|
||||
if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
|
||||
}
|
||||
});
|
||||
|
||||
if (key === 'set-cookie') {
|
||||
if (parsed[key]) {
|
||||
parsed[key].push(val);
|
||||
} else {
|
||||
parsed[key] = [val];
|
||||
}
|
||||
} else {
|
||||
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
|
||||
}
|
||||
});
|
||||
|
||||
return parsed;
|
||||
};
|
||||
|
||||
@ -2,5 +2,5 @@
|
||||
|
||||
export default function parseProtocol(url) {
|
||||
const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
|
||||
return match && match[1] || '';
|
||||
return (match && match[1]) || '';
|
||||
}
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
import speedometer from "./speedometer.js";
|
||||
import throttle from "./throttle.js";
|
||||
import utils from "../utils.js";
|
||||
import speedometer from './speedometer.js';
|
||||
import throttle from './throttle.js';
|
||||
import utils from '../utils.js';
|
||||
|
||||
export const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
|
||||
let bytesNotified = 0;
|
||||
const _speedometer = speedometer(50, 250);
|
||||
|
||||
return throttle(e => {
|
||||
return throttle((e) => {
|
||||
const loaded = e.loaded;
|
||||
const total = e.lengthComputable ? e.total : undefined;
|
||||
const progressBytes = loaded - bytesNotified;
|
||||
@ -18,27 +18,34 @@ export const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
|
||||
const data = {
|
||||
loaded,
|
||||
total,
|
||||
progress: total ? (loaded / total) : undefined,
|
||||
progress: total ? loaded / total : undefined,
|
||||
bytes: progressBytes,
|
||||
rate: rate ? rate : undefined,
|
||||
estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
|
||||
event: e,
|
||||
lengthComputable: total != null,
|
||||
[isDownloadStream ? 'download' : 'upload']: true
|
||||
[isDownloadStream ? 'download' : 'upload']: true,
|
||||
};
|
||||
|
||||
listener(data);
|
||||
}, freq);
|
||||
}
|
||||
};
|
||||
|
||||
export const progressEventDecorator = (total, throttled) => {
|
||||
const lengthComputable = total != null;
|
||||
|
||||
return [(loaded) => throttled[0]({
|
||||
lengthComputable,
|
||||
total,
|
||||
loaded
|
||||
}), throttled[1]];
|
||||
}
|
||||
return [
|
||||
(loaded) =>
|
||||
throttled[0]({
|
||||
lengthComputable,
|
||||
total,
|
||||
loaded,
|
||||
}),
|
||||
throttled[1],
|
||||
];
|
||||
};
|
||||
|
||||
export const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));
|
||||
export const asyncDecorator =
|
||||
(fn) =>
|
||||
(...args) =>
|
||||
utils.asap(() => fn(...args));
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
const {asyncIterator} = Symbol;
|
||||
const { asyncIterator } = Symbol;
|
||||
|
||||
const readBlob = async function* (blob) {
|
||||
if (blob.stream) {
|
||||
yield* blob.stream()
|
||||
yield* blob.stream();
|
||||
} else if (blob.arrayBuffer) {
|
||||
yield await blob.arrayBuffer()
|
||||
yield await blob.arrayBuffer();
|
||||
} else if (blob[asyncIterator]) {
|
||||
yield* blob[asyncIterator]();
|
||||
} else {
|
||||
yield blob;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default readBlob;
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
import platform from "../platform/index.js";
|
||||
import utils from "../utils.js";
|
||||
import isURLSameOrigin from "./isURLSameOrigin.js";
|
||||
import cookies from "./cookies.js";
|
||||
import buildFullPath from "../core/buildFullPath.js";
|
||||
import mergeConfig from "../core/mergeConfig.js";
|
||||
import AxiosHeaders from "../core/AxiosHeaders.js";
|
||||
import buildURL from "./buildURL.js";
|
||||
import platform from '../platform/index.js';
|
||||
import utils from '../utils.js';
|
||||
import isURLSameOrigin from './isURLSameOrigin.js';
|
||||
import cookies from './cookies.js';
|
||||
import buildFullPath from '../core/buildFullPath.js';
|
||||
import mergeConfig from '../core/mergeConfig.js';
|
||||
import AxiosHeaders from '../core/AxiosHeaders.js';
|
||||
import buildURL from './buildURL.js';
|
||||
|
||||
export default (config) => {
|
||||
const newConfig = mergeConfig({}, config);
|
||||
@ -14,12 +14,22 @@ export default (config) => {
|
||||
|
||||
newConfig.headers = headers = AxiosHeaders.from(headers);
|
||||
|
||||
newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);
|
||||
newConfig.url = buildURL(
|
||||
buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls),
|
||||
config.params,
|
||||
config.paramsSerializer
|
||||
);
|
||||
|
||||
// HTTP basic authentication
|
||||
if (auth) {
|
||||
headers.set('Authorization', 'Basic ' +
|
||||
btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))
|
||||
headers.set(
|
||||
'Authorization',
|
||||
'Basic ' +
|
||||
btoa(
|
||||
(auth.username || '') +
|
||||
':' +
|
||||
(auth.password ? unescape(encodeURIComponent(auth.password)) : '')
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@ -57,5 +67,4 @@ export default (config) => {
|
||||
}
|
||||
|
||||
return newConfig;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@ -48,7 +48,7 @@ function speedometer(samplesCount, min) {
|
||||
|
||||
const passed = startedAt && now - startedAt;
|
||||
|
||||
return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
|
||||
return passed ? Math.round((bytesCount * 1000) / passed) : undefined;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -18,23 +18,23 @@ function throttle(fn, freq) {
|
||||
timer = null;
|
||||
}
|
||||
fn(...args);
|
||||
}
|
||||
};
|
||||
|
||||
const throttled = (...args) => {
|
||||
const now = Date.now();
|
||||
const passed = now - timestamp;
|
||||
if ( passed >= threshold) {
|
||||
if (passed >= threshold) {
|
||||
invoke(args, now);
|
||||
} else {
|
||||
lastArgs = args;
|
||||
if (!timer) {
|
||||
timer = setTimeout(() => {
|
||||
timer = null;
|
||||
invoke(lastArgs)
|
||||
invoke(lastArgs);
|
||||
}, threshold - passed);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const flush = () => lastArgs && invoke(lastArgs);
|
||||
|
||||
|
||||
@ -38,11 +38,14 @@ function removeBrackets(key) {
|
||||
*/
|
||||
function renderKey(path, key, dots) {
|
||||
if (!path) return key;
|
||||
return path.concat(key).map(function each(token, i) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
token = removeBrackets(token);
|
||||
return !dots && i ? '[' + token + ']' : token;
|
||||
}).join(dots ? '.' : '');
|
||||
return path
|
||||
.concat(key)
|
||||
.map(function each(token, i) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
token = removeBrackets(token);
|
||||
return !dots && i ? '[' + token + ']' : token;
|
||||
})
|
||||
.join(dots ? '.' : '');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -92,21 +95,26 @@ function toFormData(obj, formData, options) {
|
||||
formData = formData || new (PlatformFormData || FormData)();
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
options = utils.toFlatObject(options, {
|
||||
metaTokens: true,
|
||||
dots: false,
|
||||
indexes: false
|
||||
}, false, function defined(option, source) {
|
||||
// eslint-disable-next-line no-eq-null,eqeqeq
|
||||
return !utils.isUndefined(source[option]);
|
||||
});
|
||||
options = utils.toFlatObject(
|
||||
options,
|
||||
{
|
||||
metaTokens: true,
|
||||
dots: false,
|
||||
indexes: false,
|
||||
},
|
||||
false,
|
||||
function defined(option, source) {
|
||||
// eslint-disable-next-line no-eq-null,eqeqeq
|
||||
return !utils.isUndefined(source[option]);
|
||||
}
|
||||
);
|
||||
|
||||
const metaTokens = options.metaTokens;
|
||||
// eslint-disable-next-line no-use-before-define
|
||||
const visitor = options.visitor || defaultVisitor;
|
||||
const dots = options.dots;
|
||||
const indexes = options.indexes;
|
||||
const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
|
||||
const _Blob = options.Blob || (typeof Blob !== 'undefined' && Blob);
|
||||
const useBlob = _Blob && utils.isSpecCompliantForm(formData);
|
||||
|
||||
if (!utils.isFunction(visitor)) {
|
||||
@ -156,17 +164,22 @@ function toFormData(obj, formData, options) {
|
||||
value = JSON.stringify(value);
|
||||
} else if (
|
||||
(utils.isArray(value) && isFlatArray(value)) ||
|
||||
((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))
|
||||
)) {
|
||||
((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value)))
|
||||
) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
key = removeBrackets(key);
|
||||
|
||||
arr.forEach(function each(el, index) {
|
||||
!(utils.isUndefined(el) || el === null) && formData.append(
|
||||
// eslint-disable-next-line no-nested-ternary
|
||||
indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),
|
||||
convertValue(el)
|
||||
);
|
||||
!(utils.isUndefined(el) || el === null) &&
|
||||
formData.append(
|
||||
// eslint-disable-next-line no-nested-ternary
|
||||
indexes === true
|
||||
? renderKey([key], index, dots)
|
||||
: indexes === null
|
||||
? key
|
||||
: key + '[]',
|
||||
convertValue(el)
|
||||
);
|
||||
});
|
||||
return false;
|
||||
}
|
||||
@ -186,7 +199,7 @@ function toFormData(obj, formData, options) {
|
||||
const exposedHelpers = Object.assign(predicates, {
|
||||
defaultVisitor,
|
||||
convertValue,
|
||||
isVisitable
|
||||
isVisitable,
|
||||
});
|
||||
|
||||
function build(value, path) {
|
||||
@ -199,9 +212,9 @@ function toFormData(obj, formData, options) {
|
||||
stack.push(value);
|
||||
|
||||
utils.forEach(value, function each(el, key) {
|
||||
const result = !(utils.isUndefined(el) || el === null) && visitor.call(
|
||||
formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers
|
||||
);
|
||||
const result =
|
||||
!(utils.isUndefined(el) || el === null) &&
|
||||
visitor.call(formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers);
|
||||
|
||||
if (result === true) {
|
||||
build(el, path ? path.concat(key) : [key]);
|
||||
|
||||
@ -6,7 +6,7 @@ import platform from '../platform/index.js';
|
||||
|
||||
export default function toURLEncodedForm(data, options) {
|
||||
return toFormData(data, new platform.classes.URLSearchParams(), {
|
||||
visitor: function(value, key, path, helpers) {
|
||||
visitor: function (value, key, path, helpers) {
|
||||
if (platform.isNode && utils.isBuffer(value)) {
|
||||
this.append(key, value.toString('base64'));
|
||||
return false;
|
||||
@ -14,6 +14,6 @@ export default function toURLEncodedForm(data, options) {
|
||||
|
||||
return helpers.defaultVisitor.apply(this, arguments);
|
||||
},
|
||||
...options
|
||||
...options,
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
export const streamChunk = function* (chunk, chunkSize) {
|
||||
let len = chunk.byteLength;
|
||||
|
||||
@ -15,13 +14,13 @@ export const streamChunk = function* (chunk, chunkSize) {
|
||||
yield chunk.slice(pos, end);
|
||||
pos = end;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const readBytes = async function* (iterable, chunkSize) {
|
||||
for await (const chunk of readStream(iterable)) {
|
||||
yield* streamChunk(chunk, chunkSize);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const readStream = async function* (stream) {
|
||||
if (stream[Symbol.asyncIterator]) {
|
||||
@ -32,7 +31,7 @@ const readStream = async function* (stream) {
|
||||
const reader = stream.getReader();
|
||||
try {
|
||||
for (;;) {
|
||||
const {done, value} = await reader.read();
|
||||
const { done, value } = await reader.read();
|
||||
if (done) {
|
||||
break;
|
||||
}
|
||||
@ -41,7 +40,7 @@ const readStream = async function* (stream) {
|
||||
} finally {
|
||||
await reader.cancel();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const trackStream = (stream, chunkSize, onProgress, onFinish) => {
|
||||
const iterator = readBytes(stream, chunkSize);
|
||||
@ -53,35 +52,38 @@ export const trackStream = (stream, chunkSize, onProgress, onFinish) => {
|
||||
done = true;
|
||||
onFinish && onFinish(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return new ReadableStream({
|
||||
async pull(controller) {
|
||||
try {
|
||||
const {done, value} = await iterator.next();
|
||||
return new ReadableStream(
|
||||
{
|
||||
async pull(controller) {
|
||||
try {
|
||||
const { done, value } = await iterator.next();
|
||||
|
||||
if (done) {
|
||||
_onFinish();
|
||||
controller.close();
|
||||
return;
|
||||
if (done) {
|
||||
_onFinish();
|
||||
controller.close();
|
||||
return;
|
||||
}
|
||||
|
||||
let len = value.byteLength;
|
||||
if (onProgress) {
|
||||
let loadedBytes = (bytes += len);
|
||||
onProgress(loadedBytes);
|
||||
}
|
||||
controller.enqueue(new Uint8Array(value));
|
||||
} catch (err) {
|
||||
_onFinish(err);
|
||||
throw err;
|
||||
}
|
||||
|
||||
let len = value.byteLength;
|
||||
if (onProgress) {
|
||||
let loadedBytes = bytes += len;
|
||||
onProgress(loadedBytes);
|
||||
}
|
||||
controller.enqueue(new Uint8Array(value));
|
||||
} catch (err) {
|
||||
_onFinish(err);
|
||||
throw err;
|
||||
}
|
||||
},
|
||||
cancel(reason) {
|
||||
_onFinish(reason);
|
||||
return iterator.return();
|
||||
},
|
||||
},
|
||||
cancel(reason) {
|
||||
_onFinish(reason);
|
||||
return iterator.return();
|
||||
{
|
||||
highWaterMark: 2,
|
||||
}
|
||||
}, {
|
||||
highWaterMark: 2
|
||||
})
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
'use strict';
|
||||
|
||||
import {VERSION} from '../env/data.js';
|
||||
import { VERSION } from '../env/data.js';
|
||||
import AxiosError from '../core/AxiosError.js';
|
||||
|
||||
const validators = {};
|
||||
@ -25,7 +25,15 @@ const deprecatedWarnings = {};
|
||||
*/
|
||||
validators.transitional = function transitional(validator, version, message) {
|
||||
function formatMessage(opt, desc) {
|
||||
return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
|
||||
return (
|
||||
'[Axios v' +
|
||||
VERSION +
|
||||
"] Transitional option '" +
|
||||
opt +
|
||||
"'" +
|
||||
desc +
|
||||
(message ? '. ' + message : '')
|
||||
);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
@ -57,7 +65,7 @@ validators.spelling = function spelling(correctSpelling) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@ -83,7 +91,10 @@ function assertOptions(options, schema, allowUnknown) {
|
||||
const value = options[opt];
|
||||
const result = value === undefined || validator(value, opt, options);
|
||||
if (result !== true) {
|
||||
throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
|
||||
throw new AxiosError(
|
||||
'option ' + opt + ' must be ' + result,
|
||||
AxiosError.ERR_BAD_OPTION_VALUE
|
||||
);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@ -95,5 +106,5 @@ function assertOptions(options, schema, allowUnknown) {
|
||||
|
||||
export default {
|
||||
assertOptions,
|
||||
validators
|
||||
validators,
|
||||
};
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
'use strict'
|
||||
'use strict';
|
||||
|
||||
export default typeof Blob !== 'undefined' ? Blob : null
|
||||
export default typeof Blob !== 'undefined' ? Blob : null;
|
||||
|
||||
@ -1,13 +1,13 @@
|
||||
import URLSearchParams from './classes/URLSearchParams.js'
|
||||
import FormData from './classes/FormData.js'
|
||||
import Blob from './classes/Blob.js'
|
||||
import URLSearchParams from './classes/URLSearchParams.js';
|
||||
import FormData from './classes/FormData.js';
|
||||
import Blob from './classes/Blob.js';
|
||||
|
||||
export default {
|
||||
isBrowser: true,
|
||||
classes: {
|
||||
URLSearchParams,
|
||||
FormData,
|
||||
Blob
|
||||
Blob,
|
||||
},
|
||||
protocols: ['http', 'https', 'file', 'blob', 'url', 'data']
|
||||
protocols: ['http', 'https', 'file', 'blob', 'url', 'data'],
|
||||
};
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';
|
||||
|
||||
const _navigator = typeof navigator === 'object' && navigator || undefined;
|
||||
const _navigator = (typeof navigator === 'object' && navigator) || undefined;
|
||||
|
||||
/**
|
||||
* Determine if we're running in a standard browser environment
|
||||
@ -19,7 +19,8 @@ const _navigator = typeof navigator === 'object' && navigator || undefined;
|
||||
*
|
||||
* @returns {boolean}
|
||||
*/
|
||||
const hasStandardBrowserEnv = hasBrowserEnv &&
|
||||
const hasStandardBrowserEnv =
|
||||
hasBrowserEnv &&
|
||||
(!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);
|
||||
|
||||
/**
|
||||
@ -40,12 +41,12 @@ const hasStandardBrowserWebWorkerEnv = (() => {
|
||||
);
|
||||
})();
|
||||
|
||||
const origin = hasBrowserEnv && window.location.href || 'http://localhost';
|
||||
const origin = (hasBrowserEnv && window.location.href) || 'http://localhost';
|
||||
|
||||
export {
|
||||
hasBrowserEnv,
|
||||
hasStandardBrowserWebWorkerEnv,
|
||||
hasStandardBrowserEnv,
|
||||
_navigator as navigator,
|
||||
origin
|
||||
}
|
||||
origin,
|
||||
};
|
||||
|
||||
@ -3,5 +3,5 @@ import * as utils from './common/utils.js';
|
||||
|
||||
export default {
|
||||
...utils,
|
||||
...platform
|
||||
}
|
||||
...platform,
|
||||
};
|
||||
|
||||
@ -1,20 +1,20 @@
|
||||
import crypto from 'crypto';
|
||||
import URLSearchParams from './classes/URLSearchParams.js'
|
||||
import FormData from './classes/FormData.js'
|
||||
import URLSearchParams from './classes/URLSearchParams.js';
|
||||
import FormData from './classes/FormData.js';
|
||||
|
||||
const ALPHA = 'abcdefghijklmnopqrstuvwxyz'
|
||||
const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
|
||||
|
||||
const DIGIT = '0123456789';
|
||||
|
||||
const ALPHABET = {
|
||||
DIGIT,
|
||||
ALPHA,
|
||||
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
|
||||
}
|
||||
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT,
|
||||
};
|
||||
|
||||
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
|
||||
let str = '';
|
||||
const {length} = alphabet;
|
||||
const { length } = alphabet;
|
||||
const randomValues = new Uint32Array(size);
|
||||
crypto.randomFillSync(randomValues);
|
||||
for (let i = 0; i < size; i++) {
|
||||
@ -22,17 +22,16 @@ const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
export default {
|
||||
isNode: true,
|
||||
classes: {
|
||||
URLSearchParams,
|
||||
FormData,
|
||||
Blob: typeof Blob !== 'undefined' && Blob || null
|
||||
Blob: (typeof Blob !== 'undefined' && Blob) || null,
|
||||
},
|
||||
ALPHABET,
|
||||
generateString,
|
||||
protocols: [ 'http', 'https', 'file', 'data' ]
|
||||
protocols: ['http', 'https', 'file', 'data'],
|
||||
};
|
||||
|
||||
147
lib/utils.js
147
lib/utils.js
@ -1,6 +1,6 @@
|
||||
"use strict";
|
||||
'use strict';
|
||||
|
||||
import bind from "./helpers/bind.js";
|
||||
import bind from './helpers/bind.js';
|
||||
|
||||
// utils is a library of generic helper functions non-specific to axios
|
||||
|
||||
@ -36,7 +36,7 @@ const { isArray } = Array;
|
||||
*
|
||||
* @returns {boolean} True if the value is undefined, otherwise false
|
||||
*/
|
||||
const isUndefined = typeOfTest("undefined");
|
||||
const isUndefined = typeOfTest('undefined');
|
||||
|
||||
/**
|
||||
* Determine if a value is a Buffer
|
||||
@ -63,7 +63,7 @@ function isBuffer(val) {
|
||||
*
|
||||
* @returns {boolean} True if value is an ArrayBuffer, otherwise false
|
||||
*/
|
||||
const isArrayBuffer = kindOfTest("ArrayBuffer");
|
||||
const isArrayBuffer = kindOfTest('ArrayBuffer');
|
||||
|
||||
/**
|
||||
* Determine if a value is a view on an ArrayBuffer
|
||||
@ -74,7 +74,7 @@ const isArrayBuffer = kindOfTest("ArrayBuffer");
|
||||
*/
|
||||
function isArrayBufferView(val) {
|
||||
let result;
|
||||
if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) {
|
||||
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
|
||||
result = ArrayBuffer.isView(val);
|
||||
} else {
|
||||
result = val && val.buffer && isArrayBuffer(val.buffer);
|
||||
@ -89,7 +89,7 @@ function isArrayBufferView(val) {
|
||||
*
|
||||
* @returns {boolean} True if value is a String, otherwise false
|
||||
*/
|
||||
const isString = typeOfTest("string");
|
||||
const isString = typeOfTest('string');
|
||||
|
||||
/**
|
||||
* Determine if a value is a Function
|
||||
@ -97,7 +97,7 @@ const isString = typeOfTest("string");
|
||||
* @param {*} val The value to test
|
||||
* @returns {boolean} True if value is a Function, otherwise false
|
||||
*/
|
||||
const isFunction = typeOfTest("function");
|
||||
const isFunction = typeOfTest('function');
|
||||
|
||||
/**
|
||||
* Determine if a value is a Number
|
||||
@ -106,7 +106,7 @@ const isFunction = typeOfTest("function");
|
||||
*
|
||||
* @returns {boolean} True if value is a Number, otherwise false
|
||||
*/
|
||||
const isNumber = typeOfTest("number");
|
||||
const isNumber = typeOfTest('number');
|
||||
|
||||
/**
|
||||
* Determine if a value is an Object
|
||||
@ -115,7 +115,7 @@ const isNumber = typeOfTest("number");
|
||||
*
|
||||
* @returns {boolean} True if value is an Object, otherwise false
|
||||
*/
|
||||
const isObject = (thing) => thing !== null && typeof thing === "object";
|
||||
const isObject = (thing) => thing !== null && typeof thing === 'object';
|
||||
|
||||
/**
|
||||
* Determine if a value is a Boolean
|
||||
@ -133,7 +133,7 @@ const isBoolean = (thing) => thing === true || thing === false;
|
||||
* @returns {boolean} True if value is a plain Object, otherwise false
|
||||
*/
|
||||
const isPlainObject = (val) => {
|
||||
if (kindOf(val) !== "object") {
|
||||
if (kindOf(val) !== 'object') {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -161,10 +161,7 @@ const isEmptyObject = (val) => {
|
||||
}
|
||||
|
||||
try {
|
||||
return (
|
||||
Object.keys(val).length === 0 &&
|
||||
Object.getPrototypeOf(val) === Object.prototype
|
||||
);
|
||||
return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;
|
||||
} catch (e) {
|
||||
// Fallback for any other objects that might cause RangeError with Object.keys()
|
||||
return false;
|
||||
@ -178,7 +175,7 @@ const isEmptyObject = (val) => {
|
||||
*
|
||||
* @returns {boolean} True if value is a Date, otherwise false
|
||||
*/
|
||||
const isDate = kindOfTest("Date");
|
||||
const isDate = kindOfTest('Date');
|
||||
|
||||
/**
|
||||
* Determine if a value is a File
|
||||
@ -187,7 +184,7 @@ const isDate = kindOfTest("Date");
|
||||
*
|
||||
* @returns {boolean} True if value is a File, otherwise false
|
||||
*/
|
||||
const isFile = kindOfTest("File");
|
||||
const isFile = kindOfTest('File');
|
||||
|
||||
/**
|
||||
* Determine if a value is a Blob
|
||||
@ -196,7 +193,7 @@ const isFile = kindOfTest("File");
|
||||
*
|
||||
* @returns {boolean} True if value is a Blob, otherwise false
|
||||
*/
|
||||
const isBlob = kindOfTest("Blob");
|
||||
const isBlob = kindOfTest('Blob');
|
||||
|
||||
/**
|
||||
* Determine if a value is a FileList
|
||||
@ -205,7 +202,7 @@ const isBlob = kindOfTest("Blob");
|
||||
*
|
||||
* @returns {boolean} True if value is a File, otherwise false
|
||||
*/
|
||||
const isFileList = kindOfTest("FileList");
|
||||
const isFileList = kindOfTest('FileList');
|
||||
|
||||
/**
|
||||
* Determine if a value is a Stream
|
||||
@ -227,13 +224,13 @@ const isFormData = (thing) => {
|
||||
let kind;
|
||||
return (
|
||||
thing &&
|
||||
((typeof FormData === "function" && thing instanceof FormData) ||
|
||||
((typeof FormData === 'function' && thing instanceof FormData) ||
|
||||
(isFunction(thing.append) &&
|
||||
((kind = kindOf(thing)) === "formdata" ||
|
||||
((kind = kindOf(thing)) === 'formdata' ||
|
||||
// detect form-data instance
|
||||
(kind === "object" &&
|
||||
(kind === 'object' &&
|
||||
isFunction(thing.toString) &&
|
||||
thing.toString() === "[object FormData]"))))
|
||||
thing.toString() === '[object FormData]'))))
|
||||
);
|
||||
};
|
||||
|
||||
@ -244,13 +241,13 @@ const isFormData = (thing) => {
|
||||
*
|
||||
* @returns {boolean} True if value is a URLSearchParams object, otherwise false
|
||||
*/
|
||||
const isURLSearchParams = kindOfTest("URLSearchParams");
|
||||
const isURLSearchParams = kindOfTest('URLSearchParams');
|
||||
|
||||
const [isReadableStream, isRequest, isResponse, isHeaders] = [
|
||||
"ReadableStream",
|
||||
"Request",
|
||||
"Response",
|
||||
"Headers",
|
||||
'ReadableStream',
|
||||
'Request',
|
||||
'Response',
|
||||
'Headers',
|
||||
].map(kindOfTest);
|
||||
|
||||
/**
|
||||
@ -260,9 +257,9 @@ const [isReadableStream, isRequest, isResponse, isHeaders] = [
|
||||
*
|
||||
* @returns {String} The String freed of excess whitespace
|
||||
*/
|
||||
const trim = (str) =>
|
||||
str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
|
||||
|
||||
const trim = (str) => {
|
||||
return str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
||||
};
|
||||
/**
|
||||
* Iterate over an Array or an Object invoking a function for each item.
|
||||
*
|
||||
@ -281,7 +278,7 @@ const trim = (str) =>
|
||||
*/
|
||||
function forEach(obj, fn, { allOwnKeys = false } = {}) {
|
||||
// Don't bother if no value provided
|
||||
if (obj === null || typeof obj === "undefined") {
|
||||
if (obj === null || typeof obj === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -289,7 +286,7 @@ function forEach(obj, fn, { allOwnKeys = false } = {}) {
|
||||
let l;
|
||||
|
||||
// Force an array if not already something iterable
|
||||
if (typeof obj !== "object") {
|
||||
if (typeof obj !== 'object') {
|
||||
/*eslint no-param-reassign:0*/
|
||||
obj = [obj];
|
||||
}
|
||||
@ -306,9 +303,7 @@ function forEach(obj, fn, { allOwnKeys = false } = {}) {
|
||||
}
|
||||
|
||||
// Iterate over object keys
|
||||
const keys = allOwnKeys
|
||||
? Object.getOwnPropertyNames(obj)
|
||||
: Object.keys(obj);
|
||||
const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
|
||||
const len = keys.length;
|
||||
let key;
|
||||
|
||||
@ -339,16 +334,11 @@ function findKey(obj, key) {
|
||||
|
||||
const _global = (() => {
|
||||
/*eslint no-undef:0*/
|
||||
if (typeof globalThis !== "undefined") return globalThis;
|
||||
return typeof self !== "undefined"
|
||||
? self
|
||||
: typeof window !== "undefined"
|
||||
? window
|
||||
: global;
|
||||
if (typeof globalThis !== 'undefined') return globalThis;
|
||||
return typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : global;
|
||||
})();
|
||||
|
||||
const isContextDefined = (context) =>
|
||||
!isUndefined(context) && context !== _global;
|
||||
const isContextDefined = (context) => !isUndefined(context) && context !== _global;
|
||||
|
||||
/**
|
||||
* Accepts varargs expecting each argument to be an object, then
|
||||
@ -373,7 +363,7 @@ function merge(/* obj1, obj2, obj3, ... */) {
|
||||
const result = {};
|
||||
const assignValue = (val, key) => {
|
||||
// Skip dangerous property names to prevent prototype pollution
|
||||
if (key === "__proto__" || key === "constructor" || key === "prototype") {
|
||||
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -426,7 +416,7 @@ const extend = (a, b, thisArg, { allOwnKeys } = {}) => {
|
||||
});
|
||||
}
|
||||
},
|
||||
{ allOwnKeys },
|
||||
{ allOwnKeys }
|
||||
);
|
||||
return a;
|
||||
};
|
||||
@ -455,17 +445,14 @@ const stripBOM = (content) => {
|
||||
* @returns {void}
|
||||
*/
|
||||
const inherits = (constructor, superConstructor, props, descriptors) => {
|
||||
constructor.prototype = Object.create(
|
||||
superConstructor.prototype,
|
||||
descriptors,
|
||||
);
|
||||
Object.defineProperty(constructor.prototype, "constructor", {
|
||||
constructor.prototype = Object.create(superConstructor.prototype, descriptors);
|
||||
Object.defineProperty(constructor.prototype, 'constructor', {
|
||||
value: constructor,
|
||||
writable: true,
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
});
|
||||
Object.defineProperty(constructor, "super", {
|
||||
Object.defineProperty(constructor, 'super', {
|
||||
value: superConstructor.prototype,
|
||||
});
|
||||
props && Object.assign(constructor.prototype, props);
|
||||
@ -495,20 +482,13 @@ const toFlatObject = (sourceObj, destObj, filter, propFilter) => {
|
||||
i = props.length;
|
||||
while (i-- > 0) {
|
||||
prop = props[i];
|
||||
if (
|
||||
(!propFilter || propFilter(prop, sourceObj, destObj)) &&
|
||||
!merged[prop]
|
||||
) {
|
||||
if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
|
||||
destObj[prop] = sourceObj[prop];
|
||||
merged[prop] = true;
|
||||
}
|
||||
}
|
||||
sourceObj = filter !== false && getPrototypeOf(sourceObj);
|
||||
} while (
|
||||
sourceObj &&
|
||||
(!filter || filter(sourceObj, destObj)) &&
|
||||
sourceObj !== Object.prototype
|
||||
);
|
||||
} while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
|
||||
|
||||
return destObj;
|
||||
};
|
||||
@ -565,7 +545,7 @@ const isTypedArray = ((TypedArray) => {
|
||||
return (thing) => {
|
||||
return TypedArray && thing instanceof TypedArray;
|
||||
};
|
||||
})(typeof Uint8Array !== "undefined" && getPrototypeOf(Uint8Array));
|
||||
})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));
|
||||
|
||||
/**
|
||||
* For each entry in the object, call the function with the key and value.
|
||||
@ -608,14 +588,12 @@ const matchAll = (regExp, str) => {
|
||||
};
|
||||
|
||||
/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
|
||||
const isHTMLForm = kindOfTest("HTMLFormElement");
|
||||
const isHTMLForm = kindOfTest('HTMLFormElement');
|
||||
|
||||
const toCamelCase = (str) => {
|
||||
return str
|
||||
.toLowerCase()
|
||||
.replace(/[-_\s]([a-z\d])(\w*)/g, function replacer(m, p1, p2) {
|
||||
return p1.toUpperCase() + p2;
|
||||
});
|
||||
return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, function replacer(m, p1, p2) {
|
||||
return p1.toUpperCase() + p2;
|
||||
});
|
||||
};
|
||||
|
||||
/* Creating a function that will check if an object has a property. */
|
||||
@ -632,7 +610,7 @@ const hasOwnProperty = (
|
||||
*
|
||||
* @returns {boolean} True if value is a RegExp object, otherwise false
|
||||
*/
|
||||
const isRegExp = kindOfTest("RegExp");
|
||||
const isRegExp = kindOfTest('RegExp');
|
||||
|
||||
const reduceDescriptors = (obj, reducer) => {
|
||||
const descriptors = Object.getOwnPropertyDescriptors(obj);
|
||||
@ -656,10 +634,7 @@ const reduceDescriptors = (obj, reducer) => {
|
||||
const freezeMethods = (obj) => {
|
||||
reduceDescriptors(obj, (descriptor, name) => {
|
||||
// skip restricted props in strict mode
|
||||
if (
|
||||
isFunction(obj) &&
|
||||
["arguments", "caller", "callee"].indexOf(name) !== -1
|
||||
) {
|
||||
if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -669,7 +644,7 @@ const freezeMethods = (obj) => {
|
||||
|
||||
descriptor.enumerable = false;
|
||||
|
||||
if ("writable" in descriptor) {
|
||||
if ('writable' in descriptor) {
|
||||
descriptor.writable = false;
|
||||
return;
|
||||
}
|
||||
@ -691,9 +666,7 @@ const toObjectSet = (arrayOrString, delimiter) => {
|
||||
});
|
||||
};
|
||||
|
||||
isArray(arrayOrString)
|
||||
? define(arrayOrString)
|
||||
: define(String(arrayOrString).split(delimiter));
|
||||
isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
|
||||
|
||||
return obj;
|
||||
};
|
||||
@ -701,9 +674,7 @@ const toObjectSet = (arrayOrString, delimiter) => {
|
||||
const noop = () => {};
|
||||
|
||||
const toFiniteNumber = (value, defaultValue) => {
|
||||
return value != null && Number.isFinite((value = +value))
|
||||
? value
|
||||
: defaultValue;
|
||||
return value != null && Number.isFinite((value = +value)) ? value : defaultValue;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -717,7 +688,7 @@ function isSpecCompliantForm(thing) {
|
||||
return !!(
|
||||
thing &&
|
||||
isFunction(thing.append) &&
|
||||
thing[toStringTag] === "FormData" &&
|
||||
thing[toStringTag] === 'FormData' &&
|
||||
thing[iterator]
|
||||
);
|
||||
}
|
||||
@ -736,7 +707,7 @@ const toJSONObject = (obj) => {
|
||||
return source;
|
||||
}
|
||||
|
||||
if (!("toJSON" in source)) {
|
||||
if (!('toJSON' in source)) {
|
||||
stack[i] = source;
|
||||
const target = isArray(source) ? [] : {};
|
||||
|
||||
@ -757,7 +728,7 @@ const toJSONObject = (obj) => {
|
||||
return visit(obj, 0);
|
||||
};
|
||||
|
||||
const isAsyncFn = kindOfTest("AsyncFunction");
|
||||
const isAsyncFn = kindOfTest('AsyncFunction');
|
||||
|
||||
const isThenable = (thing) =>
|
||||
thing &&
|
||||
@ -776,27 +747,27 @@ const _setImmediate = ((setImmediateSupported, postMessageSupported) => {
|
||||
return postMessageSupported
|
||||
? ((token, callbacks) => {
|
||||
_global.addEventListener(
|
||||
"message",
|
||||
'message',
|
||||
({ source, data }) => {
|
||||
if (source === _global && data === token) {
|
||||
callbacks.length && callbacks.shift()();
|
||||
}
|
||||
},
|
||||
false,
|
||||
false
|
||||
);
|
||||
|
||||
return (cb) => {
|
||||
callbacks.push(cb);
|
||||
_global.postMessage(token, "*");
|
||||
_global.postMessage(token, '*');
|
||||
};
|
||||
})(`axios@${Math.random()}`, [])
|
||||
: (cb) => setTimeout(cb);
|
||||
})(typeof setImmediate === "function", isFunction(_global.postMessage));
|
||||
})(typeof setImmediate === 'function', isFunction(_global.postMessage));
|
||||
|
||||
const asap =
|
||||
typeof queueMicrotask !== "undefined"
|
||||
typeof queueMicrotask !== 'undefined'
|
||||
? queueMicrotask.bind(_global)
|
||||
: (typeof process !== "undefined" && process.nextTick) || _setImmediate;
|
||||
: (typeof process !== 'undefined' && process.nextTick) || _setImmediate;
|
||||
|
||||
// *********************
|
||||
|
||||
|
||||
1149
package-lock.json
generated
1149
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
||||
"name": "axios",
|
||||
"version": "1.13.5",
|
||||
"description": "Promise based HTTP client for the browser and node.js",
|
||||
"main": "./dist/node/axios.cjs",
|
||||
"main": "./index.js",
|
||||
"module": "./index.js",
|
||||
"exports": {
|
||||
".": {
|
||||
@ -63,7 +63,6 @@
|
||||
"prepublishOnly": "npm run test:build:version",
|
||||
"build": "gulp clear && cross-env NODE_ENV=production rollup -c -m",
|
||||
"examples": "node ./examples/server.js",
|
||||
"coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
|
||||
"fix": "eslint --fix lib/**/*.js",
|
||||
"prepare": "husky install && npm run prepare:hooks",
|
||||
"prepare:hooks": "npx husky set .husky/commit-msg \"npx commitlint --edit $1\""
|
||||
@ -131,11 +130,13 @@
|
||||
"karma-sauce-launcher": "^4.3.6",
|
||||
"karma-sinon": "^1.0.5",
|
||||
"karma-sourcemap-loader": "^0.4.0",
|
||||
"lint-staged": "^15.2.10",
|
||||
"memoizee": "^0.4.17",
|
||||
"minimist": "^1.2.8",
|
||||
"mocha": "^10.8.2",
|
||||
"multer": "^1.4.4",
|
||||
"pacote": "^20.0.0",
|
||||
"prettier": "^3.8.1",
|
||||
"pretty-bytes": "^6.1.1",
|
||||
"rollup": "^2.79.2",
|
||||
"rollup-plugin-auto-external": "^2.0.0",
|
||||
@ -202,6 +203,9 @@
|
||||
"@commitlint/config-conventional"
|
||||
]
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{js,cjs,mjs,ts,json,md,yml,yaml}": "prettier --write"
|
||||
},
|
||||
"c8": {
|
||||
"all": true,
|
||||
"include": [
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import resolve from '@rollup/plugin-node-resolve';
|
||||
import commonjs from '@rollup/plugin-commonjs';
|
||||
import {terser} from "rollup-plugin-terser";
|
||||
import { terser } from 'rollup-plugin-terser';
|
||||
import json from '@rollup/plugin-json';
|
||||
import { babel } from '@rollup/plugin-babel';
|
||||
import autoExternal from 'rollup-plugin-auto-external';
|
||||
@ -8,51 +8,52 @@ import bundleSize from 'rollup-plugin-bundle-size';
|
||||
import aliasPlugin from '@rollup/plugin-alias';
|
||||
import path from 'path';
|
||||
|
||||
const lib = require("./package.json");
|
||||
const lib = require('./package.json');
|
||||
const outputFileName = 'axios';
|
||||
const name = "axios";
|
||||
const name = 'axios';
|
||||
const namedInput = './index.js';
|
||||
const defaultInput = './lib/axios.js';
|
||||
|
||||
const buildConfig = ({es5, browser = true, minifiedVersion = true, alias, ...config}) => {
|
||||
const {file} = config.output;
|
||||
const buildConfig = ({ es5, browser = true, minifiedVersion = true, alias, ...config }) => {
|
||||
const { file } = config.output;
|
||||
const ext = path.extname(file);
|
||||
const basename = path.basename(file, ext);
|
||||
const extArr = ext.split('.');
|
||||
extArr.shift();
|
||||
|
||||
|
||||
const build = ({minified}) => ({
|
||||
const build = ({ minified }) => ({
|
||||
input: namedInput,
|
||||
...config,
|
||||
output: {
|
||||
...config.output,
|
||||
file: `${path.dirname(file)}/${basename}.${(minified ? ['min', ...extArr] : extArr).join('.')}`
|
||||
file: `${path.dirname(file)}/${basename}.${(minified ? ['min', ...extArr] : extArr).join('.')}`,
|
||||
},
|
||||
plugins: [
|
||||
aliasPlugin({
|
||||
entries: alias || []
|
||||
entries: alias || [],
|
||||
}),
|
||||
json(),
|
||||
resolve({browser}),
|
||||
resolve({ browser }),
|
||||
commonjs(),
|
||||
|
||||
minified && terser(),
|
||||
minified && bundleSize(),
|
||||
...(es5 ? [babel({
|
||||
babelHelpers: 'bundled',
|
||||
presets: ['@babel/preset-env']
|
||||
})] : []),
|
||||
...(es5
|
||||
? [
|
||||
babel({
|
||||
babelHelpers: 'bundled',
|
||||
presets: ['@babel/preset-env'],
|
||||
}),
|
||||
]
|
||||
: []),
|
||||
...(config.plugins || []),
|
||||
]
|
||||
],
|
||||
});
|
||||
|
||||
const configs = [
|
||||
build({minified: false}),
|
||||
];
|
||||
const configs = [build({ minified: false })];
|
||||
|
||||
if (minifiedVersion) {
|
||||
configs.push(build({minified: true}))
|
||||
configs.push(build({ minified: true }));
|
||||
}
|
||||
|
||||
return configs;
|
||||
@ -68,15 +69,15 @@ export default async () => {
|
||||
input: namedInput,
|
||||
output: {
|
||||
file: `dist/esm/${outputFileName}.js`,
|
||||
format: "esm",
|
||||
format: 'esm',
|
||||
preferConst: true,
|
||||
exports: "named",
|
||||
banner
|
||||
}
|
||||
exports: 'named',
|
||||
banner,
|
||||
},
|
||||
}),
|
||||
// browser ESM bundle for CDN with fetch adapter only
|
||||
// Downsizing from 12.97 kB (gzip) to 12.23 kB (gzip)
|
||||
/* ...buildConfig({
|
||||
/* ...buildConfig({
|
||||
input: namedInput,
|
||||
output: {
|
||||
file: `dist/esm/${outputFileName}-fetch.js`,
|
||||
@ -97,10 +98,10 @@ export default async () => {
|
||||
output: {
|
||||
file: `dist/${outputFileName}.js`,
|
||||
name,
|
||||
format: "umd",
|
||||
exports: "default",
|
||||
banner
|
||||
}
|
||||
format: 'umd',
|
||||
exports: 'default',
|
||||
banner,
|
||||
},
|
||||
}),
|
||||
|
||||
// Browser CJS bundle
|
||||
@ -111,10 +112,10 @@ export default async () => {
|
||||
output: {
|
||||
file: `dist/browser/${name}.cjs`,
|
||||
name,
|
||||
format: "cjs",
|
||||
exports: "default",
|
||||
banner
|
||||
}
|
||||
format: 'cjs',
|
||||
exports: 'default',
|
||||
banner,
|
||||
},
|
||||
}),
|
||||
|
||||
// Node.js commonjs bundle
|
||||
@ -122,16 +123,12 @@ export default async () => {
|
||||
input: defaultInput,
|
||||
output: {
|
||||
file: `dist/node/${name}.cjs`,
|
||||
format: "cjs",
|
||||
format: 'cjs',
|
||||
preferConst: true,
|
||||
exports: "default",
|
||||
banner
|
||||
exports: 'default',
|
||||
banner,
|
||||
},
|
||||
plugins: [
|
||||
autoExternal(),
|
||||
resolve(),
|
||||
commonjs()
|
||||
]
|
||||
}
|
||||
]
|
||||
plugins: [autoExternal(), resolve(), commonjs()],
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
@ -1,499 +1,522 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>AXIOS | Sandbox</title>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"/>
|
||||
<style type="text/css">
|
||||
/*
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" />
|
||||
<style type="text/css">
|
||||
/*
|
||||
:root & Dark Mode Variables
|
||||
*/
|
||||
:root {
|
||||
--bg-color: #f0f4ff; /* main page background */
|
||||
--text-color: #1a1a1a; /* main text color */
|
||||
--border-color: #cfd8ff; /* default borders */
|
||||
--well-bg: rgba(255, 255, 255, 0.9); /* card & well background */
|
||||
--input-bg: rgba(255, 255, 255, 0.95); /* input background */
|
||||
--footer-text-color: #555;
|
||||
--footer-heading-color: #1a1a1a;
|
||||
--footer-link-color: #5b4bff;
|
||||
--footer-link-hover-color: #3a2ecb;
|
||||
--shadow-color: rgba(0, 0, 0, 0.1);
|
||||
--primary-gradient: linear-gradient(135deg, #6a1bff, #00c3ff);
|
||||
--btn-hover-gradient: linear-gradient(135deg, #5b00d1, #00aaff);
|
||||
--glass-blur: blur(12px); /* for frosted glass effect */
|
||||
}
|
||||
:root {
|
||||
--bg-color: #f0f4ff;
|
||||
/* main page background */
|
||||
--text-color: #1a1a1a;
|
||||
/* main text color */
|
||||
--border-color: #cfd8ff;
|
||||
/* default borders */
|
||||
--well-bg: rgba(255, 255, 255, 0.9);
|
||||
/* card & well background */
|
||||
--input-bg: rgba(255, 255, 255, 0.95);
|
||||
/* input background */
|
||||
--footer-text-color: #555;
|
||||
--footer-heading-color: #1a1a1a;
|
||||
--footer-link-color: #5b4bff;
|
||||
--footer-link-hover-color: #3a2ecb;
|
||||
--shadow-color: rgba(0, 0, 0, 0.1);
|
||||
--primary-gradient: linear-gradient(135deg, #6a1bff, #00c3ff);
|
||||
--btn-hover-gradient: linear-gradient(135deg, #5b00d1, #00aaff);
|
||||
--glass-blur: blur(12px);
|
||||
/* for frosted glass effect */
|
||||
}
|
||||
|
||||
body.dark-mode {
|
||||
/* Dark mode overrides */
|
||||
--bg-color: #0e0f1a;
|
||||
--text-color: #e0e0ff;
|
||||
--border-color: #444;
|
||||
--well-bg: rgba(30, 30, 50, 0.7);
|
||||
--input-bg: rgba(40, 40, 60, 0.85);
|
||||
--footer-text-color: #aaa;
|
||||
--footer-heading-color: #fff;
|
||||
--footer-link-color: #7f8fff;
|
||||
--footer-link-hover-color: #aabfff;
|
||||
--shadow-color: rgba(0, 0, 0, 0.5);
|
||||
--primary-gradient: linear-gradient(135deg, #9b59ff, #00d1ff);
|
||||
--btn-hover-gradient: linear-gradient(135deg, #7d33ff, #00b7ff);
|
||||
}
|
||||
body.dark-mode {
|
||||
/* Dark mode overrides */
|
||||
--bg-color: #0e0f1a;
|
||||
--text-color: #e0e0ff;
|
||||
--border-color: #444;
|
||||
--well-bg: rgba(30, 30, 50, 0.7);
|
||||
--input-bg: rgba(40, 40, 60, 0.85);
|
||||
--footer-text-color: #aaa;
|
||||
--footer-heading-color: #fff;
|
||||
--footer-link-color: #7f8fff;
|
||||
--footer-link-hover-color: #aabfff;
|
||||
--shadow-color: rgba(0, 0, 0, 0.5);
|
||||
--primary-gradient: linear-gradient(135deg, #9b59ff, #00d1ff);
|
||||
--btn-hover-gradient: linear-gradient(135deg, #7d33ff, #00b7ff);
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
Global Styles
|
||||
*/
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
transition: all 0.4s ease; /* smooth transitions everywhere */
|
||||
}
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
transition: all 0.4s ease;
|
||||
/* smooth transitions everywhere */
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||
background: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||
background: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
}
|
||||
pre {
|
||||
min-height: 39px;
|
||||
white-space: pre-wrap; /* wrap long lines instead of stretching the panel */
|
||||
white-space: pre-wrap;
|
||||
/* wrap long lines instead of stretching the panel */
|
||||
word-wrap: break-word;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.box{
|
||||
.box {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-gap: 40px; /* Increased gap between input and response columns */
|
||||
grid-gap: 40px;
|
||||
/* Increased gap between input and response columns */
|
||||
}
|
||||
|
||||
.response {
|
||||
min-width: 0; /* prevents content overflow from pushing layout */
|
||||
min-width: 0;
|
||||
/* prevents content overflow from pushing layout */
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.header{
|
||||
.header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 2rem; /* Added space below the header */
|
||||
margin-bottom: 2rem;
|
||||
/* Added space below the header */
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
Input & Well Styles
|
||||
*/
|
||||
.well,
|
||||
.form-control {
|
||||
background: var(--well-bg);
|
||||
margin-top: 5px;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 16px;
|
||||
padding: 14px 16px;
|
||||
box-shadow: 0 10px 25px -8px var(--shadow-color);
|
||||
backdrop-filter: var(--glass-blur); /* glass effect */
|
||||
}
|
||||
.well,
|
||||
.form-control {
|
||||
background: var(--well-bg);
|
||||
margin-top: 5px;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 16px;
|
||||
padding: 14px 16px;
|
||||
box-shadow: 0 10px 25px -8px var(--shadow-color);
|
||||
backdrop-filter: var(--glass-blur);
|
||||
/* glass effect */
|
||||
}
|
||||
|
||||
.form-control {
|
||||
background: var(--input-bg);
|
||||
color: var(--text-color);
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
outline: none; /* remove default bootstrap focus outline */
|
||||
}
|
||||
.form-control {
|
||||
background: var(--input-bg);
|
||||
color: var(--text-color);
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
outline: none;
|
||||
/* remove default bootstrap focus outline */
|
||||
}
|
||||
|
||||
.form-control::placeholder {
|
||||
color: #9e9eef; /* subtle placeholder */
|
||||
}
|
||||
.form-control::placeholder {
|
||||
color: #9e9eef;
|
||||
/* subtle placeholder */
|
||||
}
|
||||
|
||||
/* Modern neon focus effect */
|
||||
.form-control:focus {
|
||||
background: var(--input-bg); /* keep consistent */
|
||||
border: 1px solid #ff00ff; /* neon border */
|
||||
box-shadow: 0 0 10px #ff00ff, 0 0 20px #00ffff; /* glowing focus */
|
||||
color: var(--text-color);
|
||||
}
|
||||
/* Modern neon focus effect */
|
||||
.form-control:focus {
|
||||
background: var(--input-bg);
|
||||
/* keep consistent */
|
||||
border: 1px solid #ff00ff;
|
||||
/* neon border */
|
||||
box-shadow: 0 0 10px #ff00ff, 0 0 20px #00ffff;
|
||||
/* glowing focus */
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
/* subtle placeholder fade on focus */
|
||||
.form-control:focus::placeholder {
|
||||
color: #ddd;
|
||||
}
|
||||
/* subtle placeholder fade on focus */
|
||||
.form-control:focus::placeholder {
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
/* spacing between form groups */
|
||||
.form-group {
|
||||
margin-bottom: 1.75rem;
|
||||
}
|
||||
/* spacing between form groups */
|
||||
.form-group {
|
||||
margin-bottom: 1.75rem;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
Header & Box Layout
|
||||
*/
|
||||
.header {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 2.5rem;
|
||||
gap: 15px;
|
||||
}
|
||||
.header {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 2.5rem;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.box {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 40px;
|
||||
}
|
||||
.box {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 40px;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
Theme Toggle Button
|
||||
*/
|
||||
#theme-toggle {
|
||||
padding: 8px 18px;
|
||||
border-radius: 12px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
background: var(--primary-gradient);
|
||||
color: #fff;
|
||||
font-weight: 600;
|
||||
box-shadow: 0 8px 20px -5px var(--shadow-color);
|
||||
transition: transform 0.25s ease, box-shadow 0.25s ease;
|
||||
}
|
||||
#theme-toggle {
|
||||
padding: 8px 18px;
|
||||
border-radius: 12px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
background: var(--primary-gradient);
|
||||
color: #fff;
|
||||
font-weight: 600;
|
||||
box-shadow: 0 8px 20px -5px var(--shadow-color);
|
||||
transition: transform 0.25s ease, box-shadow 0.25s ease;
|
||||
}
|
||||
|
||||
#theme-toggle:hover {
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 12px 25px -8px var(--shadow-color);
|
||||
}
|
||||
#theme-toggle:hover {
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 12px 25px -8px var(--shadow-color);
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
Footer Styles
|
||||
*/
|
||||
.footer {
|
||||
max-width: 900px;
|
||||
margin: 60px auto 40px auto;
|
||||
padding: 2.5rem 3rem;
|
||||
border-radius: 24px;
|
||||
background: var(--well-bg);
|
||||
box-shadow: 0 15px 35px -10px var(--shadow-color);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 25px;
|
||||
}
|
||||
|
||||
.footer-left {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.footer-left .footer-brand-axios,
|
||||
.footer-left .footer-brand-sandbox {
|
||||
font-size: 1.2em;
|
||||
font-weight: 700;
|
||||
background: var(--primary-gradient);
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.footer-left .footer-copyright {
|
||||
font-size: 0.9em;
|
||||
color: var(--footer-text-color);
|
||||
}
|
||||
|
||||
.footer-nav ul {
|
||||
display: flex;
|
||||
gap: 25px;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.footer-nav a {
|
||||
color: var(--footer-link-color);
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
transition: color 0.3s ease, transform 0.2s ease;
|
||||
}
|
||||
|
||||
.footer-nav a:hover {
|
||||
color: var(--footer-link-hover-color);
|
||||
transform: translateY(-2px);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/*
|
||||
Buttons
|
||||
*/
|
||||
.btn {
|
||||
padding: 10px 25px;
|
||||
border-radius: 50px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
background: var(--primary-gradient);
|
||||
box-shadow: 0 10px 25px -8px var(--shadow-color);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background: var(--btn-hover-gradient);
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 14px 30px -10px var(--shadow-color);
|
||||
}
|
||||
|
||||
/*
|
||||
Code/Pre blocks
|
||||
*/
|
||||
pre {
|
||||
border-radius: 16px;
|
||||
padding: 14px;
|
||||
background: var(--well-bg);
|
||||
box-shadow: inset 0 6px 12px -4px var(--shadow-color);
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
Responsive Layout
|
||||
*/
|
||||
@media screen and (max-width: 1000px) {
|
||||
.box {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.footer {
|
||||
max-width: 900px;
|
||||
margin: 60px auto 40px auto;
|
||||
padding: 2.5rem 3rem;
|
||||
border-radius: 24px;
|
||||
background: var(--well-bg);
|
||||
box-shadow: 0 15px 35px -10px var(--shadow-color);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 25px;
|
||||
}
|
||||
|
||||
.footer-left {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.footer-left .footer-brand-axios,
|
||||
.footer-left .footer-brand-sandbox {
|
||||
font-size: 1.2em;
|
||||
font-weight: 700;
|
||||
background: var(--primary-gradient);
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.footer-left .footer-copyright {
|
||||
font-size: 0.9em;
|
||||
color: var(--footer-text-color);
|
||||
text-align: center;
|
||||
padding: 2rem;
|
||||
max-width: 90%;
|
||||
}
|
||||
|
||||
.footer-nav ul {
|
||||
display: flex;
|
||||
gap: 25px;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.footer-nav a {
|
||||
color: var(--footer-link-color);
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
transition: color 0.3s ease, transform 0.2s ease;
|
||||
}
|
||||
|
||||
.footer-nav a:hover {
|
||||
color: var(--footer-link-hover-color);
|
||||
transform: translateY(-2px);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/*
|
||||
Buttons
|
||||
*/
|
||||
.btn {
|
||||
padding: 10px 25px;
|
||||
border-radius: 50px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
background: var(--primary-gradient);
|
||||
box-shadow: 0 10px 25px -8px var(--shadow-color);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background: var(--btn-hover-gradient);
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 14px 30px -10px var(--shadow-color);
|
||||
}
|
||||
|
||||
/*
|
||||
Code/Pre blocks
|
||||
*/
|
||||
pre {
|
||||
border-radius: 16px;
|
||||
padding: 14px;
|
||||
background: var(--well-bg);
|
||||
box-shadow: inset 0 6px 12px -4px var(--shadow-color);
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
Responsive Layout
|
||||
*/
|
||||
@media screen and (max-width: 1000px) {
|
||||
.box {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.footer {
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
padding: 2rem;
|
||||
max-width: 90%;
|
||||
}
|
||||
|
||||
.footer-nav ul {
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="container">
|
||||
<div class="header">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<img src="https://axios-http.com/assets/logo.svg" alt="axios" width="100" height="60">
|
||||
<h1> | Sandbox</h1>
|
||||
</div>
|
||||
<button id="theme-toggle">Toggle Theme</button>
|
||||
</div>
|
||||
|
||||
<div class="box">
|
||||
<div class="well">
|
||||
<h3>Input</h3>
|
||||
<form role="form" onsubmit="return false;">
|
||||
<div class="form-group">
|
||||
<label for="url">URL</label>
|
||||
<input id="url" type="url" class="form-control" placeholder="/api"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="method">Method</label>
|
||||
<select id="method" class="form-control">
|
||||
<option value="GET">GET</option>
|
||||
<option value="POST">POST</option>
|
||||
<option value="PUT">PUT</option>
|
||||
<option value="DELETE">DELETE</option>
|
||||
<option value="HEAD">HEAD</option>
|
||||
<option value="PATCH">PATCH</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="params">Params</label>
|
||||
<textarea id="params" class="form-control" placeholder='{"foo": "bar", "baz": 123.45}'></textarea>
|
||||
</div>
|
||||
<div class="form-group" style="display: none;">
|
||||
<label for="data">Data</label>
|
||||
<textarea id="data" class="form-control" placeholder='{"foo": "bar", "baz": 123.45}'></textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="headers">Headers</label>
|
||||
<textarea id="headers" class="form-control" placeholder='{"X-Requested-With": "XMLHttpRequest"}'></textarea>
|
||||
</div>
|
||||
<button id="submit" type="submit" class="btn btn-primary">Send Request</button>
|
||||
</form>
|
||||
<div class="header">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<img src="https://axios-http.com/assets/logo.svg" alt="axios" width="100" height="60">
|
||||
<h1> | Sandbox</h1>
|
||||
</div>
|
||||
<button id="theme-toggle">Toggle Theme</button>
|
||||
</div>
|
||||
|
||||
<div class="response">
|
||||
<div class="box">
|
||||
<div class="well">
|
||||
<h3>Request</h3>
|
||||
<pre id="request">No Data</pre>
|
||||
<h3>Input</h3>
|
||||
<form role="form" onsubmit="return false;">
|
||||
<div class="form-group">
|
||||
<label for="url">URL</label>
|
||||
<input id="url" type="url" class="form-control" placeholder="/api" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="method">Method</label>
|
||||
<select id="method" class="form-control">
|
||||
<option value="GET">GET</option>
|
||||
<option value="POST">POST</option>
|
||||
<option value="PUT">PUT</option>
|
||||
<option value="DELETE">DELETE</option>
|
||||
<option value="HEAD">HEAD</option>
|
||||
<option value="PATCH">PATCH</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="params">Params</label>
|
||||
<textarea id="params" class="form-control" placeholder='{"foo": "bar", "baz": 123.45}'></textarea>
|
||||
</div>
|
||||
<div class="form-group" style="display: none;">
|
||||
<label for="data">Data</label>
|
||||
<textarea id="data" class="form-control" placeholder='{"foo": "bar", "baz": 123.45}'></textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="headers">Headers</label>
|
||||
<textarea id="headers" class="form-control" placeholder='{"X-Requested-With": "XMLHttpRequest"}'></textarea>
|
||||
</div>
|
||||
<button id="submit" type="submit" class="btn btn-primary">Send Request</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="well">
|
||||
<h3>Response</h3>
|
||||
<pre id="response">No Data</pre>
|
||||
</div>
|
||||
<div class="response">
|
||||
<div class="well">
|
||||
<h3>Request</h3>
|
||||
<pre id="request">No Data</pre>
|
||||
</div>
|
||||
|
||||
<div class="well">
|
||||
<h3>Error</h3>
|
||||
<pre id="error">None</pre>
|
||||
<div class="well">
|
||||
<h3>Response</h3>
|
||||
<pre id="response">No Data</pre>
|
||||
</div>
|
||||
|
||||
<div class="well">
|
||||
<h3>Error</h3>
|
||||
<pre id="error">None</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<footer class="footer">
|
||||
<div class="footer-left">
|
||||
<p class="footer-brand-axios">AXIOS</p><p class="footer-brand-sandbox"> | Sandbox</p>
|
||||
<p class="footer-copyright">© <span id="year">2025</span> Axios. All rights reserved.</p>
|
||||
<p class="footer-brand-axios">AXIOS</p>
|
||||
<p class="footer-brand-sandbox"> | Sandbox</p>
|
||||
<p class="footer-copyright">© <span id="year">2025</span> Axios. All rights reserved.</p>
|
||||
</div>
|
||||
<nav class="footer-nav">
|
||||
<ul>
|
||||
<li><a href="https://axios-http.com/docs/intro" target="_blank" rel="noopener noreferrer">Docs</a></li>
|
||||
<li><a href="https://github.com/axios/axios" target="_blank" rel="noopener noreferrer">GitHub</a></li>
|
||||
<li><a href="https://axios-http.com/" target="_blank" rel="noopener noreferrer">Website</a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a href="https://axios-http.com/docs/intro" target="_blank" rel="noopener noreferrer">Docs</a></li>
|
||||
<li><a href="https://github.com/axios/axios" target="_blank" rel="noopener noreferrer">GitHub</a></li>
|
||||
<li><a href="https://axios-http.com/" target="_blank" rel="noopener noreferrer">Website</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</footer>
|
||||
</footer>
|
||||
|
||||
<script src="/axios.js"></script>
|
||||
<script>
|
||||
// Original sandbox script (untouched)
|
||||
(function () {
|
||||
var url = document.getElementById('url');
|
||||
var method = document.getElementById('method');
|
||||
var params = document.getElementById('params');
|
||||
var data = document.getElementById('data');
|
||||
var headers = document.getElementById('headers');
|
||||
var submit = document.getElementById('submit');
|
||||
var request = document.getElementById('request');
|
||||
var response = document.getElementById('response');
|
||||
var error = document.getElementById('error');
|
||||
<script src="/axios.js"></script>
|
||||
<script>
|
||||
// Original sandbox script (untouched)
|
||||
(function () {
|
||||
var url = document.getElementById('url');
|
||||
var method = document.getElementById('method');
|
||||
var params = document.getElementById('params');
|
||||
var data = document.getElementById('data');
|
||||
var headers = document.getElementById('headers');
|
||||
var submit = document.getElementById('submit');
|
||||
var request = document.getElementById('request');
|
||||
var response = document.getElementById('response');
|
||||
var error = document.getElementById('error');
|
||||
|
||||
function acceptsData(method) {
|
||||
return ['PATCH', 'POST', 'PUT'].indexOf(method) > -1;
|
||||
}
|
||||
|
||||
function getUrl() {
|
||||
return url.value.length === 0 ? '/api' : url.value;
|
||||
}
|
||||
|
||||
function getParams() {
|
||||
try {
|
||||
return params.value.length === 0 ? null : JSON.parse(params.value);
|
||||
} catch (e) {
|
||||
error.textContent = "Invalid JSON in Params";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getData() {
|
||||
try {
|
||||
return data.value.length === 0 ? null : JSON.parse(data.value);
|
||||
} catch (e) {
|
||||
error.textContent = "Invalid JSON in Data";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getHeaders() {
|
||||
try {
|
||||
return headers.value.length === 0 ? null : JSON.parse(headers.value);
|
||||
} catch (e) {
|
||||
error.textContent = "Invalid JSON in Headers";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function syncWithLocalStorage() {
|
||||
url.value = localStorage.getItem('url') || '/api';
|
||||
method.value = localStorage.getItem('method') || 'GET';
|
||||
params.value = localStorage.getItem('params') || '';
|
||||
data.value = localStorage.getItem('data') || '';
|
||||
headers.value = localStorage.getItem('headers') || '';
|
||||
}
|
||||
|
||||
function syncParamsAndData() {
|
||||
switch (method.value) {
|
||||
case 'PATCH':
|
||||
case 'POST':
|
||||
case 'PUT':
|
||||
params.parentNode.style.display = 'none';
|
||||
data.parentNode.style.display = '';
|
||||
break;
|
||||
default:
|
||||
params.parentNode.style.display = '';
|
||||
data.parentNode.style.display = 'none';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
submit.onclick = function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
if (url.value === '') {
|
||||
error.textContent = 'Please enter a valid URL';
|
||||
return;
|
||||
function acceptsData(method) {
|
||||
return ['PATCH', 'POST', 'PUT'].indexOf(method) > -1;
|
||||
}
|
||||
|
||||
var options = {
|
||||
url: getUrl(),
|
||||
params: !acceptsData(method.value) ? getParams() : undefined,
|
||||
data: acceptsData(method.value) ? getData() : undefined,
|
||||
method: method.value,
|
||||
headers: getHeaders()
|
||||
function getUrl() {
|
||||
return url.value.length === 0 ? '/api' : url.value;
|
||||
}
|
||||
|
||||
function getParams() {
|
||||
try {
|
||||
return params.value.length === 0 ? null : JSON.parse(params.value);
|
||||
} catch (e) {
|
||||
error.textContent = "Invalid JSON in Params";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getData() {
|
||||
try {
|
||||
return data.value.length === 0 ? null : JSON.parse(data.value);
|
||||
} catch (e) {
|
||||
error.textContent = "Invalid JSON in Data";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getHeaders() {
|
||||
try {
|
||||
return headers.value.length === 0 ? null : JSON.parse(headers.value);
|
||||
} catch (e) {
|
||||
error.textContent = "Invalid JSON in Headers";
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function syncWithLocalStorage() {
|
||||
url.value = localStorage.getItem('url') || '/api';
|
||||
method.value = localStorage.getItem('method') || 'GET';
|
||||
params.value = localStorage.getItem('params') || '';
|
||||
data.value = localStorage.getItem('data') || '';
|
||||
headers.value = localStorage.getItem('headers') || '';
|
||||
}
|
||||
|
||||
function syncParamsAndData() {
|
||||
switch (method.value) {
|
||||
case 'PATCH':
|
||||
case 'POST':
|
||||
case 'PUT':
|
||||
params.parentNode.style.display = 'none';
|
||||
data.parentNode.style.display = '';
|
||||
break;
|
||||
default:
|
||||
params.parentNode.style.display = '';
|
||||
data.parentNode.style.display = 'none';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
submit.onclick = function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
if (url.value === '') {
|
||||
error.textContent = 'Please enter a valid URL';
|
||||
return;
|
||||
}
|
||||
|
||||
var options = {
|
||||
url: getUrl(),
|
||||
params: !acceptsData(method.value) ? getParams() : undefined,
|
||||
data: acceptsData(method.value) ? getData() : undefined,
|
||||
method: method.value,
|
||||
headers: getHeaders()
|
||||
};
|
||||
|
||||
request.textContent = JSON.stringify(options, null, 2);
|
||||
|
||||
axios(options)
|
||||
.then(function (res) {
|
||||
response.innerHTML = JSON.stringify(res.data, null, 2);
|
||||
error.textContent = "None";
|
||||
})
|
||||
.catch(function (err) {
|
||||
if (err.response) {
|
||||
error.textContent = JSON.stringify(err.response.data, null, 2);
|
||||
response.innerHTML = "Error in Response";
|
||||
} else {
|
||||
error.textContent = err.message;
|
||||
response.innerHTML = "No Response Data";
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
request.textContent = JSON.stringify(options, null, 2);
|
||||
url.onchange = function () {
|
||||
localStorage.setItem('url', url.value);
|
||||
};
|
||||
|
||||
axios(options)
|
||||
.then(function (res) {
|
||||
response.innerHTML = JSON.stringify(res.data, null, 2);
|
||||
error.textContent = "None";
|
||||
})
|
||||
.catch(function (err) {
|
||||
if (err.response) {
|
||||
error.textContent = JSON.stringify(err.response.data, null, 2);
|
||||
response.innerHTML = "Error in Response";
|
||||
} else {
|
||||
error.textContent = err.message;
|
||||
response.innerHTML = "No Response Data";
|
||||
}
|
||||
});
|
||||
};
|
||||
method.onchange = function () {
|
||||
localStorage.setItem('method', method.value);
|
||||
syncParamsAndData();
|
||||
};
|
||||
|
||||
url.onchange = function () {
|
||||
localStorage.setItem('url', url.value);
|
||||
};
|
||||
params.onchange = function () {
|
||||
localStorage.setItem('params', params.value);
|
||||
};
|
||||
|
||||
method.onchange = function () {
|
||||
localStorage.setItem('method', method.value);
|
||||
data.onchange = function () {
|
||||
localStorage.setItem('data', data.value);
|
||||
};
|
||||
|
||||
headers.onchange = function () {
|
||||
localStorage.setItem('headers', headers.value);
|
||||
};
|
||||
|
||||
syncWithLocalStorage();
|
||||
syncParamsAndData();
|
||||
};
|
||||
})();
|
||||
|
||||
params.onchange = function () {
|
||||
localStorage.setItem('params', params.value);
|
||||
};
|
||||
// New script for theme toggle and footer year
|
||||
(function () {
|
||||
const themeToggle = document.getElementById('theme-toggle');
|
||||
const yearSpan = document.getElementById('year');
|
||||
|
||||
data.onchange = function () {
|
||||
localStorage.setItem('data', data.value);
|
||||
};
|
||||
|
||||
headers.onchange = function () {
|
||||
localStorage.setItem('headers', headers.value);
|
||||
};
|
||||
|
||||
syncWithLocalStorage();
|
||||
syncParamsAndData();
|
||||
})();
|
||||
|
||||
// New script for theme toggle and footer year
|
||||
(function() {
|
||||
const themeToggle = document.getElementById('theme-toggle');
|
||||
const yearSpan = document.getElementById('year');
|
||||
|
||||
themeToggle.addEventListener('click', () => {
|
||||
themeToggle.addEventListener('click', () => {
|
||||
document.body.classList.toggle('dark-mode');
|
||||
});
|
||||
});
|
||||
|
||||
yearSpan.textContent = new Date().getFullYear();
|
||||
})();
|
||||
</script>
|
||||
yearSpan.textContent = new Date().getFullYear();
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -3,18 +3,18 @@ import axios from '../index.js';
|
||||
const URL = 'http://127.0.0.1:3000/api';
|
||||
const BODY = {
|
||||
foo: 'bar',
|
||||
baz: 1234
|
||||
baz: 1234,
|
||||
};
|
||||
|
||||
function handleSuccess(data) { console.log(data); }
|
||||
function handleFailure(data) { console.log('error', data); }
|
||||
function handleSuccess(data) {
|
||||
console.log(data);
|
||||
}
|
||||
function handleFailure(data) {
|
||||
console.log('error', data);
|
||||
}
|
||||
|
||||
// GET
|
||||
axios.get(URL, { params: BODY })
|
||||
.then(handleSuccess)
|
||||
.catch(handleFailure);
|
||||
axios.get(URL, { params: BODY }).then(handleSuccess).catch(handleFailure);
|
||||
|
||||
// POST
|
||||
axios.post(URL, BODY)
|
||||
.then(handleSuccess)
|
||||
.catch(handleFailure);
|
||||
axios.post(URL, BODY).then(handleSuccess).catch(handleFailure);
|
||||
|
||||
@ -15,7 +15,7 @@ let server;
|
||||
function pipeFileToResponse(res, file, type) {
|
||||
if (type) {
|
||||
res.writeHead(200, {
|
||||
'Content-Type': type
|
||||
'Content-Type': type,
|
||||
});
|
||||
}
|
||||
|
||||
@ -47,18 +47,18 @@ function handleApiRequest(req, res) {
|
||||
url: req.url,
|
||||
data: data ? JSON.parse(data) : undefined,
|
||||
method: req.method,
|
||||
headers: req.headers
|
||||
headers: req.headers,
|
||||
};
|
||||
} catch (e) {
|
||||
console.error('Error:', e.message);
|
||||
status = 400;
|
||||
result = {
|
||||
error: e.message
|
||||
error: e.message,
|
||||
};
|
||||
}
|
||||
|
||||
res.writeHead(status, {
|
||||
'Content-Type': 'application/json'
|
||||
'Content-Type': 'application/json',
|
||||
});
|
||||
res.end(JSON.stringify(result));
|
||||
});
|
||||
|
||||
@ -1,18 +1,20 @@
|
||||
|
||||
export const retryNetwork = async (fn, retries = 3, delay = 1000) => {
|
||||
let attempt = 0, sleep;
|
||||
let attempt = 0,
|
||||
sleep;
|
||||
|
||||
do {
|
||||
try {
|
||||
return await fn()
|
||||
return await fn();
|
||||
} catch (err) {
|
||||
if (err.code === 'ERR_NETWORK' && attempt++ < retries) {
|
||||
sleep = attempt * attempt * delay;
|
||||
console.warn(`[ERR_NETWORK]: Attempt ${attempt}/${retries}${err.config ? ' [' + err.config.url + ']' : ''} sleep [${sleep}ms]`);
|
||||
await new Promise(resolve => setTimeout(resolve, sleep));
|
||||
console.warn(
|
||||
`[ERR_NETWORK]: Attempt ${attempt}/${retries}${err.config ? ' [' + err.config.url + ']' : ''} sleep [${sleep}ms]`
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, sleep));
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,22 +1,20 @@
|
||||
import http from "http";
|
||||
import http2 from "http2";
|
||||
import stream from "stream";
|
||||
import getStream from "get-stream";
|
||||
import {Throttle} from "stream-throttle";
|
||||
import formidable from "formidable";
|
||||
import http from 'http';
|
||||
import http2 from 'http2';
|
||||
import stream from 'stream';
|
||||
import getStream from 'get-stream';
|
||||
import { Throttle } from 'stream-throttle';
|
||||
import formidable from 'formidable';
|
||||
import selfsigned from 'selfsigned';
|
||||
|
||||
|
||||
export const LOCAL_SERVER_URL = 'http://localhost:4444';
|
||||
|
||||
export const SERVER_HANDLER_STREAM_ECHO = (req, res) => req.pipe(res);
|
||||
|
||||
export const setTimeoutAsync = (ms) => new Promise(resolve=> setTimeout(resolve, ms));
|
||||
export const setTimeoutAsync = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||
|
||||
const certificate = selfsigned.generate(null, { keySize: 2048 });
|
||||
|
||||
export const startHTTPServer = (handlerOrOptions, options) => {
|
||||
|
||||
const {
|
||||
handler,
|
||||
useBuffering = false,
|
||||
@ -26,45 +24,52 @@ export const startHTTPServer = (handlerOrOptions, options) => {
|
||||
useHTTP2,
|
||||
key = certificate.private,
|
||||
cert = certificate.cert,
|
||||
} =
|
||||
Object.assign(typeof handlerOrOptions === 'function' ? {
|
||||
handler: handlerOrOptions
|
||||
} : handlerOrOptions || {}, options);
|
||||
} = Object.assign(
|
||||
typeof handlerOrOptions === 'function'
|
||||
? {
|
||||
handler: handlerOrOptions,
|
||||
}
|
||||
: handlerOrOptions || {},
|
||||
options
|
||||
);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const serverHandler = handler || async function (req, res) {
|
||||
try {
|
||||
req.headers['content-length'] && res.setHeader('content-length', req.headers['content-length']);
|
||||
const serverHandler =
|
||||
handler ||
|
||||
async function (req, res) {
|
||||
try {
|
||||
req.headers['content-length'] &&
|
||||
res.setHeader('content-length', req.headers['content-length']);
|
||||
|
||||
let dataStream = req;
|
||||
let dataStream = req;
|
||||
|
||||
if (useBuffering) {
|
||||
dataStream = stream.Readable.from(await getStream(req));
|
||||
if (useBuffering) {
|
||||
dataStream = stream.Readable.from(await getStream(req));
|
||||
}
|
||||
|
||||
let streams = [dataStream];
|
||||
|
||||
if (rate) {
|
||||
streams.push(new Throttle({ rate }));
|
||||
}
|
||||
|
||||
streams.push(res);
|
||||
|
||||
stream.pipeline(streams, (err) => {
|
||||
err && console.log('Server warning: ' + err.message);
|
||||
});
|
||||
} catch (err) {
|
||||
console.warn('HTTP server error:', err);
|
||||
}
|
||||
};
|
||||
|
||||
let streams = [dataStream];
|
||||
|
||||
if (rate) {
|
||||
streams.push(new Throttle({rate}))
|
||||
}
|
||||
|
||||
streams.push(res);
|
||||
|
||||
stream.pipeline(streams, (err) => {
|
||||
err && console.log('Server warning: ' + err.message)
|
||||
});
|
||||
} catch (err){
|
||||
console.warn('HTTP server error:', err);
|
||||
}
|
||||
}
|
||||
|
||||
const server = useHTTP2 ?
|
||||
http2.createSecureServer({key, cert} , serverHandler) :
|
||||
http.createServer(serverHandler);
|
||||
const server = useHTTP2
|
||||
? http2.createSecureServer({ key, cert }, serverHandler)
|
||||
: http.createServer(serverHandler);
|
||||
|
||||
const sessions = new Set();
|
||||
|
||||
if(useHTTP2) {
|
||||
if (useHTTP2) {
|
||||
server.on('session', (session) => {
|
||||
sessions.add(session);
|
||||
|
||||
@ -77,7 +82,7 @@ export const startHTTPServer = (handlerOrOptions, options) => {
|
||||
for (const session of sessions) {
|
||||
session.destroy();
|
||||
}
|
||||
}
|
||||
};
|
||||
} else {
|
||||
server.keepAliveTimeout = keepAlive;
|
||||
}
|
||||
@ -85,9 +90,8 @@ export const startHTTPServer = (handlerOrOptions, options) => {
|
||||
server.listen(port, function (err) {
|
||||
err ? reject(err) : resolve(this);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const stopHTTPServer = async (server, timeout = 10000) => {
|
||||
if (server) {
|
||||
@ -99,9 +103,9 @@ export const stopHTTPServer = async (server, timeout = 10000) => {
|
||||
server.closeAllSessions();
|
||||
}
|
||||
|
||||
await Promise.race([new Promise(resolve => server.close(resolve)), setTimeoutAsync(timeout)]);
|
||||
await Promise.race([new Promise((resolve) => server.close(resolve)), setTimeoutAsync(timeout)]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const handleFormData = (req) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
@ -112,52 +116,55 @@ export const handleFormData = (req) => {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
resolve({fields, files});
|
||||
resolve({ fields, files });
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const nodeVersion = process.versions.node.split('.').map(v => parseInt(v, 10));
|
||||
export const nodeVersion = process.versions.node.split('.').map((v) => parseInt(v, 10));
|
||||
|
||||
export const generateReadable = (length = 1024 * 1024, chunkSize = 10 * 1024, sleep = 50) => {
|
||||
return stream.Readable.from(async function* (){
|
||||
let dataLength = 0;
|
||||
return stream.Readable.from(
|
||||
(async function* () {
|
||||
let dataLength = 0;
|
||||
|
||||
while(dataLength < length) {
|
||||
const leftBytes = length - dataLength;
|
||||
while (dataLength < length) {
|
||||
const leftBytes = length - dataLength;
|
||||
|
||||
const chunk = Buffer.alloc(leftBytes > chunkSize? chunkSize : leftBytes);
|
||||
const chunk = Buffer.alloc(leftBytes > chunkSize ? chunkSize : leftBytes);
|
||||
|
||||
dataLength += chunk.length;
|
||||
dataLength += chunk.length;
|
||||
|
||||
yield chunk;
|
||||
yield chunk;
|
||||
|
||||
if (sleep) {
|
||||
await setTimeoutAsync(sleep);
|
||||
if (sleep) {
|
||||
await setTimeoutAsync(sleep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}());
|
||||
}
|
||||
})()
|
||||
);
|
||||
};
|
||||
|
||||
export const makeReadableStream = (chunk = 'chunk', n = 10, timeout = 100) => {
|
||||
return new ReadableStream({
|
||||
return new ReadableStream(
|
||||
{
|
||||
async pull(controller) {
|
||||
await setTimeoutAsync(timeout);
|
||||
n-- ? controller.enqueue(chunk) : controller.close();
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
highWaterMark: 1
|
||||
highWaterMark: 1,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
export const makeEchoStream = (echo) => new WritableStream({
|
||||
write(chunk) {
|
||||
echo && console.log(`Echo chunk`, chunk);
|
||||
}
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
export const makeEchoStream = (echo) =>
|
||||
new WritableStream({
|
||||
write(chunk) {
|
||||
echo && console.log(`Echo chunk`, chunk);
|
||||
},
|
||||
});
|
||||
|
||||
export const startTestServer = async (port) => {
|
||||
const handler = async (req) => {
|
||||
@ -171,11 +178,11 @@ export const startTestServer = async (port) => {
|
||||
params,
|
||||
method: req.method,
|
||||
headers: req.headers,
|
||||
}
|
||||
};
|
||||
|
||||
const contentType = req.headers['content-type'] || '';
|
||||
|
||||
const {delay = 0} = params;
|
||||
const { delay = 0 } = params;
|
||||
|
||||
if (+delay) {
|
||||
await setTimeoutAsync(+delay);
|
||||
@ -185,44 +192,46 @@ export const startTestServer = async (port) => {
|
||||
case '/echo/json':
|
||||
default:
|
||||
if (contentType.startsWith('multipart/')) {
|
||||
let {fields, files} = await handleFormData(req);
|
||||
let { fields, files } = await handleFormData(req);
|
||||
response.form = fields;
|
||||
response.files = files;
|
||||
} else {
|
||||
response.body = (await getStream(req, {encoding: 'buffer'})).toString('hex');
|
||||
response.body = (await getStream(req, { encoding: 'buffer' })).toString('hex');
|
||||
}
|
||||
|
||||
return {
|
||||
body: response
|
||||
}
|
||||
body: response,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
return await startHTTPServer((req, res) => {
|
||||
// Set CORS headers
|
||||
res.setHeader('Access-Control-Allow-Origin', `*`); // Allows all origins, or specify a domain like 'http://example.com'
|
||||
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // Allowed HTTP methods
|
||||
res.setHeader('Access-Control-Allow-Headers', '*'); // Allowed request headers
|
||||
res.setHeader('Access-Control-Max-Age', '86400'); // Cache preflight requests for 24 hours
|
||||
return await startHTTPServer(
|
||||
(req, res) => {
|
||||
// Set CORS headers
|
||||
res.setHeader('Access-Control-Allow-Origin', `*`); // Allows all origins, or specify a domain like 'http://example.com'
|
||||
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // Allowed HTTP methods
|
||||
res.setHeader('Access-Control-Allow-Headers', '*'); // Allowed request headers
|
||||
res.setHeader('Access-Control-Max-Age', '86400'); // Cache preflight requests for 24 hours
|
||||
|
||||
// Handle preflight requests (OPTIONS method)
|
||||
if (req.method === 'OPTIONS') {
|
||||
res.writeHead(204); // No content
|
||||
res.end();
|
||||
return;
|
||||
}
|
||||
// Handle preflight requests (OPTIONS method)
|
||||
if (req.method === 'OPTIONS') {
|
||||
res.writeHead(204); // No content
|
||||
res.end();
|
||||
return;
|
||||
}
|
||||
|
||||
Promise.resolve(handler(req, res)).then(response=>{
|
||||
const {status = 200, headers = {}, body} = response || {};
|
||||
Promise.resolve(handler(req, res)).then((response) => {
|
||||
const { status = 200, headers = {}, body } = response || {};
|
||||
|
||||
res.statusCode = status;
|
||||
|
||||
res.statusCode = status;
|
||||
Object.entries(headers).forEach((header, value) => {
|
||||
res.setHeader(header, value);
|
||||
});
|
||||
|
||||
Object.entries(headers).forEach((header, value) => {
|
||||
res.setHeader(header, value);
|
||||
res.end(JSON.stringify(body, null, 2));
|
||||
});
|
||||
|
||||
res.end(JSON.stringify(body, null, 2))
|
||||
})
|
||||
}, {port});
|
||||
}
|
||||
},
|
||||
{ port }
|
||||
);
|
||||
};
|
||||
|
||||
@ -1,21 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
An alert should be shown with the <code>{"name":"axios"}</code>
|
||||
An alert should be shown with the <code>{"name":"axios"}</code>
|
||||
|
||||
<script src="promise.js"></script>
|
||||
<script src="../../dist/axios.js"></script>
|
||||
<script>
|
||||
axios.get('./fixture.json').then(function(response) {
|
||||
console.log(response);
|
||||
alert(JSON.stringify(response.data));
|
||||
alert('response headers:\n\n' + JSON.stringify(response.headers));
|
||||
}, function(err) { console.log(err) });
|
||||
</script>
|
||||
<script src="promise.js"></script>
|
||||
<script src="../../dist/axios.js"></script>
|
||||
<script>
|
||||
axios.get('./fixture.json').then(function (response) {
|
||||
console.log(response);
|
||||
alert(JSON.stringify(response.data));
|
||||
alert('response headers:\n\n' + JSON.stringify(response.headers));
|
||||
}, function (err) { console.log(err) });
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,20 +1,23 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
An alert should be shown with <code>{"status":"ok"}</code>
|
||||
An alert should be shown with <code>{"status":"ok"}</code>
|
||||
|
||||
<script src="promise.js"></script>
|
||||
<script src="../../dist/axios.js"></script>
|
||||
<script>
|
||||
axios.get('http://cors-test.appspot.com/test').then(function(response) {
|
||||
alert(JSON.stringify(response.data));
|
||||
alert('response headers:\n\n' + JSON.stringify(response.headers));
|
||||
}, function(err) { console.log(err) });
|
||||
</script>
|
||||
<script src="promise.js"></script>
|
||||
<script src="../../dist/axios.js"></script>
|
||||
<script>
|
||||
axios.get('http://cors-test.appspot.com/test').then(function (response) {
|
||||
alert(JSON.stringify(response.data));
|
||||
alert('response headers:\n\n' + JSON.stringify(response.headers));
|
||||
}, function (err) { console.log(err) });
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,37 +1,40 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
See your console
|
||||
<script src="../../dist/axios.js"></script>
|
||||
<script>
|
||||
const data = new Int8Array(10 * 1024 * 1024);
|
||||
See your console
|
||||
<script src="../../dist/axios.js"></script>
|
||||
<script>
|
||||
const data = new Int8Array(10 * 1024 * 1024);
|
||||
|
||||
data.fill(123);
|
||||
data.fill(123);
|
||||
|
||||
console.log('Starting...');
|
||||
console.log('Starting...');
|
||||
|
||||
(async() => {
|
||||
await axios.post('http://httpbin.org/post', data, {
|
||||
adapter: 'xhr',
|
||||
onUploadProgress: (e) => console.log('xhr upload', e),
|
||||
onDownloadProgress: (e) => console.log('xhr download', e),
|
||||
}).then(data=> {
|
||||
console.log(`Done: `, data);
|
||||
}).catch(e => console.warn('xhr', e));
|
||||
(async () => {
|
||||
await axios.post('http://httpbin.org/post', data, {
|
||||
adapter: 'xhr',
|
||||
onUploadProgress: (e) => console.log('xhr upload', e),
|
||||
onDownloadProgress: (e) => console.log('xhr download', e),
|
||||
}).then(data => {
|
||||
console.log(`Done: `, data);
|
||||
}).catch(e => console.warn('xhr', e));
|
||||
|
||||
await axios.post('https://httpbin.org/post', data, {
|
||||
adapter: 'fetch',
|
||||
onUploadProgress: (e) => console.log('fetch upload', e),
|
||||
onDownloadProgress: (e) => console.log('fetch download', e)
|
||||
}).then(data=> {
|
||||
console.log(`Done: `, data);
|
||||
}).catch(e => console.warn('fetch', e));
|
||||
})();
|
||||
await axios.post('https://httpbin.org/post', data, {
|
||||
adapter: 'fetch',
|
||||
onUploadProgress: (e) => console.log('fetch upload', e),
|
||||
onDownloadProgress: (e) => console.log('fetch download', e)
|
||||
}).then(data => {
|
||||
console.log(`Done: `, data);
|
||||
}).catch(e => console.warn('fetch', e));
|
||||
})();
|
||||
|
||||
</script>
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user