Commit 5b9c2099 by HoMeTown

Initial commit

parents
# Local
.DS_Store
*.local
*.log*
# Dist
node_modules
dist/
# IDE
.vscode/*
!.vscode/extensions.json
.idea
# Ignore auto generated CSS declarations
*.module.css.d.ts
*.module.sass.d.ts
*.module.scss.d.ts
*.module.less.d.ts
*.module.styl.d.ts
*.module.stylus.d.ts
\ No newline at end of file
# Rsbuild Project
## Setup
Install the dependencies:
```bash
pnpm install
```
## Get Started
Start the dev server:
```bash
pnpm dev
```
Build the app for production:
```bash
pnpm config
```
Preview the production build locally:
```bash
pnpm preview
```
build test
```bash
pnpm run build:test
```
deploy test
```bash
pnpm run deploy:test
```
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "eppfax-h5",
"private": true,
"version": "1.0.0",
"scripts": {
"dev": "rsbuild dev --open --config rsbuild/build/build.dev.ts",
"test": "rsbuild dev --open --config rsbuild/build/build.test.ts",
"prod": "rsbuild dev --open --config rsbuild/build/build.prod.ts",
"build:test": "rsbuild build --config rsbuild/build/build.test.ts",
"build:dev": "rsbuild build --config rsbuild/build/build.dev.ts",
"build:prod": "rsbuild build --config rsbuild/build/build.prod.ts",
"deploy:test": "pnpm build:test && sh ./scripts/deploy.test.sh",
"build": "rsbuild build",
"preview": "rsbuild preview"
},
"dependencies": {
"@nutui/nutui-react": "^2.2.0",
"axios": "^1.6.2",
"lodash": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.20.0"
},
"devDependencies": {
"@rsbuild/core": "^0.1.2",
"@rsbuild/plugin-image-compress": "^0.1.4",
"@rsbuild/plugin-react": "^0.1.2",
"@types/lodash": "^4.14.202",
"@types/react": "^18",
"@types/react-dom": "^18",
"postcss-px-to-viewport": "^1.1.1",
"typescript": "^5.3.0"
}
}
lockfileVersion: '6.0'
dependencies:
'@nutui/nutui-react':
specifier: ^2.2.0
version: 2.2.0(react-dom@18.2.0)(react@18.2.0)
axios:
specifier: ^1.6.2
version: 1.6.2
lodash:
specifier: ^4.17.21
version: 4.17.21
react:
specifier: ^18.2.0
version: 18.2.0
react-dom:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
react-router-dom:
specifier: ^6.20.0
version: 6.20.0(react-dom@18.2.0)(react@18.2.0)
devDependencies:
'@rsbuild/core':
specifier: ^0.1.2
version: 0.1.2
'@rsbuild/plugin-image-compress':
specifier: ^0.1.4
version: 0.1.4
'@rsbuild/plugin-react':
specifier: ^0.1.2
version: 0.1.2(webpack@5.89.0)
'@types/lodash':
specifier: ^4.14.202
version: 4.14.202
'@types/react':
specifier: ^18
version: 18.0.0
'@types/react-dom':
specifier: ^18
version: 18.0.0
postcss-px-to-viewport:
specifier: ^1.1.1
version: 1.1.1
typescript:
specifier: ^5.3.0
version: 5.3.2
packages:
/@babel/runtime@7.23.4:
resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.0
dev: false
/@jridgewell/gen-mapping@0.3.3:
resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
engines: {node: '>=6.0.0'}
dependencies:
'@jridgewell/set-array': 1.1.2
'@jridgewell/sourcemap-codec': 1.4.15
'@jridgewell/trace-mapping': 0.3.20
dev: true
/@jridgewell/resolve-uri@3.1.1:
resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
engines: {node: '>=6.0.0'}
dev: true
/@jridgewell/set-array@1.1.2:
resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
engines: {node: '>=6.0.0'}
dev: true
/@jridgewell/source-map@0.3.5:
resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==}
dependencies:
'@jridgewell/gen-mapping': 0.3.3
'@jridgewell/trace-mapping': 0.3.20
dev: true
/@jridgewell/sourcemap-codec@1.4.15:
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
dev: true
/@jridgewell/trace-mapping@0.3.20:
resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
dependencies:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/@napi-rs/image-android-arm-eabi@1.7.0:
resolution: {integrity: sha512-lpyqxaIYUrdk096xoJjvPGin5jY1Ehor0RxryqDvowGUhVU3TDgolsjjuFPEki3cfvV6zzAm7bWUkmxIci2zaw==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-android-arm64@1.7.0:
resolution: {integrity: sha512-ojzi1ORsFZ53upLh0YVF1J8Qxvq+V2s6Xwbi4p4+ZLgk3MMd9ephERxxNExOf3/nyj4k+izEz6C/RbJwnSJXpw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-darwin-arm64@1.7.0:
resolution: {integrity: sha512-SadObhsP0E/og6FGDzwafWFEwePSkdEKmwh7ssWePopwN2PfTnIyQq4MfVE/iSLgHfiHgQwwwssY6j815P8YwA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-darwin-x64@1.7.0:
resolution: {integrity: sha512-lbUpy3deqxsbGMZRRwkSAMs4uWN+f8RER4BI7kwVK9rjUwvmnI+JMC+TCD03j+AMviANhsR/umDjSTS4HAbKdQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-freebsd-x64@1.7.0:
resolution: {integrity: sha512-DCFov4Ibk7pNUI30dBAR2SqtBSKTEtlsqkOJGWRiqGlTSqt7xPR3YcdM3N8JYN1lFHCN2SoJnInV3/p3yiKVLQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-linux-arm-gnueabihf@1.7.0:
resolution: {integrity: sha512-392foWTx3vIsBs5lNDZt0H0qn/x3PLR92GCbY1SWNtbE11+D47IDxHauLqcU/18IVule9nODFZ6KLLhuLjdqJA==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-linux-arm64-gnu@1.7.0:
resolution: {integrity: sha512-oYTCK6VsyywMPjcOJh5hk8vTA7i2coekXnkfHErBbyKm7v5F+3pdOXrhmKQHYojENHT/LkWWKlkr0jF8QB4U3w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-linux-arm64-musl@1.7.0:
resolution: {integrity: sha512-x3Z3YmhdMut2ULdXSjxAihp3rGcTvxUG5bhHMVc7bfezhGOViqfPJ5Qknra8egEZpXe6C0PKkBcIBm7hSlaubg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-linux-x64-gnu@1.7.0:
resolution: {integrity: sha512-5+FEzLr7yNGljdXXPyMJLJAQG8z9c1rawFTnT4dUidFjtpP/C4AP923eWDeo7B2Zz2psT7A8hgXhK+uAqyj4WQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-linux-x64-musl@1.7.0:
resolution: {integrity: sha512-LhzaYQ/z3axPUDPZefdyvgHz1qQ3NF2oDUHHFkVgpWNLJ3wGxa4GpM5TD+/jJCOChACAGYcZPpx96XLJGKNZfQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-win32-ia32-msvc@1.7.0:
resolution: {integrity: sha512-taCxMQTssuZW2hviOzJxo1iji0cAwjXY9m7CkiAAM8KftVUxAbmDGkPyEGRyt43ftYJ/rXRMz1vEEz/gxiZ5rQ==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image-win32-x64-msvc@1.7.0:
resolution: {integrity: sha512-hfnpTipEv6mrvhaNHRHBdYoVPUPyWnJ5KDpPAabJbTcsVb4x2TUiVI54r5GzF8zQ0RJc5mGtWdu9KFvyEBVJkg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@napi-rs/image@1.7.0:
resolution: {integrity: sha512-UI8bJKz4MwYsf2toiyxodbXeyHNe9yxhXz0KJdiDgliYs7ObCiu7DatPA899yuNscOApkweKV6yx2ag1lpVbbw==}
engines: {node: '>= 10'}
optionalDependencies:
'@napi-rs/image-android-arm-eabi': 1.7.0
'@napi-rs/image-android-arm64': 1.7.0
'@napi-rs/image-darwin-arm64': 1.7.0
'@napi-rs/image-darwin-x64': 1.7.0
'@napi-rs/image-freebsd-x64': 1.7.0
'@napi-rs/image-linux-arm-gnueabihf': 1.7.0
'@napi-rs/image-linux-arm64-gnu': 1.7.0
'@napi-rs/image-linux-arm64-musl': 1.7.0
'@napi-rs/image-linux-x64-gnu': 1.7.0
'@napi-rs/image-linux-x64-musl': 1.7.0
'@napi-rs/image-win32-ia32-msvc': 1.7.0
'@napi-rs/image-win32-x64-msvc': 1.7.0
dev: true
/@nutui/icons-react@0.0.4:
resolution: {integrity: sha512-QHqPCSV1s3Hxs++OvSlsu3UvpuWe/jkIbBuyhBUaTianuNqe/ahXS7/6Ub3HAySspbm6rZh/gy0u2NhZoULRtw==}
dev: false
/@nutui/nutui-react@2.2.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-SNLNQMJp6Etab/A+rZ006ZHwxYXOzs3eyR5DMVrt1sQ9+X3KMElz01ljJKaW85rPxyVuIsqq/Lj4rsSCrUOo+g==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@babel/runtime': 7.23.4
'@nutui/icons-react': 0.0.4
'@nutui/touch-emulator': 1.0.0
'@react-spring/web': 9.6.1(react-dom@18.2.0)(react@18.2.0)
'@use-gesture/react': 10.2.20(react@18.2.0)
async-validator: 4.2.5
classnames: 2.3.2
lodash.isequal: 4.5.0
lodash.kebabcase: 4.1.1
react: 18.2.0
react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0)
transitivePeerDependencies:
- react-dom
dev: false
/@nutui/touch-emulator@1.0.0:
resolution: {integrity: sha512-k2hvI/9LlRA7Ph1Chni27pTuvPmKPt+/I10sWWd2sWzqiCOYRerD79eIwCMRGUF/q6WVDEKVnv00t9CEUL4sPA==}
dev: false
/@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.14.0)(webpack@5.89.0):
resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==}
engines: {node: '>= 10.13'}
peerDependencies:
'@types/webpack': 4.x || 5.x
react-refresh: '>=0.10.0 <1.0.0'
sockjs-client: ^1.4.0
type-fest: '>=0.17.0 <4.0.0'
webpack: '>=4.43.0 <6.0.0'
webpack-dev-server: 3.x || 4.x
webpack-hot-middleware: 2.x
webpack-plugin-serve: 0.x || 1.x
peerDependenciesMeta:
'@types/webpack':
optional: true
sockjs-client:
optional: true
type-fest:
optional: true
webpack-dev-server:
optional: true
webpack-hot-middleware:
optional: true
webpack-plugin-serve:
optional: true
dependencies:
ansi-html-community: 0.0.8
common-path-prefix: 3.0.0
core-js-pure: 3.33.3
error-stack-parser: 2.1.4
find-up: 5.0.0
html-entities: 2.4.0
loader-utils: 2.0.4
react-refresh: 0.14.0
schema-utils: 3.3.0
source-map: 0.7.4
webpack: 5.89.0
dev: true
/@react-spring/animated@9.6.1(react@18.2.0):
resolution: {integrity: sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@react-spring/shared': 9.6.1(react@18.2.0)
'@react-spring/types': 9.6.1
react: 18.2.0
dev: false
/@react-spring/core@9.6.1(react@18.2.0):
resolution: {integrity: sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@react-spring/animated': 9.6.1(react@18.2.0)
'@react-spring/rafz': 9.6.1
'@react-spring/shared': 9.6.1(react@18.2.0)
'@react-spring/types': 9.6.1
react: 18.2.0
dev: false
/@react-spring/rafz@9.6.1:
resolution: {integrity: sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==}
dev: false
/@react-spring/shared@9.6.1(react@18.2.0):
resolution: {integrity: sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@react-spring/rafz': 9.6.1
'@react-spring/types': 9.6.1
react: 18.2.0
dev: false
/@react-spring/types@9.6.1:
resolution: {integrity: sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==}
dev: false
/@react-spring/web@9.6.1(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-X2zR6q2Z+FjsWfGAmAXlQaoUHbPmfuCaXpuM6TcwXPpLE1ZD4A1eys/wpXboFQmDkjnrlTmKvpVna1MjWpZ5Hw==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@react-spring/animated': 9.6.1(react@18.2.0)
'@react-spring/core': 9.6.1(react@18.2.0)
'@react-spring/shared': 9.6.1(react@18.2.0)
'@react-spring/types': 9.6.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/@remix-run/router@1.13.0:
resolution: {integrity: sha512-5dMOnVnefRsl4uRnAdoWjtVTdh8e6aZqgM4puy9nmEADH72ck+uXwzpJLEKE9Q6F8ZljNewLgmTfkxUrBdv4WA==}
engines: {node: '>=14.0.0'}
dev: false
/@rsbuild/core@0.1.2:
resolution: {integrity: sha512-+8ccsgtvgJsW5N7M2u+sOqqYk/5NwTiICD7mU+FnhBZA6FetJ3JBmB/jNx5xNS+pIKAVy5n/4kBHNin/G+vzkw==}
engines: {node: '>=14.0.0'}
hasBin: true
dependencies:
'@rsbuild/shared': 0.1.2
'@rspack/core': 0.4.0
core-js: 3.32.2
html-webpack-plugin: /html-rspack-plugin@5.5.7
postcss: 8.4.31
semver: 7.5.4
dev: true
/@rsbuild/plugin-image-compress@0.1.4:
resolution: {integrity: sha512-52/obVL7S/hVcEEYK5kc5YFHLLsxyY2cZBKyOaoMNxqVGXTr30yvnY00rELzKtSy8tRbr+4jvT1RQ3iDGqIPng==}
dependencies:
'@napi-rs/image': 1.7.0
'@rsbuild/shared': 0.1.4
svgo: 3.0.4
dev: true
/@rsbuild/plugin-react@0.1.2(webpack@5.89.0):
resolution: {integrity: sha512-Ros2RIQ3Zxm8FJpJRZJFYbzYSiReSIIS2clOgz0FQ1n9z8LJHiYkxEtt+wiDEkrCad6wb4Kinxeaj1vDE3DiaA==}
dependencies:
'@rsbuild/shared': 0.1.2
'@rspack/plugin-react-refresh': 0.4.0(react-refresh@0.14.0)(webpack@5.89.0)
react-refresh: 0.14.0
semver: 7.5.4
transitivePeerDependencies:
- '@types/webpack'
- sockjs-client
- type-fest
- webpack
- webpack-dev-server
- webpack-hot-middleware
- webpack-plugin-serve
dev: true
/@rsbuild/shared@0.1.2:
resolution: {integrity: sha512-ePs2+TKK7yTamWhU7EEjFHlomn+t7sCcOix9c6vYF5J2Q/GGHDimABGHvH0IQ5p6foWgjGPh7jIxRnqBEIBFFA==}
dependencies:
'@rspack/core': 0.4.0
caniuse-lite: 1.0.30001565
line-diff: 2.1.1
lodash: 4.17.21
postcss: 8.4.31
dev: true
/@rsbuild/shared@0.1.4:
resolution: {integrity: sha512-rqRxIg4S6nVl9eAPLT4biSVvK0gmVzjaz4uFK6sZCN0mzDLVapAHDsotFevbQ9nG6FTXPqIbSNt0GEzcH2i/kA==}
dependencies:
'@rspack/core': 0.4.0-canary-d45e3e0-20231128075052
caniuse-lite: 1.0.30001565
line-diff: 2.1.1
lodash: 4.17.21
postcss: 8.4.31
dev: true
/@rspack/binding-darwin-arm64@0.4.0:
resolution: {integrity: sha512-iQ6ERHXzY58zgHIZZAC7L7hrosO7BZXH3RpOTTibiZdTVex4Bq10CVmy6q6m88iQuqAQS2BHOXzAYLJtZlZRRw==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-darwin-arm64@0.4.0-canary-d45e3e0-20231128075052:
resolution: {integrity: sha512-53VBxIlJZ4gjWQZ5lkRuQk9tSba571WuGr8QgHpBNu/jNygXTh8m52kukQEw1aDml/BI6+22KjPvxkO9fMGk5g==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-darwin-x64@0.4.0:
resolution: {integrity: sha512-LRCiMPCbAIwwo0euqao7+8peUXj+qPDSi0nSK2y6wjaXfUVi8FwpWQ+O+B3RH3rpyFBU63IqatC8razalt8JgQ==}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-darwin-x64@0.4.0-canary-d45e3e0-20231128075052:
resolution: {integrity: sha512-jPA6v2rrn3cVFRbwN2FDuVwUYQbHOSy5l5q6F0rjvJmU+jmbMnDKuNTe32O4mTdo3na1F4KmX2QcWwmQmiiR/w==}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-linux-arm64-gnu@0.4.0:
resolution: {integrity: sha512-trfEUQ7awu6dLWUlIXmSJmwW48lSxEl7kW4FUas/UMNH3/B/wim8TPx6ZuDrCzVhYk5HP7ccjbQg7mnbJ+E48w==}
cpu: [arm64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-linux-arm64-musl@0.4.0:
resolution: {integrity: sha512-ubIcXmRopSJ6n+F/cRXDfGSgK847OX0CPeSSL4tiJ4dah5lz8iISZ9GLrNHJQ+SvphOH8F9lDpp8h2iwVt0Pbw==}
cpu: [arm64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-linux-x64-gnu@0.4.0:
resolution: {integrity: sha512-Q3mqjgV2k68F8VuzZwaqhHggBhcSlD0N+vvtFP8BxXIX4Pdkmk2shwwVjniZmY+oKB16dbSmXxShdMlCE3CCng==}
cpu: [x64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-linux-x64-gnu@0.4.0-canary-d45e3e0-20231128075052:
resolution: {integrity: sha512-sOSX7x+mAN+/tZpGSXopVDgepINLANdl2slU1aJkrD/ORfMTlsERU09wWrul814bMb8epAXajZWjuxiqxD+fTg==}
cpu: [x64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-linux-x64-musl@0.4.0:
resolution: {integrity: sha512-5l6Q00yZDIeT8T1ruxEfF1Wj3m3SqnSHrPFiUqYydmgmNll1iCCRC2AmGVsmAACDQ7rg9z8BhhHtKukNBvmwTQ==}
cpu: [x64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-win32-arm64-msvc@0.4.0:
resolution: {integrity: sha512-k96/PSkVT/VEvqHygenzgr8Z7n4SuCSKONVFB5zazWDPaJwCqaqANQuvX0PbuazVy6PbiLE/YI0+4TDjL7dHCw==}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-win32-ia32-msvc@0.4.0:
resolution: {integrity: sha512-DmC7MumePZuss1AigT4FaIbFPZFtZXdcWBhD7dF88CvsvQRVtOcMujtByWkkNJ6ZDp+IUHyXOtPQWr1iRjDOCQ==}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-win32-x64-msvc@0.4.0:
resolution: {integrity: sha512-F3pAxz1GakFkyq8S+iPTqVkvIFnHG9te36wLW+tIzY4oC0vNPsEVunBp6NrYHzTaOf3aBZ+bvsLZyfvg+pKxqA==}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@rspack/binding-win32-x64-msvc@0.4.0-canary-d45e3e0-20231128075052:
resolution: {integrity: sha512-ip1yuB/We1eW5MQkQ2LCLoMx2F59zTcoEoVB77H+8jM9f3BcTSZFXakWiXkCwAhnVLwLIRhyLPMFUBTVAZnzYA==}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@rspack/binding@0.4.0:
resolution: {integrity: sha512-SpjaySPGmyRnRHrQItl9W9NGE2WoHsUPnererZaLK+pfVgO92q9uoEoKl3EBNNI9uttG132SCz4cx1zXwN394w==}
optionalDependencies:
'@rspack/binding-darwin-arm64': 0.4.0
'@rspack/binding-darwin-x64': 0.4.0
'@rspack/binding-linux-arm64-gnu': 0.4.0
'@rspack/binding-linux-arm64-musl': 0.4.0
'@rspack/binding-linux-x64-gnu': 0.4.0
'@rspack/binding-linux-x64-musl': 0.4.0
'@rspack/binding-win32-arm64-msvc': 0.4.0
'@rspack/binding-win32-ia32-msvc': 0.4.0
'@rspack/binding-win32-x64-msvc': 0.4.0
dev: true
/@rspack/binding@0.4.0-canary-d45e3e0-20231128075052:
resolution: {integrity: sha512-RgjCSE/fZHoeUwfQjotBZNZyw9jThdt3tHYxxLLwIJy+jPT7scA0npKx7Lulr2ym7Co1WPFvcw/0r9/2pQy8rA==}
optionalDependencies:
'@rspack/binding-darwin-arm64': 0.4.0-canary-d45e3e0-20231128075052
'@rspack/binding-darwin-x64': 0.4.0-canary-d45e3e0-20231128075052
'@rspack/binding-linux-x64-gnu': 0.4.0-canary-d45e3e0-20231128075052
'@rspack/binding-win32-x64-msvc': 0.4.0-canary-d45e3e0-20231128075052
dev: true
/@rspack/core@0.4.0:
resolution: {integrity: sha512-GY8lsCGRzj1mj5q1Ss5kjazpSisT/HJdXpIU730pG4Os6mE2sGYVUJ0ncYRv/DEBcL1c2dVr5vtMKTHlNYRlfg==}
engines: {node: '>=16.0.0'}
dependencies:
'@rspack/binding': 0.4.0
'@swc/helpers': 0.5.1
browserslist: 4.22.1
compare-versions: 6.0.0-rc.1
enhanced-resolve: 5.12.0
fast-querystring: 1.1.2
graceful-fs: 4.2.10
json-parse-even-better-errors: 3.0.1
neo-async: 2.6.2
react-refresh: 0.14.0
tapable: 2.2.1
terminal-link: 2.1.1
watchpack: 2.4.0
webpack-sources: 3.2.3
zod: 3.22.4
zod-validation-error: 1.2.0(zod@3.22.4)
dev: true
/@rspack/core@0.4.0-canary-d45e3e0-20231128075052:
resolution: {integrity: sha512-lMVJyoziBavPpldTkAoNE2ItExIGgNFAZCBK0wmkLaDNfAZu5uQzi6dp0qs4RX/0NPpVjXbOfbfJQMwk/K6nxg==}
engines: {node: '>=16.0.0'}
dependencies:
'@rspack/binding': 0.4.0-canary-d45e3e0-20231128075052
'@swc/helpers': 0.5.1
browserslist: 4.22.1
compare-versions: 6.0.0-rc.1
enhanced-resolve: 5.12.0
fast-querystring: 1.1.2
graceful-fs: 4.2.10
json-parse-even-better-errors: 3.0.1
neo-async: 2.6.2
react-refresh: 0.14.0
tapable: 2.2.1
terminal-link: 2.1.1
watchpack: 2.4.0
webpack-sources: 3.2.3
zod: 3.22.4
zod-validation-error: 1.3.1(zod@3.22.4)
dev: true
/@rspack/plugin-react-refresh@0.4.0(react-refresh@0.14.0)(webpack@5.89.0):
resolution: {integrity: sha512-yo2FXVj6P2HrBGIxBqqRJQzAdG6CrL0WFE+kQk/Uz+7Ct09nPvl7zRdHE1BUXHnSXIjrMJj4fRmd7hXsmtTHXQ==}
peerDependencies:
react-refresh: '>=0.10.0 <1.0.0'
peerDependenciesMeta:
react-refresh:
optional: true
dependencies:
'@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.14.0)(webpack@5.89.0)
react-refresh: 0.14.0
transitivePeerDependencies:
- '@types/webpack'
- sockjs-client
- type-fest
- webpack
- webpack-dev-server
- webpack-hot-middleware
- webpack-plugin-serve
dev: true
/@swc/helpers@0.5.1:
resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==}
dependencies:
tslib: 2.6.2
dev: true
/@trysound/sax@0.2.0:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
dev: true
/@types/eslint-scope@3.7.7:
resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
dependencies:
'@types/eslint': 8.44.7
'@types/estree': 1.0.5
dev: true
/@types/eslint@8.44.7:
resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==}
dependencies:
'@types/estree': 1.0.5
'@types/json-schema': 7.0.15
dev: true
/@types/estree@1.0.5:
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
dev: true
/@types/json-schema@7.0.15:
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
dev: true
/@types/lodash@4.14.202:
resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==}
dev: true
/@types/node@20.10.0:
resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==}
dependencies:
undici-types: 5.26.5
dev: true
/@types/prop-types@15.7.11:
resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
dev: true
/@types/react-dom@18.0.0:
resolution: {integrity: sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg==}
dependencies:
'@types/react': 18.0.0
dev: true
/@types/react@18.0.0:
resolution: {integrity: sha512-7+K7zEQYu7NzOwQGLR91KwWXXDzmTFODRVizJyIALf6RfLv2GDpqpknX64pvRVILXCpXi7O/pua8NGk44dLvJw==}
dependencies:
'@types/prop-types': 15.7.11
'@types/scheduler': 0.16.8
csstype: 3.1.2
dev: true
/@types/scheduler@0.16.8:
resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
dev: true
/@use-gesture/core@10.2.20:
resolution: {integrity: sha512-4lFhHc8so4yIHkBEs641DnEsBxPyhJ5GEjB4PURFDH4p/FcZriH6w99knZgI63zN/MBFfylMyb8+PDuj6RIXKQ==}
dev: false
/@use-gesture/react@10.2.20(react@18.2.0):
resolution: {integrity: sha512-KnJq9ZSqprWA6uNhWTUHZqTCh+rfa0j8ehTzqeBhktUPrmTj7yVOBvEQ/vSFU/7d72cGgWSsJ0f5T6GQCHXnvg==}
peerDependencies:
react: '>= 16.8.0'
dependencies:
'@use-gesture/core': 10.2.20
react: 18.2.0
dev: false
/@webassemblyjs/ast@1.11.6:
resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==}
dependencies:
'@webassemblyjs/helper-numbers': 1.11.6
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
dev: true
/@webassemblyjs/floating-point-hex-parser@1.11.6:
resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
dev: true
/@webassemblyjs/helper-api-error@1.11.6:
resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
dev: true
/@webassemblyjs/helper-buffer@1.11.6:
resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==}
dev: true
/@webassemblyjs/helper-numbers@1.11.6:
resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
dependencies:
'@webassemblyjs/floating-point-hex-parser': 1.11.6
'@webassemblyjs/helper-api-error': 1.11.6
'@xtuc/long': 4.2.2
dev: true
/@webassemblyjs/helper-wasm-bytecode@1.11.6:
resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
dev: true
/@webassemblyjs/helper-wasm-section@1.11.6:
resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==}
dependencies:
'@webassemblyjs/ast': 1.11.6
'@webassemblyjs/helper-buffer': 1.11.6
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/wasm-gen': 1.11.6
dev: true
/@webassemblyjs/ieee754@1.11.6:
resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
dependencies:
'@xtuc/ieee754': 1.2.0
dev: true
/@webassemblyjs/leb128@1.11.6:
resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
dependencies:
'@xtuc/long': 4.2.2
dev: true
/@webassemblyjs/utf8@1.11.6:
resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
dev: true
/@webassemblyjs/wasm-edit@1.11.6:
resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==}
dependencies:
'@webassemblyjs/ast': 1.11.6
'@webassemblyjs/helper-buffer': 1.11.6
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/helper-wasm-section': 1.11.6
'@webassemblyjs/wasm-gen': 1.11.6
'@webassemblyjs/wasm-opt': 1.11.6
'@webassemblyjs/wasm-parser': 1.11.6
'@webassemblyjs/wast-printer': 1.11.6
dev: true
/@webassemblyjs/wasm-gen@1.11.6:
resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==}
dependencies:
'@webassemblyjs/ast': 1.11.6
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/ieee754': 1.11.6
'@webassemblyjs/leb128': 1.11.6
'@webassemblyjs/utf8': 1.11.6
dev: true
/@webassemblyjs/wasm-opt@1.11.6:
resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==}
dependencies:
'@webassemblyjs/ast': 1.11.6
'@webassemblyjs/helper-buffer': 1.11.6
'@webassemblyjs/wasm-gen': 1.11.6
'@webassemblyjs/wasm-parser': 1.11.6
dev: true
/@webassemblyjs/wasm-parser@1.11.6:
resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==}
dependencies:
'@webassemblyjs/ast': 1.11.6
'@webassemblyjs/helper-api-error': 1.11.6
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/ieee754': 1.11.6
'@webassemblyjs/leb128': 1.11.6
'@webassemblyjs/utf8': 1.11.6
dev: true
/@webassemblyjs/wast-printer@1.11.6:
resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==}
dependencies:
'@webassemblyjs/ast': 1.11.6
'@xtuc/long': 4.2.2
dev: true
/@xtuc/ieee754@1.2.0:
resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
dev: true
/@xtuc/long@4.2.2:
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
dev: true
/acorn-import-assertions@1.9.0(acorn@8.11.2):
resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
peerDependencies:
acorn: ^8
dependencies:
acorn: 8.11.2
dev: true
/acorn@8.11.2:
resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
/ajv-keywords@3.5.2(ajv@6.12.6):
resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
peerDependencies:
ajv: ^6.9.1
dependencies:
ajv: 6.12.6
dev: true
/ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
dependencies:
fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
dev: true
/ansi-escapes@4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
dependencies:
type-fest: 0.21.3
dev: true
/ansi-html-community@0.0.8:
resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
engines: {'0': node >= 0.8.0}
hasBin: true
dev: true
/async-validator@4.2.5:
resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
dev: false
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
/axios@1.6.2:
resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==}
dependencies:
follow-redirects: 1.15.3
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
dev: false
/big.js@5.2.2:
resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
dev: true
/boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
dev: true
/browserslist@4.22.1:
resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
caniuse-lite: 1.0.30001565
electron-to-chromium: 1.4.595
node-releases: 2.0.13
update-browserslist-db: 1.0.13(browserslist@4.22.1)
dev: true
/buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
dev: true
/caniuse-lite@1.0.30001565:
resolution: {integrity: sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==}
dev: true
/chrome-trace-event@1.0.3:
resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
engines: {node: '>=6.0'}
dev: true
/classnames@2.3.2:
resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
dev: false
/combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: false
/commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: true
/commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
dev: true
/common-path-prefix@3.0.0:
resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
dev: true
/compare-versions@6.0.0-rc.1:
resolution: {integrity: sha512-cFhkjbGY1jLFWIV7KegECbfuyYPxSGvgGkdkfM+ibboQDoPwg2FRHm5BSNTOApiauRBzJIQH7qvOJs2sW5ueKQ==}
dev: true
/core-js-pure@3.33.3:
resolution: {integrity: sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==}
requiresBuild: true
dev: true
/core-js@3.32.2:
resolution: {integrity: sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==}
requiresBuild: true
dev: true
/css-select@5.1.0:
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
dependencies:
boolbase: 1.0.0
css-what: 6.1.0
domhandler: 5.0.3
domutils: 3.1.0
nth-check: 2.1.1
dev: true
/css-tree@2.2.1:
resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
dependencies:
mdn-data: 2.0.28
source-map-js: 1.0.2
dev: true
/css-tree@2.3.1:
resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
dependencies:
mdn-data: 2.0.30
source-map-js: 1.0.2
dev: true
/css-what@6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
dev: true
/csso@5.0.5:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
dependencies:
css-tree: 2.2.1
dev: true
/csstype@3.1.2:
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: false
/dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
dependencies:
'@babel/runtime': 7.23.4
csstype: 3.1.2
dev: false
/dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
entities: 4.5.0
dev: true
/domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
dev: true
/domhandler@5.0.3:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
dependencies:
domelementtype: 2.3.0
dev: true
/domutils@3.1.0:
resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
dependencies:
dom-serializer: 2.0.0
domelementtype: 2.3.0
domhandler: 5.0.3
dev: true
/electron-to-chromium@1.4.595:
resolution: {integrity: sha512-+ozvXuamBhDOKvMNUQvecxfbyICmIAwS4GpLmR0bsiSBlGnLaOcs2Cj7J8XSbW+YEaN3Xl3ffgpm+srTUWFwFQ==}
dev: true
/emojis-list@3.0.0:
resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
engines: {node: '>= 4'}
dev: true
/enhanced-resolve@5.12.0:
resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==}
engines: {node: '>=10.13.0'}
dependencies:
graceful-fs: 4.2.10
tapable: 2.2.1
dev: true
/enhanced-resolve@5.15.0:
resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==}
engines: {node: '>=10.13.0'}
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
dev: true
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
dev: true
/error-stack-parser@2.1.4:
resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
dependencies:
stackframe: 1.3.4
dev: true
/es-module-lexer@1.4.1:
resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==}
dev: true
/escalade@3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
dev: true
/eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
dependencies:
esrecurse: 4.3.0
estraverse: 4.3.0
dev: true
/esrecurse@4.3.0:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
engines: {node: '>=4.0'}
dependencies:
estraverse: 5.3.0
dev: true
/estraverse@4.3.0:
resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
engines: {node: '>=4.0'}
dev: true
/estraverse@5.3.0:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
dev: true
/events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
dev: true
/fast-decode-uri-component@1.0.1:
resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
dev: true
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
dev: true
/fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
dev: true
/fast-querystring@1.1.2:
resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
dependencies:
fast-decode-uri-component: 1.0.1
dev: true
/find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
dev: true
/follow-redirects@1.15.3:
resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: false
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
dev: true
/graceful-fs@4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
dev: true
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
dev: true
/has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
dev: true
/html-entities@2.4.0:
resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==}
dev: true
/html-rspack-plugin@5.5.7:
resolution: {integrity: sha512-7dNAURj9XBHWoYg59F8VU6hT7J7w+od4Lr5hc/rrgN6sy6QfqVpoPqW9Qw4IGFOgit8Pul7iQp1yysBSIhOlsg==}
engines: {node: '>=10.13.0'}
dependencies:
lodash: 4.17.21
tapable: 2.2.1
dev: true
/jest-worker@27.5.1:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
dependencies:
'@types/node': 20.10.0
merge-stream: 2.0.0
supports-color: 8.1.1
dev: true
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
dev: false
/json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
dev: true
/json-parse-even-better-errors@3.0.1:
resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
dev: true
/json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
dev: true
/json5@2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'}
hasBin: true
dev: true
/levdist@1.0.0:
resolution: {integrity: sha512-YguwC2spb0pqpJM3a5OsBhih/GG2ZHoaSHnmBqhEI7997a36buhqcRTegEjozHxyxByIwLpZHZTVYMThq+Zd3g==}
dev: true
/line-diff@2.1.1:
resolution: {integrity: sha512-vswdynAI5AMPJacOo2o+JJ4caDJbnY2NEqms4MhMW0NJbjh3skP/brpVTAgBxrg55NRZ2Vtw88ef18hnagIpYQ==}
dependencies:
levdist: 1.0.0
dev: true
/loader-runner@4.3.0:
resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
engines: {node: '>=6.11.5'}
dev: true
/loader-utils@2.0.4:
resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
engines: {node: '>=8.9.0'}
dependencies:
big.js: 5.2.2
emojis-list: 3.0.0
json5: 2.2.3
dev: true
/locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
dependencies:
p-locate: 5.0.0
dev: true
/lodash.isequal@4.5.0:
resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
dev: false
/lodash.kebabcase@4.1.1:
resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
dev: false
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
/loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
dependencies:
js-tokens: 4.0.0
dev: false
/lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
dependencies:
yallist: 4.0.0
dev: true
/mdn-data@2.0.28:
resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
dev: true
/mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
dev: true
/merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
dev: true
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
/nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
dev: true
/neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
dev: true
/node-releases@2.0.13:
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
dev: true
/nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
dependencies:
boolbase: 1.0.0
dev: true
/object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
/p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
dependencies:
yocto-queue: 0.1.0
dev: true
/p-locate@5.0.0:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
dependencies:
p-limit: 3.1.0
dev: true
/path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
dev: true
/picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
dev: true
/postcss-px-to-viewport@1.1.1:
resolution: {integrity: sha512-2x9oGnBms+e0cYtBJOZdlwrFg/mLR4P1g2IFu7jYKvnqnH/HLhoKyareW2Q/x4sg0BgklHlP1qeWo2oCyPm8FQ==}
dependencies:
object-assign: 4.1.1
postcss: 8.4.31
dev: true
/postcss@8.4.31:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
dev: true
/prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
dev: false
/proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: false
/punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
dev: true
/randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
dependencies:
safe-buffer: 5.2.1
dev: true
/react-dom@18.2.0(react@18.2.0):
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
peerDependencies:
react: ^18.2.0
dependencies:
loose-envify: 1.4.0
react: 18.2.0
scheduler: 0.23.0
dev: false
/react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
dev: false
/react-refresh@0.14.0:
resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
engines: {node: '>=0.10.0'}
dev: true
/react-router-dom@6.20.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-CbcKjEyiSVpA6UtCHOIYLUYn/UJfwzp55va4yEfpk7JBN3GPqWfHrdLkAvNCcpXr8QoihcDMuk0dzWZxtlB/mQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
dependencies:
'@remix-run/router': 1.13.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-router: 6.20.0(react@18.2.0)
dev: false
/react-router@6.20.0(react@18.2.0):
resolution: {integrity: sha512-pVvzsSsgUxxtuNfTHC4IxjATs10UaAtvLGVSA1tbUE4GDaOSU1Esu2xF5nWLz7KPiMuW8BJWuPFdlGYJ7/rW0w==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
dependencies:
'@remix-run/router': 1.13.0
react: 18.2.0
dev: false
/react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
peerDependencies:
react: '>=16.6.0'
react-dom: '>=16.6.0'
dependencies:
'@babel/runtime': 7.23.4
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/react@18.2.0:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
dev: false
/regenerator-runtime@0.14.0:
resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
dev: false
/safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: true
/scheduler@0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies:
loose-envify: 1.4.0
dev: false
/schema-utils@3.3.0:
resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
engines: {node: '>= 10.13.0'}
dependencies:
'@types/json-schema': 7.0.15
ajv: 6.12.6
ajv-keywords: 3.5.2(ajv@6.12.6)
dev: true
/semver@7.5.4:
resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
engines: {node: '>=10'}
hasBin: true
dependencies:
lru-cache: 6.0.0
dev: true
/serialize-javascript@6.0.1:
resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==}
dependencies:
randombytes: 2.1.0
dev: true
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
dev: true
/source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
dev: true
/source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
dev: true
/source-map@0.7.4:
resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
engines: {node: '>= 8'}
dev: true
/stackframe@1.3.4:
resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
dev: true
/supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
dependencies:
has-flag: 4.0.0
dev: true
/supports-color@8.1.1:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
dependencies:
has-flag: 4.0.0
dev: true
/supports-hyperlinks@2.3.0:
resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
engines: {node: '>=8'}
dependencies:
has-flag: 4.0.0
supports-color: 7.2.0
dev: true
/svgo@3.0.4:
resolution: {integrity: sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g==}
engines: {node: '>=14.0.0'}
hasBin: true
dependencies:
'@trysound/sax': 0.2.0
commander: 7.2.0
css-select: 5.1.0
css-tree: 2.3.1
css-what: 6.1.0
csso: 5.0.5
picocolors: 1.0.0
dev: true
/tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
dev: true
/terminal-link@2.1.1:
resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
engines: {node: '>=8'}
dependencies:
ansi-escapes: 4.3.2
supports-hyperlinks: 2.3.0
dev: true
/terser-webpack-plugin@5.3.9(webpack@5.89.0):
resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==}
engines: {node: '>= 10.13.0'}
peerDependencies:
'@swc/core': '*'
esbuild: '*'
uglify-js: '*'
webpack: ^5.1.0
peerDependenciesMeta:
'@swc/core':
optional: true
esbuild:
optional: true
uglify-js:
optional: true
dependencies:
'@jridgewell/trace-mapping': 0.3.20
jest-worker: 27.5.1
schema-utils: 3.3.0
serialize-javascript: 6.0.1
terser: 5.24.0
webpack: 5.89.0
dev: true
/terser@5.24.0:
resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==}
engines: {node: '>=10'}
hasBin: true
dependencies:
'@jridgewell/source-map': 0.3.5
acorn: 8.11.2
commander: 2.20.3
source-map-support: 0.5.21
dev: true
/tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
dev: true
/type-fest@0.21.3:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
dev: true
/typescript@5.3.2:
resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==}
engines: {node: '>=14.17'}
hasBin: true
dev: true
/undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
dev: true
/update-browserslist-db@1.0.13(browserslist@4.22.1):
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
dependencies:
browserslist: 4.22.1
escalade: 3.1.1
picocolors: 1.0.0
dev: true
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
punycode: 2.3.1
dev: true
/watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}
dependencies:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.10
dev: true
/webpack-sources@3.2.3:
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
engines: {node: '>=10.13.0'}
dev: true
/webpack@5.89.0:
resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==}
engines: {node: '>=10.13.0'}
hasBin: true
peerDependencies:
webpack-cli: '*'
peerDependenciesMeta:
webpack-cli:
optional: true
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.5
'@webassemblyjs/ast': 1.11.6
'@webassemblyjs/wasm-edit': 1.11.6
'@webassemblyjs/wasm-parser': 1.11.6
acorn: 8.11.2
acorn-import-assertions: 1.9.0(acorn@8.11.2)
browserslist: 4.22.1
chrome-trace-event: 1.0.3
enhanced-resolve: 5.15.0
es-module-lexer: 1.4.1
eslint-scope: 5.1.1
events: 3.3.0
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
json-parse-even-better-errors: 2.3.1
loader-runner: 4.3.0
mime-types: 2.1.35
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
terser-webpack-plugin: 5.3.9(webpack@5.89.0)
watchpack: 2.4.0
webpack-sources: 3.2.3
transitivePeerDependencies:
- '@swc/core'
- esbuild
- uglify-js
dev: true
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
dev: true
/zod-validation-error@1.2.0(zod@3.22.4):
resolution: {integrity: sha512-laJkD/ugwEh8CpuH+xXv5L9Z+RLz3lH8alNxolfaHZJck611OJj97R4Rb+ZqA7WNly2kNtTo4QwjdjXw9scpiw==}
engines: {node: ^14.17 || >=16.0.0}
peerDependencies:
zod: ^3.18.0
dependencies:
zod: 3.22.4
dev: true
/zod-validation-error@1.3.1(zod@3.22.4):
resolution: {integrity: sha512-cNEXpla+tREtNdAnNKY4xKY1SGOn2yzyuZMu4O0RQylX9apRpUjNcPkEc3uHIAr5Ct7LenjZt6RzjEH6+JsqVQ==}
engines: {node: '>=16.0.0'}
peerDependencies:
zod: ^3.18.0
dependencies:
zod: 3.22.4
dev: true
/zod@3.22.4:
resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
dev: true
import { type RsbuildConfig as BaseRsbuildConfig } from '@rsbuild/shared';
import { pluginReact } from '@rsbuild/plugin-react';
import { pluginImageCompress } from '@rsbuild/plugin-image-compress';
import { CSS_MODULES_LOCAL_IDENT_NAME, HTML_TEMPLATE_CONFIG } from '../config'
import { postcssPxToViewportCreator } from '../plugins'
const buildBaseConfig: BaseRsbuildConfig = {
plugins: [pluginReact()],
output: {
enableCssModuleTSDeclaration: true,
cssModules: {
localIdentName: CSS_MODULES_LOCAL_IDENT_NAME
}
},
html: HTML_TEMPLATE_CONFIG,
tools: {
postcss: (opts) => {
console.log(postcssPxToViewportCreator());
opts.postcssOptions?.plugins?.push(postcssPxToViewportCreator())
},
},
performance: {
chunkSplit: {
strategy: 'split-by-experience'
}
},
server: {
port: 3000
}
}
export default buildBaseConfig
import {type RsbuildConfig as BaseRsbuildConfig} from '@rsbuild/shared';
import {defineConfig} from '@rsbuild/core';
import merge from 'lodash/merge';
import buildBaseConfig from "./build.base";
import {ENV_CONFIG, ENV_DEV} from "../config";
function defineConfigCreator(): BaseRsbuildConfig {
const devEnvConfig = ENV_CONFIG[ENV_DEV];
for (let prodEnvConfigKey in devEnvConfig) {
process.env[prodEnvConfigKey] = devEnvConfig[prodEnvConfigKey as keyof typeof devEnvConfig]
}
const devBuildConfig: BaseRsbuildConfig = {
source: {
define: {
'process.env.REACT_APP_ENV': JSON.stringify(ENV_DEV),
'process.env.REACT_APP_API_URL': JSON.stringify(devEnvConfig.REACT_APP_API_URL)
}},
tools: { bundlerChain(chain, { env }) { chain.devtool('eval'); } }
}
return defineConfig(merge({}, buildBaseConfig, devBuildConfig))
}
export default defineConfigCreator();
import {type RsbuildConfig as BaseRsbuildConfig} from '@rsbuild/shared';
import {defineConfig} from '@rsbuild/core';
import merge from 'lodash/merge';
import buildBaseConfig from "./build.base";
import {ENV_CONFIG, ENV_PROD} from "../config";
function defineConfigCreator(): BaseRsbuildConfig {
const prodEnvConfig = ENV_CONFIG[ENV_PROD];
for (let prodEnvConfigKey in prodEnvConfig) {
process.env[prodEnvConfigKey] = prodEnvConfig[prodEnvConfigKey as keyof typeof prodEnvConfig]
}
const prodBuildConfig: BaseRsbuildConfig = {
output: { disableSourceMap: true },
performance: {removeConsole: ['log', 'warn'],},
source: {
define: {
'process.env.REACT_APP_ENV': JSON.stringify(ENV_PROD),
'process.env.REACT_APP_API_URL': JSON.stringify(prodEnvConfig.REACT_APP_API_URL)
}},
}
return defineConfig(merge({}, buildBaseConfig, prodBuildConfig))
}
export default defineConfigCreator();
import {type RsbuildConfig as BaseRsbuildConfig} from '@rsbuild/shared';
import {defineConfig} from '@rsbuild/core';
import merge from 'lodash/merge';
import buildBaseConfig from "./build.base";
import {ENV_CONFIG, ENV_TEST} from "../config";
function defineConfigCreator(): BaseRsbuildConfig {
const testEnvConfig = ENV_CONFIG[ENV_TEST];
for (let prodEnvConfigKey in testEnvConfig) {
process.env[prodEnvConfigKey] = testEnvConfig[prodEnvConfigKey as keyof typeof testEnvConfig]
}
const testBuildConfig: BaseRsbuildConfig = {
source: {
define: {
'process.env.REACT_APP_ENV': JSON.stringify(ENV_TEST),
'process.env.REACT_APP_API_URL': JSON.stringify(testEnvConfig.REACT_APP_API_URL)
}}
}
return defineConfig(merge({}, buildBaseConfig, testBuildConfig))
}
export default defineConfigCreator();
/**
* 自定义 CSS Modules 生成的类名规则
*/
export const CSS_MODULES_LOCAL_IDENT_NAME = '[hash:base64:8]'
\ No newline at end of file
/**
* 环境变量:开发
*/
export const ENV_DEV = 'development'
/**
* 环境变量:测试
*/
export const ENV_TEST = 'test'
/**
* 环境变量:生产
*/
export const ENV_PROD = 'production'
/**
* 环境配置
*/
export const ENV_CONFIG = {
[ENV_DEV]: {
REACT_APP_ENV: ENV_DEV,
REACT_APP_ENV_ZH: '开发环境',
REACT_APP_API_URL: 'https://mall-test.eppfax.com/apjf-shopping-mall-api'
},
[ENV_TEST]: {
REACT_APP_ENV: ENV_TEST,
REACT_APP_ENV_ZH: '测试环境',
REACT_APP_API_URL: 'https://mall-test.eppfax.com/apjf-shopping-mall-api'
},
[ENV_PROD]: {
REACT_APP_ENV: ENV_PROD,
REACT_APP_ENV_ZH: '生产环境',
REACT_APP_API_URL: 'https://mall.eppfax.com/apjf-shopping-mall-api'
},
}
\ No newline at end of file
import { type RsbuildConfig as BaseRsbuildConfig } from '@rsbuild/shared';
type HtmlTemplateType = BaseRsbuildConfig['html']
export const HTML_TEMPLATE_CONFIG:HtmlTemplateType = {
title: 'test',
favicon: './static/favicon.ico',
tags: [
{ tag: 'meta', attrs: { charset: 'UTF-8'} },
{ tag: 'meta', attrs: { name: 'viewport', content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover'} },
{ tag: 'meta', attrs: { 'http-equiv': 'X-UA-Compatible', content: 'IE=edge,chrome=1'} },
{ tag: 'meta', attrs: { 'http-equiv': 'Expires', content: '0' }},
{ tag: 'meta', attrs: { 'http-equiv': 'Pragma', content: 'no-cache' }},
{ tag: 'meta', attrs: { 'http-equiv': 'Cache-control', content: 'no-cache' }},
{ tag: 'meta', attrs: { 'http-equiv': 'Cache', content: 'no-cache' }},
]
}
\ No newline at end of file
export * from './css-modules'
export * from './html-template'
export * from './env'
\ No newline at end of file
export * from './postcss-px-to-viewport'
\ No newline at end of file
/**
* 创建px2vw
*/
export const postcssPxToViewportCreator = function() {
const postcssPxToViewport = require('postcss-px-to-viewport')
return postcssPxToViewport({
unitToConvert: 'px', // 要转化的单位
viewportWidth: 375,
viewportUnit: 'vw', // 指定需要转换成的视窗单位,建议使用 rem
fontViewportUnit: 'vw', // 字体使用的视口单位
unitPrecision: 13, // 指定`px`转换为视窗单位值的小数后 x位数
propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
selectorBlackList: ['ignore'], // 指定不转换为视窗单位的类名,
minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
replace: true, // 是否转换后直接更换属性值
exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
landscape: false, // 是否处理横屏情况
})
}
\ No newline at end of file
scp -i ~/.ssh/id_rsa -r /Users/hometown/dh/eppfax-h5/dist/* root@123.56.20.201:/data/app_front_test/eppfax-h5
.testBox {
width: 200px;
height: 200px;
background-color: #fcc;
position: relative;
.testBoxText {
color: #000;
font-weight: bold;
font-size: 14px;
}
.testBoxImg {
width: 57px;
height: 20px;
position: absolute;
right: 0;
top: 0;
}
}
\ No newline at end of file
import styles from './App.module.scss'
import testImg from '@/assets/images/notGetStatus.png'
import {useNavigate} from "react-router-dom";
const App = () => {
const navigate = useNavigate()
function handleClick() {
navigate("/testdemo?id=1234", {
state: {
id: 1234567
}
})
}
return (
<div className="content">
<div className={styles.testBox}>
<span className={styles.testBoxText}>hello, 你好 {process.env.REACT_APP_ENV}</span>
<button onClick={handleClick}>点击跳转</button>
<img className={styles.testBoxImg} src={testImg} alt=""/>
</div>
</div>
);
};
export default App;
import axiosInstance from '@/utils/axios'
/**
* 获取登录地址
*/
export const getLoginUrl = async (): Promise<BackendResponse<any>> => {
const response = await axiosInstance.get<BackendResponse<LoginResponseData>>('/api/login/get_login_url');
return response.data
}
interface LoginRequestData {
code: string;
state: string;
amp: string;
}
interface LoginResponseData {
token: string;
}
/**
* 登录
* @returns Promise<LoginResponseData>
* @param requestData
*/
export const login = async (requestData: LoginRequestData): Promise<BackendResponse<LoginResponseData>> => {
const response = await axiosInstance.post<BackendResponse<LoginResponseData>>('/api/login/authorize', requestData);
return response.data;
}
interface QueryUserOrderResponse {
orderId: string;
lotteryOrderId: string;
}
export const queryUserOrder = async (): Promise<BackendResponse<QueryUserOrderResponse>> => {
const response = await axiosInstance.get<BackendResponse<QueryUserOrderResponse>>('/api/order/getUserOrder')
return response.data
}
/**
* 查询产品列表
*/
export const queryProductList = async (): Promise<BackendResponse<any>> => {
const response = await axiosInstance.get<BackendResponse<any>>('/api/product/query_list');
return response.data
}
/**
* 获取首页配置信息
*/
export const queryHomeConfig = async (): Promise<BackendResponse<any>> => {
const response = await axiosInstance.get<BackendResponse<any>>('/api/common/config/query_home_config');
return response.data
}
export interface QueryBranchListResponseData {
branchCode: string;
branchName: string;
showOrder: 1;
}
/**
* 获取网点列表
*/
export const queryBranchList = async (): Promise<BackendResponse<QueryBranchListResponseData[]>> => {
const response = await axiosInstance.get<BackendResponse<QueryBranchListResponseData[]>>('/api/branch/query_list');
return response.data
}
export interface CreateOrderRequestData {
branchName: string;
branchCode: string;
productCode: string;
number: number;
}
/**
* 创建订单
* @param requestData
*/
export const createOrder = async (requestData: CreateOrderRequestData): Promise<BackendResponse<string>> => {
const response = await axiosInstance.post<BackendResponse<string>>('/api/order/create_order', requestData);
return response.data
}
interface GetPayUrlRequestData {
orderId: string
}
/**
* 查询支付地址
* @param requestData
*/
export const queryPayUrl = async (requestData: GetPayUrlRequestData): Promise<BackendResponse<string>> => {
const response = await axiosInstance.post<BackendResponse<string>>('/api/pay', requestData);
return response.data
}
/**
* 查询支付配置
*/
export const queryPayConfig = async (): Promise<BackendResponse<any>> => {
const response = await axiosInstance.get<BackendResponse<any>>('/api/pay/pay_config');
return response.data
}
interface QueryOrderInfoResponseOrderDetail {
branchCode: string;
branchName: string;
mobile: string;
orderAmount: string;
payStatus: string;
payTime: string;
}
interface QueryOrderInfoResponseProductDetailInfo {
productCode: string;
productName: string;
}
export interface QueryOrderInfoResponse {
orderDetail: QueryOrderInfoResponseOrderDetail;
productDetailInfo: QueryOrderInfoResponseProductDetailInfo
}
/**
* 查询订单详情
* @param orderId
*/
export const queryOrderInfo = async (orderId: string):Promise<BackendResponse<any>> => {
const response = await axiosInstance.get<BackendResponse<any>>(`/api/order/detail/${orderId}`)
return response.data
}
\ No newline at end of file
import * as common from './common'
export default {
common
}
\ No newline at end of file
/// <reference types="@rsbuild/core/types" />
interface Window {
AlipayJSBridge: Record<string, any>
}
\ No newline at end of file
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import Home from "@/pages/Home";
import Lottery from "@/pages/Lottery";
import OrderDetail from "@/pages/OrderDetail";
import './styles/reset.css';
import './styles/nut-var.css';
import '@nutui/nutui-react/dist/style.css'
const root = ReactDOM.createRoot(document.getElementById('root')!);
root.render(
<React.StrictMode>
<BrowserRouter>
<Routes>
<Route path = '/' element={<Home />}></Route>
<Route path = '/lottery' element={<Lottery />}></Route>
<Route path = '/orderDetail' element={<OrderDetail />}></Route>
</Routes>
</BrowserRouter>
</React.StrictMode>,
);
import React from "react";
import styles from "@/pages/Home/index.module.scss";
import homeTopBannerImg from "@/assets/images/homeTopBanner.png";
import homeBotBannerImg from "@/assets/images/homeBotBanner.png";
const HomeBg: React.FC = () => {
return (
<div className={styles.bgWrap}>
<img className={styles.topBannerImg} src={homeTopBannerImg} alt=""/>
<img className={styles.botBannerImg} src={homeBotBannerImg} alt=""/>
</div>
)
}
export default HomeBg
\ No newline at end of file
import React, {useEffect, useState} from "react";
import homeProductBanner1Img from "@/assets/images/homeProductBanner1.png";
import homeProductBanner2Img from "@/assets/images/homeProductBanner2.png";
import styles from "@/pages/Home/index.module.scss";
import HomeProductItem from "@/pages/Home/components/HomeProductItem";
import { Overlay, Popup, Toast } from "@nutui/nutui-react";
import homeRulesOverlayCloseImg from "@/assets/images/homeRulesOverlayClose.png";
import HomeRuleContent from "@/pages/Home/components/HomeRuleContent";
import apis from "@/apis";
import {type QueryBranchListResponseData} from '@/apis/common'
import OrderHelper from "@/pages/Home/helper/order";
const HomeContent: React.FC = () => {
const [productList] = useState([
{ bannerImg: homeProductBanner1Img, title: '厅堂实物 1元购', buttonTextColor: '#F41E71', productCode: '4'},
{ bannerImg: homeProductBanner2Img, title: '微信立减金等你来拿', buttonTextColor: '#1FA189', productCode: '5'},
])
const [branchList, setBranchList] = useState<QueryBranchListResponseData[]>([])
const [rulesOverlayVisible, setRulesOverlayVisible] = useState(false)
const [showBranchListPopup, setShowBranchListPopup] = useState(false)
const [activeBranchIdx, setActiveBranchIdx] = useState(-1)
const [activeProductIdx, setActiveProductIdx] = useState(-1)
const [toasted, setToasted] = useState(false)
function handleClickProduct(idx: number) {
if(toasted) {
setActiveProductIdx(idx)
setShowBranchListPopup(true)
} else {
Toast.show('请在网点工作人员指导下购买,每人仅有一次活动参与机会');
setToasted(true)
}
}
function handleConfirm() {
OrderHelper.submitOrder({
branchName: branchList[activeBranchIdx].branchName,
branchCode: branchList[activeBranchIdx].branchCode,
productCode: productList[activeProductIdx].productCode,
number: 1
})
}
useEffect(() => {
apis.common.queryBranchList().then(res => {
if(res.ok) {
setBranchList(res.data)
}
})
}, [])
return (
<div className={styles.contentWrap}>
{productList.map((item, index) => {
return (
<HomeProductItem
bannerImg={item.bannerImg}
title={item.title}
buttonTextColor={item.buttonTextColor}
key={index}
idx={index}
onButtonClick={handleClickProduct}
/>
)
})}
<div className={styles.productTips}>活动最终解释权归本行所有</div>
{/*网点列表*/}
<Popup
visible={ showBranchListPopup }
position="bottom"
round
onClose={ () => { setShowBranchListPopup(false) }
}>
<div className={styles.branchListPopupWrap}>
<div className={styles.branchListPopupHeader}>
<div className={styles.branchListPopupHeaderCancel} onClick={() => {
setShowBranchListPopup(false);
setActiveBranchIdx(-1);
}}>取消</div>
<div className={styles.branchListPopupHeaderTitle}>选择营业网点</div>
<div className={styles.branchListPopupHeaderConfirm} onClick={handleConfirm}>确定</div>
</div>
<div className={styles.branchListPopupContent}>
{ branchList.map((item, index) => {
return (
<div
className={styles.branchListItem}
onClick={() => setActiveBranchIdx(index)}
key={item.branchCode}
style={{
color: activeBranchIdx === index ? '#e64545' : '',
background: activeBranchIdx === index ? '#f7f7f7' : ''
}}
>
{item.branchName}
</div>
)
}) }
</div>
</div>
</Popup>
{/*网点列表*/}
{/*活动规则*/}
<div className={styles.contentRulesButton} onClick={() => setRulesOverlayVisible(true)}>活动规则</div>
<Overlay
visible={rulesOverlayVisible}
closeOnOverlayClick={false}
onClick={() => setRulesOverlayVisible(false)}
>
<div className={styles.rulesOverlayWrap}>
<div className={styles.rulesOverlayContent}>
<img className={styles.rulesOverlayCloseImg} src={homeRulesOverlayCloseImg} onClick={() => setRulesOverlayVisible(false)} alt=""/>
<HomeRuleContent />
</div>
</div>
</Overlay>
{/*活动规则*/}
</div>
)
}
export default HomeContent
\ No newline at end of file
import React from "react";
import styles from "@/pages/Home/index.module.scss";
interface HomeProductItemProps {
/**
* 背景图
*/
bannerImg: string;
/**
* 标题
*/
title: string;
/**
* 按钮文字
*/
buttonText?: string;
/**
* 按钮文字颜色
*/
buttonTextColor: string;
/**
* 点击
*/
onButtonClick: (idx: number) => void
/**
* 索引
*/
idx: number
}
const HomeProductItem: React.FC<HomeProductItemProps> = (props) => {
const buttonStyle = { color: props.buttonTextColor }
return (
<div className={styles.productItem}>
<img className={styles.productItemBg} src={props.bannerImg} alt={props.title}/>
<h3 className={styles.productItemTitle}>{ props.title }</h3>
<div className={styles.productItemButton} style={buttonStyle} onClick={() => props.onButtonClick(props.idx)}>{ props.buttonText || '立即购买' }</div>
</div>
)
}
export default HomeProductItem
\ No newline at end of file
import React from "react";
import styles from "@/pages/Home/index.module.scss";
const HomeRuleContent: React.FC = () => {
return (
<div className={styles.rulesOverlayContentInner}>
<h2>活动规则</h2>
<h3>闸北支行一元购,新年钜惠等你来拿</h3>
<h4>活动时间:</h4>
<p>2023年1月9日~2023年4月30日</p>
<h4>活动对象:</h4>
<p>掌银新客户,信用卡新客户,财富贵宾客户</p>
<h4>活动规则:</h4>
<p>
1.打开掌银,扫描网点厅堂二维码进入活动页面,在网点工作人员的指导下购买新客礼,每人在活动期限内限参与1次活动。
<br />
2.同一证件号、同一手机号、同一设备均视为同一客户。
<br />
3.成功支付后请出示订单详情页,于网点大堂当场核销礼品。
<br />
4.凡参加本次活动者,即视为同意接受本次活动相关规则,活动期间用户不得使用不正当手段破坏活动规则、违背活动公平原则,否则有权取消活动参与资格。
</p>
</div>
)
}
export default HomeRuleContent
\ No newline at end of file
import apis from "@/apis";
import {type CreateOrderRequestData, queryUserOrder} from '@/apis/common'
import SessionStorageUtil from "@/utils/session";
import { type NavigateFunction } from "react-router-dom";
class OrderHelper {
/**
* 提交订单:
* 1. 创建订单
* 2. 查询支付地址
* 3. 查询支付配置
* 4. 唤起app支付
* @param params CreateOrderRequestData
*/
static async submitOrder(params: CreateOrderRequestData) {
const createOrderRes = await apis.common.createOrder(params)
const queryPayUrlRes = await apis.common.queryPayUrl({orderId: createOrderRes.data})
const tokenId = queryPayUrlRes.data.split('=')[1]
const queryPayConfigRes = await apis.common.queryPayConfig()
const data = queryPayConfigRes.data
data.param.tokenId = tokenId
window.AlipayJSBridge.call("startApp", data, function (result: string) {
console.log(result, "支付结果");
});
}
/**
* 获取用户的订单
*/
static async queryUserOrder(navigate: NavigateFunction) {
const res = await apis.common.queryUserOrder()
if(res.ok) {
if(res.data?.lotteryOrderId) {
navigate(`/lottery?lotteryOrderId=${res.data.lotteryOrderId}`, {
replace: true
})
}
if(res.data?.orderId) {
navigate(`/orderDetail?orderId=${res.data.orderId}`, {
replace: true
})
}
}
}
}
export default OrderHelper
\ No newline at end of file
.wrap {
width: 100%;
height: 100%;
overflow: hidden;
position: relative;
.bgWrap {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
.topBannerImg {
width: 100%;
height: 497px;
}
.botBannerImg {
width: 100%;
height: 154px;
}
}
.contentWrap {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 2;
box-sizing: border-box;
padding: 0 16px;
display: flex;
flex-direction: column;
justify-content: flex-end;
.contentRulesButton {
position: absolute;
right: 0;
top: 20px;
z-index: 2;
width: 66px;
height: 24px;
background: rgba(7,103,90,0.6);
border-radius: 20px 0 0 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
color: #FFFFFF;
}
.productItem {
width: 343px;
height: 120px;
margin-bottom: 16px;
position: relative;
box-sizing: border-box;
padding: 25px 24px;
.productItemBg {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
}
.productItemTitle {
font-size: 20px;
color: #FFFFFF;
line-height: 26px;
position: relative;
z-index: 2;
}
.productItemButton {
width: 100px;
height: 32px;
background: #FFFFFF;
border-radius: 16px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-weight: 500;
color: #F41E71;
line-height: 16px;
position: relative;
z-index: 3;
margin-top: 12px;
}
}
.productTips {
width: 100%;
text-align: center;
font-size: 12px;
color: #666666;
line-height: 14px;
letter-spacing: 2px;
margin-bottom: 18px;
}
}
}
.rulesOverlayWrap {
display: flex;
width: 100%;
height: 100%;
align-items: center;
justify-content: center;
.rulesOverlayContent {
width: 280px;
height: 400px;
border-radius: 10px;
background-color: #fff;
position: relative;
.rulesOverlayCloseImg {
width: 22px;
height: 22px;
position: absolute;
right: 10px;
top: -30px;
}
.rulesOverlayContentInner {
width: 100%;
height: 100%;
overflow-y: scroll;
overflow-x: hidden;
box-sizing: border-box;
padding: 20px 24px;
h2 {
width: 100%;
font-size: 16px;
font-weight: 500;
color: #333333;
display: flex;
justify-content: center;
/* padding-top: 20px; */
padding-bottom: 16px;
}
h3 {
font-size: 14px;
font-weight: 500;
color: #333333;
line-height: 20px;
margin: 0;
margin-bottom: 12px;
}
h4 {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
line-height: 20px;
margin: 0;
}
p {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
color: #666;
line-height: 20px;
margin-bottom: 12px;
}
}
}
}
.branchListPopupWrap {
.branchListPopupHeader {
display: flex;
width: 100%;
height: 60px;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 0 16px;
border-bottom: 1px solid #e5e5e5;
.branchListPopupHeaderCancel {
font-size: 16px;
font-weight: 400;
color: #999999;
line-height: 22px;
}
.branchListPopupHeaderTitle {
font-size: 16px;
font-weight: 500;
color: #333333;
line-height: 22px;
}
.branchListPopupHeaderConfirm {
font-size: 16px;
font-weight: 500;
color: #e64545;
line-height: 22px;
}
}
.branchListPopupContent {
box-sizing: border-box;
padding: 10px 16px;
background-color: #fff;
.branchListItem {
width: 100%;
height: 40px;
background-color: #fff;
font-size: 15px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
line-height: 22px;
display: flex;
align-items: center;
box-sizing: border-box;
padding-left: 16px;
}
}
}
\ No newline at end of file
import React, {useEffect, useState} from "react";
import styles from './index.module.scss'
import {useNavigate, useSearchParams} from "react-router-dom";
import HomeBg from "@/pages/Home/components/HomeBg";
import HomeContent from "@/pages/Home/components/HomeContent";
import AuthUtil from "@/utils/auth";
import OrderHelper from "@/pages/Home/helper/order";
const Home: React.FC = () => {
const [params] = useSearchParams()
const navigate = useNavigate()
const [isAuthed, setIsAuthed] = useState(false)
useEffect( () => {
AuthUtil.auth(params)
.then(res => {
OrderHelper.queryUserOrder(navigate).then(_ => {
setIsAuthed(res)
})
})
}, []);
return (
<div className={styles.wrap}>
{ isAuthed && <HomeBg /> }
{ isAuthed && <HomeContent /> }
</div>
)
}
export default Home
\ No newline at end of file
import React from "react";
const Lottery: React.FC = () => {
return (
<div>抽奖页</div>
)
}
export default Lottery
\ No newline at end of file
.wrap {
width: 100%;
height: 100%;
background: #F7F7F7;
box-sizing: border-box;
padding: 10px 16px;
.contentWrap {
width: 100%;
box-sizing: border-box;
padding: 20px 16px;
background: #FFFFFF;
border-radius: 10px;
margin-bottom: 10px;
.contentTitle {
font-size: 15px;
font-weight: 500;
color: #333333;
line-height: 22px;
margin-bottom: 13px;
}
.contentItem {
display: flex;
align-items: center;
margin-bottom: 18px;
&:last-child {
margin-bottom: 0;
}
.contentItemLabel {
font-size: 14px;
font-weight: 400;
color: #999999;
line-height: 20px;
}
.contentItemValue {
font-size: 15px;
font-weight: 500;
color: #222222;
line-height: 22px;
}
.contentItemAmount {
font-size: 12px;
font-weight: 500;
color: #E64545;
line-height: 22px;
> span {
font-size: 16px;
}
}
}
}
}
\ No newline at end of file
import React, {useEffect, useState} from "react";
import {useSearchParams} from "react-router-dom";
import apis from "@/apis";
import { type QueryOrderInfoResponse } from '@/apis/common'
import styles from './index.module.scss'
import { Divider, Skeleton } from '@nutui/nutui-react';
const OrderDetail: React.FC = () => {
const [params] = useSearchParams()
const [orderInfo, setOrderInfo] = useState<QueryOrderInfoResponse>()
const [checked, setChecked] = useState(false)
useEffect(() => {
console.log(params.get('orderId'))
apis.common.queryOrderInfo(params.get('orderId') || '').then(res => {
console.log(res.data)
if(res.ok) {
setOrderInfo(res.data)
setChecked(true)
}
})
}, [])
return (
<div className={styles.wrap}>
<div className={styles.contentWrap}>
<Skeleton rows={2} title animated visible={checked}>
<div className={styles.contentTitle}>商品详情</div>
<div className={styles.contentItem}>
<span className={styles.contentItemLabel}>商品名称:</span>
<span className={styles.contentItemValue}>{orderInfo?.productDetailInfo.productName}</span>
</div>
<div className={styles.contentItem}>
<span className={styles.contentItemLabel}>支付金额:</span>
<span className={styles.contentItemAmount}><span>{orderInfo?.orderDetail.orderAmount}</span></span>
</div>
</Skeleton>
</div>
<div className={styles.contentWrap}>
<Skeleton rows={4} title animated visible={checked}>
<div className={styles.contentTitle}>订单详情</div>
<div className={styles.contentItem}>
<span className={styles.contentItemLabel}>机构编码:</span>
<span className={styles.contentItemValue}>{orderInfo?.orderDetail.branchCode}</span>
</div>
<div className={styles.contentItem}>
<span className={styles.contentItemLabel}>所属网点:</span>
<span className={styles.contentItemValue}>{orderInfo?.orderDetail.branchName}</span>
</div>
<Divider />
<div className={styles.contentItem}>
<span className={styles.contentItemLabel}>支付时间:</span>
<span className={styles.contentItemValue}>{orderInfo?.orderDetail.payTime}</span>
</div>
<div className={styles.contentItem}>
<span className={styles.contentItemLabel}>下单账号:</span>
<span className={styles.contentItemValue}>{orderInfo?.orderDetail.mobile}</span>
</div>
</Skeleton>
</div>
</div>
)
}
export default OrderDetail
\ No newline at end of file
:root {
--nutui-toast-inner-padding: 8px 12px;
--nutui-toast-inner-border-radius: 8px;
--nutui-divider-border-color: rgba(229, 229, 229, .5);
}
\ No newline at end of file
/* CSS Reset for HTML5 Applications */
html, body, #root {
width: 100%;
height: 100%;
overflow: hidden;
}
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
interface BackendResponse<T> {
code: number;
msg: string;
ok: boolean;
data: T;
}
\ No newline at end of file
import { type NavigateFunction} from "react-router-dom";
import apis from '@/apis'
import SessionStorageUtil from "@/utils/session";
class AuthUtil {
static auth(params: URLSearchParams): Promise<boolean> {
return new Promise((resolve, reject) => {
if(process.env.REACT_APP_ENV === 'development') {
SessionStorageUtil.setItem('__TOKEN__', '6d29e9d470e24cf9af48bd5881b97f80')
resolve(true)
} else {
const token = SessionStorageUtil.getItem('__TOKEN__')
if(!token) {
if(!params.get('code')) {
apis.common.getLoginUrl().then(res => {
if(res.ok) {
window.location.replace(res.data)
}
})
} else {
apis.common.login({
code: params.get('code') || '',
state: params.get('state') || '',
amp: params.get('amp') || '',
}).then(res => {
if(res.ok) {
SessionStorageUtil.setItem('__TOKEN__', res.data.token)
}
resolve(true)
})
}
} else {
resolve(true)
}
}
})
}
}
export default AuthUtil
\ No newline at end of file
import axios, { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from "axios";
import SessionStorageUtil from "@/utils/session";
import { Toast } from "@nutui/nutui-react";
const axiosInstance: AxiosInstance = axios.create({
baseURL: process.env.REACT_APP_API_URL,
timeout: 30000,
})
axiosInstance.interceptors.request.use(
(config: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {
config.headers.token = SessionStorageUtil.getItem('__TOKEN__');
return config;
},
(error) => {
return Promise.reject(error);
}
);
axiosInstance.interceptors.response.use(
(response: AxiosResponse ): AxiosResponse => {
// 处理登录失效
if(response.data.code === 9999) {
Toast.show('登录失效')
setTimeout(() => {
SessionStorageUtil.clear()
window.location.replace('/')
}, 2000)
}
return response;
},
(error) => {
return Promise.reject(error);
}
);
export default axiosInstance;
\ No newline at end of file
class SessionStorageUtil {
/**
* 存储数据到sessionStorage
* @param key 键名
* @param value 值,将被自动转换为字符串
*/
static setItem(key: string, value: any): void {
const stringValue = JSON.stringify(value);
sessionStorage.setItem(key, stringValue);
}
/**
* 从sessionStorage获取数据
* @param key 键名
* @returns 返回解析后的值,如果不存在则返回null
*/
static getItem<T>(key: string): T | null {
const item = sessionStorage.getItem(key);
if (item === null) {
return null;
}
try {
return JSON.parse(item) as T;
} catch (e) {
console.error("Error parsing sessionStorage item", e);
return null;
}
}
/**
* 从sessionStorage中删除特定数据
* @param key 键名
*/
static removeItem(key: string): void {
sessionStorage.removeItem(key);
}
/**
* 更新sessionStorage中的数据
* @param key 键名
* @param value 新的值,将被自动转换为字符串
*/
static updateItem(key: string, value: any): void {
this.setItem(key, value);
}
/**
* 清除所有sessionStorage数据
*/
static clear(): void {
sessionStorage.clear();
}
}
export default SessionStorageUtil
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"
/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta name="HandheldFriendly" content="true" />
<meta name="MobileOptimized" content="320" />
<meta name="msapplication-tap-highlight" content="no" />
<meta name="apple-mobile-web-app-title" content="标题" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="format-detection" content="telephone=yes" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-control" content="no-cache" />
<meta http-equiv="Cache" content="no-cache" />
<title><%= appName %></title>
</head>
<body>
<div id="<%= mountId %>"></div>
</body>
</html>
\ No newline at end of file
{
"compilerOptions": {
"target": "ES2020",
"lib": ["DOM", "ES2020"],
"module": "ESNext",
"jsx": "react-jsx",
"strict": true,
"skipLibCheck": true,
"isolatedModules": true,
"resolveJsonModule": true,
"moduleResolution": "bundler",
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src"]
}
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