diff --git a/src/pages/personal/index.tsx b/src/pages/personal/index.tsx
index b707c37..e62ab24 100644
--- a/src/pages/personal/index.tsx
+++ b/src/pages/personal/index.tsx
@@ -1,59 +1,44 @@
-import { Tabs } from 'react-vant'
import '~/styles/personal.scss'
-import ProductItem from '~/components/ProductItem'
-const Person = () => {
+const Personal = () => {
+
return (
-
-
-
-
-
-
-
-
-
IamjackRider
-
-
-
-
-
-
- {Array.from({ length: 10 }).map((_, index) =>
)}
-
-
-
-
- {Array.from({ length: 10 }).map((_, index) =>
)}
+
+
+ {/*
购物车
+
+ {
+ Array.from({ length: 5 }).map((_, index) => (
+
+
+
+
The Unkown
+
+
ETH 2.25
+
+
+
iamjackrider
+
+
+
Top Bid is By You
+
Time Remaining
+
+
-
-
-
+ ))
+ } */}
+ {/*
*/}
)
}
-export default Person
\ No newline at end of file
+export default Personal
\ No newline at end of file
diff --git a/src/pages/share/index.tsx b/src/pages/share/index.tsx
new file mode 100644
index 0000000..f9c35ea
--- /dev/null
+++ b/src/pages/share/index.tsx
@@ -0,0 +1,71 @@
+import { Tabs } from 'react-vant'
+import '~/styles/share.scss'
+import ProductItem from '~/components/ProductItem'
+
+const Share = () => {
+ return (
+
+
+
+
+
+
+
+
+
IamjackRider
+
+
+
+
+
+ 我的NFT
+ 25
+
}
+ titleClass='fz-wb-550'
+ >
+
+ {Array.from({ length: 10 }).map((_, index) =>
)}
+
+
+
+ 我喜欢的NFT
+ 999+
+ }
+ titleClass='fz-wb-550'
+ >
+
+ {Array.from({ length: 10 }).map((_, index) =>
)}
+
+
+
+
+
+ )
+}
+
+export default Share
\ No newline at end of file
diff --git a/src/router/index.tsx b/src/router/index.tsx
deleted file mode 100644
index c215086..0000000
--- a/src/router/index.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { useState } from 'react';
-import '~/styles/layout.scss'
-import { useRouter } from '~/hooks/useRouter';
-import Notify from './Notify';
-import Router from './router';
-import { tabbarData } from './routes';
-
-const LayoutRouter = () => {
-
- const { location, push } = useRouter()
- const [visible, setVisible] = useState(false)
-
- return (
-
-
-
-
- {
- tabbarData.includes(location.pathname) &&
- }
-
- {
- tabbarData.includes(location.pathname) && (
-
- {
- tabbarData.map((item, index) => (
-
push(item)}>
-
- {
- item === location.pathname &&
-
- }
-
- ))
- }
-
- )
- }
-
-
- );
-}
-
-export default LayoutRouter
\ No newline at end of file
diff --git a/src/router/layout/ConnectButton.tsx b/src/router/layout/ConnectButton.tsx
new file mode 100644
index 0000000..930d38e
--- /dev/null
+++ b/src/router/layout/ConnectButton.tsx
@@ -0,0 +1,78 @@
+import '~/styles/layout.scss'
+import { useEffect, useRef, useState } from "react"
+import { Button, Popover, PopoverInstance, Toast } from "react-vant"
+import { observer } from 'mobx-react'
+import useConnectWallet from '~/hooks/useConnectWallet'
+import store from '~/store'
+import { splitAddress } from '~/utils'
+
+const ConnectButton = () => {
+
+ const { token, walletAddress } = store.state
+ const [loading, setLoading] = useState(false)
+ const { login } = useConnectWallet();
+ const popover = useRef
(null);
+
+
+ const connectWallet = async () => {
+ setLoading(true);
+ await login();
+ setLoading(false);
+ }
+
+ const logout = () => {
+ popover.current && popover.current.hide();
+ store.removeAddr();
+ store.removeToken();
+ Toast.success('退出成功');
+ }
+
+ useEffect(() => {
+ if (!(window as any).ethereum) {
+ return;
+ };
+ (window as any).ethereum.on('accountsChanged', () => {
+ store.removeAddr();
+ store.removeToken();
+ });
+ }, []);
+
+ return (
+
+ {
+ token ? (
+
+ {splitAddress(walletAddress)}
+
+ }
+ >
+
+
+
+
+ ) : (
+
+ 连接钱包
+
+ )
+ }
+
+
+
+ )
+}
+
+export default observer(ConnectButton)
\ No newline at end of file
diff --git a/src/router/layout/Navbar.tsx b/src/router/layout/Navbar.tsx
new file mode 100644
index 0000000..45fbab2
--- /dev/null
+++ b/src/router/layout/Navbar.tsx
@@ -0,0 +1,29 @@
+
+import '~/styles/layout.scss'
+import ConnectButton from './ConnectButton'
+
+interface NavbarProps {
+ pathname: string,
+ setVisible: Function
+}
+
+const Navbar = (props: NavbarProps) => {
+
+ const { pathname, setVisible } = props
+
+ return (
+
+ )
+}
+
+export default Navbar
\ No newline at end of file
diff --git a/src/router/Notify.tsx b/src/router/layout/Notify.tsx
similarity index 100%
rename from src/router/Notify.tsx
rename to src/router/layout/Notify.tsx
diff --git a/src/router/router.tsx b/src/router/layout/RenderRouter.tsx
similarity index 83%
rename from src/router/router.tsx
rename to src/router/layout/RenderRouter.tsx
index 81bd74c..195b804 100644
--- a/src/router/router.tsx
+++ b/src/router/layout/RenderRouter.tsx
@@ -1,9 +1,9 @@
import { Suspense } from "react";
import { Route, Routes } from "react-router-dom";
import { Loading } from "react-vant";
-import routes from "./routes";
+import routes from "../routes";
-const Router = () => {
+const RenderRouter = () => {
return (
@@ -22,4 +22,4 @@ const Router = () => {
)
}
-export default Router;
+export default RenderRouter;
diff --git a/src/router/layout/Tabbar.tsx b/src/router/layout/Tabbar.tsx
new file mode 100644
index 0000000..c3c7770
--- /dev/null
+++ b/src/router/layout/Tabbar.tsx
@@ -0,0 +1,36 @@
+import '~/styles/layout.scss'
+
+interface TabbarProps {
+ tabbarData: string[],
+ push: Function,
+ pathname: string
+}
+
+const Tabbar = (props: TabbarProps) => {
+
+ const { tabbarData, push, pathname } = props
+
+ return (
+
+ {
+ tabbarData.map((item, index) => (
+
push(item)}>
+
+ {
+ item === pathname &&
+
+ }
+
+ ))
+ }
+
+ )
+}
+
+export default Tabbar
\ No newline at end of file
diff --git a/src/router/layout/index.tsx b/src/router/layout/index.tsx
new file mode 100644
index 0000000..22a3788
--- /dev/null
+++ b/src/router/layout/index.tsx
@@ -0,0 +1,47 @@
+import '~/styles/layout.scss'
+import { LegacyRef, useEffect, useRef, useState } from 'react';
+import { useRouter } from '~/hooks/useRouter';
+import Notify from './Notify';
+import RenderRouter from './RenderRouter';
+import { tabbarData } from '../routes';
+import Navbar from './Navbar';
+import Tabbar from './Tabbar';
+
+const LayoutRouter = () => {
+
+ const { location, push } = useRouter()
+ const [visible, setVisible] = useState(false)
+ const pagesRef = useRef
(null);
+
+ useEffect(() => {
+ // 在路由变化时将自定义滚动条滚动到顶部
+
+ }, [location.pathname])
+
+ return (
+
+
+
+
+ {
+ tabbarData.includes(location.pathname) &&
+ }
+
+ {
+ tabbarData.includes(location.pathname) && (
+
+ )
+ }
+
+
+ );
+}
+
+export default LayoutRouter
\ No newline at end of file
diff --git a/src/router/routes.tsx b/src/router/routes.tsx
index 9b6f43b..89cd197 100644
--- a/src/router/routes.tsx
+++ b/src/router/routes.tsx
@@ -3,8 +3,8 @@ import { RouteObject } from "react-router-dom";
const Home = lazy(() => import("~/pages/home"));
const Product = lazy(() => import("~/pages/product"));
-const Cart = lazy(() => import("~/pages/cart"));
-const Person = lazy(() => import("~/pages/personal"));
+const Share = lazy(() => import("~/pages/share"));
+const Personal = lazy(() => import("~/pages/personal"));
const Detail = lazy(() => import("~/pages/detail"));
const routes = [
@@ -17,12 +17,12 @@ const routes = [
element: ,
},
{
- path: "/cart",
- element: ,
+ path: "/share",
+ element: ,
},
{
path: "/personal",
- element: ,
+ element: ,
},
{
path: "/detail",
@@ -33,7 +33,7 @@ const routes = [
export const tabbarData = [
'/',
'/product',
- '/cart',
+ '/share',
'/personal',
]
diff --git a/src/store/index.ts b/src/store/index.ts
new file mode 100644
index 0000000..5e25ec8
--- /dev/null
+++ b/src/store/index.ts
@@ -0,0 +1,64 @@
+import { makeAutoObservable } from "mobx";
+import { StoreLocalStorageKey } from "~/types";
+
+interface Store {
+ state: object;
+}
+
+class AppStore implements Store {
+ state = {
+ token: "",
+ walletAddress: "",
+ };
+
+ constructor() {
+ makeAutoObservable(this);
+ this.initState()
+ }
+
+ /**
+ * @description 初始化数据
+ */
+ initState() {
+ let addr = window.localStorage.getItem(StoreLocalStorageKey.ADDRESS) || "";
+ let token = window.localStorage.getItem(StoreLocalStorageKey.TOKEN) || "";
+ this.state.walletAddress = addr;
+ this.state.token = token;
+ }
+
+ /**
+ * @description 设置token
+ */
+ setToken(token: string): void {
+ this.state.token = token;
+ window.localStorage.setItem(StoreLocalStorageKey.TOKEN, token);
+ }
+
+ /**
+ * @description 移除token
+ */
+ removeToken(): void {
+ this.state.token = "";
+ window.localStorage.removeItem(StoreLocalStorageKey.TOKEN);
+ }
+
+ /**
+ * @description 设置地址
+ */
+ setAddress(addr: string): void {
+ this.state.walletAddress = addr;
+ window.localStorage.setItem(StoreLocalStorageKey.ADDRESS, addr);
+ }
+
+ /**
+ * @description 移除地址
+ */
+ removeAddr(): void {
+ this.state.walletAddress = "";
+ window.localStorage.removeItem(StoreLocalStorageKey.ADDRESS);
+ }
+}
+
+const store = new AppStore();
+
+export default store;
diff --git a/src/styles/cart.scss b/src/styles/cart.scss
deleted file mode 100644
index e4ddc9c..0000000
--- a/src/styles/cart.scss
+++ /dev/null
@@ -1,60 +0,0 @@
-.cart{
-
- .cover{
- @include img-size(170px,170px)
- }
-
- .box{
- height: 151px;
- width: 100%;
- background-color: $white;
- box-shadow: 8px 8px 20px 0px rgba(0, 0, 0, 0.1);
- border-top-right-radius: 10px;
- border-bottom-right-radius: 10px;
-
- .price-tag{
- padding: 0px 8px;
- height: 18px;
- display: flex;
- align-items: center;
- background: linear-gradient(114deg, #320D6D 0%, #8A4CED 108%);
- color: $white;
- border-radius: 50px;
- font-size: 12px;
- }
-
- .user-tag{
- padding: 0px 8px 0px 0px;
- height: 18px;
- display: flex;
- align-items: center;
- background-color: #F1F1F1;
- border-radius: 50px;
- font-size: 12px;
- .img{
- @include img-size(15px,15px);
- border-radius:8px
- }
- }
-
- .timing-box{
- width: 85px;
- height: 20px;
- border-radius: 20px;
- background-color: #f1f1f1;
- display: flex;
- justify-content: center;
- align-items: center;
- }
-
- .delete{
- width: 22px;
- height: 22px;
- border-radius: 12px;
- background-color: #f1f1f1;
- color:#F96900;
- }
-
- }
-
-}
diff --git a/src/styles/home.scss b/src/styles/home.scss
index e1196c4..804cb17 100644
--- a/src/styles/home.scss
+++ b/src/styles/home.scss
@@ -7,10 +7,68 @@
&::-webkit-scrollbar{
display: none;
}
+
+ .swiper-item{
+ min-width: 284px;
+ min-height: 375px;
+ position: relative;
+ }
+
+ .cover-box{
+ position: absolute;
+ width: 200px;
+ height: 130px;
+ right: 0;
+ bottom: 0;
+ background-color: rgb(248,247,255);
+ border-radius: 15px;
+
+ .cover-box-item{
+ position: absolute;
+ right: 5px;
+ bottom: 5px;
+ width: 190px;
+ height: 120px;
+ background-color: $white;
+ border: 1px solid #D8D8D8;
+ box-shadow: 0px 0px 50px 0px rgba(0, 0, 0, 0.06);
+ border-radius: 15px;
+ position: absolute;
+ display: flex;
+ justify-content: space-between;
+ flex-direction: column;
+
+ .user-tag{
+ width: 90%;
+ height: 16px;
+ background: #f5f5f5;
+ font-size: 8px;
+ border-radius: 8px;
+
+ img{
+ width: 16px;
+ height: 16px;
+ border-radius: 15px;
+ object-fit: cover;
+ }
+ }
+
+ .button{
+ width: 82px;
+ height: 30px;
+ background-color: $primary;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
}
.swiper-img{
- @include img-size(203px,266px)
+ width: 220px;
+ height: 310px;
+ object-fit: cover;
+ border: 1px solid #D8D8D8;
}
}
\ No newline at end of file
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index 073565c..82a1699 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -17,6 +17,7 @@
border-radius: 3px;
background-color: $red;
}
+
}
.header-bg-color{
@@ -90,4 +91,24 @@
top: 49%;
left: 0;
}
+}
+
+.connect-button{
+
+ .button{
+ margin: 0;
+ padding: 0;
+ width: 126px;
+ height: 32px;
+ border-radius: 5px;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .rv-popover__content{
+ width: 126px;
+ }
+
}
\ No newline at end of file
diff --git a/src/styles/personal.scss b/src/styles/personal.scss
index a180f11..e4ddc9c 100644
--- a/src/styles/personal.scss
+++ b/src/styles/personal.scss
@@ -1,44 +1,60 @@
-.personal{
+.cart{
- .box{
+ .cover{
+ @include img-size(170px,170px)
+ }
+ .box{
+ height: 151px;
width: 100%;
- height: 200px;
- position: relative;
- .bg-cover{
- width: 100%;
- height: 200px;
- top: 0;
- left: 0;
- object-fit:cover;
- position: absolute;
- border-bottom-left-radius: 50px;
- border-bottom-right-radius: 50px;
+ background-color: $white;
+ box-shadow: 8px 8px 20px 0px rgba(0, 0, 0, 0.1);
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+
+ .price-tag{
+ padding: 0px 8px;
+ height: 18px;
+ display: flex;
+ align-items: center;
+ background: linear-gradient(114deg, #320D6D 0%, #8A4CED 108%);
+ color: $white;
+ border-radius: 50px;
+ font-size: 12px;
}
- .avatar{
- position: absolute;
- left: calc(50% - 71px);
- bottom: -71px;
-
+ .user-tag{
+ padding: 0px 8px 0px 0px;
+ height: 18px;
+ display: flex;
+ align-items: center;
+ background-color: #F1F1F1;
+ border-radius: 50px;
+ font-size: 12px;
.img{
- @include img-size(142px,142px);
- border-radius: 71px;
+ @include img-size(15px,15px);
+ border-radius:8px
}
}
- }
- .box-block{
- display: block;
- height: 71px;
- width: 100%;
- }
+ .timing-box{
+ width: 85px;
+ height: 20px;
+ border-radius: 20px;
+ background-color: #f1f1f1;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .delete{
+ width: 22px;
+ height: 22px;
+ border-radius: 12px;
+ background-color: #f1f1f1;
+ color:#F96900;
+ }
- .tag{
- background: linear-gradient(104deg, #1DD0DF -2%, #1DD0DF -2%, #1BEDFF -2%, #14BDEB 108%);
- padding: 5px 15px;
- font-size: 12px;
- border-radius: 20px;
}
-}
\ No newline at end of file
+}
diff --git a/src/styles/share.scss b/src/styles/share.scss
new file mode 100644
index 0000000..a180f11
--- /dev/null
+++ b/src/styles/share.scss
@@ -0,0 +1,44 @@
+.personal{
+
+ .box{
+
+ width: 100%;
+ height: 200px;
+ position: relative;
+ .bg-cover{
+ width: 100%;
+ height: 200px;
+ top: 0;
+ left: 0;
+ object-fit:cover;
+ position: absolute;
+ border-bottom-left-radius: 50px;
+ border-bottom-right-radius: 50px;
+ }
+
+ .avatar{
+ position: absolute;
+ left: calc(50% - 71px);
+ bottom: -71px;
+
+ .img{
+ @include img-size(142px,142px);
+ border-radius: 71px;
+ }
+ }
+ }
+
+ .box-block{
+ display: block;
+ height: 71px;
+ width: 100%;
+ }
+
+ .tag{
+ background: linear-gradient(104deg, #1DD0DF -2%, #1DD0DF -2%, #1BEDFF -2%, #14BDEB 108%);
+ padding: 5px 15px;
+ font-size: 12px;
+ border-radius: 20px;
+ }
+
+}
\ No newline at end of file
diff --git a/src/types/api.d.ts b/src/types/api.d.ts
new file mode 100644
index 0000000..5a86228
--- /dev/null
+++ b/src/types/api.d.ts
@@ -0,0 +1,12 @@
+interface PerformSNonce {
+ address: string;
+ chainId: number;
+}
+
+interface PerformSignin {
+ address: string;
+ nonce: string;
+ signature: string;
+}
+
+export { PerformSNonce, PerformSignin }
diff --git a/src/types/index.ts b/src/types/index.ts
new file mode 100644
index 0000000..fabb6b8
--- /dev/null
+++ b/src/types/index.ts
@@ -0,0 +1,2 @@
+export { StoreLocalStorageKey } from "./store.d";
+export type { PerformSignin, PerformSNonce } from "./api";
diff --git a/src/types/store.d.ts b/src/types/store.d.ts
new file mode 100644
index 0000000..30dec6a
--- /dev/null
+++ b/src/types/store.d.ts
@@ -0,0 +1,6 @@
+enum StoreLocalStorageKey {
+ TOKEN = "MARKET_NFT_TOKEN",
+ ADDRESS = "MARKET_NFT_ADDRESS",
+}
+
+export { StoreLocalStorageKey };
diff --git a/src/utils/index.ts b/src/utils/index.ts
new file mode 100644
index 0000000..f820481
--- /dev/null
+++ b/src/utils/index.ts
@@ -0,0 +1,14 @@
+const splitAddress = (address: string, index?: number) => {
+ try {
+ let idx = index ? index : 5;
+ return (
+ address.substring(0, idx) +
+ "..." +
+ address.substring(address.length - idx, address.length)
+ );
+ } catch (error) {
+ return "";
+ }
+};
+
+export { splitAddress };
diff --git a/src/utils/sign/sign.ts b/src/utils/sign/sign.ts
new file mode 100644
index 0000000..6f088ee
--- /dev/null
+++ b/src/utils/sign/sign.ts
@@ -0,0 +1,21 @@
+const md5 = require('js-md5')
+var signkey = process.env.REACT_APP_SIGN_KEY
+
+var signGenerator = (data: any) => {
+
+ var keys = [];
+ for (var key in data) {
+ keys.push(key);
+ }
+ keys.sort();
+
+ var ptxt = "";
+ for (var i = 0; i < keys.length; i++) {
+ ptxt += keys[i] + data[keys[i]];
+ }
+ ptxt = signkey + ptxt + signkey;
+ var signval = md5(ptxt).toLowerCase()
+ return signval;
+}
+
+export default signGenerator;
\ No newline at end of file
diff --git a/src/utils/sign/sort.ts b/src/utils/sign/sort.ts
new file mode 100644
index 0000000..9dbfee3
--- /dev/null
+++ b/src/utils/sign/sort.ts
@@ -0,0 +1,35 @@
+/* eslint-disable no-loop-func */
+var sortParam = (data: any) => {
+ var keys: any = [];
+ for (var key in data) {
+ keys.push(key);
+ }
+
+ var ptxt = "";
+ for (var i = 0; i < keys.length; i++) {
+ if (data[keys[i]] instanceof Array) {
+ if (i === 0) {
+ data[keys[i]].forEach((v: string, index: number) => {
+ if (index === 1) {
+ ptxt += keys[i] + "=" + v;
+ } else {
+ ptxt += "&" + keys[i] + "=" + v;
+ }
+ });
+ } else {
+ data[keys[i]].forEach((v: any) => {
+ ptxt += "&" + keys[i] + "=" + v;
+ });
+ }
+ } else {
+ if (i === 0) {
+ ptxt += keys[i] + "=" + data[keys[i]];
+ } else {
+ ptxt += "&" + keys[i] + "=" + data[keys[i]];
+ }
+ }
+ }
+ // console.log(ptxt);
+ return ptxt;
+};
+export default sortParam;
diff --git a/yarn.lock b/yarn.lock
index 6c13ae8..ecb7c8a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3078,6 +3078,11 @@ balanced-match@^1.0.0:
resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
batch@0.6.1:
version "0.6.1"
resolved "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
@@ -3191,6 +3196,14 @@ buffer-from@^1.0.0:
resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+buffer@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
builtin-modules@^3.1.0:
version "3.3.0"
resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
@@ -5328,6 +5341,11 @@ identity-obj-proxy@^3.0.0:
dependencies:
harmony-reflect "^1.4.6"
+ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
ignore@^5.2.0:
version "5.3.0"
resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78"
@@ -6274,6 +6292,11 @@ jiti@^1.19.1:
resolved "https://registry.npmmirror.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
+js-md5@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.npmmirror.com/js-md5/-/js-md5-0.8.3.tgz#921bab7efa95bfc9d62b87ee08a57f8fe4305b69"
+ integrity sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==
+
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"