2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-20 20:00:40 +03: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:
Jay
2026-02-14 16:59:48 +02:00
committed by GitHub
parent 335b79ffb6
commit ef3711d1b3
181 changed files with 9093 additions and 7461 deletions
+13 -12
View File
@@ -1,15 +1,16 @@
module.exports = { module.exports = {
"env": { env: {
"browser": true, browser: true,
"es2018": true, es2018: true,
"node": true node: true,
}, },
"extends": "eslint:recommended", extends: 'eslint:recommended',
"parserOptions": { parserOptions: {
"ecmaVersion": 2018, ecmaVersion: 2018,
"sourceType": "module" sourceType: 'module',
}, },
"rules": { rules: {
"no-cond-assign": 0 'no-cond-assign': 0,
} 'no-unused-vars': ['error', { args: 'none', varsIgnorePattern: '^_' }],
} },
};
+20
View 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
View File
@@ -0,0 +1,7 @@
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
}
+206 -206
View File
@@ -31,38 +31,38 @@
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/175160345?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ashvin Tiwari](https://github.com/ashvin2005 "+1752/-4 (#7218 #7218 )") - <img src="https://avatars.githubusercontent.com/u/175160345?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ashvin Tiwari](https://github.com/ashvin2005 '+1752/-4 (#7218 #7218 )')
- <img src="https://avatars.githubusercontent.com/u/71729144?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Nikunj Mochi](https://github.com/mochinikunj "+940/-12 (#7294 #7294 )") - <img src="https://avatars.githubusercontent.com/u/71729144?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Nikunj Mochi](https://github.com/mochinikunj '+940/-12 (#7294 #7294 )')
- <img src="https://avatars.githubusercontent.com/u/128113546?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh "+544/-102 (#7169 #7185 )") - <img src="https://avatars.githubusercontent.com/u/128113546?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh '+544/-102 (#7169 #7185 )')
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [jasonsaayman](https://github.com/jasonsaayman "+317/-73 (#7334 #7298 )") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [jasonsaayman](https://github.com/jasonsaayman '+317/-73 (#7334 #7298 )')
- <img src="https://avatars.githubusercontent.com/u/377911?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Julian Dax](https://github.com/brodo "+99/-120 (#5558 )") - <img src="https://avatars.githubusercontent.com/u/377911?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Julian Dax](https://github.com/brodo '+99/-120 (#5558 )')
- <img src="https://avatars.githubusercontent.com/u/184285082?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Akash Dhar Dubey](https://github.com/AKASHDHARDUBEY "+167/-0 (#7287 #7288 )") - <img src="https://avatars.githubusercontent.com/u/184285082?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Madhumita](https://github.com/madhumitaaa "+20/-68 (#7198 )") - <img src="https://avatars.githubusercontent.com/u/145687605?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Madhumita](https://github.com/madhumitaaa '+20/-68 (#7198 )')
- <img src="https://avatars.githubusercontent.com/u/24915252?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Tackoil](https://github.com/Tackoil "+80/-2 (#6269 )") - <img src="https://avatars.githubusercontent.com/u/24915252?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Tackoil](https://github.com/Tackoil '+80/-2 (#6269 )')
- <img src="https://avatars.githubusercontent.com/u/145078271?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon "+41/-41 (#6324 #6315 )") - <img src="https://avatars.githubusercontent.com/u/145078271?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon '+41/-41 (#6324 #6315 )')
- <img src="https://avatars.githubusercontent.com/u/184138832?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Rudransh](https://github.com/Rudrxxx "+71/-2 (#7257 )") - <img src="https://avatars.githubusercontent.com/u/184138832?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Rudransh](https://github.com/Rudrxxx '+71/-2 (#7257 )')
- <img src="https://avatars.githubusercontent.com/u/146366930?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [WuMingDao](https://github.com/WuMingDao "+36/-36 (#7215 )") - <img src="https://avatars.githubusercontent.com/u/146366930?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [WuMingDao](https://github.com/WuMingDao '+36/-36 (#7215 )')
- <img src="https://avatars.githubusercontent.com/u/46827243?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [codenomnom](https://github.com/codenomnom "+70/-0 (#7201 #7201 )") - <img src="https://avatars.githubusercontent.com/u/46827243?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [codenomnom](https://github.com/codenomnom '+70/-0 (#7201 #7201 )')
- <img src="https://avatars.githubusercontent.com/u/189698992?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Nandan Acharya](https://github.com/Nandann018-ux "+60/-10 (#7272 )") - <img src="https://avatars.githubusercontent.com/u/189698992?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Nandan Acharya](https://github.com/Nandann018-ux '+60/-10 (#7272 )')
- <img src="https://avatars.githubusercontent.com/u/7225168?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Eric Dubé](https://github.com/KernelDeimos "+22/-40 (#7042 )") - <img src="https://avatars.githubusercontent.com/u/7225168?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Eric Dubé](https://github.com/KernelDeimos '+22/-40 (#7042 )')
- <img src="https://avatars.githubusercontent.com/u/915045?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Tibor Pilz](https://github.com/tiborpilz "+40/-4 (#5551 )") - <img src="https://avatars.githubusercontent.com/u/915045?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Tibor Pilz](https://github.com/tiborpilz '+40/-4 (#5551 )')
- <img src="https://avatars.githubusercontent.com/u/23138717?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Gabriel Quaresma](https://github.com/joaoGabriel55 "+31/-4 (#6314 )") - <img src="https://avatars.githubusercontent.com/u/23138717?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Gabriel Quaresma](https://github.com/joaoGabriel55 '+31/-4 (#6314 )')
- <img src="https://avatars.githubusercontent.com/u/21505?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Turadg Aleahmad](https://github.com/turadg "+23/-6 (#6265 )") - <img src="https://avatars.githubusercontent.com/u/21505?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Turadg Aleahmad](https://github.com/turadg '+23/-6 (#6265 )')
- <img src="https://avatars.githubusercontent.com/u/4273631?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [JohnTitor](https://github.com/kiritosan "+14/-14 (#6155 )") - <img src="https://avatars.githubusercontent.com/u/4273631?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [JohnTitor](https://github.com/kiritosan '+14/-14 (#6155 )')
- <img src="https://avatars.githubusercontent.com/u/39668736?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [rohit miryala](https://github.com/rohitmiryala "+22/-0 (#7250 )") - <img src="https://avatars.githubusercontent.com/u/39668736?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [rohit miryala](https://github.com/rohitmiryala '+22/-0 (#7250 )')
- <img src="https://avatars.githubusercontent.com/u/30316250?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Wilson Mun](https://github.com/wmundev "+20/-0 (#6053 )") - <img src="https://avatars.githubusercontent.com/u/30316250?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Wilson Mun](https://github.com/wmundev '+20/-0 (#6053 )')
- <img src="https://avatars.githubusercontent.com/u/184506226?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [techcodie](https://github.com/techcodie "+7/-7 (#7236 )") - <img src="https://avatars.githubusercontent.com/u/184506226?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [techcodie](https://github.com/techcodie '+7/-7 (#7236 )')
- <img src="https://avatars.githubusercontent.com/u/187598667?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ved Vadnere](https://github.com/Archis009 "+5/-6 (#7283 )") - <img src="https://avatars.githubusercontent.com/u/187598667?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ved Vadnere](https://github.com/Archis009 '+5/-6 (#7283 )')
- <img src="https://avatars.githubusercontent.com/u/115612815?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [svihpinc](https://github.com/svihpinc "+5/-3 (#6134 )") - <img src="https://avatars.githubusercontent.com/u/115612815?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [svihpinc](https://github.com/svihpinc '+5/-3 (#6134 )')
- <img src="https://avatars.githubusercontent.com/u/123884782?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [SANDESH LENDVE](https://github.com/mrsandy1965 "+3/-3 (#7246 )") - <img src="https://avatars.githubusercontent.com/u/123884782?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [SANDESH LENDVE](https://github.com/mrsandy1965 '+3/-3 (#7246 )')
- <img src="https://avatars.githubusercontent.com/u/12529395?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Lubos](https://github.com/mrlubos "+5/-1 (#7312 )") - <img src="https://avatars.githubusercontent.com/u/12529395?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Lubos](https://github.com/mrlubos '+5/-1 (#7312 )')
- <img src="https://avatars.githubusercontent.com/u/709451?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jarred Sumner](https://github.com/Jarred-Sumner "+5/-1 (#5754 )") - <img src="https://avatars.githubusercontent.com/u/709451?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jarred Sumner](https://github.com/Jarred-Sumner '+5/-1 (#5754 )')
- <img src="https://avatars.githubusercontent.com/u/17907922?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Adam Hines](https://github.com/thebanjomatic "+2/-1 (#5756 )") - <img src="https://avatars.githubusercontent.com/u/17907922?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Adam Hines](https://github.com/thebanjomatic '+2/-1 (#5756 )')
- <img src="https://avatars.githubusercontent.com/u/177472603?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Subhan Kumar Rai](https://github.com/Subhan030 "+2/-1 (#7256 )") - <img src="https://avatars.githubusercontent.com/u/177472603?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Subhan Kumar Rai](https://github.com/Subhan030 '+2/-1 (#7256 )')
- <img src="https://avatars.githubusercontent.com/u/6473925?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Joseph Frazier](https://github.com/josephfrazier "+1/-1 (#7311 )") - <img src="https://avatars.githubusercontent.com/u/6473925?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Joseph Frazier](https://github.com/josephfrazier '+1/-1 (#7311 )')
- <img src="https://avatars.githubusercontent.com/u/184906930?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [KT0803](https://github.com/KT0803 "+0/-2 (#7229 )") - <img src="https://avatars.githubusercontent.com/u/184906930?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [KT0803](https://github.com/KT0803 '+0/-2 (#7229 )')
- <img src="https://avatars.githubusercontent.com/u/6703955?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Albie](https://github.com/AlbertoSadoc "+1/-1 (#5560 )") - <img src="https://avatars.githubusercontent.com/u/6703955?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Albie](https://github.com/AlbertoSadoc '+1/-1 (#5560 )')
- <img src="https://avatars.githubusercontent.com/u/9452325?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jake Hayes](https://github.com/thejayhaykid "+1/-0 (#5999 )") - <img src="https://avatars.githubusercontent.com/u/9452325?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+28/-9 (#7206 #7202 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+28/-9 (#7206 #7202 )')
- <img src="https://avatars.githubusercontent.com/u/1174718?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Kasper Isager Dalsgarð](https://github.com/kasperisager "+9/-9 (#7196 )") - <img src="https://avatars.githubusercontent.com/u/1174718?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/128113546?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh "+220/-111 (#7173 )") - <img src="https://avatars.githubusercontent.com/u/128113546?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh '+220/-111 (#7173 )')
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+18/-1 (#7193 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+794/-180 (#7186 #7150 #7039 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+24/-509 (#7032 )") - <img src="https://avatars.githubusercontent.com/u/189505037?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 '+24/-509 (#7032 )')
- <img src="https://avatars.githubusercontent.com/u/195581631?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Aviraj2929](https://github.com/Aviraj2929 "+211/-93 (#7136 #7135 #7134 #7112 )") - <img src="https://avatars.githubusercontent.com/u/195581631?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [prasoon patel](https://github.com/Prasoon52 "+167/-6 (#7099 )") - <img src="https://avatars.githubusercontent.com/u/181717941?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [prasoon patel](https://github.com/Prasoon52 '+167/-6 (#7099 )')
- <img src="https://avatars.githubusercontent.com/u/141911040?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Samyak Dandge](https://github.com/Samy-in "+134/-0 (#7171 )") - <img src="https://avatars.githubusercontent.com/u/141911040?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Samyak Dandge](https://github.com/Samy-in '+134/-0 (#7171 )')
- <img src="https://avatars.githubusercontent.com/u/128113546?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh "+53/-56 (#7170 )") - <img src="https://avatars.githubusercontent.com/u/128113546?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Anchal Singh](https://github.com/imanchalsingh '+53/-56 (#7170 )')
- <img src="https://avatars.githubusercontent.com/u/146073621?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Rahul Kumar](https://github.com/jaiyankargupta "+28/-28 (#7073 )") - <img src="https://avatars.githubusercontent.com/u/146073621?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Rahul Kumar](https://github.com/jaiyankargupta '+28/-28 (#7073 )')
- <img src="https://avatars.githubusercontent.com/u/148716794?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Amit Verma](https://github.com/Amitverma0509 "+24/-13 (#7129 )") - <img src="https://avatars.githubusercontent.com/u/148716794?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Amit Verma](https://github.com/Amitverma0509 '+24/-13 (#7129 )')
- <img src="https://avatars.githubusercontent.com/u/141427581?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Abhishek3880](https://github.com/abhishekmaniy "+23/-4 (#7119 #7117 #7116 #7115 )") - <img src="https://avatars.githubusercontent.com/u/141427581?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dhvani Maktuporia](https://github.com/Dhvani365 "+14/-5 (#7175 )") - <img src="https://avatars.githubusercontent.com/u/91522146?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dhvani Maktuporia](https://github.com/Dhvani365 '+14/-5 (#7175 )')
- <img src="https://avatars.githubusercontent.com/u/41838423?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Usama Ayoub](https://github.com/sam3690 "+4/-4 (#7133 )") - <img src="https://avatars.githubusercontent.com/u/41838423?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Usama Ayoub](https://github.com/sam3690 '+4/-4 (#7133 )')
- <img src="https://avatars.githubusercontent.com/u/79366821?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [ikuy1203](https://github.com/ikuy1203 "+3/-3 (#7166 )") - <img src="https://avatars.githubusercontent.com/u/79366821?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [ikuy1203](https://github.com/ikuy1203 '+3/-3 (#7166 )')
- <img src="https://avatars.githubusercontent.com/u/74639234?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Nikhil Simon Toppo](https://github.com/Kirito-Excalibur "+1/-1 (#7172 )") - <img src="https://avatars.githubusercontent.com/u/74639234?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jane Wangari](https://github.com/Wangarijane "+1/-1 (#7155 )") - <img src="https://avatars.githubusercontent.com/u/200562195?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jane Wangari](https://github.com/Wangarijane '+1/-1 (#7155 )')
- <img src="https://avatars.githubusercontent.com/u/78318848?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Supakorn Ieamgomol](https://github.com/Supakornn "+1/-1 (#7065 )") - <img src="https://avatars.githubusercontent.com/u/78318848?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Supakorn Ieamgomol](https://github.com/Supakornn '+1/-1 (#7065 )')
- <img src="https://avatars.githubusercontent.com/u/134518?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Kian-Meng Ang](https://github.com/kianmeng "+1/-1 (#7046 )") - <img src="https://avatars.githubusercontent.com/u/134518?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Kian-Meng Ang](https://github.com/kianmeng '+1/-1 (#7046 )')
- <img src="https://avatars.githubusercontent.com/u/13148112?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [UTSUMI Keiji](https://github.com/k-utsumi "+1/-1 (#7037 )") - <img src="https://avatars.githubusercontent.com/u/13148112?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+247/-16 (#7030 #7022 #7024 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+2/-6 (#7028 #7029 )") - <img src="https://avatars.githubusercontent.com/u/189505037?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+10/-4 (#7020 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+132/-16760 (#7002 #5926 #6782 )") - <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+4263/-293 (#7006 #7003 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+4263/-293 (#7006 #7003 )')
- <img src="https://avatars.githubusercontent.com/u/53833811?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [khani](https://github.com/mkhani01 "+111/-15 (#6982 )") - <img src="https://avatars.githubusercontent.com/u/53833811?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [khani](https://github.com/mkhani01 '+111/-15 (#6982 )')
- <img src="https://avatars.githubusercontent.com/u/7712804?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ameer Assadi](https://github.com/AmeerAssadi "+123/-0 (#7011 )") - <img src="https://avatars.githubusercontent.com/u/7712804?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ameer Assadi](https://github.com/AmeerAssadi '+123/-0 (#7011 )')
- <img src="https://avatars.githubusercontent.com/u/70265727?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Emiedonmokumo Dick-Boro](https://github.com/emiedonmokumo "+55/-35 (#6998 )") - <img src="https://avatars.githubusercontent.com/u/70265727?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Emiedonmokumo Dick-Boro](https://github.com/emiedonmokumo '+55/-35 (#6998 )')
- <img src="https://avatars.githubusercontent.com/u/47859767?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Zeroday BYTE](https://github.com/opsysdebug "+8/-8 (#6980 )") - <img src="https://avatars.githubusercontent.com/u/47859767?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Zeroday BYTE](https://github.com/opsysdebug '+8/-8 (#6980 )')
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jason Saayman](https://github.com/jasonsaayman "+7/-7 (#6985 #6985 )") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jason Saayman](https://github.com/jasonsaayman '+7/-7 (#6985 #6985 )')
- <img src="https://avatars.githubusercontent.com/u/13010755?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [최예찬](https://github.com/HealGaren "+5/-7 (#5715 )") - <img src="https://avatars.githubusercontent.com/u/13010755?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [최예찬](https://github.com/HealGaren '+5/-7 (#5715 )')
- <img src="https://avatars.githubusercontent.com/u/7002604?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Gligor Kotushevski](https://github.com/gligorkot "+3/-1 (#5627 )") - <img src="https://avatars.githubusercontent.com/u/7002604?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Gligor Kotushevski](https://github.com/gligorkot '+3/-1 (#5627 )')
- <img src="https://avatars.githubusercontent.com/u/15893?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Aleksandar Dimitrov](https://github.com/adimit "+2/-1 (#5595 )") - <img src="https://avatars.githubusercontent.com/u/15893?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12534341?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [izzy goldman](https://github.com/izzygld "+186/-93 (#6970 )") - <img src="https://avatars.githubusercontent.com/u/12534341?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [izzy goldman](https://github.com/izzygld '+186/-93 (#6970 )')
- <img src="https://avatars.githubusercontent.com/u/142807367?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Manish Sahani](https://github.com/manishsahanidev "+70/-0 (#6961 )") - <img src="https://avatars.githubusercontent.com/u/142807367?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Manish Sahani](https://github.com/manishsahanidev '+70/-0 (#6961 )')
- <img src="https://avatars.githubusercontent.com/u/189505037?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+12/-10 (#6938 #6939 )") - <img src="https://avatars.githubusercontent.com/u/189505037?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 '+12/-10 (#6938 #6939 )')
- <img src="https://avatars.githubusercontent.com/u/392612?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [James Nail](https://github.com/jrnail23 "+13/-2 (#6956 )") - <img src="https://avatars.githubusercontent.com/u/392612?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [James Nail](https://github.com/jrnail23 '+13/-2 (#6956 )')
- <img src="https://avatars.githubusercontent.com/u/163745239?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Tejaswi1305](https://github.com/Tejaswi1305 "+1/-1 (#6894 )") - <img src="https://avatars.githubusercontent.com/u/163745239?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+30/-19 (#6933 #6920 #6893 #6892 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 "+2/-6 (#6922 #6923 )") - <img src="https://avatars.githubusercontent.com/u/189505037?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Noritaka Kobayashi](https://github.com/noritaka1166 '+2/-6 (#6922 #6923 )')
- <img src="https://avatars.githubusercontent.com/u/48370490?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dimitrios Lazanas](https://github.com/dimitry-lzs "+4/-0 (#6917 )") - <img src="https://avatars.githubusercontent.com/u/48370490?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dimitrios Lazanas](https://github.com/dimitry-lzs '+4/-0 (#6917 )')
- <img src="https://avatars.githubusercontent.com/u/71047946?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Adrian Knapp](https://github.com/AdrianKnapp "+2/-2 (#6867 )") - <img src="https://avatars.githubusercontent.com/u/71047946?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Adrian Knapp](https://github.com/AdrianKnapp '+2/-2 (#6867 )')
- <img src="https://avatars.githubusercontent.com/u/16129206?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Howie Zhao](https://github.com/howiezhao "+3/-1 (#6872 )") - <img src="https://avatars.githubusercontent.com/u/16129206?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Howie Zhao](https://github.com/howiezhao '+3/-1 (#6872 )')
- <img src="https://avatars.githubusercontent.com/u/6788611?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Uhyeon Park](https://github.com/warpdev "+1/-1 (#6883 )") - <img src="https://avatars.githubusercontent.com/u/6788611?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Uhyeon Park](https://github.com/warpdev '+1/-1 (#6883 )')
- <img src="https://avatars.githubusercontent.com/u/20028934?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Sampo Silvennoinen](https://github.com/stscoundrel "+1/-1 (#6913 )") - <img src="https://avatars.githubusercontent.com/u/20028934?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+26/-1 ()") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+26/-1 ()')
- <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+21/-0 (#5707 )") - <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini '+21/-0 (#5707 )')
- <img src="https://avatars.githubusercontent.com/u/2500247?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [George Cheng](https://github.com/Gerhut "+3/-3 (#5096 )") - <img src="https://avatars.githubusercontent.com/u/2500247?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [George Cheng](https://github.com/Gerhut '+3/-3 (#5096 )')
- <img src="https://avatars.githubusercontent.com/u/30260221?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [FatahChan](https://github.com/FatahChan "+2/-2 (#6855 )") - <img src="https://avatars.githubusercontent.com/u/30260221?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [FatahChan](https://github.com/FatahChan '+2/-2 (#6855 )')
- <img src="https://avatars.githubusercontent.com/u/49002?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ionuț G. Stan](https://github.com/igstan "+1/-1 (#6661 )") - <img src="https://avatars.githubusercontent.com/u/49002?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/8029107?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Marc Hassan](https://github.com/mhassan1 "+5/-1 (#6833 )") - <img src="https://avatars.githubusercontent.com/u/8029107?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/3238291?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ashcon Partovi](https://github.com/Electroid "+6/-0 (#6811 )") - <img src="https://avatars.githubusercontent.com/u/3238291?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ashcon Partovi](https://github.com/Electroid '+6/-0 (#6811 )')
- <img src="https://avatars.githubusercontent.com/u/28559054?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [StefanBRas](https://github.com/StefanBRas "+4/-0 (#6818 )") - <img src="https://avatars.githubusercontent.com/u/28559054?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [StefanBRas](https://github.com/StefanBRas '+4/-0 (#6818 )')
- <img src="https://avatars.githubusercontent.com/u/8029107?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Marc Hassan](https://github.com/mhassan1 "+2/-2 (#6814 )") - <img src="https://avatars.githubusercontent.com/u/8029107?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/14166260?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Fasoro-Joseph Alexander](https://github.com/lexcorp16 "+1/-1 (#6810 )") - <img src="https://avatars.githubusercontent.com/u/14166260?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+51/-47 (#6789 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/7661715?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Toscano](https://github.com/GethosTheWalrus "+42/-8 (#6192 )") - <img src="https://avatars.githubusercontent.com/u/7661715?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Toscano](https://github.com/GethosTheWalrus '+42/-8 (#6192 )')
- <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+26/-3 (#6788 #6777 )") - <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini '+26/-3 (#6788 #6777 )')
- <img src="https://avatars.githubusercontent.com/u/72578270?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Naron](https://github.com/naronchen "+27/-0 (#5901 )") - <img src="https://avatars.githubusercontent.com/u/72578270?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Naron](https://github.com/naronchen '+27/-0 (#5901 )')
- <img src="https://avatars.githubusercontent.com/u/47430686?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [shravan || श्रvan](https://github.com/shravan20 "+7/-3 (#6116 )") - <img src="https://avatars.githubusercontent.com/u/47430686?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [shravan || श्रvan](https://github.com/shravan20 '+7/-3 (#6116 )')
- <img src="https://avatars.githubusercontent.com/u/145078271?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon "+0/-7 (#6312 )") - <img src="https://avatars.githubusercontent.com/u/145078271?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Justin Dhillon](https://github.com/justindhillon '+0/-7 (#6312 )')
- <img src="https://avatars.githubusercontent.com/u/30925732?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [yionr](https://github.com/yionr "+5/-1 (#6129 )") - <img src="https://avatars.githubusercontent.com/u/30925732?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [yionr](https://github.com/yionr '+5/-1 (#6129 )')
- <img src="https://avatars.githubusercontent.com/u/534166?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shin&#x27;ya Ueoka](https://github.com/ueokande "+3/-3 (#5935 )") - <img src="https://avatars.githubusercontent.com/u/534166?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shin&#x27;ya Ueoka](https://github.com/ueokande '+3/-3 (#5935 )')
- <img src="https://avatars.githubusercontent.com/u/33569?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dan Dascalescu](https://github.com/dandv "+3/-3 (#5908 #6757 )") - <img src="https://avatars.githubusercontent.com/u/33569?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dan Dascalescu](https://github.com/dandv '+3/-3 (#5908 #6757 )')
- <img src="https://avatars.githubusercontent.com/u/16476523?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Nitin Ramnani](https://github.com/NitinRamnani "+2/-2 (#5938 )") - <img src="https://avatars.githubusercontent.com/u/16476523?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Nitin Ramnani](https://github.com/NitinRamnani '+2/-2 (#5938 )')
- <img src="https://avatars.githubusercontent.com/u/152275799?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shay Molcho](https://github.com/shaymolcho "+2/-2 (#6770 )") - <img src="https://avatars.githubusercontent.com/u/152275799?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shay Molcho](https://github.com/shaymolcho '+2/-2 (#6770 )')
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+0/-3 (#6732 )") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+0/-3 (#6732 )')
- fancy45daddy - fancy45daddy
- <img src="https://avatars.githubusercontent.com/u/127725897?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Habip Akyol](https://github.com/habipakyol "+1/-1 (#6030 )") - <img src="https://avatars.githubusercontent.com/u/127725897?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Habip Akyol](https://github.com/habipakyol '+1/-1 (#6030 )')
- <img src="https://avatars.githubusercontent.com/u/54869395?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Bailey Lissington](https://github.com/llamington "+1/-1 (#6771 )") - <img src="https://avatars.githubusercontent.com/u/54869395?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Bailey Lissington](https://github.com/llamington '+1/-1 (#6771 )')
- <img src="https://avatars.githubusercontent.com/u/14969290?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Bernardo da Eira Duarte](https://github.com/bernardoduarte "+1/-1 (#6480 )") - <img src="https://avatars.githubusercontent.com/u/14969290?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shivam Batham](https://github.com/Shivam-Batham "+1/-1 (#5949 )") - <img src="https://avatars.githubusercontent.com/u/117800149?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shivam Batham](https://github.com/Shivam-Batham '+1/-1 (#5949 )')
- <img src="https://avatars.githubusercontent.com/u/67861627?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Lipin Kariappa](https://github.com/lipinnnnn "+1/-1 (#5936 )") - <img src="https://avatars.githubusercontent.com/u/67861627?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+596/-108 (#6729 )") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/779047?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Remco Haszing](https://github.com/remcohaszing "+108/-596 (#6218 )") - <img src="https://avatars.githubusercontent.com/u/779047?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Remco Haszing](https://github.com/remcohaszing '+108/-596 (#6218 )')
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+281/-19 (#6640 #6619 )") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+281/-19 (#6640 #6619 )')
- <img src="https://avatars.githubusercontent.com/u/140250471?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Aayush Yadav](https://github.com/aayushyadav020 "+124/-111 (#6617 )") - <img src="https://avatars.githubusercontent.com/u/140250471?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Aayush Yadav](https://github.com/aayushyadav020 '+124/-111 (#6617 )')
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+12/-65 (#6714 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+12/-65 (#6714 )')
- <img src="https://avatars.githubusercontent.com/u/479715?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ell Bradshaw](https://github.com/cincodenada "+29/-0 (#6489 )") - <img src="https://avatars.githubusercontent.com/u/479715?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ell Bradshaw](https://github.com/cincodenada '+29/-0 (#6489 )')
- <img src="https://avatars.githubusercontent.com/u/60218780?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Amit Saini](https://github.com/amitsainii "+13/-3 (#5237 )") - <img src="https://avatars.githubusercontent.com/u/60218780?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Amit Saini](https://github.com/amitsainii '+13/-3 (#5237 )')
- <img src="https://avatars.githubusercontent.com/u/19817867?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Tommaso Paulon](https://github.com/guuido "+14/-1 (#6680 )") - <img src="https://avatars.githubusercontent.com/u/19817867?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Tommaso Paulon](https://github.com/guuido '+14/-1 (#6680 )')
- <img src="https://avatars.githubusercontent.com/u/63336443?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Akki](https://github.com/Aakash-Rana "+5/-5 (#6668 )") - <img src="https://avatars.githubusercontent.com/u/63336443?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Akki](https://github.com/Aakash-Rana '+5/-5 (#6668 )')
- <img src="https://avatars.githubusercontent.com/u/20028934?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Sampo Silvennoinen](https://github.com/stscoundrel "+3/-3 (#6633 )") - <img src="https://avatars.githubusercontent.com/u/20028934?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Sampo Silvennoinen](https://github.com/stscoundrel '+3/-3 (#6633 )')
- <img src="https://avatars.githubusercontent.com/u/1174718?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Kasper Isager Dalsgarð](https://github.com/kasperisager "+2/-2 (#6634 )") - <img src="https://avatars.githubusercontent.com/u/1174718?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Kasper Isager Dalsgarð](https://github.com/kasperisager '+2/-2 (#6634 )')
- <img src="https://avatars.githubusercontent.com/u/3709715?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Christian Clauss](https://github.com/cclauss "+4/-0 (#6683 )") - <img src="https://avatars.githubusercontent.com/u/3709715?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Christian Clauss](https://github.com/cclauss '+4/-0 (#6683 )')
- <img src="https://avatars.githubusercontent.com/u/1639119?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Pavan Welihinda](https://github.com/pavan168 "+2/-2 (#5222 )") - <img src="https://avatars.githubusercontent.com/u/1639119?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Pavan Welihinda](https://github.com/pavan168 '+2/-2 (#5222 )')
- <img src="https://avatars.githubusercontent.com/u/5742900?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Taylor Flatt](https://github.com/taylorflatt "+2/-2 (#6615 )") - <img src="https://avatars.githubusercontent.com/u/5742900?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Taylor Flatt](https://github.com/taylorflatt '+2/-2 (#6615 )')
- <img src="https://avatars.githubusercontent.com/u/79452224?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Kenzo Wada](https://github.com/Kenzo-Wada "+2/-2 (#6608 )") - <img src="https://avatars.githubusercontent.com/u/79452224?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Kenzo Wada](https://github.com/Kenzo-Wada '+2/-2 (#6608 )')
- <img src="https://avatars.githubusercontent.com/u/50064240?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ngole Lawson](https://github.com/echelonnought "+3/-0 (#6644 )") - <img src="https://avatars.githubusercontent.com/u/50064240?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ngole Lawson](https://github.com/echelonnought '+3/-0 (#6644 )')
- <img src="https://avatars.githubusercontent.com/u/1262198?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Haven](https://github.com/Baoyx007 "+3/-0 (#6590 )") - <img src="https://avatars.githubusercontent.com/u/1262198?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Haven](https://github.com/Baoyx007 '+3/-0 (#6590 )')
- <img src="https://avatars.githubusercontent.com/u/149003676?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shrivali Dutt](https://github.com/shrivalidutt "+1/-1 (#6637 )") - <img src="https://avatars.githubusercontent.com/u/149003676?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Shrivali Dutt](https://github.com/shrivalidutt '+1/-1 (#6637 )')
- <img src="https://avatars.githubusercontent.com/u/1304290?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Henco Appel](https://github.com/hencoappel "+1/-1 (#6605 )") - <img src="https://avatars.githubusercontent.com/u/1304290?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/10539109?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Rishi556](https://github.com/Rishi556 "+39/-1 (#5731 )") - <img src="https://avatars.githubusercontent.com/u/10539109?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Rishi556](https://github.com/Rishi556 '+39/-1 (#5731 )')
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+27/-7 (#6584 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+98/-46 (#6582 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+98/-46 (#6582 )')
- <img src="https://avatars.githubusercontent.com/u/3534453?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jacques Germishuys](https://github.com/jacquesg "+5/-1 (#6524 )") - <img src="https://avatars.githubusercontent.com/u/3534453?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jacques Germishuys](https://github.com/jacquesg '+5/-1 (#6524 )')
- <img src="https://avatars.githubusercontent.com/u/53894505?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [kuroino721](https://github.com/kuroino721 "+3/-1 (#6575 )") - <img src="https://avatars.githubusercontent.com/u/53894505?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Antonin Bas](https://github.com/antoninbas "+6/-6 (#6572 )") - <img src="https://avatars.githubusercontent.com/u/2495809?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Antonin Bas](https://github.com/antoninbas '+6/-6 (#6572 )')
- <img src="https://avatars.githubusercontent.com/u/5406212?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Hans Otto Wirtz](https://github.com/hansottowirtz "+4/-1 (#6533 )") - <img src="https://avatars.githubusercontent.com/u/5406212?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/31389480?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Lev Pachmanov](https://github.com/levpachmanov "+47/-11 (#6543 )") - <img src="https://avatars.githubusercontent.com/u/31389480?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Lev Pachmanov](https://github.com/levpachmanov '+47/-11 (#6543 )')
- <img src="https://avatars.githubusercontent.com/u/41283691?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Đỗ Trọng Hải](https://github.com/hainenber "+49/-4 (#6539 )") - <img src="https://avatars.githubusercontent.com/u/41283691?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+211/-159 (#6518 #6519 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+211/-159 (#6518 #6519 )')
- <img src="https://avatars.githubusercontent.com/u/10867286?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Valerii Sidorenko](https://github.com/ValeraS "+3/-3 (#6515 )") - <img src="https://avatars.githubusercontent.com/u/10867286?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Valerii Sidorenko](https://github.com/ValeraS '+3/-3 (#6515 )')
- <img src="https://avatars.githubusercontent.com/u/8599535?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [prianYu](https://github.com/prianyu "+2/-2 (#6505 )") - <img src="https://avatars.githubusercontent.com/u/8599535?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+3/-3 (#6413 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+14/-9 (#6410 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+1015/-127 (#6371 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+1015/-127 (#6371 )')
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+30/-14 ()") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+30/-14 ()')
- <img src="https://avatars.githubusercontent.com/u/16711696?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Alexandre ABRIOUX](https://github.com/alexandre-abrioux "+56/-6 (#6362 )") - <img src="https://avatars.githubusercontent.com/u/16711696?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/16711696?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Alexandre ABRIOUX](https://github.com/alexandre-abrioux "+56/-6 (#6362 )") - <img src="https://avatars.githubusercontent.com/u/16711696?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Alexandre ABRIOUX](https://github.com/alexandre-abrioux '+56/-6 (#6362 )')
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+42/-17 (#6380 #6377 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) # [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+1015/-127 (#6371 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+1015/-127 (#6371 )')
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+30/-14 ()") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+4572/-3446 (#6238 )") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+4572/-3446 (#6238 )')
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+30/-0 (#6231 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+30/-0 (#6231 )')
- <img src="https://avatars.githubusercontent.com/u/68230846?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Mitchell](https://github.com/Creaous "+9/-9 (#6300 )") - <img src="https://avatars.githubusercontent.com/u/68230846?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Mitchell](https://github.com/Creaous '+9/-9 (#6300 )')
- <img src="https://avatars.githubusercontent.com/u/53797821?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Emmanuel](https://github.com/mannoeu "+2/-2 (#6196 )") - <img src="https://avatars.githubusercontent.com/u/53797821?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Emmanuel](https://github.com/mannoeu '+2/-2 (#6196 )')
- <img src="https://avatars.githubusercontent.com/u/44109284?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Lucas Keller](https://github.com/ljkeller "+3/-0 (#6194 )") - <img src="https://avatars.githubusercontent.com/u/44109284?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Lucas Keller](https://github.com/ljkeller '+3/-0 (#6194 )')
- <img src="https://avatars.githubusercontent.com/u/72791488?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Aditya Mogili](https://github.com/ADITYA-176 "+1/-1 ()") - <img src="https://avatars.githubusercontent.com/u/72791488?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Aditya Mogili](https://github.com/ADITYA-176 '+1/-1 ()')
- <img src="https://avatars.githubusercontent.com/u/46135319?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Miroslav Petrov](https://github.com/petrovmiroslav "+1/-1 (#6243 )") - <img src="https://avatars.githubusercontent.com/u/46135319?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+30/-26 (#6203 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+30/-26 (#6203 )')
- <img src="https://avatars.githubusercontent.com/u/73059627?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [zhoulixiang](https://github.com/zh-lx "+0/-3 (#6186 )") - <img src="https://avatars.githubusercontent.com/u/73059627?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/1186084?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ilya Priven](https://github.com/ikonst "+91/-8 (#5987 )") - <img src="https://avatars.githubusercontent.com/u/1186084?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ilya Priven](https://github.com/ikonst '+91/-8 (#5987 )')
- <img src="https://avatars.githubusercontent.com/u/1884246?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Zao Soula](https://github.com/zaosoula "+6/-6 (#5778 )") - <img src="https://avatars.githubusercontent.com/u/1884246?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+41/-6 (#6176 #6175 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+41/-6 (#6176 #6175 )')
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+6/-1 ()") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+34/-6 ()") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+34/-6 ()')
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+34/-3 (#6172 #6167 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+34/-3 (#6172 #6167 )')
- <img src="https://avatars.githubusercontent.com/u/1402060?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Guy Nesher](https://github.com/gnesher "+10/-10 (#6163 )") - <img src="https://avatars.githubusercontent.com/u/1402060?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman "+15/-6 (#6145 )") - <img src="https://avatars.githubusercontent.com/u/4814473?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jay](https://github.com/jasonsaayman '+15/-6 (#6145 )')
- <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini "+17/-2 (#6132 )") - <img src="https://avatars.githubusercontent.com/u/22686401?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Willian Agostini](https://github.com/WillianAgostini '+17/-2 (#6132 )')
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+3/-0 (#6084 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Ng Choon Khon (CK)](https://github.com/ckng0221 "+4/-4 (#6073 )") - <img src="https://avatars.githubusercontent.com/u/79681367?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Muhammad Noman](https://github.com/mnomanmemon "+2/-2 (#6048 )") - <img src="https://avatars.githubusercontent.com/u/9162827?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+432/-65 (#6059 #6056 #6055 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Fabian Meyer](https://github.com/meyfa "+5/-2 (#5835 )") - <img src="https://avatars.githubusercontent.com/u/3982806?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Fabian Meyer](https://github.com/meyfa '+5/-2 (#5835 )')
### PRs ### PRs
@@ -656,9 +656,9 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Valentin Panov](https://github.com/valentin-panov "+4/-4 (#6028 )") - <img src="https://avatars.githubusercontent.com/u/63700910?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Valentin Panov](https://github.com/valentin-panov '+4/-4 (#6028 )')
- <img src="https://avatars.githubusercontent.com/u/76877078?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Rinku Chaudhari](https://github.com/therealrinku "+1/-1 (#5889 )") - <img src="https://avatars.githubusercontent.com/u/76877078?v&#x3D;4&amp;s&#x3D;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) ## [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 ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+89/-18 (#5919 #5917 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+89/-18 (#5919 #5917 )')
- <img src="https://avatars.githubusercontent.com/u/110460234?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [David Dallas](https://github.com/DavidJDallas "+11/-5 ()") - <img src="https://avatars.githubusercontent.com/u/110460234?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [David Dallas](https://github.com/DavidJDallas '+11/-5 ()')
- <img src="https://avatars.githubusercontent.com/u/71556073?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Sean Sattler](https://github.com/fb-sean "+2/-8 ()") - <img src="https://avatars.githubusercontent.com/u/71556073?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Sean Sattler](https://github.com/fb-sean '+2/-8 ()')
- <img src="https://avatars.githubusercontent.com/u/4294069?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Mustafa Ateş Uzun](https://github.com/0o001 "+4/-4 ()") - <img src="https://avatars.githubusercontent.com/u/4294069?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Mustafa Ateş Uzun](https://github.com/0o001 '+4/-4 ()')
- <img src="https://avatars.githubusercontent.com/u/132928043?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Przemyslaw Motacki](https://github.com/sfc-gh-pmotacki "+2/-1 (#5892 )") - <img src="https://avatars.githubusercontent.com/u/132928043?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+1/-1 ()") - <img src="https://avatars.githubusercontent.com/u/5492927?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+1/-1 ()')
### PRs ### PRs
@@ -703,10 +703,10 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [夜葬](https://github.com/geekact "+42/-0 (#5324 )") - <img src="https://avatars.githubusercontent.com/u/102841186?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [夜葬](https://github.com/geekact '+42/-0 (#5324 )')
- <img src="https://avatars.githubusercontent.com/u/65978976?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jonathan Budiman](https://github.com/JBudiman00 "+30/-0 (#5788 )") - <img src="https://avatars.githubusercontent.com/u/65978976?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Jonathan Budiman](https://github.com/JBudiman00 '+30/-0 (#5788 )')
- <img src="https://avatars.githubusercontent.com/u/5492927?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+3/-5 (#5791 )") - <img src="https://avatars.githubusercontent.com/u/5492927?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+3/-5 (#5791 )')
### PRs ### PRs
@@ -735,9 +735,9 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Arthur Fiorette](https://github.com/arthurfiorette "+19/-19 (#5525 )") - <img src="https://avatars.githubusercontent.com/u/47537704?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Arthur Fiorette](https://github.com/arthurfiorette '+19/-19 (#5525 )')
- <img src="https://avatars.githubusercontent.com/u/43876655?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [PIYUSH NEGI](https://github.com/npiyush97 "+2/-18 (#5670 )") - <img src="https://avatars.githubusercontent.com/u/43876655?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [PIYUSH NEGI](https://github.com/npiyush97 '+2/-18 (#5670 )')
### PRs ### PRs
@@ -757,8 +757,8 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+48/-10 (#5665 #5661 #5663 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+2/-0 (#5445 )") - <img src="https://avatars.githubusercontent.com/u/5492927?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+2/-0 (#5445 )')
### PRs ### PRs
@@ -778,7 +778,7 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+28/-10 (#5633 #5584 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+28/-10 (#5633 #5584 )')
### PRs ### PRs
@@ -798,9 +798,9 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+38/-26 (#5564 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+38/-26 (#5564 )')
- <img src="https://avatars.githubusercontent.com/u/19550000?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [lcysgsg](https://github.com/lcysgsg "+4/-0 (#5548 )") - <img src="https://avatars.githubusercontent.com/u/19550000?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [lcysgsg](https://github.com/lcysgsg '+4/-0 (#5548 )')
- <img src="https://avatars.githubusercontent.com/u/5492927?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan "+3/-0 (#5444 )") - <img src="https://avatars.githubusercontent.com/u/5492927?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Michael Di Prisco](https://github.com/Cadienvan '+3/-0 (#5444 )')
### PRs ### PRs
@@ -821,8 +821,8 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+11/-7 (#5545 #5535 #5542 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [陈若枫](https://github.com/ruofee "+2/-2 (#5467 )") - <img src="https://avatars.githubusercontent.com/u/19842213?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [陈若枫](https://github.com/ruofee '+2/-2 (#5467 )')
### PRs ### PRs
@@ -842,7 +842,7 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+2/-1 (#5530 #5528 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+2/-1 (#5530 #5528 )')
### PRs ### PRs
@@ -862,7 +862,7 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+27/-8 (#5521 #5518 )") - <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+27/-8 (#5521 #5518 )')
### PRs ### PRs
@@ -886,8 +886,8 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- <img src="https://avatars.githubusercontent.com/u/12586868?v&#x3D;4&amp;s&#x3D;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/12586868?v&#x3D;4&amp;s&#x3D;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&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [ItsNotGoodName](https://github.com/ItsNotGoodName "+43/-2 (#5497 )") - <img src="https://avatars.githubusercontent.com/u/35015993?v&#x3D;4&amp;s&#x3D;18" alt="avatar" width="18"/> [ItsNotGoodName](https://github.com/ItsNotGoodName '+43/-2 (#5497 )')
### PRs ### PRs
@@ -907,7 +907,7 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+24/-9 (#5503 #5502 )") - ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+24/-9 (#5503 #5502 )')
### PRs ### PRs
@@ -926,8 +926,8 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+82/-54 (#5499 )") - ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+82/-54 (#5499 )')
- ![avatar](https://avatars.githubusercontent.com/u/20516159?v=4&s=16) [Elliot Ford](https://github.com/EFord36 "+1/-1 (#5462 )") - ![avatar](https://avatars.githubusercontent.com/u/20516159?v=4&s=16) [Elliot Ford](https://github.com/EFord36 '+1/-1 (#5462 )')
### PRs ### PRs
@@ -947,8 +947,8 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+242/-108 (#5486 #5482 )") - ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+242/-108 (#5486 #5482 )')
- ![avatar](https://avatars.githubusercontent.com/u/9430821?v=4&s=16) [Daniel Hillmann](https://github.com/hilleer "+1/-1 (#5478 )") - ![avatar](https://avatars.githubusercontent.com/u/9430821?v=4&s=16) [Daniel Hillmann](https://github.com/hilleer '+1/-1 (#5478 )')
### PRs ### PRs
@@ -967,7 +967,7 @@ This functionality is considered as a fix.
### Contributors to this release ### Contributors to this release
- ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS "+938/-442 (#5456 #5455 #5453 #5451 #5449 #5447 #5446 #5443 #5442 #5439 #5420 )") - ![avatar](https://avatars.githubusercontent.com/u/12586868?v=4&s=16) [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS '+938/-442 (#5456 #5455 #5453 #5451 #5449 #5447 #5446 #5443 #5442 #5439 #5420 )')
### PRs ### PRs
+2 -2
View File
@@ -5,7 +5,7 @@ Thank you to all the wonderful people who have contributed to axios!
## Core Team ## Core Team
- [Jay](https://github.com/jasonsaayman) - Lead Maintainer - [Jay](https://github.com/jasonsaayman) - Lead Maintainer
- [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS) - Core Contributor - [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS) - Core Contributor
- [Matt Zabriskie](https://github.com/mzabriskie) - Creator - [Matt Zabriskie](https://github.com/mzabriskie) - Creator
## Notable Contributors ## Notable Contributors
@@ -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!_
+59 -33
View File
@@ -1,7 +1,7 @@
import util from "util"; import util from 'util';
import cp from "child_process"; import cp from 'child_process';
import {parseVersion} from "./helpers/parser.js"; import { parseVersion } from './helpers/parser.js';
import githubAxios from "./githubAxios.js"; import githubAxios from './githubAxios.js';
import memoize from 'memoizee'; import memoize from 'memoizee';
const exec = util.promisify(cp.exec); const exec = util.promisify(cp.exec);
@@ -20,15 +20,19 @@ export default class GithubAPI {
this.owner = owner; this.owner = owner;
this.axios = githubAxios.create({ this.axios = githubAxios.create({
baseURL: `https://api.github.com/repos/${this.owner}/${this.repo}/`, baseURL: `https://api.github.com/repos/${this.owner}/${this.repo}/`,
}) });
} }
async createComment(issue, body) { 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} = {}) { 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; return (
await this.axios.get(`/issues/${issue}/comments`, {
params: { direction: desc ? 'desc' : 'asc', per_page, page },
})
).data;
} }
async getComment(id) { async getComment(id) {
@@ -36,11 +40,11 @@ export default class GithubAPI {
} }
async updateComment(id, body) { 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) { 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) { async getUser(user) {
@@ -51,7 +55,7 @@ export default class GithubAPI {
try { try {
return (await this.axios.get(`/collaborators/${user}`)).status === 204; return (await this.axios.get(`/collaborators/${user}`)).status === 204;
} catch (e) { } catch (e) {
// Do nothing
} }
} }
@@ -67,8 +71,19 @@ export default class GithubAPI {
return (await this.axios.get(`/pulls/${issue}`)).data; return (await this.axios.get(`/pulls/${issue}`)).data;
} }
async getIssues({state= 'open', labels, sort = 'created', desc = false, per_page = 100, page = 1}) { async getIssues({
return (await this.axios.get(`/issues`, {params: {state, labels, sort, direction: desc ? 'desc' : 'asc', per_page, page}})).data; 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) { async updateIssue(issue, data) {
@@ -77,55 +92,66 @@ export default class GithubAPI {
async closeIssue(issue) { async closeIssue(issue) {
return this.updateIssue(issue, { return this.updateIssue(issue, {
state: "closed" state: 'closed',
}) });
} }
async getReleases({per_page = 30, page= 1} = {}) { async getReleases({ per_page = 30, page = 1 } = {}) {
return (await this.axios.get(`/releases`, {params: {per_page, page}})).data; return (await this.axios.get(`/releases`, { params: { per_page, page } })).data;
} }
async getRelease(release = 'latest') { 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} = {}) { async getTags({ per_page = 30, page = 1 } = {}) {
return (await this.axios.get(`/tags`, {params: {per_page, page}})).data; return (await this.axios.get(`/tags`, { params: { per_page, page } })).data;
} }
async reopenIssue(issue) { async reopenIssue(issue) {
return this.updateIssue(issue, { return this.updateIssue(issue, {
state: "open" state: 'open',
}) });
} }
static async getTagRef(tag) { static async getTagRef(tag) {
try { try {
return (await exec(`git show-ref --tags "refs/tags/${tag}"`)).stdout.split(' ')[0]; return (await exec(`git show-ref --tags "refs/tags/${tag}"`)).stdout.split(' ')[0];
} catch (e) { } catch (e) {
// Do nothing
} }
} }
static async getLatestTag() { static async getLatestTag() {
try{ try {
const {stdout} = await exec(`git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1`); const { stdout } = await exec(
`git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1`
);
return stdout.split('/').pop(); return stdout.split('/').pop();
} catch (e) {} } catch (e) {
// Do nothing
}
} }
static normalizeTag(tag){ static normalizeTag(tag) {
return tag ? 'v' + tag.replace(/^v/, '') : ''; return tag ? 'v' + tag.replace(/^v/, '') : '';
} }
} }
const {prototype} = GithubAPI; const { prototype } = GithubAPI;
['getUser', 'isCollaborator'].forEach(methodName => { ['getUser', 'isCollaborator'].forEach((methodName) => {
prototype[methodName] = memoize(prototype[methodName], { promise: true }) prototype[methodName] = memoize(prototype[methodName], { promise: true });
});
['get', 'post', 'put', 'delete', 'isAxiosError'].forEach((method) => prototype[method] = function(...args){
return this.axios[method](...args);
}); });
['get', 'post', 'put', 'delete', 'isAxiosError'].forEach(
(method) =>
(prototype[method] = function (...args) {
return this.axios[method](...args);
})
);
+29 -24
View File
@@ -1,17 +1,17 @@
import GithubAPI from "./GithubAPI.js"; import GithubAPI from './GithubAPI.js';
import api from './api.js'; import api from './api.js';
import Handlebars from "handlebars"; import Handlebars from 'handlebars';
import fs from "fs/promises"; import fs from 'fs/promises';
import {colorize} from "./helpers/colorize.js"; import { colorize } from './helpers/colorize.js';
import {getReleaseInfo} from "./contributors.js"; import { getReleaseInfo } from './contributors.js';
import path from "path"; import path from 'path';
import {fileURLToPath} from "url"; import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url)); const __dirname = path.dirname(fileURLToPath(import.meta.url));
const NOTIFY_PR_TEMPLATE = path.resolve(__dirname, '../templates/pr_published.hbs'); 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]'; const GITHUB_BOT_LOGIN = 'github-actions[bot]';
@@ -19,14 +19,11 @@ const skipCollaboratorPRs = true;
class RepoBot { class RepoBot {
constructor(options) { constructor(options) {
const { const { owner, repo, templates } = options || {};
owner, repo,
templates
} = options || {};
this.templates = { this.templates = {
published: NOTIFY_PR_TEMPLATE, published: NOTIFY_PR_TEMPLATE,
...templates ...templates,
}; };
this.github = api || new GithubAPI(owner, repo); this.github = api || new GithubAPI(owner, repo);
@@ -45,7 +42,7 @@ class RepoBot {
try { try {
pr = await this.github.getPR(id); pr = await this.github.getPR(id);
} catch (err) { } catch (err) {
if(err.response?.status === 404) { if (err.response?.status === 404) {
throw new Error(`PR #${id} not found (404)`); throw new Error(`PR #${id} not found (404)`);
} }
@@ -54,25 +51,33 @@ class RepoBot {
tag = normalizeTag(tag); tag = normalizeTag(tag);
const {merged, labels, user: {login, type}} = pr; const {
merged,
labels,
user: { login, type },
} = pr;
const isBot = type === 'Bot'; const isBot = type === 'Bot';
if (!merged) { if (!merged) {
return false return false;
} }
await this.github.appendLabels(id, [tag]); 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; return false;
} }
const comments = await this.github.getComments(id, {desc: true}); const comments = await this.github.getComments(id, { desc: true });
const comment = comments.find( 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) { if (comment) {
console.log(colorize()`Release comment [${comment.html_url}] already exists in #${pr.id}`); console.log(colorize()`Release comment [${comment.html_url}] already exists in #${pr.id}`);
@@ -88,8 +93,8 @@ class RepoBot {
author, author,
release: { release: {
tag, 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); return await this.addComment(id, message);
@@ -104,7 +109,7 @@ class RepoBot {
throw Error(colorize()`Can't get release info for ${tag}`); 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}:`); console.log(colorize()`Found ${merges.length} PRs in ${tag}:`);
@@ -112,7 +117,7 @@ class RepoBot {
for (const pr of merges) { for (const pr of merges) {
try { 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); const result = await this.notifyPRPublished(pr.id, tag);
console.log('✔️', result ? 'Label, comment' : 'Label'); console.log('✔️', result ? 'Label, comment' : 'Label');
} catch (err) { } catch (err) {
+1 -3
View File
@@ -1,4 +1,4 @@
import minimist from "minimist"; import minimist from 'minimist';
import RepoBot from '../RepoBot.js'; import RepoBot from '../RepoBot.js';
import fs from 'fs/promises'; import fs from 'fs/promises';
@@ -13,7 +13,6 @@ let { tag } = argv;
tag = 'v' + version; tag = 'v' + version;
} else if (typeof tag !== 'string') { } else if (typeof tag !== 'string') {
throw new Error('tag must be a string'); throw new Error('tag must be a string');
} }
@@ -25,4 +24,3 @@ let { tag } = argv;
console.warn('Error:', err.message); console.warn('Error:', err.message);
} }
})(); })();
+1 -1
View File
@@ -1,3 +1,3 @@
import GithubAPI from "./GithubAPI.js"; import GithubAPI from './GithubAPI.js';
export default new GithubAPI('axios', 'axios'); export default new GithubAPI('axios', 'axios');
+2 -4
View File
@@ -3,9 +3,9 @@ import assert from 'assert';
import axios from '../index.js'; import axios from '../index.js';
import axiosBuild from '../dist/node/axios.cjs'; 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(`Package version: v${version}`);
console.log(`Axios version: v${axios.VERSION}`); console.log(`Axios version: v${axios.VERSION}`);
@@ -25,5 +25,3 @@ assert.strictEqual(
); );
console.log('✔️ PASSED\n'); console.log('✔️ PASSED\n');
+76 -70
View File
@@ -1,9 +1,9 @@
import axios from "./githubAxios.js"; import axios from './githubAxios.js';
import util from "util"; import util from 'util';
import cp from "child_process"; import cp from 'child_process';
import Handlebars from "handlebars"; import Handlebars from 'handlebars';
import fs from "fs/promises"; import fs from 'fs/promises';
import {colorize} from "./helpers/colorize.js"; import { colorize } from './helpers/colorize.js';
const exec = util.promisify(cp.exec); 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 removeExtraLineBreaks = (str) => str.replace(/(?:\r\n|\r|\n){3,}/gm, '\r\n\r\n');
const cleanTemplate = template => template const cleanTemplate = (template) =>
.replace(/\n +/g, '\n') template
.replace(/^ +/, '') .replace(/\n +/g, '\n')
.replace(/\n\n\n+/g, '\n\n') .replace(/^ +/, '')
.replace(/\n\n$/, '\n'); .replace(/\n\n\n+/g, '\n\n')
.replace(/\n\n$/, '\n');
const getUserFromCommit = ((commitCache) => async (sha) => { const getUserFromCommit = ((commitCache) => async (sha) => {
try { try {
if(commitCache[sha] !== undefined) { if (commitCache[sha] !== undefined) {
return commitCache[sha]; return commitCache[sha];
} }
console.log(colorize()`fetch github commit info (${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.commit.author,
...data.author, ...data.author,
avatar_url_sm: data.author.avatar_url ? data.author.avatar_url + '&s=18' : '', avatar_url_sm: data.author.avatar_url ? data.author.avatar_url + '&s=18' : '',
}; });
} catch (err) { } catch (err) {
return commitCache[sha] = null; return (commitCache[sha] = null);
} }
})({}); })({});
const getIssueById = ((cache) => async (id) => { const getIssueById = ((cache) => async (id) => {
if(cache[id] !== undefined) { if (cache[id] !== undefined) {
return cache[id]; return cache[id];
} }
try { 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) { } catch (err) {
return null; return null;
} }
})({}); })({});
const getUserInfo = ((userCache) => async (userEntry) => { const getUserInfo = ((userCache) => async (userEntry) => {
const {email, commits} = userEntry; const { email, commits } = userEntry;
if (userCache[email] !== undefined) { if (userCache[email] !== undefined) {
return userCache[email]; return userCache[email];
@@ -60,32 +61,32 @@ const getUserInfo = ((userCache) => async (userEntry) => {
console.log(colorize()`fetch github user info [${userEntry.name}]`); console.log(colorize()`fetch github user info [${userEntry.name}]`);
return userCache[email] = { return (userCache[email] = {
...userEntry, ...userEntry,
...await getUserFromCommit(commits[0].hash) ...(await getUserFromCommit(commits[0].hash)),
} });
})({}); })({});
const deduplicate = (authors) => { const deduplicate = (authors) => {
const loginsMap = {}; const loginsMap = {};
const combined= {}; const combined = {};
const assign = (a, b) => { const assign = (a, b) => {
const {insertions, deletions, points, ...rest} = b; const { insertions, _deletions, _points, ...rest } = b;
Object.assign(a, rest); Object.assign(a, rest);
a.insertions += insertions; a.insertions += insertions;
a.deletions += insertions; a.deletions += insertions;
a.insertions += insertions; a.insertions += insertions;
} };
for(const [email, user] of Object.entries(authors)) { for (const [email, user] of Object.entries(authors)) {
const {login} = user; const { login } = user;
let entry; let entry;
if(login && (entry = loginsMap[login])) { if (login && (entry = loginsMap[login])) {
assign(entry, user); assign(entry, user);
} else { } else {
login && (loginsMap[login] = user); login && (loginsMap[login] = user);
combined[email] = user; combined[email] = user;
@@ -93,10 +94,10 @@ const deduplicate = (authors) => {
} }
return combined; return combined;
} };
const getReleaseInfo = ((releaseCache) => async (tag) => { const getReleaseInfo = ((releaseCache) => async (tag) => {
if(releaseCache[tag] !== undefined) { if (releaseCache[tag] !== undefined) {
return releaseCache[tag]; return releaseCache[tag];
} }
@@ -104,47 +105,48 @@ const getReleaseInfo = ((releaseCache) => async (tag) => {
const version = 'v' + tag.replace(/^v/, ''); const version = 'v' + tag.replace(/^v/, '');
const command = isUnreleasedTag ? const command = isUnreleasedTag
`npx auto-changelog --unreleased-only --stdout --commit-limit false --template json` : ? `npx auto-changelog --unreleased-only --stdout --commit-limit false --template json`
`npx auto-changelog ${ : `npx auto-changelog ${
version ? '--starting-version ' + version + ' --ending-version ' + version : '' version ? '--starting-version ' + version + ' --ending-version ' + version : ''
} --stdout --commit-limit false --template json`; } --stdout --commit-limit false --template json`;
console.log(command); 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]; const release = JSON.parse(stdout)[0];
if(release) { if (release) {
const authors = {}; const authors = {};
const commits = [ const commits = [
...release.commits, ...release.commits,
...release.fixes.map(fix => fix.commit), ...release.fixes.map((fix) => fix.commit),
...release.merges.map(fix => fix.commit) ...release.merges.map((fix) => fix.commit),
].filter(Boolean); ].filter(Boolean);
const commitMergeMap = {}; const commitMergeMap = {};
for(const merge of release.merges) { for (const merge of release.merges) {
commitMergeMap[merge.commit.hash] = merge.id; commitMergeMap[merge.commit.hash] = merge.id;
} }
for (const {hash, author, email, insertions, deletions} of commits) { for (const { hash, author, email, insertions, deletions } of commits) {
const entry = authors[email] = (authors[email] || { const entry = (authors[email] = authors[email] || {
name: author, name: author,
prs: [], prs: [],
email, email,
commits: [], commits: [],
insertions: 0, deletions: 0 insertions: 0,
deletions: 0,
}); });
entry.commits.push({hash}); entry.commits.push({ hash });
let pr; let pr;
if((pr = commitMergeMap[hash])) { if ((pr = commitMergeMap[hash])) {
entry.prs.push(pr); entry.prs.push(pr);
} }
@@ -160,13 +162,12 @@ const getReleaseInfo = ((releaseCache) => async (tag) => {
} }
for (const [email, author] of Object.entries(authors)) { 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)) release.authors = Object.values(deduplicate(authors)).sort((a, b) => b.points - a.points);
.sort((a, b) => b.points - a.points);
release.allCommits = commits; release.allCommits = commits;
} }
@@ -179,27 +180,36 @@ const getReleaseInfo = ((releaseCache) => async (tag) => {
const renderContributorsList = async (tag, template) => { const renderContributorsList = async (tag, template) => {
const release = await getReleaseInfo(tag); 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); const content = compile(release);
return removeExtraLineBreaks(cleanTemplate(content)); 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 release = await getReleaseInfo(tag);
const prs = {}; const prs = {};
for(const merge of release.merges) { for (const merge of release.merges) {
const pr = await getIssueById(merge.id); const pr = await getIssueById(merge.id);
if (pr && pr.labels.find(({name}) => name === label)) { if (pr && pr.labels.find(({ name }) => name === label)) {
const {reactions, body} = pr; const { reactions, body } = pr;
prs[pr.number] = pr; prs[pr.number] = pr;
pr.isHot = pr.comments > comments_threshold; pr.isHot = pr.comments > comments_threshold;
const points = reactions['+1'] + const points =
reactions['hooray'] + reactions['rocket'] + reactions['heart'] + reactions['laugh'] - reactions['-1']; reactions['+1'] +
reactions['hooray'] +
reactions['rocket'] +
reactions['heart'] +
reactions['laugh'] -
reactions['-1'];
pr.isAwesome = points > awesome_threshold; pr.isAwesome = points > awesome_threshold;
@@ -210,7 +220,7 @@ const renderPRsList = async (tag, template, {comments_threshold= 5, awesome_thre
if (body) { if (body) {
const reg = /```+changelog\n*(.+?)?\n*```/gms; const reg = /```+changelog\n*(.+?)?\n*```/gms;
while((match = reg.exec(body))) { while ((match = reg.exec(body))) {
match[1] && pr.messages.push(match[1]); 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); 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); const content = compile(release);
return removeExtraLineBreaks(cleanTemplate(content)); return removeExtraLineBreaks(cleanTemplate(content));
} };
const getTagRef = async (tag) => { const getTagRef = async (tag) => {
try { try {
return (await exec(`git show-ref --tags "refs/tags/${tag}"`)).stdout.split(' ')[0]; return (await exec(`git show-ref --tags "refs/tags/${tag}"`)).stdout.split(' ')[0];
} catch(e) { } catch (e) {
// Do nothing
} }
} };
export { export { renderContributorsList, getReleaseInfo, renderPRsList, getTagRef };
renderContributorsList,
getReleaseInfo,
renderPRsList,
getTagRef
}
+13 -8
View File
@@ -1,19 +1,24 @@
import axios from '../index.js'; 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]`); GITHUB_TOKEN ? console.log(`[GITHUB_TOKEN OK]`) : console.warn(`[GITHUB_TOKEN is not defined]`);
const defaultTransform = axios.defaults.transformRequest; const defaultTransform = axios.defaults.transformRequest;
export default axios.create({ export default axios.create({
transformRequest: [defaultTransform[0], function (data) { transformRequest: [
console.log(colorize()`[${this.method.toUpperCase()}] Request [${new URL(axios.getUri(this)).pathname}]`); defaultTransform[0],
return data; function (data) {
}], console.log(
colorize()`[${this.method.toUpperCase()}] Request [${new URL(axios.getUri(this)).pathname}]`
);
return data;
},
],
baseURL: 'https://api.github.com/', baseURL: 'https://api.github.com/',
headers: { headers: {
Authorization: GITHUB_TOKEN ? `token ${GITHUB_TOKEN}` : null Authorization: GITHUB_TOKEN ? `token ${GITHUB_TOKEN}` : null,
} },
}); });
+7 -5
View File
@@ -1,14 +1,16 @@
import chalk from 'chalk'; import chalk from 'chalk';
export const colorize = (...colors) => { export const colorize = (...colors) => {
if(!colors.length) { if (!colors.length) {
colors = ['green', 'cyan', 'magenta', 'blue', 'yellow', 'red']; colors = ['green', 'cyan', 'magenta', 'blue', 'yellow', 'red'];
} }
const colorsCount = colors.length; const colorsCount = colors.length;
return (strings, ...values) => { return (strings, ...values) => {
const {length} = values; const { length } = values;
return strings.map((str, i) => i < length ? str + chalk[colors[i%colorsCount]].bold(values[i]) : str).join(''); return strings
} .map((str, i) => (i < length ? str + chalk[colors[i % colorsCount]].bold(values[i]) : str))
} .join('');
};
};
+4 -3
View File
@@ -1,12 +1,13 @@
export const matchAll = (text, regexp, cb) => { export const matchAll = (text, regexp, cb) => {
let match; let match;
while((match = regexp.exec(text))) {
while ((match = regexp.exec(text))) {
cb(match); cb(match);
} }
} };
export const parseSection = (body, name, cb) => { export const parseSection = (body, name, cb) => {
matchAll(body, new RegExp(`^(#+)\\s+${name}?(.*?)^\\1\\s+\\w+`, 'gims'), cb); matchAll(body, new RegExp(`^(#+)\\s+${name}?(.*?)^\\1\\s+\\w+`, 'gims'), cb);
} };
export const parseVersion = (rawVersion) => /^v?(\d+).(\d+).(\d+)/.exec(rawVersion); export const parseVersion = (rawVersion) => /^v?(\d+).(\d+).(\d+)/.exec(rawVersion);
+11 -15
View File
@@ -1,9 +1,9 @@
import fs from 'fs/promises'; import fs from 'fs/promises';
import path from 'path'; 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 asyncReplace from 'string-replace-async';
import {fileURLToPath} from "url"; import { fileURLToPath } from 'url';
import {colorize} from "./helpers/colorize.js"; import { colorize } from './helpers/colorize.js';
const __dirname = path.dirname(fileURLToPath(import.meta.url)); 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); infile = path.resolve(__dirname, infile);
const content = String(await fs.readFile(infile)); const content = String(await fs.readFile(infile));
const headerRE = /^#+\s+\[([-_\d.\w]+)].+?$/mig; const headerRE = /^#+\s+\[([-_\d.\w]+)].+?$/gim;
let tag; let tag;
let index = 0; let index = 0;
@@ -32,11 +32,11 @@ const injectSection = async (name, contributorsRE, injector, infile = '../CHANGE
tag = nextTag; tag = nextTag;
index = offset + match.length; index = offset + match.length;
if(currentTag) { if (currentTag) {
if (hasSection) { if (hasSection) {
console.log(colorize()`[${currentTag}]: ✓ OK`); console.log(colorize()`[${currentTag}]: ✓ OK`);
} else { } else {
const target = isFirstTag && (!await getTagRef(currentTag)) ? '' : currentTag; const target = isFirstTag && !(await getTagRef(currentTag)) ? '' : currentTag;
console.log(colorize()`[${currentTag}]: ❌ MISSED` + (!target ? ' (UNRELEASED)' : '')); 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 fs.writeFile(infile, newContent);
} };
await injectSection( await injectSection('PRs', /^\s*### PRs/im, (tag) =>
'PRs', tag ? '' : renderPRsList(tag, PRS_TEMPLATE, { awesome_threshold: 5, comments_threshold: 7 })
/^\s*### PRs/mi,
(tag) => tag ? '' : renderPRsList(tag, PRS_TEMPLATE, {awesome_threshold: 5, comments_threshold: 7}),
); );
await injectSection( await injectSection('contributors', /^\s*### Contributors/im, (tag) =>
'contributors', renderContributorsList(tag, CONTRIBUTORS_TEMPLATE)
/^\s*### Contributors/mi,
(tag) => renderContributorsList(tag, CONTRIBUTORS_TEMPLATE)
); );
+56 -51
View File
@@ -1,22 +1,22 @@
import Handlebars from "handlebars"; import Handlebars from 'handlebars';
import fs from "fs/promises"; import fs from 'fs/promises';
import prettyBytes from 'pretty-bytes'; import prettyBytes from 'pretty-bytes';
import {getBlobHistory} from './repo.js'; import { getBlobHistory } from './repo.js';
import pacote from "pacote"; import pacote from 'pacote';
import zlib from "zlib"; import zlib from 'zlib';
import tar from "tar-stream"; import tar from 'tar-stream';
import { Readable } from "stream"; import { Readable } from 'stream';
const FILE_SIZE_DIFF_THRESHOLD = 512; // 0.5KB const FILE_SIZE_DIFF_THRESHOLD = 512; // 0.5KB
const readJSONFile = async (file) => JSON.parse(String(await fs.readFile(file))); 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 parseVersion = (tag) => {
const [, major, minor, patch] = /^v?(\d+)\.(\d+)\.(\d+)/.exec(tag) || []; const [, major, minor, patch] = /^v?(\d+)\.(\d+)\.(\d+)/.exec(tag) || [];
return [major, minor, patch]; return [major, minor, patch];
} };
const [MAJOR_NUMBER] = parseVersion(version); const [MAJOR_NUMBER] = parseVersion(version);
@@ -27,14 +27,14 @@ async function getFilesFromNPM(pkg) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const extract = tar.extract(); const extract = tar.extract();
extract.on("entry", (header, stream, next) => { extract.on('entry', (header, stream, next) => {
const buffers = []; const buffers = [];
stream.on('data', (buffer) => { stream.on('data', (buffer) => {
buffers.push(buffer); buffers.push(buffer);
}); });
stream.on("end", () => { stream.on('end', () => {
const content = Buffer.concat(buffers); const content = Buffer.concat(buffers);
const gzipped = zlib.gzipSync(content); const gzipped = zlib.gzipSync(content);
@@ -42,7 +42,7 @@ async function getFilesFromNPM(pkg) {
files[header.name.replace(/^package\//, '')] = { files[header.name.replace(/^package\//, '')] = {
gzip: gzipped.length, gzip: gzipped.length,
compressed: header.size ? gzipped.length / header.size : 1, compressed: header.size ? gzipped.length / header.size : 1,
...header ...header,
}; };
next(); next();
@@ -52,51 +52,50 @@ async function getFilesFromNPM(pkg) {
Readable.from(tgzData) Readable.from(tgzData)
.pipe(zlib.createGunzip()) .pipe(zlib.createGunzip())
.pipe(extract) .pipe(extract)
.on("error", reject) .on('error', reject)
.on('finish', () => resolve(files)); .on('finish', () => resolve(files));
}); });
} }
const generateFileReport = async (files, historyCount = 3) => { const generateFileReport = async (files, historyCount = 3) => {
const allFilesStat = {}; 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]; return MAJOR_NUMBER === parseVersion(tag)[0];
}); });
const warns = []; const warns = [];
const npmHistory = {}; const npmHistory = {};
await Promise.all(commits.map(async ({tag}) => { await Promise.all(
npmHistory[tag] = await getFilesFromNPM(`axios@${tag.replace(/^v/, '')}`); 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 file = await fs.stat(filename).catch(console.warn);
const gzip = file ? zlib.gzipSync(await fs.readFile(filename)).length : 0; const gzip = file ? zlib.gzipSync(await fs.readFile(filename)).length : 0;
const stat = allFilesStat[filename] = file ? { const stat = (allFilesStat[filename] = file
name, ? {
size: file.size, name,
path: filename, size: file.size,
gzip, path: filename,
compressed: file.size ? gzip / file.size : 1, gzip,
history: commits.map(({tag}) => { compressed: file.size ? gzip / file.size : 1,
const files = npmHistory[tag]; history: commits.map(({ tag }) => {
const file = files && files[filename] || null; const files = npmHistory[tag];
const file = (files && files[filename]) || null;
return { return {
tag, tag,
...file ...file,
}; };
}) }),
} : null; }
: null);
if (stat.history[0]) {
if(stat.history[0]) {
const diff = stat.gzip - stat.history[0].gzip; const diff = stat.gzip - stat.history[0].gzip;
if (diff > FILE_SIZE_DIFF_THRESHOLD) { if (diff > FILE_SIZE_DIFF_THRESHOLD) {
@@ -113,22 +112,28 @@ const generateFileReport = async (files, historyCount = 3) => {
return { return {
version, version,
files: allFilesStat, 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); const data = await generateFileReport(files);
Handlebars.registerHelper('filesize', (bytes) => bytes != null ? prettyBytes(bytes) : '<unknown>'); Handlebars.registerHelper('filesize', (bytes) =>
Handlebars.registerHelper('percent', (value) => Number.isFinite(value) ? `${(value * 100).toFixed(1)}%` : `---` ); 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); return Handlebars.compile(String(await fs.readFile(template)))(data);
} };
console.log(await generateBody({ console.log(
files: { await generateBody({
'Browser build (UMD)' : 'dist/axios.min.js', files: {
'Browser build (ESM)' : 'dist/esm/axios.min.js', 'Browser build (UMD)': 'dist/axios.min.js',
} 'Browser build (ESM)': 'dist/esm/axios.min.js',
})); },
})
);
+17 -19
View File
@@ -1,20 +1,20 @@
import util from "util"; import util from 'util';
import cp from "child_process"; import cp from 'child_process';
export const exec = util.promisify(cp.exec); export const exec = util.promisify(cp.exec);
export const getBlobSize = async (filepath, sha ='HEAD') => { export const getBlobSize = async (filepath, sha = 'HEAD') => {
const size = (await exec( const size = (await exec(`git cat-file -s ${sha}:${filepath}`)).stdout;
`git cat-file -s ${sha}:${filepath}`
)).stdout;
return size ? +size : 0; return size ? +size : 0;
} };
export const getBlobHistory = async (filepath, maxCount= 5) => { export const getBlobHistory = async (filepath, maxCount = 5) => {
const log = (await exec( const log = (
`git log --max-count=${maxCount} --no-walk --tags=v* --oneline --format=%H%d -- ${filepath}` await exec(
)).stdout; `git log --max-count=${maxCount} --no-walk --tags=v* --oneline --format=%H%d -- ${filepath}`
)
).stdout;
const commits = []; const commits = [];
@@ -22,21 +22,19 @@ export const getBlobHistory = async (filepath, maxCount= 5) => {
const regexp = /^(\w+) \(tag: (v?[.\d]+)\)$/gm; const regexp = /^(\w+) \(tag: (v?[.\d]+)\)$/gm;
while((match = regexp.exec(log))) { while ((match = regexp.exec(log))) {
commits.push({ commits.push({
sha: match[1], sha: match[1],
tag: match[2], tag: match[2],
size: await getBlobSize(filepath, match[1]) size: await getBlobSize(filepath, match[1]),
}) });
} }
return commits; return commits;
} };
export const getTags = async (pattern = 'v*', sort = '-v:refname') => { export const getTags = async (pattern = 'v*', sort = '-v:refname') => {
const log = (await exec( const log = (await exec(`git tag -l ${pattern} --sort=${sort}`)).stdout;
`git tag -l ${pattern} --sort=${sort}`
)).stdout;
return log.split(/\r?\n/); return log.split(/\r?\n/);
} };
+7 -5
View File
@@ -1,8 +1,8 @@
import {exec, getTags} from "./repo.js"; import { exec, getTags } from './repo.js';
import fs from "fs"; import fs from 'fs';
import {colorize} from "./helpers/colorize.js"; 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 [major] = version.split('.');
const tags = await getTags(); const tags = await getTags();
@@ -13,6 +13,8 @@ const isLatest = latestTag === version;
let tag = isBeta ? 'next' : isLatest ? 'latest' : `v${major}`; 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`); await exec(`echo "tag=${tag}" >> $GITHUB_OUTPUT`);
+7 -16
View File
@@ -1,11 +1,10 @@
import { startTestServer, stopHTTPServer } from '../test/helpers/server.js'; import { startTestServer, stopHTTPServer } from '../test/helpers/server.js';
import { spawn } from 'child_process'; import { spawn } from 'child_process';
import chalk from "chalk"; import chalk from 'chalk';
let server; let server;
async function run() { async function run() {
console.log(chalk.red.bold(`[ Starting HTTP server... ]`)); console.log(chalk.red.bold(`[ Starting HTTP server... ]`));
server = await startTestServer(3000); server = await startTestServer(3000);
@@ -13,25 +12,19 @@ async function run() {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
console.log('Starting karma runner...'); console.log('Starting karma runner...');
const karma = spawn( const karma = spawn('npx', ['karma', 'start', 'karma.conf.cjs', '--single-run'], {
'npx', stdio: 'inherit',
['karma', 'start', 'karma.conf.cjs', '--single-run'], shell: true,
{ env: { ...process.env, LISTEN_ADDR: '0.0.0.0' },
stdio: 'inherit', });
shell: true,
env: { ...process.env, LISTEN_ADDR: '0.0.0.0' },
});
karma.on('exit', (code) => { karma.on('exit', (code) => {
code ? reject(new Error(`Karma tests failed with exit code ${code}`)) : resolve(); code ? reject(new Error(`Karma tests failed with exit code ${code}`)) : resolve();
}); });
}); });
} }
(async () => {
(async() => {
try { try {
await run(); await run();
} finally { } finally {
@@ -42,5 +35,3 @@ async function run() {
} }
} }
})(); })();
+15 -25
View File
@@ -1,12 +1,12 @@
import fs from "fs/promises"; import fs from 'fs/promises';
import _axios from "../index.js"; import _axios from '../index.js';
import { exec } from "./repo.js"; import { exec } from './repo.js';
import { colorize } from "./helpers/colorize.js"; import { colorize } from './helpers/colorize.js';
const axios = _axios.create({ const axios = _axios.create({
headers: { headers: {
"User-Agent": 'User-Agent':
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", '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) { if (counter++ >= retries) {
throw err; throw err;
} }
await new Promise((resolve) => await new Promise((resolve) => setTimeout(resolve, counter ** counter * 1000));
setTimeout(resolve, counter ** counter * 1000),
);
return doRequest(); return doRequest();
} }
}; };
@@ -29,11 +27,7 @@ const getWithRetry = (url, retries = 3) => {
return doRequest(); return doRequest();
}; };
const updateReadmeSponsors = async ( const updateReadmeSponsors = async (url, path, marker = '<!--<div>marker</div>-->') => {
url,
path,
marker = "<!--<div>marker</div>-->",
) => {
let fileContent = (await fs.readFile(path)).toString(); let fileContent = (await fs.readFile(path)).toString();
const index = fileContent.indexOf(marker); const index = fileContent.indexOf(marker);
@@ -42,7 +36,7 @@ const updateReadmeSponsors = async (
const readmeContent = fileContent.slice(index); const readmeContent = fileContent.slice(index);
let { data: sponsorContent } = await getWithRetry(url); let { data: sponsorContent } = await getWithRetry(url);
sponsorContent += "\n"; sponsorContent += '\n';
const currentSponsorContent = fileContent.slice(0, index); const currentSponsorContent = fileContent.slice(0, index);
@@ -54,22 +48,18 @@ const updateReadmeSponsors = async (
console.log(colorize()`Sponsor block in [${path}] is up to date`); console.log(colorize()`Sponsor block in [${path}] is up to date`);
} }
} else { } else {
console.warn( console.warn(colorize()`Can not find marker (${marker}) in ${path} to inject sponsor block`);
colorize()`Can not find marker (${marker}) in ${path} to inject sponsor block`,
);
} }
return false; return false;
}; };
(async (url) => { (async (url) => {
const newContent = await updateReadmeSponsors(url, "./README.md"); const newContent = await updateReadmeSponsors(url, './README.md');
await exec( await exec(`echo "changed=${newContent ? 'true' : 'false'}" >> $GITHUB_OUTPUT`);
`echo "changed=${newContent ? "true" : "false"}" >> $GITHUB_OUTPUT`,
);
if (newContent !== false) { if (newContent !== false) {
await fs.mkdir("./temp").catch(() => {}); await fs.mkdir('./temp').catch(() => {});
await fs.writeFile("./temp/sponsors.md", newContent); await fs.writeFile('./temp/sponsors.md', newContent);
} }
})("https://axios-http.com/data/sponsors.md"); })('https://axios-http.com/data/sponsors.md');
+8 -6
View File
@@ -1,4 +1,4 @@
import {spawn} from 'child_process'; import { spawn } from 'child_process';
const args = process.argv.slice(2); 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'); isHotfixNeeded && console.warn('Setting --openssl-legacy-provider as ssl hotfix');
const test = spawn('cross-env', const test = spawn(
isHotfixNeeded ? ['NODE_OPTIONS=--openssl-legacy-provider', ...args] : args, { 'cross-env',
isHotfixNeeded ? ['NODE_OPTIONS=--openssl-legacy-provider', ...args] : args,
{
shell: true, shell: true,
stdio: 'inherit' stdio: 'inherit',
} }
); );
test.on('exit', function (code) { test.on('exit', function (code) {
process.exit(code) process.exit(code);
}) });
+1 -1
View File
@@ -7,4 +7,4 @@ To run the examples:
3. `npm install` 3. `npm install`
4. `npm run build` 4. `npm run build`
5. `npm run examples` 5. `npm run examples`
6. [http://localhost:3000](http://localhost:3000) 6. [http://localhost:3000](http://localhost:3000)
+93 -88
View File
@@ -1,69 +1,73 @@
<!doctype html> <!doctype html>
<html> <html>
<head>
<title>axios - abort controller example</title> <head>
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/> <title>axios - abort controller example</title>
<style> <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
.status { margin-top: 10px; } <style>
</style> .status {
</head> margin-top: 10px;
<body class="container"> }
<h1>axios.AbortController</h1> </style>
</head>
<div class="row" style="margin-top: 20px;">
<div class="col-md-12"> <body class="container">
<h3>1. Single Request Cancellation</h3> <h1>axios.AbortController</h1>
<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> <div class="row" style="margin-top: 20px;">
<button id="cancelBtn" class="btn btn-danger" disabled>Cancel Request</button> <div class="col-md-12">
<div id="singleStatus" class="status"></div> <h3>1. Single Request Cancellation</h3>
</div> <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>
</div>
<hr/> <hr />
<div class="row" style="margin-top: 20px;"> <div class="row" style="margin-top: 20px;">
<div class="col-md-12"> <div class="col-md-12">
<h3>2. Search-as-you-type (Race Condition Handling)</h3> <h3>2. Search-as-you-type (Race Condition Handling)</h3>
<p>Type quickly. Previous pending requests will be cancelled automatically.</p> <p>Type quickly. Previous pending requests will be cancelled automatically.</p>
<div class="form-group"> <div class="form-group">
<input type="text" id="searchInput" class="form-control" placeholder="Type to search..."> <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>
<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>
</div>
<script src="/axios.min.js"></script> <script src="/axios.min.js"></script>
<script> <script>
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// 1. Single Request Cancellation // 1. Single Request Cancellation
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
const startBtn = document.getElementById('startBtn'); const startBtn = document.getElementById('startBtn');
const cancelBtn = document.getElementById('cancelBtn'); const cancelBtn = document.getElementById('cancelBtn');
const singleStatus = document.getElementById('singleStatus'); const singleStatus = document.getElementById('singleStatus');
let controller;
startBtn.onclick = function() { let controller;
// Create a new AbortController instance for this request
controller = new AbortController();
startBtn.disabled = true; startBtn.onclick = function () {
cancelBtn.disabled = false; // Create a new AbortController instance for this request
singleStatus.innerHTML = '<span class="text-info">Request pending... (3s delay)</span>'; controller = new AbortController();
axios.get('/abort-controller/server?delay=3000', { startBtn.disabled = true;
signal: controller.signal cancelBtn.disabled = false;
}) singleStatus.innerHTML = '<span class="text-info">Request pending... (3s delay)</span>';
axios.get('/abort-controller/server?delay=3000', {
signal: controller.signal
})
.then(function (response) { .then(function (response) {
singleStatus.innerHTML = '<span class="text-success">' + response.data.message + '</span>'; singleStatus.innerHTML = '<span class="text-success">' + response.data.message + '</span>';
}) })
.catch(function (err) { .catch(function (err) {
if (axios.isCancel(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 { } else {
singleStatus.innerHTML = '<span class="text-danger">Error: ' + err.message + '</span>'; singleStatus.innerHTML = '<span class="text-danger">Error: ' + err.message + '</span>';
} }
}) })
.finally(function () { .finally(function () {
@@ -71,42 +75,42 @@
cancelBtn.disabled = true; cancelBtn.disabled = true;
controller = null; controller = null;
}); });
}; };
cancelBtn.onclick = function() { cancelBtn.onclick = function () {
if (controller) { if (controller) {
// Abort the request // Abort the request
controller.abort(); controller.abort();
} }
}; };
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// 2. Search-as-you-type // 2. Search-as-you-type
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
const searchInput = document.getElementById('searchInput'); const searchInput = document.getElementById('searchInput');
const searchStatus = document.getElementById('searchStatus'); const searchStatus = document.getElementById('searchStatus');
const searchLog = document.getElementById('searchLog'); const searchLog = document.getElementById('searchLog');
let searchController;
searchInput.addEventListener('input', function(e) { let searchController;
const query = e.target.value;
if (searchController) {
// Cancel the previous request
searchController.abort();
}
// Create a new controller for the new request searchInput.addEventListener('input', function (e) {
searchController = new AbortController(); const query = e.target.value;
log('New search for: "' + query + '"'); if (searchController) {
searchStatus.innerHTML = '<span class="text-info">Searching...</span>'; // Cancel the previous request
searchController.abort();
}
axios.get('/abort-controller/server?delay=1000', { // Create a new controller for the new request
signal: searchController.signal searchController = new AbortController();
})
log('New search for: "' + query + '"');
searchStatus.innerHTML = '<span class="text-info">Searching...</span>';
axios.get('/abort-controller/server?delay=1000', {
signal: searchController.signal
})
.then(function (response) { .then(function (response) {
searchStatus.innerHTML = '<span class="text-success">Result for "' + query + '": ' + response.data.message + '</span>'; searchStatus.innerHTML = '<span class="text-success">Result for "' + query + '": ' + response.data.message + '</span>';
log('Success: ' + query); log('Success: ' + query);
@@ -119,14 +123,15 @@
log('Error: ' + query); log('Error: ' + query);
} }
}); });
}); });
function log(msg) { function log(msg) {
const li = document.createElement('li'); const li = document.createElement('li');
li.className = 'list-group-item py-1'; li.className = 'list-group-item py-1';
li.textContent = new Date().toLocaleTimeString() + ' - ' + msg; li.textContent = new Date().toLocaleTimeString() + ' - ' + msg;
searchLog.prepend(li); searchLog.prepend(li);
} }
</script> </script>
</body> </body>
</html>
</html>
+7 -5
View File
@@ -6,11 +6,13 @@ export default function (req, res) {
setTimeout(() => { setTimeout(() => {
res.writeHead(200, { res.writeHead(200, {
'Content-Type': 'text/json' 'Content-Type': 'text/json',
}); });
res.write(JSON.stringify({ res.write(
message: 'Response completed successfully after ' + delay + 'ms' JSON.stringify({
})); message: 'Response completed successfully after ' + delay + 'ms',
})
);
res.end(); res.end();
}, delay); }, delay);
}; }
+41 -38
View File
@@ -1,44 +1,47 @@
<!doctype html> <!doctype html>
<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> <head>
<h3>User</h3> <title>axios - all example</title>
<div class="row"> <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
<img id="useravatar" src="" class="col-md-1"/> </head>
<div class="col-md-3">
<strong id="username"></strong> <body class="container">
</div> <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> </div>
<hr/>
<h3>Orgs</h3>
<ul id="orgs" class="list-unstyled"></ul>
</div> </div>
<hr />
<h3>Orgs</h3>
<ul id="orgs" class="list-unstyled"></ul>
</div>
<script src="/axios.min.js"></script> <script src="/axios.min.js"></script>
<script> <script>
axios.all([ axios.all([
axios.get('https://api.github.com/users/mzabriskie'), axios.get('https://api.github.com/users/mzabriskie'),
axios.get('https://api.github.com/users/mzabriskie/orgs') axios.get('https://api.github.com/users/mzabriskie/orgs')
]).then(axios.spread(function (user, orgs) { ]).then(axios.spread(function (user, orgs) {
document.getElementById('useravatar').src = user.data.avatar_url; document.getElementById('useravatar').src = user.data.avatar_url;
document.getElementById('username').innerHTML = user.data.name; document.getElementById('username').innerHTML = user.data.name;
document.getElementById('orgs').innerHTML = orgs.data.map(function (org) { document.getElementById('orgs').innerHTML = orgs.data.map(function (org) {
return ( return (
'<li class="row">' + '<li class="row">' +
'<img src="' + org.avatar_url + '" class="col-md-1"/>' + '<img src="' + org.avatar_url + '" class="col-md-1"/>' +
'<div class="col-md-3">' + '<div class="col-md-3">' +
'<strong>' + org.login + '</strong>' + '<strong>' + org.login + '</strong>' +
'</div>' + '</div>' +
'</li>' '</li>'
); );
}).join(''); }).join('');
})); }));
</script> </script>
</body> </body>
</html>
</html>
+33 -30
View File
@@ -1,37 +1,40 @@
<!doctype html> <!doctype html>
<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> <head>
<h3>User</h3> <title>AMD</title>
<div class="row"> <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
<img id="useravatar" src="" class="col-md-1"/> </head>
<div class="col-md-3">
<strong id="username"></strong> <body class="container">
</div> <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> </div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.16/require.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.16/require.min.js"></script>
<script> <script>
requirejs.config({ requirejs.config({
paths: { paths: {
axios: '/axios.min' axios: '/axios.min'
} }
}); });
requirejs(['axios'], function (axios) { requirejs(['axios'], function (axios) {
axios.get('https://api.github.com/users/mzabriskie') axios.get('https://api.github.com/users/mzabriskie')
.then(function (user) { .then(function (user) {
document.getElementById('useravatar').src = user.data.avatar_url; document.getElementById('useravatar').src = user.data.avatar_url;
document.getElementById('username').innerHTML = user.data.name; document.getElementById('username').innerHTML = user.data.name;
}); });
}); });
</script> </script>
</body> </body>
</html>
</html>
+33 -30
View File
@@ -1,33 +1,36 @@
<!doctype html> <!doctype html>
<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> <head>
<script> <title>axios - get example</title>
axios.get('/get/server') <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
.then(function (response) { </head>
document.getElementById('people').innerHTML = response.data.map(function (person) {
return ( <body class="container">
'<li class="row">' + <h1>axios.get</h1>
'<img src="https://avatars.githubusercontent.com/u/' + person.avatar + '?s=50" class="col-md-1"/>' + <ul id="people" class="list-unstyled"></ul>
'<div class="col-md-3">' +
'<strong>' + person.name + '</strong>' + <script src="/axios.min.js"></script>
'<div>GitHub: <a href="https://github.com/' + person.github + '" target="_blank">' + person.github + '</a></div>' + <script>
'<div>Twitter: <a href="https://twitter.com/' + person.twitter + '" target="_blank">' + person.twitter + '</a></div>' + axios.get('/get/server')
'</div>' + .then(function (response) {
'</li><br/>' document.getElementById('people').innerHTML = response.data.map(function (person) {
); return (
}).join(''); '<li class="row">' +
}) '<img src="https://avatars.githubusercontent.com/u/' + person.avatar + '?s=50" class="col-md-1"/>' +
.catch(function (err) { '<div class="col-md-3">' +
document.getElementById('people').innerHTML = '<li class="text-danger">' + err.message + '</li>'; '<strong>' + person.name + '</strong>' +
}); '<div>GitHub: <a href="https://github.com/' + person.github + '" target="_blank" rel="noopener noreferrer">' + person.github + '</a></div>' +
</script> '<div>Twitter: <a href="https://twitter.com/' + person.twitter + '" target="_blank" rel="noopener noreferrer">' + person.twitter + '</a></div>' +
</body> '</div>' +
</html> '</li><br/>'
);
}).join('');
})
.catch(function (err) {
document.getElementById('people').innerHTML = '<li class="text-danger">' + err.message + '</li>';
});
</script>
</body>
</html>
+19 -19
View File
@@ -1,34 +1,34 @@
const people = [ const people = [
{ {
"name": "Matt Zabriskie", name: 'Matt Zabriskie',
"github": "mzabriskie", github: 'mzabriskie',
"twitter": "mzabriskie", twitter: 'mzabriskie',
"avatar": "199035" avatar: '199035',
}, },
{ {
"name": "Ryan Florence", name: 'Ryan Florence',
"github": "rpflorence", github: 'rpflorence',
"twitter": "ryanflorence", twitter: 'ryanflorence',
"avatar": "100200" avatar: '100200',
}, },
{ {
"name": "Kent C. Dodds", name: 'Kent C. Dodds',
"github": "kentcdodds", github: 'kentcdodds',
"twitter": "kentcdodds", twitter: 'kentcdodds',
"avatar": "1500684" avatar: '1500684',
}, },
{ {
"name": "Chris Esplin", name: 'Chris Esplin',
"github": "deltaepsilon", github: 'deltaepsilon',
"twitter": "chrisesplin", twitter: 'chrisesplin',
"avatar": "878947" avatar: '878947',
} },
]; ];
export default function (req, res) { export default function (req, res) {
res.writeHead(200, { res.writeHead(200, {
'Content-Type': 'application/json' 'Content-Type': 'application/json',
}); });
res.write(JSON.stringify(people)); res.write(JSON.stringify(people));
res.end(); res.end();
}; }
+15 -14
View File
@@ -2,7 +2,7 @@
This document explains a simple approach to make Axios network errors more helpful and human-readable. This document explains a simple approach to make Axios network errors more helpful and human-readable.
By default, Axios shows a generic `"Network Error"` message for many failures. By default, Axios shows a generic `"Network Error"` message for many failures.
This can be confusing because it doesn't explain "what actually went wrong" (e.g., no internet, a timeout, a CORS issue, etc.). This can be confusing because it doesn't explain "what actually went wrong" (e.g., no internet, a timeout, a CORS issue, etc.).
Our approach adds clear, categorised error messages for different network issues. Our approach adds clear, categorised error messages for different network issues.
@@ -10,19 +10,20 @@ Our approach adds clear, categorised error messages for different network issues
==> Problem ==> Problem
Axios currently throws the same `Network Error` message for many different cases: Axios currently throws the same `Network Error` message for many different cases:
- The Internet is disconnected
- DNS lookup fails - The Internet is disconnected
- Server is down or refusing connections - DNS lookup fails
- CORS blocked requests - Server is down or refusing connections
- Request timed out - CORS blocked requests
- Request timed out
These cases all look the same to developers and users, making debugging harder. These cases all look the same to developers and users, making debugging harder.
--> Our Approach — Wrapper / Middleware --> Our Approach — Wrapper / Middleware
We created a small wrapper function called `enhanceNetworkError()` that: 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. - Adds a new field `error.detailedMessage` with a short, clear explanation.
- Assigns a new `error.code` (like `ERR_TIMEOUT`, `ERR_DNS_FAILURE`, etc.). - Assigns a new `error.code` (like `ERR_TIMEOUT`, `ERR_DNS_FAILURE`, etc.).
- Works for both browser and Node.js environments. - Works for both browser and Node.js environments.
@@ -31,7 +32,7 @@ The wrapper is used inside an Axios instance via a Response interceptor.
-> How It Works -> How It Works
1. When Axios throws an error, the interceptor catches it. 1. When Axios throws an error, the interceptor catches it.
2. The `enhanceNetworkError()` function checks what type of error it is: 2. The `enhanceNetworkError()` function checks what type of error it is:
- Offline → `ERR_NO_INTERNET` - Offline → `ERR_NO_INTERNET`
- DNS failure → `ERR_DNS_FAILURE` - DNS failure → `ERR_DNS_FAILURE`
@@ -42,16 +43,16 @@ The wrapper is used inside an Axios instance via a Response interceptor.
- Other → `ERR_NETWORK_GENERIC` - Other → `ERR_NETWORK_GENERIC`
3. It returns a more descriptive error with both `code` and `detailedMessage`. 3. It returns a more descriptive error with both `code` and `detailedMessage`.
-> Example Usage -> Example Usage
```javascript ```javascript
const api = createEnhancedClient({ baseURL: 'https://example.com' }); const api = createEnhancedClient({ baseURL: 'https://example.com' });
api.get('/data') api
.then(res => console.log(res.data)) .get('/data')
.catch(err => { .then((res) => console.log(res.data))
console.error(err.code); // e.g., ERR_TIMEOUT .catch((err) => {
console.error(err.code); // e.g., ERR_TIMEOUT
console.error(err.detailedMessage); // e.g., "The request took too long to respond." console.error(err.detailedMessage); // e.g., "The request took too long to respond."
}); });
``` ```
+7 -12
View File
@@ -25,29 +25,25 @@ function enhanceNetworkError(error) {
// when Request timeout happens // when Request timeout happens
else if (error.code === 'ETIMEDOUT' || /timeout/i.test(error.message)) { else if (error.code === 'ETIMEDOUT' || /timeout/i.test(error.message)) {
error.code = 'ERR_TIMEOUT'; error.code = 'ERR_TIMEOUT';
error.detailedMessage = error.detailedMessage = 'The request took too long to respond. Please try again later.';
'The request took too long to respond. Please try again later.';
} }
// when CORS restriction happens (for browser only) // when CORS restriction happens (for browser only)
else if (/CORS/i.test(error.message)) { else if (/CORS/i.test(error.message)) {
error.code = 'ERR_CORS_BLOCKED'; error.code = 'ERR_CORS_BLOCKED';
error.detailedMessage = error.detailedMessage = 'The request was blocked due to cross-origin restrictions.';
'The request was blocked due to cross-origin restrictions.';
} }
// when Server-side error occurs // when Server-side error occurs
else if (error.response && error.response.status >= 500) { else if (error.response && error.response.status >= 500) {
error.code = 'ERR_SERVER'; error.code = 'ERR_SERVER';
error.detailedMessage = error.detailedMessage = 'A server-side issue occurred. Please try again later.';
'A server-side issue occurred. Please try again later.';
} }
// when Client-side error occurs // when Client-side error occurs
else if (error.response && error.response.status >= 400) { else if (error.response && error.response.status >= 400) {
error.code = 'ERR_CLIENT'; error.code = 'ERR_CLIENT';
error.detailedMessage = error.detailedMessage = 'A client-side error occurred. Please check your request.';
'A client-side error occurred. Please check your request.';
} }
// when unknown network issue occurs // when unknown network issue occurs
@@ -60,13 +56,12 @@ function enhanceNetworkError(error) {
return error; return error;
} }
export function createEnhancedClient(config = {}) { export function createEnhancedClient(config = {}) {
const client = axios.create(config); const client = axios.create(config);
client.interceptors.response.use( client.interceptors.response.use(
response => response, (response) => response,
error => { (error) => {
throw enhanceNetworkError(error); throw enhanceNetworkError(error);
} }
); );
+37 -34
View File
@@ -1,40 +1,43 @@
<!doctype html> <!doctype html>
<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;"> <head>
<div class="form-group"> <title>axios - post example</title>
<label for="data">JSON</label> <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
<textarea id="data" class="form-control" rows="5"></textarea> </head>
</div>
<button id="post" type="button" class="btn btn-primary">POST</button>
</form>
<div id="output" class="container"></div> <body class="container">
<h1>axios.post</h1>
<script src="/axios.min.js"></script> <form role="form" class="form" onsubmit="return false;">
<script> <div class="form-group">
(function () { <label for="data">JSON</label>
var output = document.getElementById('output'); <textarea id="data" class="form-control" rows="5"></textarea>
document.getElementById('post').onclick = function () { </div>
var data = document.getElementById('data').value; <button id="post" type="button" class="btn btn-primary">POST</button>
</form>
axios.post('/post/server', JSON.parse(data)) <div id="output" class="container"></div>
.then(function (res) {
output.className = 'container'; <script src="/axios.min.js"></script>
output.innerHTML = res.data; <script>
}) (function () {
.catch(function (err) { var output = document.getElementById('output');
output.className = 'container text-danger'; document.getElementById('post').onclick = function () {
output.innerHTML = err.message; var data = document.getElementById('data').value;
});
}; axios.post('/post/server', JSON.parse(data))
})(); .then(function (res) {
</script> output.className = 'container';
</body> output.innerHTML = res.data;
</html> })
.catch(function (err) {
output.className = 'container text-danger';
output.innerHTML = err.message;
});
};
})();
</script>
</body>
</html>
+2 -2
View File
@@ -8,9 +8,9 @@ export default function (req, res) {
req.on('end', function () { req.on('end', function () {
console.log('POST data received'); console.log('POST data received');
res.writeHead(200, { res.writeHead(200, {
'Content-Type': 'application/json' 'Content-Type': 'application/json',
}); });
res.write(JSON.stringify(data)); res.write(JSON.stringify(data));
res.end(); res.end();
}); });
}; }
File diff suppressed because it is too large Load Diff
+3 -5
View File
@@ -1,13 +1,11 @@
export default function (req, res) { export default function (req, res) {
req.on('data', function (chunk) {});
req.on('data', function (chunk) {
});
req.on('end', function () { req.on('end', function () {
console.log('POST received'); console.log('POST received');
res.writeHead(200, { res.writeHead(200, {
'Content-Type': 'application/json' 'Content-Type': 'application/json',
}); });
res.end(); res.end();
}); });
}; }
+23 -20
View File
@@ -2,7 +2,7 @@ import fs from 'fs';
import path from 'path'; import path from 'path';
import http from 'http'; import http from 'http';
import minimist from 'minimist'; import minimist from 'minimist';
import url from "url"; import url from 'url';
const argv = minimist(process.argv.slice(2)); const argv = minimist(process.argv.slice(2));
let server; let server;
@@ -31,7 +31,9 @@ function listDirs(root) {
function getIndexTemplate() { function getIndexTemplate() {
const links = dirs.map(function (dir) { const links = dirs.map(function (dir) {
const url = '/' + 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 ( return (
@@ -72,14 +74,14 @@ function pipeFileToResponse(res, file, type) {
// Validate file path - prevent directory traversal // Validate file path - prevent directory traversal
const safeBasePath = path.join(__dirname, 'examples'); const safeBasePath = path.join(__dirname, 'examples');
const resolvedPath = path.resolve(path.join(safeBasePath, file)); const resolvedPath = path.resolve(path.join(safeBasePath, file));
// Ensure the resolved path is within intended directory // Ensure the resolved path is within intended directory
if (!resolvedPath.startsWith(safeBasePath)) { if (!resolvedPath.startsWith(safeBasePath)) {
res.writeHead(400); res.writeHead(400);
res.end('Invalid file path'); res.end('Invalid file path');
return; return;
} }
// Check if file exists // Check if file exists
if (!fs.existsSync(resolvedPath)) { if (!fs.existsSync(resolvedPath)) {
res.writeHead(404); res.writeHead(404);
@@ -89,7 +91,7 @@ function pipeFileToResponse(res, file, type) {
if (type) { if (type) {
res.writeHead(200, { res.writeHead(200, {
"Content-Type": type 'Content-Type': type,
}); });
} else { } else {
res.writeHead(200); res.writeHead(200);
@@ -97,21 +99,21 @@ function pipeFileToResponse(res, file, type) {
const stream = fs.createReadStream(resolvedPath); const stream = fs.createReadStream(resolvedPath);
stream.on("error", (err) => { stream.on('error', (err) => {
console.error("Error while reading file:", err.message); console.error('Error while reading file:', err.message);
if (!res.headersSent) { 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); stream.pipe(res);
} catch (err) { } catch (err) {
console.error("Unexpected error:", err.message); console.error('Unexpected error:', err.message);
if (!res.headersSent) { 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 // Process server request
else if (new RegExp('(' + dirs.join('|') + ')\/server').test(url)) { else if (new RegExp('(' + dirs.join('|') + ')\/server').test(url)) {
if (fs.existsSync(path.join(__dirname, url + '.js'))) { if (fs.existsSync(path.join(__dirname, url + '.js'))) {
import('file://' + path.join(__dirname, url + '.js')).then((server) => { import('file://' + path.join(__dirname, url + '.js'))
server.default(req, res); .then((server) => {
}).catch(err => { server.default(req, res);
console.error('Error importing server:', err); })
send404(res); .catch((err) => {
}); console.error('Error importing server:', err);
send404(res);
});
} else { } else {
send404(res); send404(res);
} }
return; return;
} } else {
else {
send404(res); send404(res);
} }
}); });
+41 -38
View File
@@ -1,44 +1,47 @@
<!doctype html> <!doctype html>
<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"> <head>
<img id="useravatar" src="" class="col-md-1"/> <title>axios - transform response example</title>
<div class="col-md-3"> <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
<strong id="username"></strong><br/> </head>
Created: <span id="created"></span><br/>
Updated: <span id="updated"></span> <body class="container">
</div> <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>
</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();
}
axios.get('https://api.github.com/users/mzabriskie', { <script src="/axios.min.js"></script>
transformResponse: axios.defaults.transformResponse.concat(function (data, headers) { <script>
Object.keys(data).forEach(function (k) { var ISO_8601 = /(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})Z/;
if (ISO_8601.test(data[k])) { function formatDate(d) {
data[k] = new Date(Date.parse(data[k])); return (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
} }
});
return data; axios.get('https://api.github.com/users/mzabriskie', {
}) transformResponse: axios.defaults.transformResponse.concat(function (data, headers) {
}) Object.keys(data).forEach(function (k) {
.then(function (res) { if (ISO_8601.test(data[k])) {
document.getElementById('useravatar').src = res.data.avatar_url; data[k] = new Date(Date.parse(data[k]));
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> return data;
</body> })
</html> })
.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>
+45 -40
View File
@@ -1,48 +1,53 @@
<!doctype html> <!doctype html>
<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;"> <head>
<div class="form-group"> <title>axios - file upload example</title>
<label for="file">File</label> <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
<input id="file" type="file" class="form-control"/> </head>
</div>
<button id="upload" type="button" class="btn btn-primary">Upload</button>
</form>
<div id="output" class="container"></div> <body class="container">
<h1>file upload</h1>
<script src="/axios.min.js"></script> <form role="form" class="form" onsubmit="return false;">
<script> <div class="form-group">
(function () { <label for="file">File</label>
var output = document.getElementById('output'); <input id="file" type="file" class="form-control" />
document.getElementById('upload').onclick = function () { </div>
var data = new FormData(); <button id="upload" type="button" class="btn btn-primary">Upload</button>
data.append('foo', 'bar'); </form>
data.append('file', document.getElementById('file').files[0]);
var config = { <div id="output" class="container"></div>
onUploadProgress: function(progressEvent) {
var percentCompleted = Math.round( (progressEvent.loaded * 100) / progressEvent.total );
}
};
axios.put('/upload/server', data, config) <script src="/axios.min.js"></script>
.then(function (res) { <script>
output.className = 'container'; (function () {
output.innerHTML = res.data; var output = document.getElementById('output');
}) document.getElementById('upload').onclick = function () {
.catch(function (err) { var data = new FormData();
output.className = 'container text-danger'; data.append('foo', 'bar');
output.innerHTML = err.message; 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> axios.put('/upload/server', data, config)
</body> .then(function (res) {
</html> output.className = 'container';
output.textContent = res.data;
})
.catch(function (err) {
output.className = 'container text-danger';
output.textContent = err.message;
});
};
})();
</script>
</body>
</html>
+3 -3
View File
@@ -1,8 +1,8 @@
export default function (req, res) { export default function (req, res) {
let data = ''; let _data = '';
req.on('data', function (chunk) { req.on('data', function (chunk) {
data += chunk; _data += chunk;
}); });
req.on('end', function () { req.on('end', function () {
@@ -10,4 +10,4 @@ export default function (req, res) {
res.writeHead(200); res.writeHead(200);
res.end(); res.end();
}); });
}; }
+35 -35
View File
@@ -1,30 +1,23 @@
import gulp from 'gulp'; import gulp from 'gulp';
import fs from 'fs-extra'; import fs from 'fs-extra';
import axios from './bin/githubAxios.js'; import axios from './bin/githubAxios.js';
import minimist from 'minimist' import minimist from 'minimist';
const argv = minimist(process.argv.slice(2)); const argv = minimist(process.argv.slice(2));
gulp.task('default', async function(){ gulp.task('default', async function () {
console.log('hello!'); console.log('hello!');
}); });
const clear = gulp.task('clear', async function() { const clear = gulp.task('clear', async function () {
await fs.emptyDir('./dist/') await fs.emptyDir('./dist/');
}); });
const bower = gulp.task('bower', async function () { const bower = gulp.task('bower', async function () {
const npm = JSON.parse(await fs.readFile('package.json')); const npm = JSON.parse(await fs.readFile('package.json'));
const bower = JSON.parse(await fs.readFile('bower.json')); const bower = JSON.parse(await fs.readFile('bower.json'));
const fields = [ const fields = ['name', 'description', 'version', 'homepage', 'license', 'keywords'];
'name',
'description',
'version',
'homepage',
'license',
'keywords'
];
for (let i = 0, l = fields.length; i < l; i++) { for (let i = 0, l = fields.length; i < l; i++) {
const field = fields[i]; const field = fields[i];
@@ -35,16 +28,23 @@ const bower = gulp.task('bower', async function () {
}); });
async function getContributors(user, repo, maxCount = 1) { async function getContributors(user, repo, maxCount = 1) {
const contributors = (await axios.get( const contributors = (
`https://api.github.com/repos/${encodeURIComponent(user)}/${encodeURIComponent(repo)}/contributors`, await axios.get(
{ params: { per_page: maxCount } } `https://api.github.com/repos/${encodeURIComponent(user)}/${encodeURIComponent(repo)}/contributors`,
)).data; { params: { per_page: maxCount } }
)
).data;
return Promise.all(contributors.map(async (contributor) => { return Promise.all(
return {...contributor, ...(await axios.get( contributors.map(async (contributor) => {
`https://api.github.com/users/${encodeURIComponent(contributor.login)}` return {
)).data}; ...contributor,
})) ...(
await axios.get(`https://api.github.com/users/${encodeURIComponent(contributor.login)}`)
).data,
};
})
);
} }
const packageJSON = gulp.task('package', async function () { const packageJSON = gulp.task('package', async function () {
@@ -57,9 +57,10 @@ const packageJSON = gulp.task('package', async function () {
npm.contributors = contributors npm.contributors = contributors
.filter( .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)); await fs.writeFile('package.json', JSON.stringify(npm, null, 2));
} catch (err) { } catch (err) {
@@ -75,19 +76,18 @@ const env = gulp.task('env', async function () {
const envFilePath = './lib/env/data.js'; const envFilePath = './lib/env/data.js';
await fs.writeFile(envFilePath, Object.entries({ await fs.writeFile(
VERSION: (argv.bump || npm.version).replace(/^v/, '') envFilePath,
}).map(([key, value]) => { Object.entries({
return `export const ${key} = ${JSON.stringify(value)};` VERSION: (argv.bump || npm.version).replace(/^v/, ''),
}).join('\n')); })
.map(([key, value]) => {
return `export const ${key} = ${JSON.stringify(value)};`;
})
.join('\n')
);
}); });
const version = gulp.series('bower', 'env', 'package'); const version = gulp.series('bower', 'env', 'package');
export { export { bower, env, clear, version, packageJSON };
bower,
env,
clear,
version,
packageJSON
}
+231 -106
View File
@@ -2,30 +2,54 @@ interface RawAxiosHeaders {
[key: string]: axios.AxiosHeaderValue; [key: string]: axios.AxiosHeaderValue;
} }
type MethodsHeaders = Partial<{ type MethodsHeaders = Partial<
[Key in axios.Method as Lowercase<Key>]: AxiosHeaders; {
} & {common: AxiosHeaders}>; [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 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; type BrowserProgressEvent = any;
declare class AxiosHeaders { declare class AxiosHeaders {
constructor( constructor(headers?: RawAxiosHeaders | AxiosHeaders | string);
headers?: RawAxiosHeaders | AxiosHeaders | string
);
[key: string]: any; [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; set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders;
get(headerName: string, parser: RegExp): RegExpExecArray | null; get(headerName: string, parser: RegExp): RegExpExecArray | null;
@@ -39,7 +63,9 @@ declare class AxiosHeaders {
normalize(format: boolean): 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; toJSON(asStrings?: boolean): RawAxiosHeaders;
@@ -47,14 +73,19 @@ declare class AxiosHeaders {
static accessor(header: string | string[]): 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; setContentType(value: ContentType, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
getContentType(parser?: RegExp): RegExpExecArray | null; getContentType(parser?: RegExp): RegExpExecArray | null;
getContentType(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; getContentType(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasContentType(matcher?: AxiosHeaderMatcher): boolean; 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(parser?: RegExp): RegExpExecArray | null;
getContentLength(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; getContentLength(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasContentLength(matcher?: AxiosHeaderMatcher): boolean; hasContentLength(matcher?: AxiosHeaderMatcher): boolean;
@@ -69,12 +100,18 @@ declare class AxiosHeaders {
getUserAgent(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; getUserAgent(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasUserAgent(matcher?: AxiosHeaderMatcher): boolean; 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(parser?: RegExp): RegExpExecArray | null;
getContentEncoding(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; getContentEncoding(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasContentEncoding(matcher?: AxiosHeaderMatcher): boolean; 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(parser?: RegExp): RegExpExecArray | null;
getAuthorization(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue; getAuthorization(matcher?: AxiosHeaderMatcher): axios.AxiosHeaderValue;
hasAuthorization(matcher?: AxiosHeaderMatcher): boolean; hasAuthorization(matcher?: AxiosHeaderMatcher): boolean;
@@ -86,11 +123,11 @@ declare class AxiosHeaders {
declare class AxiosError<T = unknown, D = any> extends Error { declare class AxiosError<T = unknown, D = any> extends Error {
constructor( constructor(
message?: string, message?: string,
code?: string, code?: string,
config?: axios.InternalAxiosRequestConfig<D>, config?: axios.InternalAxiosRequestConfig<D>,
request?: any, request?: any,
response?: axios.AxiosResponse<T, D> response?: axios.AxiosResponse<T, D>
); );
config?: axios.InternalAxiosRequestConfig<D>; config?: axios.InternalAxiosRequestConfig<D>;
@@ -108,24 +145,23 @@ declare class AxiosError<T = unknown, D = any> extends Error {
config?: axios.InternalAxiosRequestConfig<D>, config?: axios.InternalAxiosRequestConfig<D>,
request?: any, request?: any,
response?: axios.AxiosResponse<T, D>, response?: axios.AxiosResponse<T, D>,
customProps?: object, customProps?: object
): AxiosError<T, D>; ): AxiosError<T, D>;
static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS"; 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_VALUE = 'ERR_BAD_OPTION_VALUE';
static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION"; static readonly ERR_BAD_OPTION = 'ERR_BAD_OPTION';
static readonly ERR_NETWORK = "ERR_NETWORK"; static readonly ERR_NETWORK = 'ERR_NETWORK';
static readonly ERR_DEPRECATED = "ERR_DEPRECATED"; static readonly ERR_DEPRECATED = 'ERR_DEPRECATED';
static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE"; static readonly ERR_BAD_RESPONSE = 'ERR_BAD_RESPONSE';
static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST"; static readonly ERR_BAD_REQUEST = 'ERR_BAD_REQUEST';
static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT"; static readonly ERR_NOT_SUPPORT = 'ERR_NOT_SUPPORT';
static readonly ERR_INVALID_URL = "ERR_INVALID_URL"; static readonly ERR_INVALID_URL = 'ERR_INVALID_URL';
static readonly ERR_CANCELED = "ERR_CANCELED"; static readonly ERR_CANCELED = 'ERR_CANCELED';
static readonly ECONNABORTED = "ECONNABORTED"; static readonly ECONNABORTED = 'ECONNABORTED';
static readonly ETIMEDOUT = "ETIMEDOUT"; static readonly ETIMEDOUT = 'ETIMEDOUT';
} }
declare class CanceledError<T> extends AxiosError<T> { declare class CanceledError<T> extends AxiosError<T> {}
}
declare class Axios { declare class Axios {
constructor(config?: axios.AxiosRequestConfig); constructor(config?: axios.AxiosRequestConfig);
@@ -135,17 +171,55 @@ declare class Axios {
response: axios.AxiosInterceptorManager<axios.AxiosResponse>; response: axios.AxiosInterceptorManager<axios.AxiosResponse>;
}; };
getUri(config?: axios.AxiosRequestConfig): string; getUri(config?: axios.AxiosRequestConfig): string;
request<T = any, R = axios.AxiosResponse<T>, D = any>(config: axios.AxiosRequestConfig<D>): Promise<R>; request<T = any, R = axios.AxiosResponse<T>, D = any>(
get<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>; config: axios.AxiosRequestConfig<D>
delete<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>; ): Promise<R>;
head<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>; get<T = any, R = axios.AxiosResponse<T>, D = any>(
options<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>; url: string,
post<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>; config?: axios.AxiosRequestConfig<D>
put<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>; ): Promise<R>;
patch<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>; delete<T = any, R = axios.AxiosResponse<T>, D = any>(
postForm<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>; url: string,
putForm<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>; config?: axios.AxiosRequestConfig<D>
patchForm<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>; ): 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 { declare enum HttpStatusCode {
@@ -219,11 +293,13 @@ type InternalAxiosError<T = unknown, D = any> = AxiosError<T, D>;
declare namespace axios { declare namespace axios {
type AxiosError<T = unknown, D = any> = InternalAxiosError<T, D>; type AxiosError<T = unknown, D = any> = InternalAxiosError<T, D>;
type RawAxiosRequestHeaders = Partial<RawAxiosHeaders & { type RawAxiosRequestHeaders = Partial<
[Key in CommonRequestHeadersList]: AxiosHeaderValue; RawAxiosHeaders & {
} & { [Key in CommonRequestHeadersList]: AxiosHeaderValue;
'Content-Type': ContentType } & {
}>; 'Content-Type': ContentType;
}
>;
type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders; type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders;
@@ -232,7 +308,7 @@ declare namespace axios {
type RawCommonResponseHeaders = { type RawCommonResponseHeaders = {
[Key in CommonResponseHeadersList]: AxiosHeaderValue; [Key in CommonResponseHeadersList]: AxiosHeaderValue;
} & { } & {
"set-cookie": string[]; 'set-cookie': string[];
}; };
type RawAxiosResponseHeaders = Partial<RawAxiosHeaders & RawCommonResponseHeaders>; type RawAxiosResponseHeaders = Partial<RawAxiosHeaders & RawCommonResponseHeaders>;
@@ -244,7 +320,12 @@ declare namespace axios {
} }
interface AxiosResponseTransformer { interface AxiosResponseTransformer {
(this: InternalAxiosRequestConfig, data: any, headers: AxiosResponseHeaders, status?: number): any; (
this: InternalAxiosRequestConfig,
data: any,
headers: AxiosResponseHeaders,
status?: number
): any;
} }
interface AxiosAdapter { interface AxiosAdapter {
@@ -264,39 +345,54 @@ declare namespace axios {
} }
type Method = type Method =
| 'get' | 'GET' | 'get'
| 'delete' | 'DELETE' | 'GET'
| 'head' | 'HEAD' | 'delete'
| 'options' | 'OPTIONS' | 'DELETE'
| 'post' | 'POST' | 'head'
| 'put' | 'PUT' | 'HEAD'
| 'patch' | 'PATCH' | 'options'
| 'purge' | 'PURGE' | 'OPTIONS'
| 'link' | 'LINK' | 'post'
| 'unlink' | 'UNLINK'; | 'POST'
| 'put'
| 'PUT'
| 'patch'
| 'PATCH'
| 'purge'
| 'PURGE'
| 'link'
| 'LINK'
| 'unlink'
| 'UNLINK';
type ResponseType = type ResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream' | 'formdata';
| 'arraybuffer'
| 'blob'
| 'document'
| 'json'
| 'text'
| 'stream'
| 'formdata';
type responseEncoding = type responseEncoding =
| 'ascii' | 'ASCII' | 'ascii'
| 'ansi' | 'ANSI' | 'ASCII'
| 'binary' | 'BINARY' | 'ansi'
| 'base64' | 'BASE64' | 'ANSI'
| 'base64url' | 'BASE64URL' | 'binary'
| 'hex' | 'HEX' | 'BINARY'
| 'latin1' | 'LATIN1' | 'base64'
| 'ucs-2' | 'UCS-2' | 'BASE64'
| 'ucs2' | 'UCS2' | 'base64url'
| 'utf-8' | 'UTF-8' | 'BASE64URL'
| 'utf8' | 'UTF8' | 'hex'
| 'utf16le' | 'UTF16LE'; | 'HEX'
| 'latin1'
| 'LATIN1'
| 'ucs-2'
| 'UCS-2'
| 'ucs2'
| 'UCS2'
| 'utf-8'
| 'UTF-8'
| 'utf8'
| 'UTF8'
| 'utf16le'
| 'UTF16LE';
interface TransitionalOptions { interface TransitionalOptions {
silentJSONParsing?: boolean; silentJSONParsing?: boolean;
@@ -320,11 +416,11 @@ declare namespace axios {
interface SerializerVisitor { interface SerializerVisitor {
( (
this: GenericFormData, this: GenericFormData,
value: any, value: any,
key: string | number, key: string | number,
path: null | Array<string | number>, path: null | Array<string | number>,
helpers: FormDataVisitorHelpers helpers: FormDataVisitorHelpers
): boolean; ): boolean;
} }
@@ -336,8 +432,7 @@ declare namespace axios {
} }
// tslint:disable-next-line // tslint:disable-next-line
interface FormSerializerOptions extends SerializerOptions { interface FormSerializerOptions extends SerializerOptions {}
}
interface ParamEncoder { interface ParamEncoder {
(value: any, defaultEncoder: (value: any) => any): any; (value: any, defaultEncoder: (value: any) => any): any;
@@ -411,7 +506,10 @@ declare namespace axios {
maxBodyLength?: number; maxBodyLength?: number;
maxRedirects?: number; maxRedirects?: number;
maxRate?: number | [MaxUploadRate, MaxDownloadRate]; 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; socketPath?: string | null;
transport?: any; transport?: any;
httpAgent?: any; httpAgent?: any;
@@ -427,16 +525,33 @@ declare namespace axios {
fetch?: (input: URL | Request | string, init?: RequestInit) => Promise<Response>; fetch?: (input: URL | Request | string, init?: RequestInit) => Promise<Response>;
Request?: new (input: URL | Request | string, init?: RequestInit) => Request; Request?: new (input: URL | Request | string, init?: RequestInit) => Request;
Response?: new ( Response?: new (
body?: ArrayBuffer | ArrayBufferView | Blob | FormData | URLSearchParams | string | null, body?: ArrayBuffer | ArrayBufferView | Blob | FormData | URLSearchParams | string | null,
init?: ResponseInit init?: ResponseInit
) => Response; ) => Response;
}; };
formSerializer?: FormSerializerOptions; formSerializer?: FormSerializerOptions;
family?: AddressFamily; family?: AddressFamily;
lookup?: ((hostname: string, options: object, cb: (err: Error | null, address: LookupAddress | LookupAddress[], family?: AddressFamily) => void) => void) | lookup?:
((hostname: string, options: object) => Promise<[address: LookupAddressEntry | LookupAddressEntry[], family?: AddressFamily] | LookupAddress>); | ((
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); 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; httpVersion?: 1 | 2;
http2Options?: Record<string, any> & { http2Options?: Record<string, any> & {
sessionTimeout?: number; sessionTimeout?: number;
@@ -472,11 +587,11 @@ declare namespace axios {
headers?: RawAxiosRequestHeaders | AxiosHeaders | Partial<HeadersDefaults>; headers?: RawAxiosRequestHeaders | AxiosHeaders | Partial<HeadersDefaults>;
} }
interface AxiosResponse<T = any, D = any, H = {}> { interface AxiosResponse<T = any, D = any, H = {}> {
data: T; data: T;
status: number; status: number;
statusText: string; statusText: string;
headers: H & RawAxiosResponseHeaders | AxiosResponseHeaders; headers: (H & RawAxiosResponseHeaders) | AxiosResponseHeaders;
config: InternalAxiosRequestConfig<D>; config: InternalAxiosRequestConfig<D>;
request?: any; request?: any;
} }
@@ -546,13 +661,16 @@ declare namespace axios {
interface AxiosInstance extends Axios { interface AxiosInstance extends Axios {
<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>; <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; create(config?: CreateAxiosDefaults): AxiosInstance;
defaults: Omit<AxiosDefaults, 'headers'> & { defaults: Omit<AxiosDefaults, 'headers'> & {
headers: HeadersDefaults & { headers: HeadersDefaults & {
[key: string]: AxiosHeaderValue [key: string]: AxiosHeaderValue;
} };
}; };
} }
@@ -578,11 +696,18 @@ declare namespace axios {
all<T>(values: Array<T | Promise<T>>): Promise<T[]>; all<T>(values: Array<T | Promise<T>>): Promise<T[]>;
spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R; spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>; isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>;
toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData; toFormData(
formToJSON(form: GenericFormData|GenericHTMLFormElement): object; sourceObj: object,
targetFormData?: GenericFormData,
options?: FormSerializerOptions
): GenericFormData;
formToJSON(form: GenericFormData | GenericHTMLFormElement): object;
getAdapter(adapters: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined): AxiosAdapter; getAdapter(adapters: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined): AxiosAdapter;
AxiosHeaders: typeof AxiosHeaders; 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>;
} }
} }
+3 -3
View File
@@ -19,7 +19,7 @@ const {
HttpStatusCode, HttpStatusCode,
formToJSON, formToJSON,
getAdapter, getAdapter,
mergeConfig mergeConfig,
} = axios; } = axios;
export { export {
@@ -39,5 +39,5 @@ export {
HttpStatusCode, HttpStatusCode,
formToJSON, formToJSON,
getAdapter, getAdapter,
mergeConfig mergeConfig,
} };
+26 -52
View File
@@ -14,11 +14,11 @@ function createCustomLauncher(browser, version, platform) {
base: 'SauceLabs', base: 'SauceLabs',
browserName: browser, browserName: browser,
version: version, version: version,
platform: platform platform: platform,
}; };
} }
module.exports = function(config) { module.exports = function (config) {
var customLaunchers = {}; var customLaunchers = {};
var browsers = process.env.Browsers && process.env.Browsers.split(','); var browsers = process.env.Browsers && process.env.Browsers.split(',');
var sauceLabs; var sauceLabs;
@@ -35,10 +35,10 @@ module.exports = function(config) {
'SAUCE_IE', 'SAUCE_IE',
'SAUCE_EDGE', 'SAUCE_EDGE',
'SAUCE_IOS', 'SAUCE_IOS',
'SAUCE_ANDROID' 'SAUCE_ANDROID',
]; ];
options.forEach(function(opt) { options.forEach(function (opt) {
if (process.env[opt]) { if (process.env[opt]) {
runAll = false; runAll = false;
} }
@@ -62,21 +62,9 @@ module.exports = function(config) {
if (runAll || process.env.SAUCE_SAFARI) { if (runAll || process.env.SAUCE_SAFARI) {
// customLaunchers.SL_Safari7 = createCustomLauncher('safari', 7); // customLaunchers.SL_Safari7 = createCustomLauncher('safari', 7);
// customLaunchers.SL_Safari8 = createCustomLauncher('safari', 8); // customLaunchers.SL_Safari8 = createCustomLauncher('safari', 8);
customLaunchers.SL_Safari9 = createCustomLauncher( customLaunchers.SL_Safari9 = createCustomLauncher('safari', 9.0, 'OS X 10.11');
'safari', customLaunchers.SL_Safari10 = createCustomLauncher('safari', '10.1', 'macOS 10.12');
9.0, customLaunchers.SL_Safari11 = createCustomLauncher('safari', '11.1', 'macOS 10.13');
'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 // Opera
@@ -118,14 +106,14 @@ module.exports = function(config) {
recordScreenshots: false, recordScreenshots: false,
connectOptions: { connectOptions: {
// port: 5757, // 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') { } else if (process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false') {
console.log( console.log(
'Cannot run on Sauce Labs as encrypted environment variables are not available to PRs. ' + 'Cannot run on Sauce Labs as encrypted environment variables are not available to PRs. ' +
'Running on Travis.' 'Running on Travis.'
); );
browsers = ['Firefox']; browsers = ['Firefox'];
} else if (process.env.GITHUB_ACTIONS === 'true') { } else if (process.env.GITHUB_ACTIONS === 'true') {
@@ -133,50 +121,44 @@ module.exports = function(config) {
browsers = ['FirefoxHeadless', 'ChromeHeadless']; browsers = ['FirefoxHeadless', 'ChromeHeadless'];
} else { } else {
browsers = browsers || ['Chrome']; 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({ config.set({
// base path that will be used to resolve all patterns (eg. files, exclude) // base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '', basePath: '',
// frameworks to use // frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine-ajax', 'jasmine', 'sinon'], frameworks: ['jasmine-ajax', 'jasmine', 'sinon'],
// list of files / patterns to load in the browser // list of files / patterns to load in the browser
files: [ files: [
{pattern: 'test/specs/__helpers.js', watched: false}, { pattern: 'test/specs/__helpers.js', watched: false },
{pattern: 'test/specs/**/*.spec.js', watched: false} { pattern: 'test/specs/**/*.spec.js', watched: false },
], ],
// list of files to exclude // list of files to exclude
exclude: [], exclude: [],
// preprocess matching files before serving them to the browser // preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: { preprocessors: {
'test/specs/__helpers.js': ['rollup'], 'test/specs/__helpers.js': ['rollup'],
'test/specs/**/*.spec.js': ['rollup'] 'test/specs/**/*.spec.js': ['rollup'],
}, },
rollupPreprocessor: { rollupPreprocessor: {
plugins: [ plugins: [resolve({ browser: true }), commonjs()],
resolve({browser: true}),
commonjs()
],
output: { output: {
format: 'iife', format: 'iife',
name: '_axios', name: '_axios',
sourcemap: 'inline' sourcemap: 'inline',
} },
}, },
// test results reporter to use // test results reporter to use
// possible values: 'dots', 'progress' // possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter // available reporters: https://npmjs.org/browse/keyword/karma-reporter
@@ -184,36 +166,29 @@ module.exports = function(config) {
// reporters: ['dots', 'coverage', 'saucelabs'], // reporters: ['dots', 'coverage', 'saucelabs'],
reporters: ['progress'], reporters: ['progress'],
// web server port // web server port
port: 9876, port: 9876,
// Increase timeouts to prevent the issue with disconnected tests (https://goo.gl/nstA69) // Increase timeouts to prevent the issue with disconnected tests (https://goo.gl/nstA69)
captureTimeout: 4 * 60 * 1000, captureTimeout: 4 * 60 * 1000,
browserDisconnectTimeout: 10000, browserDisconnectTimeout: 10000,
browserDisconnectTolerance: 1, browserDisconnectTolerance: 1,
browserNoActivityTimeout: 4 * 60 * 1000, browserNoActivityTimeout: 4 * 60 * 1000,
// enable / disable colors in the output (reporters and logs) // enable / disable colors in the output (reporters and logs)
colors: true, colors: true,
// level of logging // level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO, logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes // enable / disable watching file and executing tests whenever any file changes
autoWatch: false, autoWatch: false,
// start these browsers // start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: browsers, browsers: browsers,
// Continuous Integration mode // Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits // if true, Karma captures browsers, runs the tests and exits
singleRun: false, singleRun: false,
@@ -225,26 +200,25 @@ module.exports = function(config) {
devtool: 'inline-source-map', devtool: 'inline-source-map',
externals: [ externals: [
{ {
'./adapters/http': 'var undefined' './adapters/http': 'var undefined',
} },
] ],
}, },
webpackServer: { webpackServer: {
stats: { stats: {
colors: true colors: true,
} },
}, },
// Coverage reporting // Coverage reporting
coverageReporter: { coverageReporter: {
type: 'lcov', type: 'lcov',
dir: 'coverage/', dir: 'coverage/',
subdir: '.' subdir: '.',
}, },
sauceLabs: sauceLabs, sauceLabs: sauceLabs,
customLaunchers: customLaunchers customLaunchers: customLaunchers,
}); });
}; };
+4 -5
View File
@@ -12,19 +12,18 @@ module.exports = function myAdapter(config) {
// - config has been merged with defaults // - config has been merged with defaults
// - request transformers have already run // - request transformers have already run
// - request interceptors have already run // - request interceptors have already run
// Make the request using config provided // Make the request using config provided
// Upon response settle the Promise // Upon response settle the Promise
return new Promise(function(resolve, reject) { return new Promise(function (resolve, reject) {
var response = { var response = {
data: responseData, data: responseData,
status: request.status, status: request.status,
statusText: request.statusText, statusText: request.statusText,
headers: responseHeaders, headers: responseHeaders,
config: config, config: config,
request: request request: request,
}; };
settle(resolve, reject, response); settle(resolve, reject, response);
@@ -33,5 +32,5 @@ module.exports = function myAdapter(config) {
// - response transformers will run // - response transformers will run
// - response interceptors will run // - response interceptors will run
}); });
} };
``` ```
+18 -14
View File
@@ -2,7 +2,7 @@ import utils from '../utils.js';
import httpAdapter from './http.js'; import httpAdapter from './http.js';
import xhrAdapter from './xhr.js'; import xhrAdapter from './xhr.js';
import * as fetchAdapter from './fetch.js'; import * as fetchAdapter from './fetch.js';
import AxiosError from "../core/AxiosError.js"; import AxiosError from '../core/AxiosError.js';
/** /**
* Known adapters mapping. * Known adapters mapping.
@@ -10,7 +10,7 @@ import AxiosError from "../core/AxiosError.js";
* - `http` for Node.js * - `http` for Node.js
* - `xhr` for browsers * - `xhr` for browsers
* - `fetch` for fetch API-based requests * - `fetch` for fetch API-based requests
* *
* @type {Object<string, Function|Object>} * @type {Object<string, Function|Object>}
*/ */
const knownAdapters = { const knownAdapters = {
@@ -18,7 +18,7 @@ const knownAdapters = {
xhr: xhrAdapter, xhr: xhrAdapter,
fetch: { fetch: {
get: fetchAdapter.getFetch, get: fetchAdapter.getFetch,
} },
}; };
// Assign adapter names for easier debugging and identification // Assign adapter names for easier debugging and identification
@@ -35,7 +35,7 @@ utils.forEach(knownAdapters, (fn, value) => {
/** /**
* Render a rejection reason string for unknown or unsupported adapters * Render a rejection reason string for unknown or unsupported adapters
* *
* @param {string} reason * @param {string} reason
* @returns {string} * @returns {string}
*/ */
@@ -43,17 +43,18 @@ const renderReason = (reason) => `- ${reason}`;
/** /**
* Check if the adapter is resolved (function, null, or false) * Check if the adapter is resolved (function, null, or false)
* *
* @param {Function|null|false} adapter * @param {Function|null|false} adapter
* @returns {boolean} * @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. * Get the first suitable adapter from the provided list.
* Tries each adapter in order until a supported one is found. * Tries each adapter in order until a supported one is found.
* Throws an AxiosError if no adapter is suitable. * Throws an AxiosError if no adapter is suitable.
* *
* @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function. * @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.
* @param {Object} config - Axios request configuration * @param {Object} config - Axios request configuration
* @throws {AxiosError} If no suitable adapter is available * @throws {AxiosError} If no suitable adapter is available
@@ -90,14 +91,17 @@ function getAdapter(adapters, config) {
} }
if (!adapter) { if (!adapter) {
const reasons = Object.entries(rejectedReasons) const reasons = Object.entries(rejectedReasons).map(
.map(([id, state]) => `adapter ${id} ` + ([id, state]) =>
`adapter ${id} ` +
(state === false ? 'is not supported by the environment' : 'is not available in the build') (state === false ? 'is not supported by the environment' : 'is not available in the build')
); );
let s = length ? let s = length
(reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) : ? reasons.length > 1
'as no adapter specified'; ? 'since :\n' + reasons.map(renderReason).join('\n')
: ' ' + renderReason(reasons[0])
: 'as no adapter specified';
throw new AxiosError( throw new AxiosError(
`There is no suitable adapter to dispatch the request ` + s, `There is no suitable adapter to dispatch the request ` + s,
@@ -122,5 +126,5 @@ export default {
* Exposes all known adapters * Exposes all known adapters
* @type {Object<string, Function|Object>} * @type {Object<string, Function|Object>}
*/ */
adapters: knownAdapters adapters: knownAdapters,
}; };
+133 -87
View File
@@ -1,40 +1,46 @@
import platform from "../platform/index.js"; import platform from '../platform/index.js';
import utils from "../utils.js"; import utils from '../utils.js';
import AxiosError from "../core/AxiosError.js"; import AxiosError from '../core/AxiosError.js';
import composeSignals from "../helpers/composeSignals.js"; import composeSignals from '../helpers/composeSignals.js';
import {trackStream} from "../helpers/trackStream.js"; import { trackStream } from '../helpers/trackStream.js';
import AxiosHeaders from "../core/AxiosHeaders.js"; import AxiosHeaders from '../core/AxiosHeaders.js';
import {progressEventReducer, progressEventDecorator, asyncDecorator} from "../helpers/progressEventReducer.js"; import {
import resolveConfig from "../helpers/resolveConfig.js"; progressEventReducer,
import settle from "../core/settle.js"; 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 DEFAULT_CHUNK_SIZE = 64 * 1024;
const {isFunction} = utils; const { isFunction } = utils;
const globalFetchAPI = (({Request, Response}) => ({ const globalFetchAPI = (({ Request, Response }) => ({
Request, Response Request,
Response,
}))(utils.global); }))(utils.global);
const { const { ReadableStream, TextEncoder } = utils.global;
ReadableStream, TextEncoder
} = utils.global;
const test = (fn, ...args) => { const test = (fn, ...args) => {
try { try {
return !!fn(...args); return !!fn(...args);
} catch (e) { } catch (e) {
return false return false;
} }
} };
const factory = (env) => { const factory = (env) => {
env = utils.merge.call({ env = utils.merge.call(
skipUndefined: true {
}, globalFetchAPI, env); 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 isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';
const isRequestSupported = isFunction(Request); const isRequestSupported = isFunction(Request);
const isResponseSupported = isFunction(Response); const isResponseSupported = isFunction(Response);
@@ -45,46 +51,61 @@ const factory = (env) => {
const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream); const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);
const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ? const encodeText =
((encoder) => (str) => encoder.encode(str))(new TextEncoder()) : isFetchSupported &&
async (str) => new Uint8Array(await new Request(str).arrayBuffer()) (typeof TextEncoder === 'function'
); ? (
(encoder) => (str) =>
encoder.encode(str)
)(new TextEncoder())
: async (str) => new Uint8Array(await new Request(str).arrayBuffer()));
const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => { const supportsRequestStream =
let duplexAccessed = false; isRequestSupported &&
isReadableStreamSupported &&
test(() => {
let duplexAccessed = false;
const hasContentType = new Request(platform.origin, { const hasContentType = new Request(platform.origin, {
body: new ReadableStream(), body: new ReadableStream(),
method: 'POST', method: 'POST',
get duplex() { get duplex() {
duplexAccessed = true; duplexAccessed = true;
return 'half'; return 'half';
}, },
}).headers.has('Content-Type'); }).headers.has('Content-Type');
return duplexAccessed && !hasContentType; return duplexAccessed && !hasContentType;
}); });
const supportsResponseStream = isResponseSupported && isReadableStreamSupported && const supportsResponseStream =
isResponseSupported &&
isReadableStreamSupported &&
test(() => utils.isReadableStream(new Response('').body)); test(() => utils.isReadableStream(new Response('').body));
const resolvers = { const resolvers = {
stream: supportsResponseStream && ((res) => res.body) stream: supportsResponseStream && ((res) => res.body),
}; };
isFetchSupported && ((() => { isFetchSupported &&
['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => { (() => {
!resolvers[type] && (resolvers[type] = (res, config) => { ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach((type) => {
let method = res && res[type]; !resolvers[type] &&
(resolvers[type] = (res, config) => {
let method = res && res[type];
if (method) { if (method) {
return method.call(res); 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) => { const getBodyLength = async (body) => {
if (body == null) { if (body == null) {
@@ -114,13 +135,13 @@ const factory = (env) => {
if (utils.isString(body)) { if (utils.isString(body)) {
return (await encodeText(body)).byteLength; return (await encodeText(body)).byteLength;
} }
} };
const resolveBodyLength = async (headers, body) => { const resolveBodyLength = async (headers, body) => {
const length = utils.toFiniteNumber(headers.getContentLength()); const length = utils.toFiniteNumber(headers.getContentLength());
return length == null ? getBodyLength(body) : length; return length == null ? getBodyLength(body) : length;
} };
return async (config) => { return async (config) => {
let { let {
@@ -135,38 +156,47 @@ const factory = (env) => {
responseType, responseType,
headers, headers,
withCredentials = 'same-origin', withCredentials = 'same-origin',
fetchOptions fetchOptions,
} = resolveConfig(config); } = resolveConfig(config);
let _fetch = envFetch || fetch; let _fetch = envFetch || fetch;
responseType = responseType ? (responseType + '').toLowerCase() : 'text'; responseType = responseType ? (responseType + '').toLowerCase() : 'text';
let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout); let composedSignal = composeSignals(
[signal, cancelToken && cancelToken.toAbortSignal()],
timeout
);
let request = null; let request = null;
const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => { const unsubscribe =
composedSignal.unsubscribe(); composedSignal &&
}); composedSignal.unsubscribe &&
(() => {
composedSignal.unsubscribe();
});
let requestContentLength; let requestContentLength;
try { try {
if ( if (
onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' && onUploadProgress &&
supportsRequestStream &&
method !== 'get' &&
method !== 'head' &&
(requestContentLength = await resolveBodyLength(headers, data)) !== 0 (requestContentLength = await resolveBodyLength(headers, data)) !== 0
) { ) {
let _request = new Request(url, { let _request = new Request(url, {
method: 'POST', method: 'POST',
body: data, body: data,
duplex: "half" duplex: 'half',
}); });
let contentTypeHeader; let contentTypeHeader;
if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) { if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
headers.setContentType(contentTypeHeader) headers.setContentType(contentTypeHeader);
} }
if (_request.body) { if (_request.body) {
@@ -185,7 +215,7 @@ const factory = (env) => {
// Cloudflare Workers throws when credentials are defined // Cloudflare Workers throws when credentials are defined
// see https://github.com/cloudflare/workerd/issues/902 // see https://github.com/cloudflare/workerd/issues/902
const isCredentialsSupported = isRequestSupported && "credentials" in Request.prototype; const isCredentialsSupported = isRequestSupported && 'credentials' in Request.prototype;
const resolvedOptions = { const resolvedOptions = {
...fetchOptions, ...fetchOptions,
@@ -193,29 +223,35 @@ const factory = (env) => {
method: method.toUpperCase(), method: method.toUpperCase(),
headers: headers.normalize().toJSON(), headers: headers.normalize().toJSON(),
body: data, body: data,
duplex: "half", duplex: 'half',
credentials: isCredentialsSupported ? withCredentials : undefined credentials: isCredentialsSupported ? withCredentials : undefined,
}; };
request = isRequestSupported && new Request(url, resolvedOptions); 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))) { if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
const options = {}; const options = {};
['status', 'statusText', 'headers'].forEach(prop => { ['status', 'statusText', 'headers'].forEach((prop) => {
options[prop] = response[prop]; options[prop] = response[prop];
}); });
const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length')); const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));
const [onProgress, flush] = onDownloadProgress && progressEventDecorator( const [onProgress, flush] =
responseContentLength, (onDownloadProgress &&
progressEventReducer(asyncDecorator(onDownloadProgress), true) progressEventDecorator(
) || []; responseContentLength,
progressEventReducer(asyncDecorator(onDownloadProgress), true)
)) ||
[];
response = new Response( response = new Response(
trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => { trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
@@ -228,7 +264,10 @@ const factory = (env) => {
responseType = responseType || 'text'; 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(); !isStreamResponse && unsubscribe && unsubscribe();
@@ -239,43 +278,50 @@ const factory = (env) => {
status: response.status, status: response.status,
statusText: response.statusText, statusText: response.statusText,
config, config,
request request,
}) });
}) });
} catch (err) { } catch (err) {
unsubscribe && unsubscribe(); unsubscribe && unsubscribe();
if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) { if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {
throw Object.assign( 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); throw AxiosError.from(err, err && err.code, config, request, err && err.response);
} }
} };
} };
const seedCache = new Map(); const seedCache = new Map();
export const getFetch = (config) => { export const getFetch = (config) => {
let env = (config && config.env) || {}; let env = (config && config.env) || {};
const {fetch, Request, Response} = env; const { fetch, Request, Response } = env;
const seeds = [ const seeds = [Request, Response, fetch];
Request, Response, fetch
];
let len = seeds.length, i = len, let len = seeds.length,
seed, target, map = seedCache; i = len,
seed,
target,
map = seedCache;
while (i--) { while (i--) {
seed = seeds[i]; seed = seeds[i];
target = map.get(seed); 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; map = target;
} }
+659 -608
View File
File diff suppressed because it is too large Load Diff
+192 -170
View File
@@ -6,195 +6,217 @@ import CanceledError from '../cancel/CanceledError.js';
import parseProtocol from '../helpers/parseProtocol.js'; import parseProtocol from '../helpers/parseProtocol.js';
import platform from '../platform/index.js'; import platform from '../platform/index.js';
import AxiosHeaders from '../core/AxiosHeaders.js'; import AxiosHeaders from '../core/AxiosHeaders.js';
import {progressEventReducer} from '../helpers/progressEventReducer.js'; import { progressEventReducer } from '../helpers/progressEventReducer.js';
import resolveConfig from "../helpers/resolveConfig.js"; import resolveConfig from '../helpers/resolveConfig.js';
const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
export default isXHRAdapterSupported && function (config) { export default isXHRAdapterSupported &&
return new Promise(function dispatchXhrRequest(resolve, reject) { function (config) {
const _config = resolveConfig(config); return new Promise(function dispatchXhrRequest(resolve, reject) {
let requestData = _config.data; const _config = resolveConfig(config);
const requestHeaders = AxiosHeaders.from(_config.headers).normalize(); let requestData = _config.data;
let {responseType, onUploadProgress, onDownloadProgress} = _config; const requestHeaders = AxiosHeaders.from(_config.headers).normalize();
let onCanceled; let { responseType, onUploadProgress, onDownloadProgress } = _config;
let uploadThrottled, downloadThrottled; let onCanceled;
let flushUpload, flushDownload; let uploadThrottled, downloadThrottled;
let flushUpload, flushDownload;
function done() { function done() {
flushUpload && flushUpload(); // flush events flushUpload && flushUpload(); // flush events
flushDownload && flushDownload(); // 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); _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;
} }
reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request)); let request = new XMLHttpRequest();
// Clean up request request.open(_config.method.toUpperCase(), _config.url, true);
request = null;
};
// Handle low level network errors // Set the request timeout in MS
request.onerror = function handleError(event) { request.timeout = _config.timeout;
// 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 function onloadend() {
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 => {
if (!request) { if (!request) {
return; return;
} }
reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel); // Prepare the response
request.abort(); 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; request = null;
}; };
_config.cancelToken && _config.cancelToken.subscribe(onCanceled); // Handle low level network errors
if (_config.signal) { request.onerror = function handleError(event) {
_config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled); // 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) { // Add responseType to request if needed
reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); if (responseType && responseType !== 'json') {
return; request.responseType = _config.responseType;
} }
// Handle progress if needed
if (onDownloadProgress) {
[downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true);
request.addEventListener('progress', downloadThrottled);
}
// Send the request // Not all browsers support upload events
request.send(requestData || null); 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);
});
};
+6 -6
View File
@@ -9,12 +9,12 @@ import formDataToJSON from './helpers/formDataToJSON.js';
import CanceledError from './cancel/CanceledError.js'; import CanceledError from './cancel/CanceledError.js';
import CancelToken from './cancel/CancelToken.js'; import CancelToken from './cancel/CancelToken.js';
import isCancel from './cancel/isCancel.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 toFormData from './helpers/toFormData.js';
import AxiosError from './core/AxiosError.js'; import AxiosError from './core/AxiosError.js';
import spread from './helpers/spread.js'; import spread from './helpers/spread.js';
import isAxiosError from './helpers/isAxiosError.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 adapters from './adapters/adapters.js';
import HttpStatusCode from './helpers/HttpStatusCode.js'; import HttpStatusCode from './helpers/HttpStatusCode.js';
@@ -30,10 +30,10 @@ function createInstance(defaultConfig) {
const instance = bind(Axios.prototype.request, context); const instance = bind(Axios.prototype.request, context);
// Copy axios.prototype to instance // 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 // Copy context to instance
utils.extend(instance, context, null, {allOwnKeys: true}); utils.extend(instance, context, null, { allOwnKeys: true });
// Factory for creating new instances // Factory for creating new instances
instance.create = function create(instanceConfig) { instance.create = function create(instanceConfig) {
@@ -77,7 +77,7 @@ axios.mergeConfig = mergeConfig;
axios.AxiosHeaders = AxiosHeaders; 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; axios.getAdapter = adapters.getAdapter;
@@ -86,4 +86,4 @@ axios.HttpStatusCode = HttpStatusCode;
axios.default = axios; axios.default = axios;
// this module should only have a default export // this module should only have a default export
export default axios export default axios;
+4 -4
View File
@@ -24,7 +24,7 @@ class CancelToken {
const token = this; const token = this;
// eslint-disable-next-line func-names // eslint-disable-next-line func-names
this.promise.then(cancel => { this.promise.then((cancel) => {
if (!token._listeners) return; if (!token._listeners) return;
let i = token._listeners.length; let i = token._listeners.length;
@@ -36,10 +36,10 @@ class CancelToken {
}); });
// eslint-disable-next-line func-names // eslint-disable-next-line func-names
this.promise.then = onfulfilled => { this.promise.then = (onfulfilled) => {
let _resolve; let _resolve;
// eslint-disable-next-line func-names // eslint-disable-next-line func-names
const promise = new Promise(resolve => { const promise = new Promise((resolve) => {
token.subscribe(resolve); token.subscribe(resolve);
_resolve = resolve; _resolve = resolve;
}).then(onfulfilled); }).then(onfulfilled);
@@ -127,7 +127,7 @@ class CancelToken {
}); });
return { return {
token, token,
cancel cancel,
}; };
} }
} }
+57 -43
View File
@@ -24,7 +24,7 @@ class Axios {
this.defaults = instanceConfig || {}; this.defaults = instanceConfig || {};
this.interceptors = { this.interceptors = {
request: new InterceptorManager(), request: new InterceptorManager(),
response: new InterceptorManager() response: new InterceptorManager(),
}; };
} }
@@ -52,7 +52,7 @@ class Axios {
err.stack = stack; err.stack = stack;
// match without the 2 top stack lines // match without the 2 top stack lines
} else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ''))) { } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ''))) {
err.stack += '\n' + stack err.stack += '\n' + stack;
} }
} catch (e) { } catch (e) {
// ignore the case where "stack" is an un-writable property // ignore the case where "stack" is an un-writable property
@@ -75,27 +75,35 @@ class Axios {
config = mergeConfig(this.defaults, config); config = mergeConfig(this.defaults, config);
const {transitional, paramsSerializer, headers} = config; const { transitional, paramsSerializer, headers } = config;
if (transitional !== undefined) { if (transitional !== undefined) {
validator.assertOptions(transitional, { validator.assertOptions(
silentJSONParsing: validators.transitional(validators.boolean), transitional,
forcedJSONParsing: validators.transitional(validators.boolean), {
clarifyTimeoutError: validators.transitional(validators.boolean), silentJSONParsing: validators.transitional(validators.boolean),
legacyInterceptorReqResOrdering: validators.transitional(validators.boolean) forcedJSONParsing: validators.transitional(validators.boolean),
}, false); clarifyTimeoutError: validators.transitional(validators.boolean),
legacyInterceptorReqResOrdering: validators.transitional(validators.boolean),
},
false
);
} }
if (paramsSerializer != null) { if (paramsSerializer != null) {
if (utils.isFunction(paramsSerializer)) { if (utils.isFunction(paramsSerializer)) {
config.paramsSerializer = { config.paramsSerializer = {
serialize: paramsSerializer serialize: paramsSerializer,
} };
} else { } else {
validator.assertOptions(paramsSerializer, { validator.assertOptions(
encode: validators.function, paramsSerializer,
serialize: validators.function {
}, true); encode: validators.function,
serialize: validators.function,
},
true
);
} }
} }
@@ -108,26 +116,25 @@ class Axios {
config.allowAbsoluteUrls = true; config.allowAbsoluteUrls = true;
} }
validator.assertOptions(config, { validator.assertOptions(
baseUrl: validators.spelling('baseURL'), config,
withXsrfToken: validators.spelling('withXSRFToken') {
}, true); baseUrl: validators.spelling('baseURL'),
withXsrfToken: validators.spelling('withXSRFToken'),
},
true
);
// Set config.method // Set config.method
config.method = (config.method || this.defaults.method || 'get').toLowerCase(); config.method = (config.method || this.defaults.method || 'get').toLowerCase();
// Flatten headers // Flatten headers
let contextHeaders = headers && utils.merge( let contextHeaders = headers && utils.merge(headers.common, headers[config.method]);
headers.common,
headers[config.method]
);
headers && utils.forEach( headers &&
['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], (method) => {
(method) => {
delete headers[method]; delete headers[method];
} });
);
config.headers = AxiosHeaders.concat(contextHeaders, headers); config.headers = AxiosHeaders.concat(contextHeaders, headers);
@@ -142,7 +149,8 @@ class Axios {
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
const transitional = config.transitional || transitionalDefaults; const transitional = config.transitional || transitionalDefaults;
const legacyInterceptorReqResOrdering = transitional && transitional.legacyInterceptorReqResOrdering; const legacyInterceptorReqResOrdering =
transitional && transitional.legacyInterceptorReqResOrdering;
if (legacyInterceptorReqResOrdering) { if (legacyInterceptorReqResOrdering) {
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
@@ -216,12 +224,14 @@ class Axios {
// Provide aliases for supported request methods // Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
/*eslint func-names:0*/ /*eslint func-names:0*/
Axios.prototype[method] = function(url, config) { Axios.prototype[method] = function (url, config) {
return this.request(mergeConfig(config || {}, { return this.request(
method, mergeConfig(config || {}, {
url, method,
data: (config || {}).data url,
})); data: (config || {}).data,
})
);
}; };
}); });
@@ -230,14 +240,18 @@ utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
function generateHTTPMethod(isForm) { function generateHTTPMethod(isForm) {
return function httpMethod(url, data, config) { return function httpMethod(url, data, config) {
return this.request(mergeConfig(config || {}, { return this.request(
method, mergeConfig(config || {}, {
headers: isForm ? { method,
'Content-Type': 'multipart/form-data' headers: isForm
} : {}, ? {
url, 'Content-Type': 'multipart/form-data',
data }
})); : {},
url,
data,
})
);
}; };
} }
+48 -48
View File
@@ -3,57 +3,57 @@
import utils from '../utils.js'; import utils from '../utils.js';
class AxiosError extends Error { class AxiosError extends Error {
static from(error, code, config, request, response, customProps) { static from(error, code, config, request, response, customProps) {
const axiosError = new AxiosError(error.message, code || error.code, config, request, response); const axiosError = new AxiosError(error.message, code || error.code, config, request, response);
axiosError.cause = error; axiosError.cause = error;
axiosError.name = error.name; axiosError.name = error.name;
customProps && Object.assign(axiosError, customProps); customProps && Object.assign(axiosError, customProps);
return axiosError; return axiosError;
} }
/** /**
* Create an Error with the specified message, config, error code, request and response. * Create an Error with the specified message, config, error code, request and response.
* *
* @param {string} message The error message. * @param {string} message The error message.
* @param {string} [code] The error code (for example, 'ECONNABORTED'). * @param {string} [code] The error code (for example, 'ECONNABORTED').
* @param {Object} [config] The config. * @param {Object} [config] The config.
* @param {Object} [request] The request. * @param {Object} [request] The request.
* @param {Object} [response] The response. * @param {Object} [response] The response.
* *
* @returns {Error} The created error. * @returns {Error} The created error.
*/ */
constructor(message, code, config, request, response) { constructor(message, code, config, request, response) {
super(message); super(message);
this.name = 'AxiosError'; this.name = 'AxiosError';
this.isAxiosError = true; this.isAxiosError = true;
code && (this.code = code); code && (this.code = code);
config && (this.config = config); config && (this.config = config);
request && (this.request = request); request && (this.request = request);
if (response) { if (response) {
this.response = response; this.response = response;
this.status = response.status; this.status = response.status;
}
} }
}
toJSON() { toJSON() {
return { return {
// Standard // Standard
message: this.message, message: this.message,
name: this.name, name: this.name,
// Microsoft // Microsoft
description: this.description, description: this.description,
number: this.number, number: this.number,
// Mozilla // Mozilla
fileName: this.fileName, fileName: this.fileName,
lineNumber: this.lineNumber, lineNumber: this.lineNumber,
columnNumber: this.columnNumber, columnNumber: this.columnNumber,
stack: this.stack, stack: this.stack,
// Axios // Axios
config: utils.toJSONObject(this.config), config: utils.toJSONObject(this.config),
code: this.code, code: this.code,
status: this.status, status: this.status,
}; };
} }
} }
// This can be changed to static properties as soon as the parser options in .eslint.cjs are updated. // This can be changed to static properties as soon as the parser options in .eslint.cjs are updated.
+54 -24
View File
@@ -52,8 +52,10 @@ function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {
} }
function formatHeader(header) { function formatHeader(header) {
return header.trim() return header
.toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => { .trim()
.toLowerCase()
.replace(/([a-z\d])(\w*)/g, (w, char, str) => {
return char.toUpperCase() + str; return char.toUpperCase() + str;
}); });
} }
@@ -61,12 +63,12 @@ function formatHeader(header) {
function buildAccessors(obj, header) { function buildAccessors(obj, header) {
const accessorName = utils.toCamelCase(' ' + header); const accessorName = utils.toCamelCase(' ' + header);
['get', 'set', 'has'].forEach(methodName => { ['get', 'set', 'has'].forEach((methodName) => {
Object.defineProperty(obj, methodName + accessorName, { Object.defineProperty(obj, methodName + accessorName, {
value: function(arg1, arg2, arg3) { value: function (arg1, arg2, arg3) {
return this[methodName].call(this, header, 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); 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); self[key || _header] = normalizeValue(_value);
} }
} }
@@ -97,21 +104,26 @@ class AxiosHeaders {
utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
if (utils.isPlainObject(header) || header instanceof this.constructor) { if (utils.isPlainObject(header) || header instanceof this.constructor) {
setHeaders(header, valueOrRewrite) setHeaders(header, valueOrRewrite);
} else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { } else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
setHeaders(parseHeaders(header), valueOrRewrite); setHeaders(parseHeaders(header), valueOrRewrite);
} else if (utils.isObject(header) && utils.isIterable(header)) { } else if (utils.isObject(header) && utils.isIterable(header)) {
let obj = {}, dest, key; let obj = {},
dest,
key;
for (const entry of header) { for (const entry of header) {
if (!utils.isArray(entry)) { if (!utils.isArray(entry)) {
throw TypeError('Object iterator must return a key-value pair'); throw TypeError('Object iterator must return a key-value pair');
} }
obj[key = entry[0]] = (dest = obj[key]) ? obj[(key = entry[0])] = (dest = obj[key])
(utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1]; ? utils.isArray(dest)
? [...dest, entry[1]]
: [dest, entry[1]]
: entry[1];
} }
setHeaders(obj, valueOrRewrite) setHeaders(obj, valueOrRewrite);
} else { } else {
header != null && setHeader(valueOrRewrite, header, rewrite); header != null && setHeader(valueOrRewrite, header, rewrite);
} }
@@ -155,7 +167,11 @@ class AxiosHeaders {
if (header) { if (header) {
const key = utils.findKey(this, 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; return false;
@@ -195,7 +211,7 @@ class AxiosHeaders {
while (i--) { while (i--) {
const key = keys[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]; delete this[key];
deleted = true; deleted = true;
} }
@@ -239,7 +255,9 @@ class AxiosHeaders {
const obj = Object.create(null); const obj = Object.create(null);
utils.forEach(this, (value, header) => { 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; return obj;
@@ -250,11 +268,13 @@ class AxiosHeaders {
} }
toString() { 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() { getSetCookie() {
return this.get("set-cookie") || []; return this.get('set-cookie') || [];
} }
get [Symbol.toStringTag]() { get [Symbol.toStringTag]() {
@@ -274,9 +294,12 @@ class AxiosHeaders {
} }
static accessor(header) { static accessor(header) {
const internals = this[$internals] = (this[$internals] = { const internals =
accessors: {} (this[$internals] =
}); this[$internals] =
{
accessors: {},
});
const accessors = internals.accessors; const accessors = internals.accessors;
const prototype = this.prototype; 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 // 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` let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`
return { return {
get: () => value, get: () => value,
set(headerValue) { set(headerValue) {
this[mapped] = headerValue; this[mapped] = headerValue;
} },
} };
}); });
utils.freezeMethods(AxiosHeaders); utils.freezeMethods(AxiosHeaders);
+1 -1
View File
@@ -21,7 +21,7 @@ class InterceptorManager {
fulfilled, fulfilled,
rejected, rejected,
synchronous: options ? options.synchronous : false, synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null runWhen: options ? options.runWhen : null,
}); });
return this.handlers.length - 1; return this.handlers.length - 1;
} }
+27 -31
View File
@@ -5,7 +5,7 @@ import isCancel from '../cancel/isCancel.js';
import defaults from '../defaults/index.js'; import defaults from '../defaults/index.js';
import CanceledError from '../cancel/CanceledError.js'; import CanceledError from '../cancel/CanceledError.js';
import AxiosHeaders from '../core/AxiosHeaders.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. * Throws a `CanceledError` if cancellation has been requested.
@@ -37,10 +37,7 @@ export default function dispatchRequest(config) {
config.headers = AxiosHeaders.from(config.headers); config.headers = AxiosHeaders.from(config.headers);
// Transform request data // Transform request data
config.data = transformData.call( config.data = transformData.call(config, config.transformRequest);
config,
config.transformRequest
);
if (['post', 'put', 'patch'].indexOf(config.method) !== -1) { if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {
config.headers.setContentType('application/x-www-form-urlencoded', false); 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); const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);
return adapter(config).then(function onAdapterResolution(response) { return adapter(config).then(
throwIfCancellationRequested(config); function onAdapterResolution(response) {
// 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)) {
throwIfCancellationRequested(config); throwIfCancellationRequested(config);
// Transform response data // Transform response data
if (reason && reason.response) { response.data = transformData.call(config, config.transformResponse, response);
reason.response.data = transformData.call(
config,
config.transformResponse,
reason.response
);
reason.response.headers = AxiosHeaders.from(reason.response.headers);
}
}
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);
}
);
} }
+10 -22
View File
@@ -1,10 +1,9 @@
"use strict"; 'use strict';
import utils from "../utils.js"; import utils from '../utils.js';
import AxiosHeaders from "./AxiosHeaders.js"; import AxiosHeaders from './AxiosHeaders.js';
const headersToObject = (thing) => const headersToObject = (thing) => (thing instanceof AxiosHeaders ? { ...thing } : thing);
thing instanceof AxiosHeaders ? { ...thing } : thing;
/** /**
* Config-specific merge-function which creates a new config-object * 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), mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true),
}; };
utils.forEach( utils.forEach(Object.keys({ ...config1, ...config2 }), function computeConfigValue(prop) {
Object.keys({ ...config1, ...config2 }), if (prop === '__proto__' || prop === 'constructor' || prop === 'prototype') return;
function computeConfigValue(prop) { const merge = utils.hasOwnProp(mergeMap, prop) ? mergeMap[prop] : mergeDeepProperties;
if ( const configValue = merge(config1[prop], config2[prop], prop);
prop === "__proto__" || (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
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; return config;
} }
+11 -7
View File
@@ -16,12 +16,16 @@ export default function settle(resolve, reject, response) {
if (!response.status || !validateStatus || validateStatus(response.status)) { if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response); resolve(response);
} else { } else {
reject(new AxiosError( reject(
'Request failed with status code ' + response.status, new AxiosError(
[AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], 'Request failed with status code ' + response.status,
response.config, [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][
response.request, Math.floor(response.status / 100) - 4
response ],
)); response.config,
response.request,
response
)
);
} }
} }
+89 -78
View File
@@ -34,96 +34,107 @@ function stringifySafely(rawValue, parser, encoder) {
} }
const defaults = { const defaults = {
transitional: transitionalDefaults, transitional: transitionalDefaults,
adapter: ['xhr', 'http', 'fetch'], adapter: ['xhr', 'http', 'fetch'],
transformRequest: [function transformRequest(data, headers) { transformRequest: [
const contentType = headers.getContentType() || ''; function transformRequest(data, headers) {
const hasJSONContentType = contentType.indexOf('application/json') > -1; const contentType = headers.getContentType() || '';
const isObjectPayload = utils.isObject(data); const hasJSONContentType = contentType.indexOf('application/json') > -1;
const isObjectPayload = utils.isObject(data);
if (isObjectPayload && utils.isHTMLForm(data)) { if (isObjectPayload && utils.isHTMLForm(data)) {
data = new FormData(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 ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { const isFormData = utils.isFormData(data);
const _FormData = this.env && this.env.FormData;
return toFormData( if (isFormData) {
isFileList ? {'files[]': data} : data, return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
_FormData && new _FormData(),
this.formSerializer
);
} }
}
if (isObjectPayload || hasJSONContentType ) { if (
headers.setContentType('application/json', false); utils.isArrayBuffer(data) ||
return stringifySafely(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) { if (isObjectPayload) {
const transitional = this.transitional || defaults.transitional; if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
const forcedJSONParsing = transitional && transitional.forcedJSONParsing; return toURLEncodedForm(data, this.formSerializer).toString();
const JSONRequested = this.responseType === 'json'; }
if (utils.isResponse(data) || utils.isReadableStream(data)) { if (
return data; (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)) { return toFormData(
const silentJSONParsing = transitional && transitional.silentJSONParsing; isFileList ? { 'files[]': data } : data,
const strictJSONParsing = !silentJSONParsing && JSONRequested; _FormData && new _FormData(),
this.formSerializer
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; 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 * A timeout in milliseconds to abort a request. If set to 0 (default) a
@@ -139,7 +150,7 @@ const defaults = {
env: { env: {
FormData: platform.classes.FormData, FormData: platform.classes.FormData,
Blob: platform.classes.Blob Blob: platform.classes.Blob,
}, },
validateStatus: function validateStatus(status) { validateStatus: function validateStatus(status) {
@@ -148,10 +159,10 @@ const defaults = {
headers: { headers: {
common: { common: {
'Accept': 'application/json, text/plain, */*', Accept: 'application/json, text/plain, */*',
'Content-Type': undefined 'Content-Type': undefined,
} },
} },
}; };
utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {
+1 -1
View File
@@ -4,5 +4,5 @@ export default {
silentJSONParsing: true, silentJSONParsing: true,
forcedJSONParsing: true, forcedJSONParsing: true,
clarifyTimeoutError: false, clarifyTimeoutError: false,
legacyInterceptorReqResOrdering: true legacyInterceptorReqResOrdering: true,
}; };
+1 -1
View File
@@ -1 +1 @@
export const VERSION = "1.13.5"; export const VERSION = '1.13.5';
+37 -24
View File
@@ -5,24 +5,29 @@ import utils from '../utils.js';
const kInternals = Symbol('internals'); const kInternals = Symbol('internals');
class AxiosTransformStream extends stream.Transform{ class AxiosTransformStream extends stream.Transform {
constructor(options) { constructor(options) {
options = utils.toFlatObject(options, { options = utils.toFlatObject(
maxRate: 0, options,
chunkSize: 64 * 1024, {
minChunkSize: 100, maxRate: 0,
timeWindow: 500, chunkSize: 64 * 1024,
ticksRate: 2, minChunkSize: 100,
samplesCount: 15 timeWindow: 500,
}, null, (prop, source) => { ticksRate: 2,
return !utils.isUndefined(source[prop]); samplesCount: 15,
}); },
null,
(prop, source) => {
return !utils.isUndefined(source[prop]);
}
);
super({ super({
readableHighWaterMark: options.chunkSize readableHighWaterMark: options.chunkSize,
}); });
const internals = this[kInternals] = { const internals = (this[kInternals] = {
timeWindow: options.timeWindow, timeWindow: options.timeWindow,
chunkSize: options.chunkSize, chunkSize: options.chunkSize,
maxRate: options.maxRate, maxRate: options.maxRate,
@@ -32,10 +37,10 @@ class AxiosTransformStream extends stream.Transform{
notifiedBytesLoaded: 0, notifiedBytesLoaded: 0,
ts: Date.now(), ts: Date.now(),
bytes: 0, bytes: 0,
onReadCallback: null onReadCallback: null,
}; });
this.on('newListener', event => { this.on('newListener', (event) => {
if (event === 'progress') { if (event === 'progress') {
if (!internals.isCaptured) { if (!internals.isCaptured) {
internals.isCaptured = true; internals.isCaptured = true;
@@ -63,8 +68,11 @@ class AxiosTransformStream extends stream.Transform{
const timeWindow = internals.timeWindow; const timeWindow = internals.timeWindow;
const divider = 1000 / timeWindow; const divider = 1000 / timeWindow;
const bytesThreshold = (maxRate / divider); const bytesThreshold = maxRate / divider;
const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0; const minChunkSize =
internals.minChunkSize !== false
? Math.max(internals.minChunkSize, bytesThreshold * 0.01)
: 0;
const pushChunk = (_chunk, _callback) => { const pushChunk = (_chunk, _callback) => {
const bytes = Buffer.byteLength(_chunk); const bytes = Buffer.byteLength(_chunk);
@@ -81,7 +89,7 @@ class AxiosTransformStream extends stream.Transform{
process.nextTick(_callback); process.nextTick(_callback);
}; };
} }
} };
const transformChunk = (_chunk, _callback) => { const transformChunk = (_chunk, _callback) => {
const chunkSize = Buffer.byteLength(_chunk); const chunkSize = Buffer.byteLength(_chunk);
@@ -93,7 +101,7 @@ class AxiosTransformStream extends stream.Transform{
if (maxRate) { if (maxRate) {
const now = Date.now(); const now = Date.now();
if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) { if (!internals.ts || (passed = now - internals.ts) >= timeWindow) {
internals.ts = now; internals.ts = now;
bytesLeft = bytesThreshold - internals.bytes; bytesLeft = bytesThreshold - internals.bytes;
internals.bytes = bytesLeft < 0 ? -bytesLeft : 0; 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); chunkRemainder = _chunk.subarray(maxChunkSize);
_chunk = _chunk.subarray(0, maxChunkSize); _chunk = _chunk.subarray(0, maxChunkSize);
} }
pushChunk(_chunk, chunkRemainder ? () => { pushChunk(
process.nextTick(_callback, null, chunkRemainder); _chunk,
} : _callback); chunkRemainder
? () => {
process.nextTick(_callback, null, chunkRemainder);
}
: _callback
);
}; };
transformChunk(chunk, function transformNextChunk(err, _chunk) { transformChunk(chunk, function transformNextChunk(err, _chunk) {
+11 -7
View File
@@ -18,7 +18,7 @@ function encode(str) {
')': '%29', ')': '%29',
'~': '%7E', '~': '%7E',
'%20': '+', '%20': '+',
'%00': '\x00' '%00': '\x00',
}; };
return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) { return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
return charMap[match]; return charMap[match];
@@ -46,13 +46,17 @@ prototype.append = function append(name, value) {
}; };
prototype.toString = function toString(encoder) { prototype.toString = function toString(encoder) {
const _encode = encoder ? function(value) { const _encode = encoder
return encoder.call(this, value, encode); ? function (value) {
} : encode; return encoder.call(this, value, encode);
}
: encode;
return this._pairs.map(function each(pair) { return this._pairs
return _encode(pair[0]) + '=' + _encode(pair[1]); .map(function each(pair) {
}, '').join('&'); return _encode(pair[0]) + '=' + _encode(pair[1]);
}, '')
.join('&');
}; };
export default AxiosURLSearchParams; export default AxiosURLSearchParams;
+5 -4
View File
@@ -1,6 +1,6 @@
"use strict"; 'use strict';
import stream from "stream"; import stream from 'stream';
class ZlibHeaderTransformStream extends stream.Transform { class ZlibHeaderTransformStream extends stream.Transform {
__transform(chunk, encoding, callback) { __transform(chunk, encoding, callback) {
@@ -13,10 +13,11 @@ class ZlibHeaderTransformStream extends stream.Transform {
this._transform = this.__transform; this._transform = this.__transform;
// Add Default Compression headers if no zlib headers are present // 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); const header = Buffer.alloc(2);
header[0] = 120; // Hex: 78 header[0] = 120; // Hex: 78
header[1] = 156; // Hex: 9C header[1] = 156; // Hex: 9C
this.push(header, encoding); this.push(header, encoding);
} }
} }
+15 -13
View File
@@ -12,11 +12,11 @@ import AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';
* @returns {string} The encoded value. * @returns {string} The encoded value.
*/ */
function encode(val) { function encode(val) {
return encodeURIComponent(val). return encodeURIComponent(val)
replace(/%3A/gi, ':'). .replace(/%3A/gi, ':')
replace(/%24/g, '$'). .replace(/%24/g, '$')
replace(/%2C/gi, ','). .replace(/%2C/gi, ',')
replace(/%20/g, '+'); .replace(/%20/g, '+');
} }
/** /**
@@ -33,11 +33,13 @@ export default function buildURL(url, params, options) {
return url; return url;
} }
const _encode = options && options.encode || encode; const _encode = (options && options.encode) || encode;
const _options = utils.isFunction(options) ? { const _options = utils.isFunction(options)
serialize: options ? {
} : options; serialize: options,
}
: options;
const serializeFn = _options && _options.serialize; const serializeFn = _options && _options.serialize;
@@ -46,13 +48,13 @@ export default function buildURL(url, params, options) {
if (serializeFn) { if (serializeFn) {
serializedParams = serializeFn(params, _options); serializedParams = serializeFn(params, _options);
} else { } else {
serializedParams = utils.isURLSearchParams(params) ? serializedParams = utils.isURLSearchParams(params)
params.toString() : ? params.toString()
new AxiosURLSearchParams(params, _options).toString(_encode); : new AxiosURLSearchParams(params, _options).toString(_encode);
} }
if (serializedParams) { if (serializedParams) {
const hashmarkIndex = url.indexOf("#"); const hashmarkIndex = url.indexOf('#');
if (hashmarkIndex !== -1) { if (hashmarkIndex !== -1) {
url = url.slice(0, hashmarkIndex); url = url.slice(0, hashmarkIndex);
+13 -11
View File
@@ -1,16 +1,18 @@
import utils from "../utils.js"; import utils from '../utils.js';
const callbackify = (fn, reducer) => { const callbackify = (fn, reducer) => {
return utils.isAsyncFn(fn) ? function (...args) { return utils.isAsyncFn(fn)
const cb = args.pop(); ? function (...args) {
fn.apply(this, args).then((value) => { const cb = args.pop();
try { fn.apply(this, args).then((value) => {
reducer ? cb(null, ...reducer(value)) : cb(null, value); try {
} catch (err) { reducer ? cb(null, ...reducer(value)) : cb(null, value);
cb(err); } catch (err) {
cb(err);
}
}, cb);
} }
}, cb); : fn;
} : fn; };
}
export default callbackify; export default callbackify;
+22 -14
View File
@@ -1,9 +1,9 @@
import CanceledError from "../cancel/CanceledError.js"; import CanceledError from '../cancel/CanceledError.js';
import AxiosError from "../core/AxiosError.js"; import AxiosError from '../core/AxiosError.js';
import utils from '../utils.js'; import utils from '../utils.js';
const composeSignals = (signals, timeout) => { const composeSignals = (signals, timeout) => {
const {length} = (signals = signals ? signals.filter(Boolean) : []); const { length } = (signals = signals ? signals.filter(Boolean) : []);
if (timeout || length) { if (timeout || length) {
let controller = new AbortController(); let controller = new AbortController();
@@ -15,34 +15,42 @@ const composeSignals = (signals, timeout) => {
aborted = true; aborted = true;
unsubscribe(); unsubscribe();
const err = reason instanceof Error ? reason : this.reason; 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(() => { let timer =
timer = null; timeout &&
onabort(new AxiosError(`timeout of ${timeout}ms exceeded`, AxiosError.ETIMEDOUT)) setTimeout(() => {
}, timeout) timer = null;
onabort(new AxiosError(`timeout of ${timeout}ms exceeded`, AxiosError.ETIMEDOUT));
}, timeout);
const unsubscribe = () => { const unsubscribe = () => {
if (signals) { if (signals) {
timer && clearTimeout(timer); timer && clearTimeout(timer);
timer = null; timer = null;
signals.forEach(signal => { signals.forEach((signal) => {
signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort); signal.unsubscribe
? signal.unsubscribe(onabort)
: signal.removeEventListener('abort', onabort);
}); });
signals = null; signals = null;
} }
} };
signals.forEach((signal) => signal.addEventListener('abort', onabort)); signals.forEach((signal) => signal.addEventListener('abort', onabort));
const {signal} = controller; const { signal } = controller;
signal.unsubscribe = () => utils.asap(unsubscribe); signal.unsubscribe = () => utils.asap(unsubscribe);
return signal; return signal;
} }
} };
export default composeSignals; export default composeSignals;
+39 -44
View File
@@ -1,53 +1,48 @@
import utils from '../utils.js'; import utils from '../utils.js';
import platform from '../platform/index.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 const cookie = [`${name}=${encodeURIComponent(value)}`];
{
write(name, value, expires, path, domain, secure, sameSite) {
if (typeof document === 'undefined') return;
const cookie = [`${name}=${encodeURIComponent(value)}`]; if (utils.isNumber(expires)) {
cookie.push(`expires=${new Date(expires).toUTCString()}`);
}
if (utils.isString(path)) {
cookie.push(`path=${path}`);
}
if (utils.isString(domain)) {
cookie.push(`domain=${domain}`);
}
if (secure === true) {
cookie.push('secure');
}
if (utils.isString(sameSite)) {
cookie.push(`SameSite=${sameSite}`);
}
if (utils.isNumber(expires)) { document.cookie = cookie.join('; ');
cookie.push(`expires=${new Date(expires).toUTCString()}`); },
}
if (utils.isString(path)) {
cookie.push(`path=${path}`);
}
if (utils.isString(domain)) {
cookie.push(`domain=${domain}`);
}
if (secure === true) {
cookie.push('secure');
}
if (utils.isString(sameSite)) {
cookie.push(`SameSite=${sameSite}`);
}
document.cookie = cookie.join('; '); read(name) {
}, if (typeof document === 'undefined') return null;
const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));
return match ? decodeURIComponent(match[1]) : null;
},
read(name) { remove(name) {
if (typeof document === 'undefined') return null; this.write(name, '', Date.now() - 86400000, '/');
const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)')); },
return match ? decodeURIComponent(match[1]) : null;
},
remove(name) {
this.write(name, '', Date.now() - 86400000, '/');
} }
} : // Non-standard browser env (web workers, react-native) lack needed support.
{
: write() {},
read() {
// Non-standard browser env (web workers, react-native) lack needed support. return null;
{ },
write() {}, remove() {},
read() { };
return null;
},
remove() {}
};
+9 -4
View File
@@ -15,12 +15,17 @@
export default function deprecatedMethod(method, instead, docs) { export default function deprecatedMethod(method, instead, docs) {
try { try {
console.warn( console.warn(
'DEPRECATED method `' + method + '`.' + 'DEPRECATED method `' +
(instead ? ' Use `' + instead + '` instead.' : '') + method +
' This method will be removed in a future release.'); '`.' +
(instead ? ' Use `' + instead + '` instead.' : '') +
' This method will be removed in a future release.'
);
if (docs) { if (docs) {
console.warn('For more information about usage see ' + docs); console.warn('For more information about usage see ' + docs);
} }
} catch (e) { /* Ignore */ } } catch (e) {
/* Ignore */
}
} }
+1 -1
View File
@@ -14,7 +14,7 @@ function parsePropPath(name) {
// foo.x.y.z // foo.x.y.z
// foo-x-y-z // foo-x-y-z
// foo x y z // foo x y z
return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => { return utils.matchAll(/\w+|\[(\w*)]/g, name).map((match) => {
return match[0] === '[]' ? '' : match[1] || match[0]; return match[0] === '[]' ? '' : match[1] || match[0];
}); });
} }
+32 -26
View File
@@ -1,8 +1,8 @@
import util from 'util'; import util from 'util';
import {Readable} from 'stream'; import { Readable } from 'stream';
import utils from "../utils.js"; import utils from '../utils.js';
import readBlob from "./readBlob.js"; import readBlob from './readBlob.js';
import platform from "../platform/index.js"; import platform from '../platform/index.js';
const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_'; const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';
@@ -14,7 +14,7 @@ const CRLF_BYTES_COUNT = 2;
class FormDataPart { class FormDataPart {
constructor(name, value) { constructor(name, value) {
const {escapeName} = this.constructor; const { escapeName } = this.constructor;
const isStringValue = utils.isString(value); const isStringValue = utils.isString(value);
let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${ let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${
@@ -24,7 +24,7 @@ class FormDataPart {
if (isStringValue) { if (isStringValue) {
value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF)); value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF));
} else { } 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); this.headers = textEncoder.encode(headers + CRLF);
@@ -37,12 +37,12 @@ class FormDataPart {
this.value = value; this.value = value;
} }
async *encode(){ async *encode() {
yield this.headers; yield this.headers;
const {value} = this; const { value } = this;
if(utils.isTypedArray(value)) { if (utils.isTypedArray(value)) {
yield value; yield value;
} else { } else {
yield* readBlob(value); yield* readBlob(value);
@@ -52,11 +52,15 @@ class FormDataPart {
} }
static escapeName(name) { static escapeName(name) {
return String(name).replace(/[\r\n"]/g, (match) => ({ return String(name).replace(
'\r' : '%0D', /[\r\n"]/g,
'\n' : '%0A', (match) =>
'"' : '%22', ({
}[match])); '\r': '%0D',
'\n': '%0A',
'"': '%22',
})[match]
);
} }
} }
@@ -64,15 +68,15 @@ const formDataToStream = (form, headersHandler, options) => {
const { const {
tag = 'form-data-boundary', tag = 'form-data-boundary',
size = 25, size = 25,
boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET) boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET),
} = options || {}; } = options || {};
if(!utils.isFormData(form)) { if (!utils.isFormData(form)) {
throw TypeError('FormData instance required'); throw TypeError('FormData instance required');
} }
if (boundary.length < 1 || boundary.length > 70) { 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); const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);
@@ -90,8 +94,8 @@ const formDataToStream = (form, headersHandler, options) => {
contentLength = utils.toFiniteNumber(contentLength); contentLength = utils.toFiniteNumber(contentLength);
const computedHeaders = { const computedHeaders = {
'Content-Type': `multipart/form-data; boundary=${boundary}` 'Content-Type': `multipart/form-data; boundary=${boundary}`,
} };
if (Number.isFinite(contentLength)) { if (Number.isFinite(contentLength)) {
computedHeaders['Content-Length'] = contentLength; computedHeaders['Content-Length'] = contentLength;
@@ -99,14 +103,16 @@ const formDataToStream = (form, headersHandler, options) => {
headersHandler && headersHandler(computedHeaders); headersHandler && headersHandler(computedHeaders);
return Readable.from((async function *() { return Readable.from(
for(const part of parts) { (async function* () {
yield boundaryBytes; for (const part of parts) {
yield* part.encode(); yield boundaryBytes;
} yield* part.encode();
}
yield footerBytes; yield footerBytes;
})()); })()
);
}; };
export default formDataToStream; export default formDataToStream;
+2 -2
View File
@@ -17,7 +17,7 @@ const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
* @returns {Buffer|Blob} * @returns {Buffer|Blob}
*/ */
export default function fromDataURI(uri, asBlob, options) { 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); const protocol = parseProtocol(uri);
if (asBlob === undefined && _Blob) { 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); 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; return buffer;
-1
View File
@@ -17,4 +17,3 @@ export default function isAbsoluteURL(url) {
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
} }
+1 -1
View File
@@ -10,5 +10,5 @@ import utils from '../utils.js';
* @returns {boolean} True if the payload is an error thrown by Axios, otherwise false * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
*/ */
export default function isAxiosError(payload) { export default function isAxiosError(payload) {
return utils.isObject(payload) && (payload.isAxiosError === true); return utils.isObject(payload) && payload.isAxiosError === true;
} }
+13 -11
View File
@@ -1,14 +1,16 @@
import platform from '../platform/index.js'; import platform from '../platform/index.js';
export default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => { export default platform.hasStandardBrowserEnv
url = new URL(url, platform.origin); ? ((origin, isMSIE) => (url) => {
url = new URL(url, platform.origin);
return ( return (
origin.protocol === url.protocol && origin.protocol === url.protocol &&
origin.host === url.host && origin.host === url.host &&
(isMSIE || origin.port === url.port) (isMSIE || origin.port === url.port)
); );
})( })(
new URL(platform.origin), new URL(platform.origin),
platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent) platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)
) : () => true; )
: () => true;
+36 -22
View File
@@ -5,10 +5,23 @@ import utils from '../utils.js';
// RawAxiosHeaders whose duplicates are ignored by node // RawAxiosHeaders whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers // c.f. https://nodejs.org/api/http.html#http_message_headers
const ignoreDuplicateOf = utils.toObjectSet([ const ignoreDuplicateOf = utils.toObjectSet([
'age', 'authorization', 'content-length', 'content-type', 'etag', 'age',
'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'authorization',
'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'content-length',
'referer', 'retry-after', 'user-agent' '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 * @returns {Object} Headers parsed into an object
*/ */
export default rawHeaders => { export default (rawHeaders) => {
const parsed = {}; const parsed = {};
let key; let key;
let val; let val;
let i; let i;
rawHeaders && rawHeaders.split('\n').forEach(function parser(line) { rawHeaders &&
i = line.indexOf(':'); rawHeaders.split('\n').forEach(function parser(line) {
key = line.substring(0, i).trim().toLowerCase(); i = line.indexOf(':');
val = line.substring(i + 1).trim(); key = line.substring(0, i).trim().toLowerCase();
val = line.substring(i + 1).trim();
if (!key || (parsed[key] && ignoreDuplicateOf[key])) { if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
return; return;
}
if (key === 'set-cookie') {
if (parsed[key]) {
parsed[key].push(val);
} else {
parsed[key] = [val];
} }
} 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; return parsed;
}; };
+1 -1
View File
@@ -2,5 +2,5 @@
export default function parseProtocol(url) { export default function parseProtocol(url) {
const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
return match && match[1] || ''; return (match && match[1]) || '';
} }
+21 -14
View File
@@ -1,12 +1,12 @@
import speedometer from "./speedometer.js"; import speedometer from './speedometer.js';
import throttle from "./throttle.js"; import throttle from './throttle.js';
import utils from "../utils.js"; import utils from '../utils.js';
export const progressEventReducer = (listener, isDownloadStream, freq = 3) => { export const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
let bytesNotified = 0; let bytesNotified = 0;
const _speedometer = speedometer(50, 250); const _speedometer = speedometer(50, 250);
return throttle(e => { return throttle((e) => {
const loaded = e.loaded; const loaded = e.loaded;
const total = e.lengthComputable ? e.total : undefined; const total = e.lengthComputable ? e.total : undefined;
const progressBytes = loaded - bytesNotified; const progressBytes = loaded - bytesNotified;
@@ -18,27 +18,34 @@ export const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
const data = { const data = {
loaded, loaded,
total, total,
progress: total ? (loaded / total) : undefined, progress: total ? loaded / total : undefined,
bytes: progressBytes, bytes: progressBytes,
rate: rate ? rate : undefined, rate: rate ? rate : undefined,
estimated: rate && total && inRange ? (total - loaded) / rate : undefined, estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
event: e, event: e,
lengthComputable: total != null, lengthComputable: total != null,
[isDownloadStream ? 'download' : 'upload']: true [isDownloadStream ? 'download' : 'upload']: true,
}; };
listener(data); listener(data);
}, freq); }, freq);
} };
export const progressEventDecorator = (total, throttled) => { export const progressEventDecorator = (total, throttled) => {
const lengthComputable = total != null; const lengthComputable = total != null;
return [(loaded) => throttled[0]({ return [
lengthComputable, (loaded) =>
total, throttled[0]({
loaded lengthComputable,
}), throttled[1]]; total,
} loaded,
}),
throttled[1],
];
};
export const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args)); export const asyncDecorator =
(fn) =>
(...args) =>
utils.asap(() => fn(...args));
+4 -4
View File
@@ -1,15 +1,15 @@
const {asyncIterator} = Symbol; const { asyncIterator } = Symbol;
const readBlob = async function* (blob) { const readBlob = async function* (blob) {
if (blob.stream) { if (blob.stream) {
yield* blob.stream() yield* blob.stream();
} else if (blob.arrayBuffer) { } else if (blob.arrayBuffer) {
yield await blob.arrayBuffer() yield await blob.arrayBuffer();
} else if (blob[asyncIterator]) { } else if (blob[asyncIterator]) {
yield* blob[asyncIterator](); yield* blob[asyncIterator]();
} else { } else {
yield blob; yield blob;
} }
} };
export default readBlob; export default readBlob;
+23 -14
View File
@@ -1,11 +1,11 @@
import platform from "../platform/index.js"; import platform from '../platform/index.js';
import utils from "../utils.js"; import utils from '../utils.js';
import isURLSameOrigin from "./isURLSameOrigin.js"; import isURLSameOrigin from './isURLSameOrigin.js';
import cookies from "./cookies.js"; import cookies from './cookies.js';
import buildFullPath from "../core/buildFullPath.js"; import buildFullPath from '../core/buildFullPath.js';
import mergeConfig from "../core/mergeConfig.js"; import mergeConfig from '../core/mergeConfig.js';
import AxiosHeaders from "../core/AxiosHeaders.js"; import AxiosHeaders from '../core/AxiosHeaders.js';
import buildURL from "./buildURL.js"; import buildURL from './buildURL.js';
export default (config) => { export default (config) => {
const newConfig = mergeConfig({}, config); const newConfig = mergeConfig({}, config);
@@ -14,12 +14,22 @@ export default (config) => {
newConfig.headers = headers = AxiosHeaders.from(headers); 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 // HTTP basic authentication
if (auth) { if (auth) {
headers.set('Authorization', 'Basic ' + headers.set(
btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : '')) 'Authorization',
'Basic ' +
btoa(
(auth.username || '') +
':' +
(auth.password ? unescape(encodeURIComponent(auth.password)) : '')
)
); );
} }
@@ -37,7 +47,7 @@ export default (config) => {
} }
}); });
} }
} }
// Add xsrf header // Add xsrf header
// This is only done if running in a standard browser environment. // This is only done if running in a standard browser environment.
@@ -57,5 +67,4 @@ export default (config) => {
} }
return newConfig; return newConfig;
} };
+1 -1
View File
@@ -48,7 +48,7 @@ function speedometer(samplesCount, min) {
const passed = startedAt && now - startedAt; const passed = startedAt && now - startedAt;
return passed ? Math.round(bytesCount * 1000 / passed) : undefined; return passed ? Math.round((bytesCount * 1000) / passed) : undefined;
}; };
} }
+4 -4
View File
@@ -18,23 +18,23 @@ function throttle(fn, freq) {
timer = null; timer = null;
} }
fn(...args); fn(...args);
} };
const throttled = (...args) => { const throttled = (...args) => {
const now = Date.now(); const now = Date.now();
const passed = now - timestamp; const passed = now - timestamp;
if ( passed >= threshold) { if (passed >= threshold) {
invoke(args, now); invoke(args, now);
} else { } else {
lastArgs = args; lastArgs = args;
if (!timer) { if (!timer) {
timer = setTimeout(() => { timer = setTimeout(() => {
timer = null; timer = null;
invoke(lastArgs) invoke(lastArgs);
}, threshold - passed); }, threshold - passed);
} }
} }
} };
const flush = () => lastArgs && invoke(lastArgs); const flush = () => lastArgs && invoke(lastArgs);
+38 -25
View File
@@ -38,11 +38,14 @@ function removeBrackets(key) {
*/ */
function renderKey(path, key, dots) { function renderKey(path, key, dots) {
if (!path) return key; if (!path) return key;
return path.concat(key).map(function each(token, i) { return path
// eslint-disable-next-line no-param-reassign .concat(key)
token = removeBrackets(token); .map(function each(token, i) {
return !dots && i ? '[' + token + ']' : token; // eslint-disable-next-line no-param-reassign
}).join(dots ? '.' : ''); token = removeBrackets(token);
return !dots && i ? '[' + token + ']' : token;
})
.join(dots ? '.' : '');
} }
/** /**
@@ -92,21 +95,26 @@ function toFormData(obj, formData, options) {
formData = formData || new (PlatformFormData || FormData)(); formData = formData || new (PlatformFormData || FormData)();
// eslint-disable-next-line no-param-reassign // eslint-disable-next-line no-param-reassign
options = utils.toFlatObject(options, { options = utils.toFlatObject(
metaTokens: true, options,
dots: false, {
indexes: false metaTokens: true,
}, false, function defined(option, source) { dots: false,
// eslint-disable-next-line no-eq-null,eqeqeq indexes: false,
return !utils.isUndefined(source[option]); },
}); false,
function defined(option, source) {
// eslint-disable-next-line no-eq-null,eqeqeq
return !utils.isUndefined(source[option]);
}
);
const metaTokens = options.metaTokens; const metaTokens = options.metaTokens;
// eslint-disable-next-line no-use-before-define // eslint-disable-next-line no-use-before-define
const visitor = options.visitor || defaultVisitor; const visitor = options.visitor || defaultVisitor;
const dots = options.dots; const dots = options.dots;
const indexes = options.indexes; 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); const useBlob = _Blob && utils.isSpecCompliantForm(formData);
if (!utils.isFunction(visitor)) { if (!utils.isFunction(visitor)) {
@@ -156,17 +164,22 @@ function toFormData(obj, formData, options) {
value = JSON.stringify(value); value = JSON.stringify(value);
} else if ( } else if (
(utils.isArray(value) && isFlatArray(value)) || (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 // eslint-disable-next-line no-param-reassign
key = removeBrackets(key); key = removeBrackets(key);
arr.forEach(function each(el, index) { arr.forEach(function each(el, index) {
!(utils.isUndefined(el) || el === null) && formData.append( !(utils.isUndefined(el) || el === null) &&
// eslint-disable-next-line no-nested-ternary formData.append(
indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'), // eslint-disable-next-line no-nested-ternary
convertValue(el) indexes === true
); ? renderKey([key], index, dots)
: indexes === null
? key
: key + '[]',
convertValue(el)
);
}); });
return false; return false;
} }
@@ -186,7 +199,7 @@ function toFormData(obj, formData, options) {
const exposedHelpers = Object.assign(predicates, { const exposedHelpers = Object.assign(predicates, {
defaultVisitor, defaultVisitor,
convertValue, convertValue,
isVisitable isVisitable,
}); });
function build(value, path) { function build(value, path) {
@@ -199,9 +212,9 @@ function toFormData(obj, formData, options) {
stack.push(value); stack.push(value);
utils.forEach(value, function each(el, key) { utils.forEach(value, function each(el, key) {
const result = !(utils.isUndefined(el) || el === null) && visitor.call( const result =
formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers !(utils.isUndefined(el) || el === null) &&
); visitor.call(formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers);
if (result === true) { if (result === true) {
build(el, path ? path.concat(key) : [key]); build(el, path ? path.concat(key) : [key]);
+2 -2
View File
@@ -6,7 +6,7 @@ import platform from '../platform/index.js';
export default function toURLEncodedForm(data, options) { export default function toURLEncodedForm(data, options) {
return toFormData(data, new platform.classes.URLSearchParams(), { 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)) { if (platform.isNode && utils.isBuffer(value)) {
this.append(key, value.toString('base64')); this.append(key, value.toString('base64'));
return false; return false;
@@ -14,6 +14,6 @@ export default function toURLEncodedForm(data, options) {
return helpers.defaultVisitor.apply(this, arguments); return helpers.defaultVisitor.apply(this, arguments);
}, },
...options ...options,
}); });
} }
+34 -32
View File
@@ -1,4 +1,3 @@
export const streamChunk = function* (chunk, chunkSize) { export const streamChunk = function* (chunk, chunkSize) {
let len = chunk.byteLength; let len = chunk.byteLength;
@@ -15,13 +14,13 @@ export const streamChunk = function* (chunk, chunkSize) {
yield chunk.slice(pos, end); yield chunk.slice(pos, end);
pos = end; pos = end;
} }
} };
export const readBytes = async function* (iterable, chunkSize) { export const readBytes = async function* (iterable, chunkSize) {
for await (const chunk of readStream(iterable)) { for await (const chunk of readStream(iterable)) {
yield* streamChunk(chunk, chunkSize); yield* streamChunk(chunk, chunkSize);
} }
} };
const readStream = async function* (stream) { const readStream = async function* (stream) {
if (stream[Symbol.asyncIterator]) { if (stream[Symbol.asyncIterator]) {
@@ -32,7 +31,7 @@ const readStream = async function* (stream) {
const reader = stream.getReader(); const reader = stream.getReader();
try { try {
for (;;) { for (;;) {
const {done, value} = await reader.read(); const { done, value } = await reader.read();
if (done) { if (done) {
break; break;
} }
@@ -41,7 +40,7 @@ const readStream = async function* (stream) {
} finally { } finally {
await reader.cancel(); await reader.cancel();
} }
} };
export const trackStream = (stream, chunkSize, onProgress, onFinish) => { export const trackStream = (stream, chunkSize, onProgress, onFinish) => {
const iterator = readBytes(stream, chunkSize); const iterator = readBytes(stream, chunkSize);
@@ -53,35 +52,38 @@ export const trackStream = (stream, chunkSize, onProgress, onFinish) => {
done = true; done = true;
onFinish && onFinish(e); onFinish && onFinish(e);
} }
} };
return new ReadableStream({ return new ReadableStream(
async pull(controller) { {
try { async pull(controller) {
const {done, value} = await iterator.next(); try {
const { done, value } = await iterator.next();
if (done) { if (done) {
_onFinish(); _onFinish();
controller.close(); controller.close();
return; 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; cancel(reason) {
if (onProgress) { _onFinish(reason);
let loadedBytes = bytes += len; return iterator.return();
onProgress(loadedBytes); },
}
controller.enqueue(new Uint8Array(value));
} catch (err) {
_onFinish(err);
throw err;
}
}, },
cancel(reason) { {
_onFinish(reason); highWaterMark: 2,
return iterator.return();
} }
}, { );
highWaterMark: 2 };
})
}
+16 -5
View File
@@ -1,6 +1,6 @@
'use strict'; 'use strict';
import {VERSION} from '../env/data.js'; import { VERSION } from '../env/data.js';
import AxiosError from '../core/AxiosError.js'; import AxiosError from '../core/AxiosError.js';
const validators = {}; const validators = {};
@@ -25,7 +25,15 @@ const deprecatedWarnings = {};
*/ */
validators.transitional = function transitional(validator, version, message) { validators.transitional = function transitional(validator, version, message) {
function formatMessage(opt, desc) { 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 // eslint-disable-next-line func-names
@@ -57,7 +65,7 @@ validators.spelling = function spelling(correctSpelling) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.warn(`${opt} is likely a misspelling of ${correctSpelling}`); console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);
return true; return true;
} };
}; };
/** /**
@@ -83,7 +91,10 @@ function assertOptions(options, schema, allowUnknown) {
const value = options[opt]; const value = options[opt];
const result = value === undefined || validator(value, opt, options); const result = value === undefined || validator(value, opt, options);
if (result !== true) { 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; continue;
} }
@@ -95,5 +106,5 @@ function assertOptions(options, schema, allowUnknown) {
export default { export default {
assertOptions, assertOptions,
validators validators,
}; };
+2 -2
View File
@@ -1,3 +1,3 @@
'use strict' 'use strict';
export default typeof Blob !== 'undefined' ? Blob : null export default typeof Blob !== 'undefined' ? Blob : null;
+5 -5
View File
@@ -1,13 +1,13 @@
import URLSearchParams from './classes/URLSearchParams.js' import URLSearchParams from './classes/URLSearchParams.js';
import FormData from './classes/FormData.js' import FormData from './classes/FormData.js';
import Blob from './classes/Blob.js' import Blob from './classes/Blob.js';
export default { export default {
isBrowser: true, isBrowser: true,
classes: { classes: {
URLSearchParams, URLSearchParams,
FormData, FormData,
Blob Blob,
}, },
protocols: ['http', 'https', 'file', 'blob', 'url', 'data'] protocols: ['http', 'https', 'file', 'blob', 'url', 'data'],
}; };
+6 -5
View File
@@ -1,6 +1,6 @@
const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; 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 * Determine if we're running in a standard browser environment
@@ -19,7 +19,8 @@ const _navigator = typeof navigator === 'object' && navigator || undefined;
* *
* @returns {boolean} * @returns {boolean}
*/ */
const hasStandardBrowserEnv = hasBrowserEnv && const hasStandardBrowserEnv =
hasBrowserEnv &&
(!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0); (!_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 { export {
hasBrowserEnv, hasBrowserEnv,
hasStandardBrowserWebWorkerEnv, hasStandardBrowserWebWorkerEnv,
hasStandardBrowserEnv, hasStandardBrowserEnv,
_navigator as navigator, _navigator as navigator,
origin origin,
} };
+2 -2
View File
@@ -3,5 +3,5 @@ import * as utils from './common/utils.js';
export default { export default {
...utils, ...utils,
...platform ...platform,
} };
+9 -10
View File
@@ -1,20 +1,20 @@
import crypto from 'crypto'; import crypto from 'crypto';
import URLSearchParams from './classes/URLSearchParams.js' import URLSearchParams from './classes/URLSearchParams.js';
import FormData from './classes/FormData.js' import FormData from './classes/FormData.js';
const ALPHA = 'abcdefghijklmnopqrstuvwxyz' const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
const DIGIT = '0123456789'; const DIGIT = '0123456789';
const ALPHABET = { const ALPHABET = {
DIGIT, DIGIT,
ALPHA, ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT,
} };
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => { const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = ''; let str = '';
const {length} = alphabet; const { length } = alphabet;
const randomValues = new Uint32Array(size); const randomValues = new Uint32Array(size);
crypto.randomFillSync(randomValues); crypto.randomFillSync(randomValues);
for (let i = 0; i < size; i++) { for (let i = 0; i < size; i++) {
@@ -22,17 +22,16 @@ const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
} }
return str; return str;
} };
export default { export default {
isNode: true, isNode: true,
classes: { classes: {
URLSearchParams, URLSearchParams,
FormData, FormData,
Blob: typeof Blob !== 'undefined' && Blob || null Blob: (typeof Blob !== 'undefined' && Blob) || null,
}, },
ALPHABET, ALPHABET,
generateString, generateString,
protocols: [ 'http', 'https', 'file', 'data' ] protocols: ['http', 'https', 'file', 'data'],
}; };
+59 -88
View File
@@ -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 // 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 * @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 * Determine if a value is a Buffer
@@ -63,7 +63,7 @@ function isBuffer(val) {
* *
* @returns {boolean} True if value is an ArrayBuffer, otherwise false * @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 * Determine if a value is a view on an ArrayBuffer
@@ -74,7 +74,7 @@ const isArrayBuffer = kindOfTest("ArrayBuffer");
*/ */
function isArrayBufferView(val) { function isArrayBufferView(val) {
let result; let result;
if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) { if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
result = ArrayBuffer.isView(val); result = ArrayBuffer.isView(val);
} else { } else {
result = val && val.buffer && isArrayBuffer(val.buffer); result = val && val.buffer && isArrayBuffer(val.buffer);
@@ -89,7 +89,7 @@ function isArrayBufferView(val) {
* *
* @returns {boolean} True if value is a String, otherwise false * @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 * Determine if a value is a Function
@@ -97,7 +97,7 @@ const isString = typeOfTest("string");
* @param {*} val The value to test * @param {*} val The value to test
* @returns {boolean} True if value is a Function, otherwise false * @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 * 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 * @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 * 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 * @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 * 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 * @returns {boolean} True if value is a plain Object, otherwise false
*/ */
const isPlainObject = (val) => { const isPlainObject = (val) => {
if (kindOf(val) !== "object") { if (kindOf(val) !== 'object') {
return false; return false;
} }
@@ -161,10 +161,7 @@ const isEmptyObject = (val) => {
} }
try { try {
return ( return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;
Object.keys(val).length === 0 &&
Object.getPrototypeOf(val) === Object.prototype
);
} catch (e) { } catch (e) {
// Fallback for any other objects that might cause RangeError with Object.keys() // Fallback for any other objects that might cause RangeError with Object.keys()
return false; return false;
@@ -178,7 +175,7 @@ const isEmptyObject = (val) => {
* *
* @returns {boolean} True if value is a Date, otherwise false * @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 * 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 * @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 * 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 * @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 * 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 * @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 * Determine if a value is a Stream
@@ -227,13 +224,13 @@ const isFormData = (thing) => {
let kind; let kind;
return ( return (
thing && thing &&
((typeof FormData === "function" && thing instanceof FormData) || ((typeof FormData === 'function' && thing instanceof FormData) ||
(isFunction(thing.append) && (isFunction(thing.append) &&
((kind = kindOf(thing)) === "formdata" || ((kind = kindOf(thing)) === 'formdata' ||
// detect form-data instance // detect form-data instance
(kind === "object" && (kind === 'object' &&
isFunction(thing.toString) && 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 * @returns {boolean} True if value is a URLSearchParams object, otherwise false
*/ */
const isURLSearchParams = kindOfTest("URLSearchParams"); const isURLSearchParams = kindOfTest('URLSearchParams');
const [isReadableStream, isRequest, isResponse, isHeaders] = [ const [isReadableStream, isRequest, isResponse, isHeaders] = [
"ReadableStream", 'ReadableStream',
"Request", 'Request',
"Response", 'Response',
"Headers", 'Headers',
].map(kindOfTest); ].map(kindOfTest);
/** /**
@@ -260,9 +257,9 @@ const [isReadableStream, isRequest, isResponse, isHeaders] = [
* *
* @returns {String} The String freed of excess whitespace * @returns {String} The String freed of excess whitespace
*/ */
const trim = (str) => const trim = (str) => {
str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ""); 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. * 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 } = {}) { function forEach(obj, fn, { allOwnKeys = false } = {}) {
// Don't bother if no value provided // Don't bother if no value provided
if (obj === null || typeof obj === "undefined") { if (obj === null || typeof obj === 'undefined') {
return; return;
} }
@@ -289,7 +286,7 @@ function forEach(obj, fn, { allOwnKeys = false } = {}) {
let l; let l;
// Force an array if not already something iterable // Force an array if not already something iterable
if (typeof obj !== "object") { if (typeof obj !== 'object') {
/*eslint no-param-reassign:0*/ /*eslint no-param-reassign:0*/
obj = [obj]; obj = [obj];
} }
@@ -306,9 +303,7 @@ function forEach(obj, fn, { allOwnKeys = false } = {}) {
} }
// Iterate over object keys // Iterate over object keys
const keys = allOwnKeys const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
? Object.getOwnPropertyNames(obj)
: Object.keys(obj);
const len = keys.length; const len = keys.length;
let key; let key;
@@ -339,16 +334,11 @@ function findKey(obj, key) {
const _global = (() => { const _global = (() => {
/*eslint no-undef:0*/ /*eslint no-undef:0*/
if (typeof globalThis !== "undefined") return globalThis; if (typeof globalThis !== 'undefined') return globalThis;
return typeof self !== "undefined" return typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : global;
? self
: typeof window !== "undefined"
? window
: global;
})(); })();
const isContextDefined = (context) => const isContextDefined = (context) => !isUndefined(context) && context !== _global;
!isUndefined(context) && context !== _global;
/** /**
* Accepts varargs expecting each argument to be an object, then * Accepts varargs expecting each argument to be an object, then
@@ -373,7 +363,7 @@ function merge(/* obj1, obj2, obj3, ... */) {
const result = {}; const result = {};
const assignValue = (val, key) => { const assignValue = (val, key) => {
// Skip dangerous property names to prevent prototype pollution // Skip dangerous property names to prevent prototype pollution
if (key === "__proto__" || key === "constructor" || key === "prototype") { if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
return; return;
} }
@@ -426,7 +416,7 @@ const extend = (a, b, thisArg, { allOwnKeys } = {}) => {
}); });
} }
}, },
{ allOwnKeys }, { allOwnKeys }
); );
return a; return a;
}; };
@@ -455,17 +445,14 @@ const stripBOM = (content) => {
* @returns {void} * @returns {void}
*/ */
const inherits = (constructor, superConstructor, props, descriptors) => { const inherits = (constructor, superConstructor, props, descriptors) => {
constructor.prototype = Object.create( constructor.prototype = Object.create(superConstructor.prototype, descriptors);
superConstructor.prototype, Object.defineProperty(constructor.prototype, 'constructor', {
descriptors,
);
Object.defineProperty(constructor.prototype, "constructor", {
value: constructor, value: constructor,
writable: true, writable: true,
enumerable: false, enumerable: false,
configurable: true, configurable: true,
}); });
Object.defineProperty(constructor, "super", { Object.defineProperty(constructor, 'super', {
value: superConstructor.prototype, value: superConstructor.prototype,
}); });
props && Object.assign(constructor.prototype, props); props && Object.assign(constructor.prototype, props);
@@ -495,20 +482,13 @@ const toFlatObject = (sourceObj, destObj, filter, propFilter) => {
i = props.length; i = props.length;
while (i-- > 0) { while (i-- > 0) {
prop = props[i]; prop = props[i];
if ( if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
(!propFilter || propFilter(prop, sourceObj, destObj)) &&
!merged[prop]
) {
destObj[prop] = sourceObj[prop]; destObj[prop] = sourceObj[prop];
merged[prop] = true; merged[prop] = true;
} }
} }
sourceObj = filter !== false && getPrototypeOf(sourceObj); sourceObj = filter !== false && getPrototypeOf(sourceObj);
} while ( } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
sourceObj &&
(!filter || filter(sourceObj, destObj)) &&
sourceObj !== Object.prototype
);
return destObj; return destObj;
}; };
@@ -565,7 +545,7 @@ const isTypedArray = ((TypedArray) => {
return (thing) => { return (thing) => {
return TypedArray && thing instanceof TypedArray; 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. * 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. */ /* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
const isHTMLForm = kindOfTest("HTMLFormElement"); const isHTMLForm = kindOfTest('HTMLFormElement');
const toCamelCase = (str) => { const toCamelCase = (str) => {
return str return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g, function replacer(m, p1, p2) {
.toLowerCase() return p1.toUpperCase() + p2;
.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. */ /* 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 * @returns {boolean} True if value is a RegExp object, otherwise false
*/ */
const isRegExp = kindOfTest("RegExp"); const isRegExp = kindOfTest('RegExp');
const reduceDescriptors = (obj, reducer) => { const reduceDescriptors = (obj, reducer) => {
const descriptors = Object.getOwnPropertyDescriptors(obj); const descriptors = Object.getOwnPropertyDescriptors(obj);
@@ -656,10 +634,7 @@ const reduceDescriptors = (obj, reducer) => {
const freezeMethods = (obj) => { const freezeMethods = (obj) => {
reduceDescriptors(obj, (descriptor, name) => { reduceDescriptors(obj, (descriptor, name) => {
// skip restricted props in strict mode // skip restricted props in strict mode
if ( if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {
isFunction(obj) &&
["arguments", "caller", "callee"].indexOf(name) !== -1
) {
return false; return false;
} }
@@ -669,7 +644,7 @@ const freezeMethods = (obj) => {
descriptor.enumerable = false; descriptor.enumerable = false;
if ("writable" in descriptor) { if ('writable' in descriptor) {
descriptor.writable = false; descriptor.writable = false;
return; return;
} }
@@ -691,9 +666,7 @@ const toObjectSet = (arrayOrString, delimiter) => {
}); });
}; };
isArray(arrayOrString) isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
? define(arrayOrString)
: define(String(arrayOrString).split(delimiter));
return obj; return obj;
}; };
@@ -701,9 +674,7 @@ const toObjectSet = (arrayOrString, delimiter) => {
const noop = () => {}; const noop = () => {};
const toFiniteNumber = (value, defaultValue) => { const toFiniteNumber = (value, defaultValue) => {
return value != null && Number.isFinite((value = +value)) return value != null && Number.isFinite((value = +value)) ? value : defaultValue;
? value
: defaultValue;
}; };
/** /**
@@ -717,7 +688,7 @@ function isSpecCompliantForm(thing) {
return !!( return !!(
thing && thing &&
isFunction(thing.append) && isFunction(thing.append) &&
thing[toStringTag] === "FormData" && thing[toStringTag] === 'FormData' &&
thing[iterator] thing[iterator]
); );
} }
@@ -736,7 +707,7 @@ const toJSONObject = (obj) => {
return source; return source;
} }
if (!("toJSON" in source)) { if (!('toJSON' in source)) {
stack[i] = source; stack[i] = source;
const target = isArray(source) ? [] : {}; const target = isArray(source) ? [] : {};
@@ -757,7 +728,7 @@ const toJSONObject = (obj) => {
return visit(obj, 0); return visit(obj, 0);
}; };
const isAsyncFn = kindOfTest("AsyncFunction"); const isAsyncFn = kindOfTest('AsyncFunction');
const isThenable = (thing) => const isThenable = (thing) =>
thing && thing &&
@@ -776,27 +747,27 @@ const _setImmediate = ((setImmediateSupported, postMessageSupported) => {
return postMessageSupported return postMessageSupported
? ((token, callbacks) => { ? ((token, callbacks) => {
_global.addEventListener( _global.addEventListener(
"message", 'message',
({ source, data }) => { ({ source, data }) => {
if (source === _global && data === token) { if (source === _global && data === token) {
callbacks.length && callbacks.shift()(); callbacks.length && callbacks.shift()();
} }
}, },
false, false
); );
return (cb) => { return (cb) => {
callbacks.push(cb); callbacks.push(cb);
_global.postMessage(token, "*"); _global.postMessage(token, '*');
}; };
})(`axios@${Math.random()}`, []) })(`axios@${Math.random()}`, [])
: (cb) => setTimeout(cb); : (cb) => setTimeout(cb);
})(typeof setImmediate === "function", isFunction(_global.postMessage)); })(typeof setImmediate === 'function', isFunction(_global.postMessage));
const asap = const asap =
typeof queueMicrotask !== "undefined" typeof queueMicrotask !== 'undefined'
? queueMicrotask.bind(_global) ? queueMicrotask.bind(_global)
: (typeof process !== "undefined" && process.nextTick) || _setImmediate; : (typeof process !== 'undefined' && process.nextTick) || _setImmediate;
// ********************* // *********************
+856 -293
View File
File diff suppressed because it is too large Load Diff
+7 -3
View File
@@ -2,7 +2,7 @@
"name": "axios", "name": "axios",
"version": "1.13.5", "version": "1.13.5",
"description": "Promise based HTTP client for the browser and node.js", "description": "Promise based HTTP client for the browser and node.js",
"main": "./dist/node/axios.cjs", "main": "./index.js",
"module": "./index.js", "module": "./index.js",
"exports": { "exports": {
".": { ".": {
@@ -63,7 +63,6 @@
"prepublishOnly": "npm run test:build:version", "prepublishOnly": "npm run test:build:version",
"build": "gulp clear && cross-env NODE_ENV=production rollup -c -m", "build": "gulp clear && cross-env NODE_ENV=production rollup -c -m",
"examples": "node ./examples/server.js", "examples": "node ./examples/server.js",
"coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
"fix": "eslint --fix lib/**/*.js", "fix": "eslint --fix lib/**/*.js",
"prepare": "husky install && npm run prepare:hooks", "prepare": "husky install && npm run prepare:hooks",
"prepare:hooks": "npx husky set .husky/commit-msg \"npx commitlint --edit $1\"" "prepare:hooks": "npx husky set .husky/commit-msg \"npx commitlint --edit $1\""
@@ -131,11 +130,13 @@
"karma-sauce-launcher": "^4.3.6", "karma-sauce-launcher": "^4.3.6",
"karma-sinon": "^1.0.5", "karma-sinon": "^1.0.5",
"karma-sourcemap-loader": "^0.4.0", "karma-sourcemap-loader": "^0.4.0",
"lint-staged": "^15.2.10",
"memoizee": "^0.4.17", "memoizee": "^0.4.17",
"minimist": "^1.2.8", "minimist": "^1.2.8",
"mocha": "^10.8.2", "mocha": "^10.8.2",
"multer": "^1.4.4", "multer": "^1.4.4",
"pacote": "^20.0.0", "pacote": "^20.0.0",
"prettier": "^3.8.1",
"pretty-bytes": "^6.1.1", "pretty-bytes": "^6.1.1",
"rollup": "^2.79.2", "rollup": "^2.79.2",
"rollup-plugin-auto-external": "^2.0.0", "rollup-plugin-auto-external": "^2.0.0",
@@ -202,6 +203,9 @@
"@commitlint/config-conventional" "@commitlint/config-conventional"
] ]
}, },
"lint-staged": {
"*.{js,cjs,mjs,ts,json,md,yml,yaml}": "prettier --write"
},
"c8": { "c8": {
"all": true, "all": true,
"include": [ "include": [
@@ -219,4 +223,4 @@
], ],
"report-dir": "./coverage" "report-dir": "./coverage"
} }
} }
+39 -42
View File
@@ -1,6 +1,6 @@
import resolve from '@rollup/plugin-node-resolve'; import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs'; 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 json from '@rollup/plugin-json';
import { babel } from '@rollup/plugin-babel'; import { babel } from '@rollup/plugin-babel';
import autoExternal from 'rollup-plugin-auto-external'; 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 aliasPlugin from '@rollup/plugin-alias';
import path from 'path'; import path from 'path';
const lib = require("./package.json"); const lib = require('./package.json');
const outputFileName = 'axios'; const outputFileName = 'axios';
const name = "axios"; const name = 'axios';
const namedInput = './index.js'; const namedInput = './index.js';
const defaultInput = './lib/axios.js'; const defaultInput = './lib/axios.js';
const buildConfig = ({es5, browser = true, minifiedVersion = true, alias, ...config}) => { const buildConfig = ({ es5, browser = true, minifiedVersion = true, alias, ...config }) => {
const {file} = config.output; const { file } = config.output;
const ext = path.extname(file); const ext = path.extname(file);
const basename = path.basename(file, ext); const basename = path.basename(file, ext);
const extArr = ext.split('.'); const extArr = ext.split('.');
extArr.shift(); extArr.shift();
const build = ({ minified }) => ({
const build = ({minified}) => ({
input: namedInput, input: namedInput,
...config, ...config,
output: { output: {
...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: [ plugins: [
aliasPlugin({ aliasPlugin({
entries: alias || [] entries: alias || [],
}), }),
json(), json(),
resolve({browser}), resolve({ browser }),
commonjs(), commonjs(),
minified && terser(), minified && terser(),
minified && bundleSize(), minified && bundleSize(),
...(es5 ? [babel({ ...(es5
babelHelpers: 'bundled', ? [
presets: ['@babel/preset-env'] babel({
})] : []), babelHelpers: 'bundled',
presets: ['@babel/preset-env'],
}),
]
: []),
...(config.plugins || []), ...(config.plugins || []),
] ],
}); });
const configs = [ const configs = [build({ minified: false })];
build({minified: false}),
];
if (minifiedVersion) { if (minifiedVersion) {
configs.push(build({minified: true})) configs.push(build({ minified: true }));
} }
return configs; return configs;
@@ -68,15 +69,15 @@ export default async () => {
input: namedInput, input: namedInput,
output: { output: {
file: `dist/esm/${outputFileName}.js`, file: `dist/esm/${outputFileName}.js`,
format: "esm", format: 'esm',
preferConst: true, preferConst: true,
exports: "named", exports: 'named',
banner banner,
} },
}), }),
// browser ESM bundle for CDN with fetch adapter only // browser ESM bundle for CDN with fetch adapter only
// Downsizing from 12.97 kB (gzip) to 12.23 kB (gzip) // Downsizing from 12.97 kB (gzip) to 12.23 kB (gzip)
/* ...buildConfig({ /* ...buildConfig({
input: namedInput, input: namedInput,
output: { output: {
file: `dist/esm/${outputFileName}-fetch.js`, file: `dist/esm/${outputFileName}-fetch.js`,
@@ -97,10 +98,10 @@ export default async () => {
output: { output: {
file: `dist/${outputFileName}.js`, file: `dist/${outputFileName}.js`,
name, name,
format: "umd", format: 'umd',
exports: "default", exports: 'default',
banner banner,
} },
}), }),
// Browser CJS bundle // Browser CJS bundle
@@ -111,10 +112,10 @@ export default async () => {
output: { output: {
file: `dist/browser/${name}.cjs`, file: `dist/browser/${name}.cjs`,
name, name,
format: "cjs", format: 'cjs',
exports: "default", exports: 'default',
banner banner,
} },
}), }),
// Node.js commonjs bundle // Node.js commonjs bundle
@@ -122,16 +123,12 @@ export default async () => {
input: defaultInput, input: defaultInput,
output: { output: {
file: `dist/node/${name}.cjs`, file: `dist/node/${name}.cjs`,
format: "cjs", format: 'cjs',
preferConst: true, preferConst: true,
exports: "default", exports: 'default',
banner banner,
}, },
plugins: [ plugins: [autoExternal(), resolve(), commonjs()],
autoExternal(), },
resolve(), ];
commonjs()
]
}
]
}; };
+437 -414
View File
@@ -1,499 +1,522 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<title>AXIOS | Sandbox</title> <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"/> <link rel="stylesheet" type="text/css"
<style 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 & Dark Mode Variables
*/ */
:root { :root {
--bg-color: #f0f4ff; /* main page background */ --bg-color: #f0f4ff;
--text-color: #1a1a1a; /* main text color */ /* main page background */
--border-color: #cfd8ff; /* default borders */ --text-color: #1a1a1a;
--well-bg: rgba(255, 255, 255, 0.9); /* card & well background */ /* main text color */
--input-bg: rgba(255, 255, 255, 0.95); /* input background */ --border-color: #cfd8ff;
--footer-text-color: #555; /* default borders */
--footer-heading-color: #1a1a1a; --well-bg: rgba(255, 255, 255, 0.9);
--footer-link-color: #5b4bff; /* card & well background */
--footer-link-hover-color: #3a2ecb; --input-bg: rgba(255, 255, 255, 0.95);
--shadow-color: rgba(0, 0, 0, 0.1); /* input background */
--primary-gradient: linear-gradient(135deg, #6a1bff, #00c3ff); --footer-text-color: #555;
--btn-hover-gradient: linear-gradient(135deg, #5b00d1, #00aaff); --footer-heading-color: #1a1a1a;
--glass-blur: blur(12px); /* for frosted glass effect */ --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 { body.dark-mode {
/* Dark mode overrides */ /* Dark mode overrides */
--bg-color: #0e0f1a; --bg-color: #0e0f1a;
--text-color: #e0e0ff; --text-color: #e0e0ff;
--border-color: #444; --border-color: #444;
--well-bg: rgba(30, 30, 50, 0.7); --well-bg: rgba(30, 30, 50, 0.7);
--input-bg: rgba(40, 40, 60, 0.85); --input-bg: rgba(40, 40, 60, 0.85);
--footer-text-color: #aaa; --footer-text-color: #aaa;
--footer-heading-color: #fff; --footer-heading-color: #fff;
--footer-link-color: #7f8fff; --footer-link-color: #7f8fff;
--footer-link-hover-color: #aabfff; --footer-link-hover-color: #aabfff;
--shadow-color: rgba(0, 0, 0, 0.5); --shadow-color: rgba(0, 0, 0, 0.5);
--primary-gradient: linear-gradient(135deg, #9b59ff, #00d1ff); --primary-gradient: linear-gradient(135deg, #9b59ff, #00d1ff);
--btn-hover-gradient: linear-gradient(135deg, #7d33ff, #00b7ff); --btn-hover-gradient: linear-gradient(135deg, #7d33ff, #00b7ff);
} }
/* /*
Global Styles Global Styles
*/ */
* { * {
box-sizing: border-box; box-sizing: border-box;
transition: all 0.4s ease; /* smooth transitions everywhere */ 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 { pre {
min-height: 39px; 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; word-wrap: break-word;
overflow: auto; overflow: auto;
} }
.box{ .box {
display: grid; display: grid;
grid-template-columns: 1fr 1fr; 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 { .response {
min-width: 0; /* prevents content overflow from pushing layout */ min-width: 0;
/* prevents content overflow from pushing layout */
overflow-x: auto; overflow-x: auto;
} }
.header{ .header {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 2rem; /* Added space below the header */ margin-bottom: 2rem;
/* Added space below the header */
} }
/* /*
Input & Well Styles Input & Well Styles
*/ */
.well, .well,
.form-control { .form-control {
background: var(--well-bg); background: var(--well-bg);
margin-top: 5px; margin-top: 5px;
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: 16px; border-radius: 16px;
padding: 14px 16px; padding: 14px 16px;
box-shadow: 0 10px 25px -8px var(--shadow-color); box-shadow: 0 10px 25px -8px var(--shadow-color);
backdrop-filter: var(--glass-blur); /* glass effect */ backdrop-filter: var(--glass-blur);
} /* glass effect */
}
.form-control { .form-control {
background: var(--input-bg); background: var(--input-bg);
color: var(--text-color); color: var(--text-color);
border-radius: 16px; border-radius: 16px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
outline: none; /* remove default bootstrap focus outline */ outline: none;
} /* remove default bootstrap focus outline */
}
.form-control::placeholder { .form-control::placeholder {
color: #9e9eef; /* subtle placeholder */ color: #9e9eef;
} /* subtle placeholder */
}
/* Modern neon focus effect */ /* Modern neon focus effect */
.form-control:focus { .form-control:focus {
background: var(--input-bg); /* keep consistent */ background: var(--input-bg);
border: 1px solid #ff00ff; /* neon border */ /* keep consistent */
box-shadow: 0 0 10px #ff00ff, 0 0 20px #00ffff; /* glowing focus */ border: 1px solid #ff00ff;
color: var(--text-color); /* neon border */
} box-shadow: 0 0 10px #ff00ff, 0 0 20px #00ffff;
/* glowing focus */
color: var(--text-color);
}
/* subtle placeholder fade on focus */ /* subtle placeholder fade on focus */
.form-control:focus::placeholder { .form-control:focus::placeholder {
color: #ddd; color: #ddd;
} }
/* spacing between form groups */ /* spacing between form groups */
.form-group { .form-group {
margin-bottom: 1.75rem; margin-bottom: 1.75rem;
} }
/* /*
Header & Box Layout Header & Box Layout
*/ */
.header { .header {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 2.5rem; margin-bottom: 2.5rem;
gap: 15px; gap: 15px;
} }
.box { .box {
display: grid; display: grid;
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
gap: 40px; gap: 40px;
} }
/* /*
Theme Toggle Button Theme Toggle Button
*/ */
#theme-toggle { #theme-toggle {
padding: 8px 18px; padding: 8px 18px;
border-radius: 12px; border-radius: 12px;
border: none; border: none;
cursor: pointer; cursor: pointer;
background: var(--primary-gradient); background: var(--primary-gradient);
color: #fff; color: #fff;
font-weight: 600; font-weight: 600;
box-shadow: 0 8px 20px -5px var(--shadow-color); box-shadow: 0 8px 20px -5px var(--shadow-color);
transition: transform 0.25s ease, box-shadow 0.25s ease; transition: transform 0.25s ease, box-shadow 0.25s ease;
} }
#theme-toggle:hover { #theme-toggle:hover {
transform: translateY(-3px); transform: translateY(-3px);
box-shadow: 0 12px 25px -8px var(--shadow-color); box-shadow: 0 12px 25px -8px var(--shadow-color);
} }
/* /*
Footer Styles 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 { .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; flex-direction: column;
gap: 6px; text-align: center;
} padding: 2rem;
max-width: 90%;
.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 { .footer-nav ul {
display: flex; justify-content: center;
gap: 25px;
list-style: none;
padding: 0;
margin: 0;
flex-wrap: wrap;
} }
}
.footer-nav a { </style>
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>
</head> </head>
<body class="container"> <body class="container">
<div class="header"> <div class="header">
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<img src="https://axios-http.com/assets/logo.svg" alt="axios" width="100" height="60"> <img src="https://axios-http.com/assets/logo.svg" alt="axios" width="100" height="60">
<h1> &nbsp;| Sandbox</h1> <h1> &nbsp;| Sandbox</h1>
</div> </div>
<button id="theme-toggle">Toggle Theme</button> <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> </div>
<div class="response"> <div class="box">
<div class="well"> <div class="well">
<h3>Request</h3> <h3>Input</h3>
<pre id="request">No Data</pre> <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>
<div class="well"> <div class="response">
<h3>Response</h3> <div class="well">
<pre id="response">No Data</pre> <h3>Request</h3>
</div> <pre id="request">No Data</pre>
</div>
<div class="well"> <div class="well">
<h3>Error</h3> <h3>Response</h3>
<pre id="error">None</pre> <pre id="response">No Data</pre>
</div>
<div class="well">
<h3>Error</h3>
<pre id="error">None</pre>
</div>
</div> </div>
</div> </div>
</div>
<footer class="footer"> <footer class="footer">
<div class="footer-left"> <div class="footer-left">
<p class="footer-brand-axios">AXIOS</p><p class="footer-brand-sandbox"> | Sandbox</p> <p class="footer-brand-axios">AXIOS</p>
<p class="footer-copyright">© <span id="year">2025</span> Axios. All rights reserved.</p> <p class="footer-brand-sandbox"> | Sandbox</p>
<p class="footer-copyright">© <span id="year">2025</span> Axios. All rights reserved.</p>
</div> </div>
<nav class="footer-nav"> <nav class="footer-nav">
<ul> <ul>
<li><a href="https://axios-http.com/docs/intro" target="_blank" rel="noopener noreferrer">Docs</a></li> <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://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> <li><a href="https://axios-http.com/" target="_blank" rel="noopener noreferrer">Website</a></li>
</ul> </ul>
</nav> </nav>
</footer> </footer>
<script src="/axios.js"></script> <script src="/axios.js"></script>
<script> <script>
// Original sandbox script (untouched) // Original sandbox script (untouched)
(function () { (function () {
var url = document.getElementById('url'); var url = document.getElementById('url');
var method = document.getElementById('method'); var method = document.getElementById('method');
var params = document.getElementById('params'); var params = document.getElementById('params');
var data = document.getElementById('data'); var data = document.getElementById('data');
var headers = document.getElementById('headers'); var headers = document.getElementById('headers');
var submit = document.getElementById('submit'); var submit = document.getElementById('submit');
var request = document.getElementById('request'); var request = document.getElementById('request');
var response = document.getElementById('response'); var response = document.getElementById('response');
var error = document.getElementById('error'); var error = document.getElementById('error');
function acceptsData(method) { function acceptsData(method) {
return ['PATCH', 'POST', 'PUT'].indexOf(method) > -1; 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;
} }
var options = { function getUrl() {
url: getUrl(), return url.value.length === 0 ? '/api' : url.value;
params: !acceptsData(method.value) ? getParams() : undefined, }
data: acceptsData(method.value) ? getData() : undefined,
method: method.value, function getParams() {
headers: getHeaders() 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) method.onchange = function () {
.then(function (res) { localStorage.setItem('method', method.value);
response.innerHTML = JSON.stringify(res.data, null, 2); syncParamsAndData();
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";
}
});
};
url.onchange = function () { params.onchange = function () {
localStorage.setItem('url', url.value); localStorage.setItem('params', params.value);
}; };
method.onchange = function () { data.onchange = function () {
localStorage.setItem('method', method.value); localStorage.setItem('data', data.value);
};
headers.onchange = function () {
localStorage.setItem('headers', headers.value);
};
syncWithLocalStorage();
syncParamsAndData(); syncParamsAndData();
}; })();
params.onchange = function () { // New script for theme toggle and footer year
localStorage.setItem('params', params.value); (function () {
}; const themeToggle = document.getElementById('theme-toggle');
const yearSpan = document.getElementById('year');
data.onchange = function () { themeToggle.addEventListener('click', () => {
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', () => {
document.body.classList.toggle('dark-mode'); document.body.classList.toggle('dark-mode');
}); });
yearSpan.textContent = new Date().getFullYear(); yearSpan.textContent = new Date().getFullYear();
})(); })();
</script> </script>
</body> </body>
</html>
</html>
+9 -9
View File
@@ -3,18 +3,18 @@ import axios from '../index.js';
const URL = 'http://127.0.0.1:3000/api'; const URL = 'http://127.0.0.1:3000/api';
const BODY = { const BODY = {
foo: 'bar', foo: 'bar',
baz: 1234 baz: 1234,
}; };
function handleSuccess(data) { console.log(data); } function handleSuccess(data) {
function handleFailure(data) { console.log('error', data); } console.log(data);
}
function handleFailure(data) {
console.log('error', data);
}
// GET // GET
axios.get(URL, { params: BODY }) axios.get(URL, { params: BODY }).then(handleSuccess).catch(handleFailure);
.then(handleSuccess)
.catch(handleFailure);
// POST // POST
axios.post(URL, BODY) axios.post(URL, BODY).then(handleSuccess).catch(handleFailure);
.then(handleSuccess)
.catch(handleFailure);
+4 -4
View File
@@ -15,7 +15,7 @@ let server;
function pipeFileToResponse(res, file, type) { function pipeFileToResponse(res, file, type) {
if (type) { if (type) {
res.writeHead(200, { res.writeHead(200, {
'Content-Type': type 'Content-Type': type,
}); });
} }
@@ -47,18 +47,18 @@ function handleApiRequest(req, res) {
url: req.url, url: req.url,
data: data ? JSON.parse(data) : undefined, data: data ? JSON.parse(data) : undefined,
method: req.method, method: req.method,
headers: req.headers headers: req.headers,
}; };
} catch (e) { } catch (e) {
console.error('Error:', e.message); console.error('Error:', e.message);
status = 400; status = 400;
result = { result = {
error: e.message error: e.message,
}; };
} }
res.writeHead(status, { res.writeHead(status, {
'Content-Type': 'application/json' 'Content-Type': 'application/json',
}); });
res.end(JSON.stringify(result)); res.end(JSON.stringify(result));
}); });
+8 -6
View File
@@ -1,18 +1,20 @@
export const retryNetwork = async (fn, retries = 3, delay = 1000) => { export const retryNetwork = async (fn, retries = 3, delay = 1000) => {
let attempt = 0, sleep; let attempt = 0,
sleep;
do { do {
try { try {
return await fn() return await fn();
} catch (err) { } catch (err) {
if (err.code === 'ERR_NETWORK' && attempt++ < retries) { if (err.code === 'ERR_NETWORK' && attempt++ < retries) {
sleep = attempt * attempt * delay; sleep = attempt * attempt * delay;
console.warn(`[ERR_NETWORK]: Attempt ${attempt}/${retries}${err.config ? ' [' + err.config.url + ']' : ''} sleep [${sleep}ms]`); console.warn(
await new Promise(resolve => setTimeout(resolve, sleep)); `[ERR_NETWORK]: Attempt ${attempt}/${retries}${err.config ? ' [' + err.config.url + ']' : ''} sleep [${sleep}ms]`
);
await new Promise((resolve) => setTimeout(resolve, sleep));
} else { } else {
throw err; throw err;
} }
} }
} while (true); } while (true);
} };
+107 -98
View File
@@ -1,22 +1,20 @@
import http from "http"; import http from 'http';
import http2 from "http2"; import http2 from 'http2';
import stream from "stream"; import stream from 'stream';
import getStream from "get-stream"; import getStream from 'get-stream';
import {Throttle} from "stream-throttle"; import { Throttle } from 'stream-throttle';
import formidable from "formidable"; import formidable from 'formidable';
import selfsigned from 'selfsigned'; import selfsigned from 'selfsigned';
export const LOCAL_SERVER_URL = 'http://localhost:4444'; export const LOCAL_SERVER_URL = 'http://localhost:4444';
export const SERVER_HANDLER_STREAM_ECHO = (req, res) => req.pipe(res); 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 }); const certificate = selfsigned.generate(null, { keySize: 2048 });
export const startHTTPServer = (handlerOrOptions, options) => { export const startHTTPServer = (handlerOrOptions, options) => {
const { const {
handler, handler,
useBuffering = false, useBuffering = false,
@@ -26,45 +24,52 @@ export const startHTTPServer = (handlerOrOptions, options) => {
useHTTP2, useHTTP2,
key = certificate.private, key = certificate.private,
cert = certificate.cert, cert = certificate.cert,
} = } = Object.assign(
Object.assign(typeof handlerOrOptions === 'function' ? { typeof handlerOrOptions === 'function'
handler: handlerOrOptions ? {
} : handlerOrOptions || {}, options); handler: handlerOrOptions,
}
: handlerOrOptions || {},
options
);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const serverHandler = handler || async function (req, res) { const serverHandler =
try { handler ||
req.headers['content-length'] && res.setHeader('content-length', req.headers['content-length']); 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) { if (useBuffering) {
dataStream = stream.Readable.from(await getStream(req)); 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]; const server = useHTTP2
? http2.createSecureServer({ key, cert }, serverHandler)
if (rate) { : http.createServer(serverHandler);
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 sessions = new Set(); const sessions = new Set();
if(useHTTP2) { if (useHTTP2) {
server.on('session', (session) => { server.on('session', (session) => {
sessions.add(session); sessions.add(session);
@@ -77,7 +82,7 @@ export const startHTTPServer = (handlerOrOptions, options) => {
for (const session of sessions) { for (const session of sessions) {
session.destroy(); session.destroy();
} }
} };
} else { } else {
server.keepAliveTimeout = keepAlive; server.keepAliveTimeout = keepAlive;
} }
@@ -85,9 +90,8 @@ export const startHTTPServer = (handlerOrOptions, options) => {
server.listen(port, function (err) { server.listen(port, function (err) {
err ? reject(err) : resolve(this); err ? reject(err) : resolve(this);
}); });
}); });
} };
export const stopHTTPServer = async (server, timeout = 10000) => { export const stopHTTPServer = async (server, timeout = 10000) => {
if (server) { if (server) {
@@ -99,9 +103,9 @@ export const stopHTTPServer = async (server, timeout = 10000) => {
server.closeAllSessions(); 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) => { export const handleFormData = (req) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@@ -112,52 +116,55 @@ export const handleFormData = (req) => {
return reject(err); 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) => { export const generateReadable = (length = 1024 * 1024, chunkSize = 10 * 1024, sleep = 50) => {
return stream.Readable.from(async function* (){ return stream.Readable.from(
let dataLength = 0; (async function* () {
let dataLength = 0;
while(dataLength < length) { while (dataLength < length) {
const leftBytes = length - dataLength; 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) { if (sleep) {
await setTimeoutAsync(sleep); await setTimeoutAsync(sleep);
}
} }
} })()
}()); );
} };
export const makeReadableStream = (chunk = 'chunk', n = 10, timeout = 100) => { export const makeReadableStream = (chunk = 'chunk', n = 10, timeout = 100) => {
return new ReadableStream({ return new ReadableStream(
{
async pull(controller) { async pull(controller) {
await setTimeoutAsync(timeout); await setTimeoutAsync(timeout);
n-- ? controller.enqueue(chunk) : controller.close(); 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) => { export const startTestServer = async (port) => {
const handler = async (req) => { const handler = async (req) => {
@@ -171,11 +178,11 @@ export const startTestServer = async (port) => {
params, params,
method: req.method, method: req.method,
headers: req.headers, headers: req.headers,
} };
const contentType = req.headers['content-type'] || ''; const contentType = req.headers['content-type'] || '';
const {delay = 0} = params; const { delay = 0 } = params;
if (+delay) { if (+delay) {
await setTimeoutAsync(+delay); await setTimeoutAsync(+delay);
@@ -185,44 +192,46 @@ export const startTestServer = async (port) => {
case '/echo/json': case '/echo/json':
default: default:
if (contentType.startsWith('multipart/')) { if (contentType.startsWith('multipart/')) {
let {fields, files} = await handleFormData(req); let { fields, files } = await handleFormData(req);
response.form = fields; response.form = fields;
response.files = files; response.files = files;
} else { } else {
response.body = (await getStream(req, {encoding: 'buffer'})).toString('hex'); response.body = (await getStream(req, { encoding: 'buffer' })).toString('hex');
} }
return { return {
body: response body: response,
} };
} }
}; };
return await startHTTPServer((req, res) => { return await startHTTPServer(
// Set CORS headers (req, res) => {
res.setHeader('Access-Control-Allow-Origin', `*`); // Allows all origins, or specify a domain like 'http://example.com' // Set CORS headers
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // Allowed HTTP methods res.setHeader('Access-Control-Allow-Origin', `*`); // Allows all origins, or specify a domain like 'http://example.com'
res.setHeader('Access-Control-Allow-Headers', '*'); // Allowed request headers res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // Allowed HTTP methods
res.setHeader('Access-Control-Max-Age', '86400'); // Cache preflight requests for 24 hours 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) // Handle preflight requests (OPTIONS method)
if (req.method === 'OPTIONS') { if (req.method === 'OPTIONS') {
res.writeHead(204); // No content res.writeHead(204); // No content
res.end(); res.end();
return; return;
} }
Promise.resolve(handler(req, res)).then(response=>{ Promise.resolve(handler(req, res)).then((response) => {
const {status = 200, headers = {}, body} = 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.end(JSON.stringify(body, null, 2));
res.setHeader(header, value);
}); });
},
res.end(JSON.stringify(body, null, 2)) { port }
}) );
}, {port}); };
}
+13 -10
View File
@@ -1,21 +1,24 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
</head> </head>
<body> <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="promise.js"></script>
<script src="../../dist/axios.js"></script> <script src="../../dist/axios.js"></script>
<script> <script>
axios.get('./fixture.json').then(function(response) { axios.get('./fixture.json').then(function (response) {
console.log(response); console.log(response);
alert(JSON.stringify(response.data)); alert(JSON.stringify(response.data));
alert('response headers:\n\n' + JSON.stringify(response.headers)); alert('response headers:\n\n' + JSON.stringify(response.headers));
}, function(err) { console.log(err) }); }, function (err) { console.log(err) });
</script> </script>
</body> </body>
</html> </html>
+12 -9
View File
@@ -1,20 +1,23 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
</head> </head>
<body> <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="promise.js"></script>
<script src="../../dist/axios.js"></script> <script src="../../dist/axios.js"></script>
<script> <script>
axios.get('http://cors-test.appspot.com/test').then(function(response) { axios.get('http://cors-test.appspot.com/test').then(function (response) {
alert(JSON.stringify(response.data)); alert(JSON.stringify(response.data));
alert('response headers:\n\n' + JSON.stringify(response.headers)); alert('response headers:\n\n' + JSON.stringify(response.headers));
}, function(err) { console.log(err) }); }, function (err) { console.log(err) });
</script> </script>
</body> </body>
</html> </html>

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