diff --git a/package.json b/package.json
index df604ca..ea097e8 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
"react-redux": "^8.0.5"
},
"devDependencies": {
+ "@rollup/plugin-replace": "^5.0.2",
"@types/node": "^20.1.1",
"@types/react": "^18.0.28",
"@types/react-dom": "^18.0.11",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 85b639b..2286bb6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -39,6 +39,9 @@ dependencies:
version: 8.0.5(@types/react-dom@18.0.11)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1)
devDependencies:
+ '@rollup/plugin-replace':
+ specifier: ^5.0.2
+ version: 5.0.2
'@types/node':
specifier: ^20.1.1
version: 20.1.1
@@ -1865,6 +1868,19 @@ packages:
reselect: 4.1.8
dev: false
+ /@rollup/plugin-replace@5.0.2:
+ resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ dependencies:
+ '@rollup/pluginutils': 5.0.2
+ magic-string: 0.27.0
+ dev: true
+
/@rollup/plugin-virtual@3.0.1:
resolution: {integrity: sha512-fK8O0IL5+q+GrsMLuACVNk2x21g3yaw+sG2qn16SnUd3IlBsQyvWxLMGHmCmXRMecPjGRSZ/1LmZB4rjQm68og==}
engines: {node: '>=14.0.0'}
@@ -1875,6 +1891,20 @@ packages:
optional: true
dev: true
+ /@rollup/pluginutils@5.0.2:
+ resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ dependencies:
+ '@types/estree': 1.0.1
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ dev: true
+
/@swc/core-darwin-arm64@1.3.57:
resolution: {integrity: sha512-lhAK9kF/ppZdNTdaxJl2gE0bXubzQXTgxB2Xojme/1sbOipaLTskBbJ3FLySChpmVOzD0QSCTiW8w/dmQxqNIQ==}
engines: {node: '>=10'}
@@ -1987,6 +2017,10 @@ packages:
'@swc/core-win32-x64-msvc': 1.3.57
dev: true
+ /@types/estree@1.0.1:
+ resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
+ dev: true
+
/@types/hoist-non-react-statics@3.3.1:
resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==}
dependencies:
@@ -2599,6 +2633,10 @@ packages:
engines: {node: '>=4.0'}
dev: true
+ /estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ dev: true
+
/esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
@@ -2966,6 +3004,13 @@ packages:
yallist: 4.0.0
dev: true
+ /magic-string@0.27.0:
+ resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
/merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
diff --git a/src/Footer.tsx b/src/Footer.tsx
index 1a8e915..a8c121e 100644
--- a/src/Footer.tsx
+++ b/src/Footer.tsx
@@ -1,4 +1,4 @@
-import { Center, Link, Text } from '@chakra-ui/react';
+import { Center, Flex, Link, Text } from '@chakra-ui/react';
import { Suspense } from 'react';
import { SDKVersion } from './SDKVersion';
@@ -17,13 +17,13 @@ export function Footer() {
left="0"
flexDir="column"
>
-
- {'音乐解锁 (x.x.x) '}
+
+ {'音乐解锁 (__APP_VERSION_SHORT__'}
- {' - 移除已购音乐的加密保护。'}
-
+ {') - 移除已购音乐的加密保护。'}
+
{'Copyright © 2019 - 2023 '}
diff --git a/src/SDKVersion.tsx b/src/SDKVersion.tsx
index 735d3fb..397d1a4 100644
--- a/src/SDKVersion.tsx
+++ b/src/SDKVersion.tsx
@@ -1,20 +1,32 @@
import { InfoOutlineIcon } from '@chakra-ui/icons';
-import { Tooltip } from '@chakra-ui/react';
+import { Tooltip, VStack, Text, Box, Flex } from '@chakra-ui/react';
import { workerClientBus } from './decrypt-worker/client';
import { DECRYPTION_WORKER_ACTION_NAME } from './decrypt-worker/constants';
import usePromise from 'react-promise-suspense';
const getSDKVersion = async () => {
- const version = workerClientBus.request(DECRYPTION_WORKER_ACTION_NAME.VERSION, null);
- return `SDK: ${version}`;
+ return workerClientBus.request(DECRYPTION_WORKER_ACTION_NAME.VERSION, null);
};
export function SDKVersion() {
const sdkVersion = usePromise(getSDKVersion, []);
return (
-
-
-
+
+
+ App: __APP_VERSION__
+ SDK: {sdkVersion}
+
+ }
+ bg="gray.300"
+ color="black"
+ >
+
+
+
);
}
diff --git a/vite.config.ts b/vite.config.ts
index 922f8c7..c31430f 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,9 +1,25 @@
-import path from 'path';
+import cp from 'node:child_process';
+import url from 'node:url';
+import path from 'node:path';
+import fs from 'node:fs';
+
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import wasm from 'vite-plugin-wasm';
+import replace from '@rollup/plugin-replace';
import topLevelAwait from 'vite-plugin-top-level-await';
+const gitRoot = url.fileURLToPath(new URL('.', import.meta.url));
+const pkg = JSON.parse(fs.readFileSync(gitRoot + '/package.json', 'utf-8'));
+
+function command(cmd, dir = '') {
+ return cp.execSync(cmd, { cwd: path.join(gitRoot, dir), encoding: 'utf-8' }).trim();
+}
+
+const COMMAND_GIT_VERSION = 'git describe --long --dirty --tags --always';
+const shortCommit = command(COMMAND_GIT_VERSION);
+const version = `${pkg.version}-${shortCommit}`;
+
// https://vitejs.dev/config/
export default defineConfig({
server: {
@@ -25,7 +41,18 @@ export default defineConfig({
optimizeDeps: {
exclude: ['@jixun/libparakeet'],
},
- plugins: [react(), wasm(), topLevelAwait()],
+ plugins: [
+ replace({
+ preventAssignment: true,
+ values: {
+ __APP_VERSION_SHORT__: pkg.version,
+ __APP_VERSION__: version,
+ },
+ }),
+ react(),
+ wasm(),
+ topLevelAwait(),
+ ],
resolve: {
alias: {
'~': path.resolve(__dirname, 'src'),