diff --git a/README.md b/README.md index bcdfb85..199ebcc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@

react 模板


+
+ +
+ ## 👨🏻‍💻 项目说明 - react 模板, 一个比 CRA 更丰富的模板 @@ -14,11 +18,10 @@ - React Hook - TypeScript v4 - webpack v5 -- axios +- axios v1 - mobx v6 - mobx-react-lite v3 - react-router-dom v6 -- postcss-px-to-viewport ## ⌛️ 安装项目依赖 @@ -127,7 +130,10 @@ merge 🔀 合并分支 ``` -## 技术栈说明 +## 🚀 陆续新增内容: -- React18 -- TypeScript +- ① 样式 ✅ 2023/2/6 日提交 [config: 🔧  新增样式文件(css/less/sass/postCss)处理](https://github.com/guokaigdg/react-enterprise-template/commit/11fb415bac609dfa7474a1ee2db93ccb4a350a51) +- ② 代码规范 ✅ 2023/2/7 日提交 [config: 🔧  新增 Prettier/ESlint/StyleLint/EditorConfig 代码规范](https://github.com/guokaigdg/react-enterprise-template/commit/87dd1ca333f81203dd245a6eb40479a0745f096f) +- ③ 路由 ✅ 2023/2/8 日提交 [config: 🔧 新增路由管理 react-router-dom v6](https://github.com/guokaigdg/react-enterprise-template/commit/239446d0709eb52bad2b48af4983eef91c49f60d) +- ④ 网络请求 ✅ 2023/2/21 日提交 +- ⑤ 数据共享 ✅ [feature: ✨  新增状态管理 Mobx v6](https://github.com/guokaigdg/react-enterprise-template/commit/992e1884943d4f8bda836f48c60df473418397d7) diff --git a/docs/images/home.png b/docs/images/home.png new file mode 100644 index 0000000..dce5336 Binary files /dev/null and b/docs/images/home.png differ diff --git a/package-lock.json b/package-lock.json index af4a41e..0a5e928 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1250,7 +1250,6 @@ "version": "7.20.13", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.13.tgz", "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.11" } @@ -2669,6 +2668,11 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", @@ -2701,6 +2705,25 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, + "axios": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.3.3.tgz", + "integrity": "sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "axios-retry": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/axios-retry/-/axios-retry-3.4.0.tgz", + "integrity": "sha512-VdgaP+gHH4iQYCCNUWF2pcqeciVOdGrBBAYUfTY+wPcO5Ltvp/37MLFNCmJKo7Gj3SHvCSdL8ouI1qLYJN3liA==", + "requires": { + "@babel/runtime": "^7.15.4", + "is-retry-allowed": "^2.2.0" + } + }, "babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.2.2.tgz", @@ -3524,6 +3547,14 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", @@ -4363,6 +4394,11 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz", @@ -5509,8 +5545,7 @@ "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "for-each": { "version": "0.3.3", @@ -5614,6 +5649,16 @@ } } }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", @@ -6924,6 +6969,11 @@ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true }, + "is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==" + }, "is-root": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-root/-/is-root-2.1.0.tgz", @@ -7878,14 +7928,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -10161,6 +10209,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", @@ -10574,8 +10627,7 @@ "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.1", diff --git a/package.json b/package.json index e9e01f4..c486ef3 100644 --- a/package.json +++ b/package.json @@ -105,6 +105,8 @@ "webpackbar": "^5.0.2" }, "dependencies": { + "axios": "^1.3.3", + "axios-retry": "^3.4.0", "mobx": "^6.8.0", "mobx-react-lite": "^3.4.0", "react": "^18.2.0", diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..8ecac9e --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,31 @@ +/* + * @file: 所有的接口列表 + * 宝可梦api https://pokeapi.co/about + */ + +import http from '../http'; +import {pokemonOptions} from '@/interface/http'; + +/** + * @function get + * @description 请求测试 + */ + +export function fetchPokemon(data: pokemonOptions) { + return http({ + url: ' https://pokeapi.co/api/v2/pokemon', + params: data + }); +} +/** + * @function post + * @description 请求测试 + */ + +export function fetchPostTest(data: any) { + return http({ + url: '/xxx/list', + method: 'post', + data + }); +} diff --git a/src/http/README.md b/src/http/README.md new file mode 100644 index 0000000..6c52477 --- /dev/null +++ b/src/http/README.md @@ -0,0 +1,6 @@ +1. 实现请求拦截 +2. 实现响应拦截 +3. 常见错误信息处理 +4. 请求头设置 +5. api 集中式管理 +6. 重复发送请求 diff --git a/src/http/index.ts b/src/http/index.ts new file mode 100644 index 0000000..b3a3717 --- /dev/null +++ b/src/http/index.ts @@ -0,0 +1,75 @@ +/* + * @Author: guokai05 + * @Date: 2023-02-19 22:31:15 + * @LastEditors: guokai05 + * @LastEditTime: 2023-02-21 16:18:27 + */ +import axios from 'axios'; +import axiosRetry from 'axios-retry'; +import {InternalAxiosRequestConfig, AxiosRequestConfig, AxiosResponse, AxiosError} from 'axios'; +const whiteRetry = new Set(['ECONNABORTED', undefined, 0]); +// import {baseURL} from '@/utils/variable'; + +// 创建 axios 请求实例 +const serviceAxios = axios.create({ + baseURL: '', // 接口请求地址 + timeout: 15 * 1000, // 请求超时设置 + withCredentials: false, // 跨域请求是否需要携带 cookie + headers: { + 'Content-Type': 'application/json;charset=utf-8' + }, + validateStatus() { + // 使用async-await,处理reject情况较为繁琐,所以全部返回resolve,在业务代码中处理异常 + return true; + } +}); + +axiosRetry(serviceAxios, { + retries: 2, // 重复请求次数 + shouldResetTimeout: true, // 重置超时时间 + retryDelay: (retryCount) => { + return retryCount * 10000; // 重复请求延迟 + }, + retryCondition: (err) => { + // true为打开自动发送请求,false为关闭自动发送请求 + const {code, message} = err; + return whiteRetry.has(code) || message.includes('timeout'); + } +}); + +// 请求拦截器 +serviceAxios.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + return config; + }, + (err: AxiosError) => { + return Promise.reject(err); + } +); + +// 响应拦截器 +serviceAxios.interceptors.response.use( + (res: AxiosResponse) => { + return res; + }, + (err: AxiosError) => { + return Promise.reject(err); + } +); + +// 统一发起请求的函数 +async function request(options: AxiosRequestConfig) { + try { + const response = await serviceAxios.request(options); + const {status, data} = response; + // 处理 HTTP 状态码 + if (status < 200 || status >= 500) { + return Promise.reject(); + } + return Promise.resolve(data); + } catch (error) { + return Promise.reject(error); + } +} + +export default request; diff --git a/src/interface/http.ts b/src/interface/http.ts new file mode 100644 index 0000000..fa81c82 --- /dev/null +++ b/src/interface/http.ts @@ -0,0 +1,4 @@ +export interface pokemonOptions { + offset?: number; + limit: number; +} diff --git a/src/router/index.tsx b/src/router/index.tsx index f6c497c..006f34b 100644 --- a/src/router/index.tsx +++ b/src/router/index.tsx @@ -15,7 +15,7 @@ const About = Suspenselazy(() => import(/* webpackChunkName:"about" */ '@/view/A const routes: RouteObject[] = [ { path: '/', - element: // 重定向 + element: // 重定向 }, { path: 'home', diff --git a/src/store/global/index.ts b/src/store/global/index.ts index 7d1fed1..a350212 100644 --- a/src/store/global/index.ts +++ b/src/store/global/index.ts @@ -1,4 +1,6 @@ -import {makeAutoObservable} from 'mobx'; +import {makeAutoObservable, runInAction} from 'mobx'; +import {fetchPokemon} from '@/api'; +import {pokemonOptions} from '@/interface/http'; class Global { constructor() { @@ -6,12 +8,29 @@ class Global { } count = 0; name = 'react'; + data: any = []; + loading = true; + addCount = () => { this.count++; }; setName = (data: string) => { this.name = data; }; + + getFetchGetTest = async (params: pokemonOptions) => { + try { + const result: any = await fetchPokemon(params); + const {results} = result; + runInAction(() => { + this.data = results; + this.loading = false; + }); + } catch (err) { + console.log(err); + this.loading = false; + } + }; } const globalStore = new Global(); diff --git a/src/utils/useHook/useRequest.ts b/src/utils/useHook/useRequest.ts new file mode 100644 index 0000000..2a98497 --- /dev/null +++ b/src/utils/useHook/useRequest.ts @@ -0,0 +1,39 @@ +/* + * useRequest封装 + * useRequest封装 https://www.xiabingbao.com/post/react/react-hook-userequest.html + */ + +import {useState, useEffect} from 'react'; +const useRequest = (fetch: any, params: any) => { + const [loading, setLoading] = useState(true); + const [result, setResult] = useState(null); + const [error, setError] = useState(null); + + const request = async () => { + setLoading(true); + try { + const result = await fetch(params); + const {code, data} = result; + if (code === 200 && data) { + setResult(data); + } else { + setError(result); + } + } catch (error) { + setError(error); + } + setLoading(false); + }; + + useEffect(() => { + request(); + }, []); + + return { + loading, + result, + error + }; +}; + +export default useRequest; diff --git a/src/utils/variable.ts b/src/utils/variable.ts new file mode 100644 index 0000000..1faf2c6 --- /dev/null +++ b/src/utils/variable.ts @@ -0,0 +1 @@ +export const baseURL = process.env.USER_BASE_URL; diff --git a/src/view/Home/HomeTwo/index.less b/src/view/Home/HomeTwo/index.less index 43b8980..ff0e01d 100644 --- a/src/view/Home/HomeTwo/index.less +++ b/src/view/Home/HomeTwo/index.less @@ -1,11 +1,84 @@ .home-two-root { display: flex; flex: 1; - align-items: center; - justify-content: center; + flex-direction: column; box-sizing: border-box; - height: 800px; - font-size: 50px; + height: 100%; background: #ffe7ba; border-radius: 10px; + + .search-wrap{ + display: flex; + align-items: center; + justify-content: center; + width: auto; + height: 120px; + + .input { + width: 250px; + height: 40px; + padding: 0 5px; + text-align: center; + } + + .btn { + width: 60px; + margin-left: 20px; + padding: 10px; + color: azure; + font-weight: 700; + font-size: 14px; + text-align: center; + background: #3c6ffe; + border-radius: 5px; + cursor: pointer; + + &:hover { + background-color: #3765e6; + border-color: #3765e6; + } + + &:active { + background-color: #315acc; + border-color: #315acc; + } + } + } + + .list-root{ + display: flex; + flex: 1; + flex-wrap: wrap; + justify-content: center; + padding: 5px; + overflow: scroll; + + .pokemon-item { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 300px; + height: 200px; + margin: 5px; + color: #383a3a; + font-size: 24px; + background-color: rgb(255 255 255); + border-radius: 10px; + + &:hover{ + border: #ea9f14 5px solid; + transform: scale(1.1); + cursor: pointer; + } + + .img{ + width: 100px; + height: 100px; + margin: 10px; + } + } + + } } diff --git a/src/view/Home/HomeTwo/index.tsx b/src/view/Home/HomeTwo/index.tsx index 6d0467a..1e88965 100644 --- a/src/view/Home/HomeTwo/index.tsx +++ b/src/view/Home/HomeTwo/index.tsx @@ -1,8 +1,49 @@ -import React from 'react'; +import React, {useEffect} from 'react'; +import {useStores} from '@/store'; +import {observer} from 'mobx-react-lite'; import './index.less'; const HomeTwo = () => { - return
HomeTwo
; + const {globalStore} = useStores(); + const {loading, data, getFetchGetTest} = globalStore; + // 查询 + const handleClick = () => { + getFetchGetTest({ + limit: 500 + }); + }; + + useEffect(() => { + getFetchGetTest({ + limit: 500 + }); + }, []); + + return ( +
+
+ +
+ 查询 +
+
+ + {!loading && ( +
+ {data.map((item: any) => ( +
+ + {item.name} +
+ ))} +
+ )} +
+ ); }; -export default HomeTwo; +export default observer(HomeTwo); diff --git a/src/view/Home/index.less b/src/view/Home/index.less index f8f8d8c..e56909d 100644 --- a/src/view/Home/index.less +++ b/src/view/Home/index.less @@ -9,7 +9,7 @@ flex-direction: column; box-sizing: border-box; width: 300px; - height: 800px; + height: 100%; padding: 10px; font-size: 25px; background: #00bfff; diff --git a/yarn.lock b/yarn.lock index c657491..f1f34c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -976,6 +976,13 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" +"@babel/runtime@^7.15.4": + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/runtime@^7.8.4": version "7.20.13" resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" @@ -2115,6 +2122,11 @@ async@^2.6.4: dependencies: lodash "^4.17.14" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -2155,6 +2167,23 @@ available-typed-arrays@^1.0.5: resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +axios-retry@^3.4.0: + version "3.4.0" + resolved "https://registry.npmmirror.com/axios-retry/-/axios-retry-3.4.0.tgz#f464dbe9408e5aa78fa319afd38bb69b533d8854" + integrity sha512-VdgaP+gHH4iQYCCNUWF2pcqeciVOdGrBBAYUfTY+wPcO5Ltvp/37MLFNCmJKo7Gj3SHvCSdL8ouI1qLYJN3liA== + dependencies: + "@babel/runtime" "^7.15.4" + is-retry-allowed "^2.2.0" + +axios@^1.3.3: + version "1.3.3" + resolved "https://registry.npmmirror.com/axios/-/axios-1.3.3.tgz#e7011384ba839b885007c9c9fae1ff23dceb295b" + integrity sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-loader@8.2.2: version "8.2.2" resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -2728,6 +2757,13 @@ colorette@^2.0.14, colorette@^2.0.19: resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^2.20.0: version "2.20.3" resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3212,6 +3248,11 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + delegates@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -4044,7 +4085,7 @@ flatted@^3.1.0: resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -4098,6 +4139,15 @@ fork-ts-checker-webpack-plugin@^7.3.0: semver "^7.3.5" tapable "^2.2.1" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -5216,6 +5266,11 @@ is-regexp@^1.0.0: resolved "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== +is-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + is-root@^2.1.0: version "2.1.0" resolved "https://registry.npmmirror.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" @@ -5958,7 +6013,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -7549,6 +7604,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + prr@~1.0.1: version "1.0.1" resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"