Commit dc30c192 authored by haiyoucuv's avatar haiyoucuv

new 模板

parent c4f942aa
......@@ -32,15 +32,15 @@
// alert("【警告】检测到活动url中没有appID参数\n缺少该参数会导致埋点、分享、app信息获取错误。")
}
</script>
<script type="module" crossorigin src="//yun.duiba.com.cn/db_games/spark/v3/1729496487145/assets/index-IOlgD7Xl.js"></script>
<link rel="stylesheet" crossorigin href="//yun.duiba.com.cn/db_games/spark/v3/1729496487145/assets/index-yKeX4PuT.css">
<script type="module" crossorigin src="//yun.duiba.com.cn/db_games/spark/v3/1729517141652/assets/index-DPQtDLbj.js"></script>
<link rel="stylesheet" crossorigin href="//yun.duiba.com.cn/db_games/spark/v3/1729517141652/assets/index-DFky1LnK.css">
<script type="module">import.meta.url;import("_").catch(()=>1);(async function*(){})().next();if(location.protocol!="file:"){window.__vite_is_modern_browser=true}</script>
<script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script>
</head>
<body>
<div id="root"></div>
<script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
<script nomodule crossorigin id="vite-legacy-polyfill" src="//yun.duiba.com.cn/db_games/spark/v3/1729496487145/assets/polyfills-legacy-lCXTzC3s.js"></script>
<script nomodule crossorigin id="vite-legacy-entry" data-src="//yun.duiba.com.cn/db_games/spark/v3/1729496487145/assets/index-legacy-BdSZAkKJ.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
<script nomodule crossorigin id="vite-legacy-polyfill" src="//yun.duiba.com.cn/db_games/spark/v3/1729517141652/assets/polyfills-legacy-W9lTZna6.js"></script>
<script nomodule crossorigin id="vite-legacy-entry" data-src="//yun.duiba.com.cn/db_games/spark/v3/1729517141652/assets/index-legacy-fDO6dxZd.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
</body>
</html>
import { AESEncrypt } from "./Crypto";
import { MockMethod, MockConfig } from 'vite-plugin-mock';
export default [
{
......
export default [
{
url: '/log/clock',
method: 'get',
response: 1,
},
]
import React, { Component, StrictMode } from 'react'
import React, { Component } from 'react'
import { observer } from "mobx-react";
import { createRoot } from "react-dom/client";
import store from "./store/store";
import "./utils/checkwebp";
import '@csstools/normalize.css';
import MD from "./MD"; // 埋点
MD();
import './App.less'
import { PAGE_MAP } from "./utils/constants";
import LoadingDemo from "./pages/LoadingDemo/LoadingDemo";
import HomeDemo from "./pages/HomeDemo/HomeDemo";
import Modal from "./modal/modal";
import './App.less'
import '@csstools/normalize.css';
import API from "./api";
MD();
const pageMap = {
[PAGE_MAP.LOADING_PAGE]: <LoadingDemo />,
[PAGE_MAP.HOME_PAGE]: <HomeDemo />,
[PAGE_MAP.LOADING_PAGE]: <LoadingDemo />,
[PAGE_MAP.HOME_PAGE]: <HomeDemo />,
};
@observer
class App extends Component {
async componentDidMount() {
await store.getFrontVariable();
}
render() {
const {curPage, pageData} = store;
return (
<>
{{...pageMap[curPage], props: {...pageData}}}
<Modal/>
</>
);
}
async componentDidMount() {
await store.getFrontVariable();
store.initRule();
API.doJoin();
}
render() {
const { curPage, pageData } = store;
return (
<>
{{ ...pageMap[curPage], props: { ...pageData } }}
<Modal />
</>
);
}
}
createRoot(document.getElementById('root')!).render(
<App />
<App />
);
......@@ -4,8 +4,7 @@ import { logClick, logExposure } from "@spark/utils/src-js/md";
const appId = CFG.appID;
const dcm = "202." + CFG.projectId + ".0.0";
const domain = "//embedlog.duiba.com.cn";
const dom = `${CFG.channel}.0.0.0`
const domain = "https://embedlog.duiba.com.cn";
const MDList = new Array(50).fill("").map((v, i) => {
return {
ele: `.md${i + 1}`,
......@@ -14,7 +13,6 @@ const MDList = new Array(50).fill("").map((v, i) => {
dcm,
domain,
appId,
dom,
},
once: false,
};
......@@ -32,7 +30,6 @@ export function handleLogExposure(id, id2 = 0) {
dcm,
domain,
appId,
dom
});
}
export function handleLogClick(id, id2 = 0) {
......@@ -41,6 +38,5 @@ export function handleLogClick(id, id2 = 0) {
dcm,
domain,
appId,
dom
});
}
import { generateAPI } from "./utils.js"
import { generateAPI } from "./utils"
const API = generateAPI({
/** 获取活动规则 */
......
declare type Methods = 'get' | 'post';
declare interface APIArguments {
uri: string,
method?: Methods | Uppercase<Methods>,
headers?: any
withToken?: boolean
secret?: string,
secretKey?: string,
contentType?: string,
showMsg?:boolean,
showLoading?: boolean;
}
declare type APIConfig = APIArguments | string
declare interface GenerateAPIParams {
[key: string]: APIConfig
}
declare type RequestParamType = Record<string, any>
declare interface ResponseType<T = any> {
code: number,
success: boolean,
message: string,
data: T
}
export declare function generateAPI<
T extends GenerateAPIParams = GenerateAPIParams,
P = RequestParamType,
Q = ResponseType>
(apiList: T): {
[key in keyof T]: (args?: P) => Promise<Q>
}
import { callApi } from '@spark/api-base'
import { Loading, Toast } from '@spark/ui'
import { isFromShare, newUser } from '../built-in/duiba-utils';
import { errorHandler } from "../utils/errorHandler";
import { getPxToken } from "../built-in/getPxToken";
const mergeData = {
user_type: newUser ? '0' : '1',
is_from_share: isFromShare ? '0' : '1',
}
// let tempCookieId = "";
//
// export function setCookieId(cookieId) {
// tempCookieId = cookieId;
// }
export function resetBackCookie(duibaTempCookieId) {
return new Promise((resolve) => {
callApi("/autoLogin/resetCookie", {
duibaTempCookieId
}).then((resp) => {
return resolve('success');
}, (e) => {
return resolve(e);
});
});
}
/**
* 请求方法get、post处理
* @param {*} value
* @returns
*/
function getRequestParams(value) {
if (typeof value === 'string') {
return {
uri: value,
method: 'get'
}
} else if (typeof value === 'object') {
const { uri, method = 'get', showMsg = true, showLoading = false, headers, withToken, secret, secretKey, contentType = 'form' } = value;
return {
uri,
method,
headers,
withToken,
secret,
secretKey,
contentType,
showLoading,
showMsg
}
} else {
console.error('getRequestParams: 传参有误');
}
}
/**
* 请求API通用处理
* @param {*} value
* @returns
*/
export function generateAPI(apiList) {
const api = {};
for (const key in apiList) {
const value = apiList[key];
const { method, uri, headers: mHeaders, withToken, secret, secretKey, contentType, showLoading, showMsg = true } = getRequestParams(value);
api[key] = async (params = {}, headers) => {
// cookie丢失的问题
// 如遇跳转Cookie丢失,打开如下代码
// const duibaTempCookieId = localStorage.getItem("db_temp_cookie");
// // const duibaTempCookieId = tempCookieId;
//
// if (duibaTempCookieId) {
// localStorage.removeItem("db_temp_cookie");
// // tempCookieId = "";
//
// const res = await API.userLogin()
// .catch(async () => {
// await resetBackCookie(duibaTempCookieId);
// });
//
// if (!res || !res.success) {
// await resetBackCookie(duibaTempCookieId);
// }
// }
// 根据接口配置showLoading展示loading
// 600ms内结束的请求不显示loading,避免闪烁
let query = false;
showLoading && setTimeout(() => {
if (!query) {
Loading.show();
}
}, 600);
let token;
if (withToken) { // 是否携带token
try {
token = await getPxToken(); // 获取token
} catch (e) {
Toast('网络异常,请稍后再试~');
query = true;
showLoading && Loading.hide();// 根据接口配置showLoading关闭loading
return ({ success: false, data: '' });
}
}
const mergedHeaders = { ...mHeaders, ...headers }
if (withToken && token) {
params.token = token;
}
params = { ...params, ...mergeData };
const result = await callApi(uri, params, method, mergedHeaders, false, secret, secretKey, contentType)
.catch(e => {
query = true;
// 捕获网络异常
showMsg && Toast(e.message || '网络异常,请稍后再试~');
showLoading && Loading.hide();
});
query = true;
showLoading && Loading.hide();// 根据接口配置showLoading关闭loading
return new Promise((resolve) => {
if (result) {
// 判断接口错误
if (!result.success && showMsg) {
errorHandler(result);
}
// 返回整个结果
resolve(result);
} else {
resolve({ success: false, data: '' });
}
})
}
}
return api;
}
import { Toast } from '@spark/ui'
import { isFromShare, newUser } from '../built-in/duiba-utils';
import { errorHandler } from "@/utils/errorHandler.js";
import { getPxToken } from "@/built-in/getPxToken.js";
import { Axios } from 'axios';
interface IRes {
success: boolean;
data: any;
msg: string;
code: number | string;
}
const mergeData = {
user_type: newUser ? '0' : '1',
is_from_share: isFromShare ? '0' : '1',
}
// let tempCookieId = "";
//
// export function setCookieId(cookieId) {
// tempCookieId = cookieId;
// }
export function resetBackCookie(duibaTempCookieId) {
return new Promise((resolve) => {
apiAxios.request({
url: "/autoLogin/resetCookie",
data: {
duibaTempCookieId
}
}).then((resp) => {
return resolve('success');
}, (e) => {
return resolve(e);
});
});
}
/**
* 请求方法get、post处理
* @param {*} value
* @returns
*/
function getRequestParams(value) {
if (typeof value === 'string') {
return {
uri: value,
method: 'get'
}
} else if (typeof value === 'object') {
const {
uri,
method = 'get',
showMsg = true,
headers,
withToken,
} = value;
return {
uri,
method,
headers,
withToken,
showMsg
}
} else {
console.error('getRequestParams: 传参有误');
}
}
const apiAxios = new Axios({
timeout: 10000,
});
apiAxios.interceptors.response.use(
async (resp) => {
try {
const res = JSON.parse(resp.data);
if (res.success) {
return res;
} else {
return { success: false };
}
} catch (e) {
return { success: false };
}
},
async (error) => {
console.error(error);
return { success: false };
}
);
/**
* 请求API通用处理
* @returns
* @param apiList
*/
export function generateAPI(apiList): { [key in string]: (params?, headers?) => Promise<IRes> } {
const api = {};
for (const key in apiList) {
let value = apiList[key];
if (typeof value === 'string') {
value = {
uri: value,
method: 'get'
}
}
const {
method = 'get',
uri,
headers: mHeaders,
withToken,
showMsg = true
} = value;
api[key] = async (params: any = {}, headers: any = {}) => {
// cookie丢失的问题
// 如遇跳转Cookie丢失,打开如下代码
// const duibaTempCookieId = localStorage.getItem("db_temp_cookie");
// // const duibaTempCookieId = tempCookieId;
//
// if (duibaTempCookieId) {
// localStorage.removeItem("db_temp_cookie");
// // tempCookieId = "";
//
// const res = await API.userLogin()
// .catch(async () => {
// await resetBackCookie(duibaTempCookieId);
// });
//
// if (!res || !res.success) {
// await resetBackCookie(duibaTempCookieId);
// }
// }
if (withToken) { // 是否携带token
params.token = await getPxToken()
.catch(() => {
Toast('网络异常,请稍后再试~');
return ({ success: false, data: '' });
});
}
const mergedHeaders = { ...mHeaders, ...headers }
params = { ...params, ...mergeData };
const res: IRes = await apiAxios.request({
method,
url: uri,
headers: mergedHeaders,
data: params,
});
if (res) {
if (!res.success && showMsg) {
errorHandler(res);
}
return res;
} else {
return { success: false, data: '' };
}
}
}
return api;
}
......@@ -5,7 +5,7 @@ export class CodeError {
stack: string;
payload: any;
constructor(input, message) {
constructor(input, message?) {
if (typeof input === 'number' || typeof input === 'string') {
this.code = input + '';
} else if (typeof input === 'object') {
......
......@@ -2,7 +2,7 @@
* Created by rockyl on 2019-11-22.
*/
import {injectProp, obj2query} from "./utils";
import { injectProp, obj2query } from "./utils";
/**
* http请求
......@@ -13,153 +13,124 @@ import {injectProp, obj2query} from "./utils";
* @param headers
*/
export function httpRequest(url: string, method: string = 'get', params?: any, type: 'text' | 'json' | 'jsonp' = 'text', headers?) {
let openUrl = url.indexOf('blob') === 0 ? url : urlJoin(url, '__ts__=' + Date.now());
let mParams = {};
injectProp(mParams, params);
if (type === "jsonp") {
return jsonp(openUrl, mParams);
} else {
return new Promise((resolve, reject) => {
let mHeaders = {
'Content-Type': 'application/x-www-form-urlencoded',
};
injectProp(mHeaders, headers);
let openUrl = url.indexOf('blob') === 0 ? url : urlJoin(url, '__ts__=' + Date.now());
let mParams = {};
injectProp(mParams, params);
let request = {url, method, params: mParams, type, headers: mHeaders};
return new Promise((resolve, reject) => {
let mHeaders = {
'Content-Type': 'application/x-www-form-urlencoded',
};
injectProp(mHeaders, headers);
const mock = window['mock'];
let mockRule;
if (mock) {
mock(request, (rule) => {
mockRule = rule;
if (!mockRule) {
doRequest(request, resolve, reject);
}
}, resolve, reject);
} else {
request.url = openUrl;
doRequest(request, resolve, reject);
}
});
}
let request = { url, method, params: mParams, type, headers: mHeaders };
const mock = window['mock'];
let mockRule;
if (mock) {
mock(request, (rule) => {
mockRule = rule;
if (!mockRule) {
doRequest(request, resolve, reject);
}
}, resolve, reject);
} else {
request.url = openUrl;
doRequest(request, resolve, reject);
}
});
}
function doProxyRequest(payload, resolve, reject) {
let proxyWindow = window['proxy_window'];
window.addEventListener('message', onMessage, false);
let proxyWindow = window['proxy_window'];
window.addEventListener('message', onMessage, false);
proxyWindow.postMessage(JSON.stringify({
action: 'http-request-proxy',
payload: payload,
}), '*');
proxyWindow.postMessage(JSON.stringify({
action: 'http-request-proxy',
payload: payload,
}), '*');
function onMessage(event) {
window.removeEventListener('message', onMessage);
try {
let data = JSON.parse(event.data);
console.log('onMessage', event.data);
function onMessage(event) {
window.removeEventListener('message', onMessage);
try {
let data = JSON.parse(event.data);
console.log('onMessage', event.data);
switch (data.action) {
case 'http-request-proxy-resolve':
resolve(data.payload);
break;
case 'http-request-proxy-reject':
reject(data.payload);
break;
}
} catch (e) {
switch (data.action) {
case 'http-request-proxy-resolve':
resolve(data.payload);
break;
case 'http-request-proxy-reject':
reject(data.payload);
break;
}
} catch (e) {
}
}
}
}
}
function doXhrRequest({url, method, params, type, headers}, resolve, reject) {
let xhr;
if (window["XMLHttpRequest"]) {
xhr = new XMLHttpRequest();
} else if (window["ActiveXObject"]) {
xhr = new window["ActiveXObject"]();
} else {
console.log('no xhr');
}
if (xhr != null) {
const isGet = method.toUpperCase() === 'GET';
const queryStr = obj2query(params);
let openUrl = url;
if (openUrl.indexOf('projectx') == 0) {
openUrl = '/' + openUrl;
}
if (isGet) {
openUrl = urlJoin(openUrl, queryStr);
}
xhr.open(method, openUrl, true);
for (let key in headers) {
xhr.setRequestHeader(key, headers[key]);
}
xhr.responseType = type;
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
resolve(xhr.response)
}
};
xhr.onerror = (reason): void => {
reject(reason)
};
xhr.onloadend = (): void => {
if (xhr.status == 404) {
reject(url + ' 404 (Not Found)')
}
};
if (isGet) {
xhr.send();
} else {
xhr.send(queryStr);
}
}
function doXhrRequest({ url, method, params, type, headers }, resolve, reject) {
let xhr;
if (window["XMLHttpRequest"]) {
xhr = new XMLHttpRequest();
} else if (window["ActiveXObject"]) {
xhr = new window["ActiveXObject"]();
} else {
console.log('no xhr');
}
if (xhr != null) {
const isGet = method.toUpperCase() === 'GET';
const queryStr = obj2query(params);
let openUrl = url;
if (openUrl.indexOf('projectx') == 0) {
openUrl = '/' + openUrl;
}
if (isGet) {
openUrl = urlJoin(openUrl, queryStr);
}
xhr.open(method, openUrl, true);
for (let key in headers) {
xhr.setRequestHeader(key, headers[key]);
}
xhr.responseType = type;
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
resolve(xhr.response)
}
};
xhr.onerror = (reason): void => {
reject(reason)
};
xhr.onloadend = (): void => {
if (xhr.status == 404) {
reject(url + ' 404 (Not Found)')
}
};
if (isGet) {
xhr.send();
} else {
xhr.send(queryStr);
}
}
}
function doRequest(payload, resolve, reject) {
if (window['proxy_window'] && payload.url.indexOf('blob') !== 0) {
doProxyRequest(payload, function (p) {
resolve(p);
}, reject);
} else {
doXhrRequest(payload, resolve, reject);
}
}
/**
* jsonp请求
* @param url
* @param params
*/
export function jsonp(url, params) {
return new Promise<void>((resolve, reject) => {
const src = urlJoin(url, obj2query(params));
const scriptEl = document.createElement('script');
scriptEl.src = src;
scriptEl.onload = function () {
resolve();
document.body.removeChild(scriptEl);
};
scriptEl.onerror = function () {
reject();
document.body.removeChild(scriptEl);
};
/*const callbackFuncName = '__zeroing_jsonp_callback__' + Math.random();
window[callbackFuncName] = function () {
callback(result);
};*/
document.body.appendChild(scriptEl);
})
if (window['proxy_window'] && payload.url.indexOf('blob') !== 0) {
doProxyRequest(payload, function (p) {
resolve(p);
}, reject);
} else {
doXhrRequest(payload, resolve, reject);
}
}
export function urlJoin(url, query) {
if (query) {
url += url.indexOf('?') < 0 ? '?' : '';
url += url[url.length - 1] === '?' ? '' : '&';
return url + query;
} else {
return url;
}
if (query) {
url += url.indexOf('?') < 0 ? '?' : '';
url += url[url.length - 1] === '?' ? '' : '&';
return url + query;
} else {
return url;
}
}
......@@ -79,8 +79,8 @@ export function obj2query(obj: any): string {
if(!obj) {
return '';
}
let arr: string[] = [];
for(let key in obj) {
const arr: string[] = [];
for(const key in obj) {
arr.push(key + (key ? '=' : '') + obj[key]);
}
return arr.join('&');
......
import * as utils from "./utils.js";
import "./intersection-observer.polyfill.js";
import "intersection-observer";
import { jsonp } from "../net/jsonp.ts";
import axios from "axios";
const showedMapper = {};
......@@ -47,21 +50,13 @@ function doClickLog(data) {
if (!validateParam(data)) {
return;
}
const net = {
name: "clickLog",
uri: "/log/click",
type: "get",
dataType: "json",
param: data,
callback: null,
hideMsg: true,
};
doAjax(net);
axios.get(`/log/click?${new URLSearchParams(data).toString()}`);
}
const intersectionObservers: IntersectionObserver[] = []
function registryIntersectionObserver(items) {
function registryIntersectionObserver(items: any[]) {
for (const observer of intersectionObservers) {
observer.disconnect()
}
......@@ -119,7 +114,7 @@ function registryIntersectionObserver(items) {
});
}
const generatorShow = (item) => {
const generatorShow = (item: { ele: any; data: any; once?: any; }) => {
// 目标元素在dom中则处理
if (utils.getReference(item.ele)) {
// 参数校验
......@@ -140,16 +135,9 @@ const generatorShow = (item) => {
showedMapper[ele] = true;
observer.unobserve(change.target);
const net = {
name: "showLog",
uri: data.domain + "/exposure/standard",
type: "get",
dataType: "jsonp",
param: data,
callback: null,
hideMsg: true,
};
doAjax(net);
jsonp(`${data.domain}/exposure/standard?${new URLSearchParams(data).toString()}`);
} else {
// 消失在视口
if (!once) {
......@@ -178,34 +166,9 @@ function doShowLog(items) {
observer.observe(document, { childList: true, subtree: true });
}
/**
* 发送请求
* @param net
*/
export const doAjax = (net) => {
let realUrl = net.uri;
//url加参数等特殊需求(例如再玩一次需要在dostart接口的url上加埋点)
if (net.addUrl) {
realUrl += net.addUrl;
}
window["$"].ajax({
type: net.type,
url: realUrl,
dataType: net.dataType,
data: net.param,
async: true,
success: (result) => {
console.log(`完成${net.name}${net.param}`);
},
error: (message) => {
console.info(message)
},
});
};
const MD = {
doClickLog: (data) => doClickLog(data),
doShowLog: (items) => doShowLog(items),
doClickLog: (data: any) => doClickLog(data),
doShowLog: (items: any) => doShowLog(items),
};
export default MD;
import { obj2query, urlJoin } from "@/built-in/utils/utils";
export function jsonp(url: string, params: any = {}) {
return new Promise<void>((resolve, reject) => {
const src = urlJoin(url, obj2query(params));
const scriptEl = document.createElement('script');
scriptEl.src = src;
scriptEl.onload = function () {
resolve();
document.body.removeChild(scriptEl);
};
scriptEl.onerror = function () {
reject();
document.body.removeChild(scriptEl);
};
/*const callbackFuncName = '__zeroing_jsonp_callback__' + Math.random();
window[callbackFuncName] = function () {
callback(result);
};*/
document.body.appendChild(scriptEl);
})
}
\ No newline at end of file
/**
* 对象转query字符串
* @param obj
*/
export function obj2query(obj: any): string {
if(!obj) {
return '';
}
const arr: string[] = [];
for(const key in obj) {
arr.push(key + (key ? '=' : '') + obj[key]);
}
return arr.join('&');
}
export function urlJoin(url: string, query: any) {
if (query) {
url += url.indexOf('?') < 0 ? '?' : '';
url += url[url.length - 1] === '?' ? '' : '&';
return url + query;
} else {
return url;
}
}
......@@ -15,8 +15,8 @@ class HomeDemo extends React.Component {
}
render() {
return <div className="homeDemo">
<div className="homeImg md1" />
return <div className="homeDemo md1">
<div className="homeImg" />
<img src={png} />
当前为活动首页
<SvgaPlayer className="svga" src={svga} />
......
import { defineConfig } from 'vite'
import { defineConfig, UserConfig } from 'vite'
import react from '@vitejs/plugin-react'
import legacy from '@vitejs/plugin-legacy'
import autoprefixer from "autoprefixer"
......@@ -9,7 +9,7 @@ import dotenv from 'dotenv';
import * as path from "node:path";
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
export default defineConfig(({ mode }): UserConfig => {
dotenv.config({ path: [`./config/.env.global`, `./config/.env.${mode}`] });
......@@ -33,9 +33,7 @@ export default defineConfig(({ mode }) => {
server: {
// port: 3001
open: false,
},
build: {
chunkSizeWarningLimit: 10,
host: "0.0.0.0",
},
resolve: {
alias: {
......
......@@ -1574,7 +1574,7 @@ autoprefixer@^10.4.20:
picocolors "^1.0.1"
postcss-value-parser "^4.2.0"
axios@^1.6.8:
axios@^1.6.8, axios@^1.7.7:
version "1.7.7"
resolved "http://npm.dui88.com:80/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f"
integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment