From 3a76b9a7c971e6faf3f707b5e0e5214e5bf4ebfe Mon Sep 17 00:00:00 2001 From: luckyasme <807254037@qq.com> Date: Mon, 16 Jun 2025 10:01:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E5=8D=87=E7=BA=A7axios=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 835c89d87..83a11ddf1 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ }, "pnpm": { "overrides": { - "axios": "1.6.7", + "axios": "1.7.4", "ua-parser-js": "1.0.34" } }, -- Gitee From 68bd1e36b446eae8ab6e029be99d79f2613d64ba Mon Sep 17 00:00:00 2001 From: luckyasme <807254037@qq.com> Date: Mon, 16 Jun 2025 15:36:01 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + pnpm-lock.yaml | 369 +++++++++++++++++++++++++++++++++++++++++-- tests/common.test.ts | 88 +++++++++++ tests/tree.test.ts | 57 +++++++ 4 files changed, 504 insertions(+), 12 deletions(-) create mode 100644 tests/common.test.ts create mode 100644 tests/tree.test.ts diff --git a/package.json b/package.json index 83a11ddf1..f79a2e57d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "vitepress preview app", "format": "prettier --write app/.vitepress/src/", "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false", + "test": "vitest", "lint": "eslint app/.vitepress/src/ --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" }, "pnpm": { @@ -63,6 +64,7 @@ "typescript": "~5.2.0", "unplugin-icons": "^0.17.1", "vitepress": "^1.5.0", + "vitest": "^3.2.3", "vue-tsc": "^1.8.19" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15e88ac4a..a0ec72945 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - axios: 1.6.7 + axios: 1.7.4 ua-parser-js: 1.0.34 importers: @@ -22,8 +22,8 @@ importers: specifier: 9.12.0 version: 9.12.0(vue@3.3.4) axios: - specifier: 1.6.7 - version: 1.6.7 + specifier: 1.7.4 + version: 1.7.4 clipboard: specifier: 2.0.11 version: 2.0.11 @@ -138,7 +138,10 @@ importers: version: 0.17.4(@vue/compiler-sfc@3.5.13)(vue-template-compiler@2.7.16) vitepress: specifier: ^1.5.0 - version: 1.5.0(@algolia/client-search@5.19.0)(@types/node@18.19.70)(async-validator@4.2.5)(axios@1.6.7)(markdown-it-mathjax3@4.3.2)(postcss@8.4.49)(sass@1.62.0)(search-insights@2.17.3)(typescript@5.2.2) + version: 1.5.0(@algolia/client-search@5.19.0)(@types/node@18.19.70)(async-validator@4.2.5)(axios@1.7.4)(markdown-it-mathjax3@4.3.2)(postcss@8.4.49)(sass@1.62.0)(search-insights@2.17.3)(typescript@5.2.2) + vitest: + specifier: ^3.2.3 + version: 3.2.3(@types/node@18.19.70)(sass@1.62.0) vue-tsc: specifier: ^1.8.19 version: 1.8.27(typescript@5.2.2) @@ -778,6 +781,12 @@ packages: '@tsconfig/node18@18.2.4': resolution: {integrity: sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -915,6 +924,35 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 + '@vitest/expect@3.2.3': + resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} + + '@vitest/mocker@3.2.3': + resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.3': + resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} + + '@vitest/runner@3.2.3': + resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} + + '@vitest/snapshot@3.2.3': + resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} + + '@vitest/spy@3.2.3': + resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} + + '@vitest/utils@3.2.3': + resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} + '@volar/language-core@1.11.1': resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} @@ -1051,7 +1089,7 @@ packages: resolution: {integrity: sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==} peerDependencies: async-validator: ^4 - axios: 1.6.7 + axios: 1.7.4 change-case: ^5 drauu: ^0.4 focus-trap: ^7 @@ -1143,14 +1181,18 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + async-validator@4.2.5: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + axios@1.7.4: + resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1180,6 +1222,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1190,6 +1236,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1200,6 +1250,10 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + cheerio-select@1.6.0: resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==} @@ -1290,6 +1344,19 @@ packages: supports-color: optional: true + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1353,6 +1420,9 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1441,6 +1511,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1449,6 +1522,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -1472,6 +1549,14 @@ packages: fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1673,6 +1758,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1749,6 +1837,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1952,6 +2043,13 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -1962,6 +2060,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pinia@2.1.6: resolution: {integrity: sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==} peerDependencies: @@ -2093,6 +2195,9 @@ packages: shiki@1.26.1: resolution: {integrity: sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -2128,6 +2233,12 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -2147,6 +2258,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + superjson@2.2.2: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} @@ -2171,9 +2285,28 @@ packages: tiny-emitter@2.1.0: resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.0: + resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2287,6 +2420,11 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.2.3: + resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + vite@5.4.11: resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2330,6 +2468,34 @@ packages: postcss: optional: true + vitest@3.2.3: + resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.3 + '@vitest/ui': 3.2.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vue-demi@0.13.11: resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} engines: {node: '>=12'} @@ -2410,6 +2576,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wicked-good-xpath@1.3.0: resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} @@ -3078,6 +3249,12 @@ snapshots: '@tsconfig/node18@18.2.4': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.6': {} '@types/hast@3.0.4': @@ -3235,6 +3412,48 @@ snapshots: vite: 5.4.11(@types/node@18.19.70)(sass@1.62.0) vue: 3.5.13(typescript@5.2.2) + '@vitest/expect@3.2.3': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.3(vite@5.4.11(@types/node@18.19.70)(sass@1.62.0))': + dependencies: + '@vitest/spy': 3.2.3 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.11(@types/node@18.19.70)(sass@1.62.0) + + '@vitest/pretty-format@3.2.3': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.3': + dependencies: + '@vitest/utils': 3.2.3 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.3': + dependencies: + '@vitest/pretty-format': 3.2.3 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.3': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.3': + dependencies: + '@vitest/pretty-format': 3.2.3 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + '@volar/language-core@1.11.1': dependencies: '@volar/source-map': 1.11.1 @@ -3470,14 +3689,14 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/integrations@11.3.0(async-validator@4.2.5)(axios@1.6.7)(focus-trap@7.6.2)(vue@3.5.13(typescript@5.2.2))': + '@vueuse/integrations@11.3.0(async-validator@4.2.5)(axios@1.7.4)(focus-trap@7.6.2)(vue@3.5.13(typescript@5.2.2))': dependencies: '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.2.2)) '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.2.2)) vue-demi: 0.14.10(vue@3.5.13(typescript@5.2.2)) optionalDependencies: async-validator: 4.2.5 - axios: 1.6.7 + axios: 1.7.4 focus-trap: 7.6.2 transitivePeerDependencies: - '@vue/composition-api' @@ -3551,11 +3770,13 @@ snapshots: array-union@2.1.0: {} + assertion-error@2.0.1: {} + async-validator@4.2.5: {} asynckit@0.4.0: {} - axios@1.6.7: + axios@1.7.4: dependencies: follow-redirects: 1.15.9 form-data: 4.0.1 @@ -3591,12 +3812,22 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) + cac@6.7.14: {} + callsites@3.1.0: {} caniuse-lite@1.0.30001692: {} ccount@2.0.1: {} + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -3606,6 +3837,8 @@ snapshots: character-entities-legacy@3.0.0: {} + check-error@2.1.1: {} + cheerio-select@1.6.0: dependencies: css-select: 4.3.0 @@ -3702,6 +3935,12 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + deep-is@0.1.4: {} delayed-stream@1.0.0: {} @@ -3775,6 +4014,8 @@ snapshots: entities@4.5.0: {} + es-module-lexer@1.7.0: {} + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -3908,6 +4149,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + esutils@2.0.3: {} execa@5.1.1: @@ -3922,6 +4167,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + expect-type@1.2.1: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -3946,6 +4193,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -4135,6 +4386,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -4208,6 +4461,8 @@ snapshots: lodash@4.17.21: {} + loupe@3.1.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -4408,12 +4663,18 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.3: {} + + pathval@2.0.0: {} + perfect-debounce@1.0.0: {} picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.2: {} + pinia@2.1.6(typescript@5.2.2)(vue@3.3.4): dependencies: '@vue/devtools-api': 6.6.4 @@ -4551,6 +4812,8 @@ snapshots: '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} simple-git@3.27.0: @@ -4581,6 +4844,10 @@ snapshots: sprintf-js@1.0.3: {} + stackback@0.0.2: {} + + std-env@3.9.0: {} + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -4596,6 +4863,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + superjson@2.2.2: dependencies: copy-anything: 3.0.5 @@ -4617,8 +4888,21 @@ snapshots: tiny-emitter@2.1.0: {} + tinybench@2.9.0: {} + tinyexec@0.3.2: {} + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.1.0: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4720,6 +5004,24 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite-node@3.2.3(@types/node@18.19.70)(sass@1.62.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 5.4.11(@types/node@18.19.70)(sass@1.62.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite@5.4.11(@types/node@18.19.70)(sass@1.62.0): dependencies: esbuild: 0.21.5 @@ -4730,7 +5032,7 @@ snapshots: fsevents: 2.3.3 sass: 1.62.0 - vitepress@1.5.0(@algolia/client-search@5.19.0)(@types/node@18.19.70)(async-validator@4.2.5)(axios@1.6.7)(markdown-it-mathjax3@4.3.2)(postcss@8.4.49)(sass@1.62.0)(search-insights@2.17.3)(typescript@5.2.2): + vitepress@1.5.0(@algolia/client-search@5.19.0)(@types/node@18.19.70)(async-validator@4.2.5)(axios@1.7.4)(markdown-it-mathjax3@4.3.2)(postcss@8.4.49)(sass@1.62.0)(search-insights@2.17.3)(typescript@5.2.2): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.19.0)(search-insights@2.17.3) @@ -4743,7 +5045,7 @@ snapshots: '@vue/devtools-api': 7.7.0 '@vue/shared': 3.5.13 '@vueuse/core': 11.3.0(vue@3.5.13(typescript@5.2.2)) - '@vueuse/integrations': 11.3.0(async-validator@4.2.5)(axios@1.6.7)(focus-trap@7.6.2)(vue@3.5.13(typescript@5.2.2)) + '@vueuse/integrations': 11.3.0(async-validator@4.2.5)(axios@1.7.4)(focus-trap@7.6.2)(vue@3.5.13(typescript@5.2.2)) focus-trap: 7.6.2 mark.js: 8.11.1 minisearch: 7.1.1 @@ -4781,6 +5083,44 @@ snapshots: - typescript - universal-cookie + vitest@3.2.3(@types/node@18.19.70)(sass@1.62.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.3 + '@vitest/mocker': 3.2.3(vite@5.4.11(@types/node@18.19.70)(sass@1.62.0)) + '@vitest/pretty-format': 3.2.3 + '@vitest/runner': 3.2.3 + '@vitest/snapshot': 3.2.3 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.0 + tinyrainbow: 2.0.0 + vite: 5.4.11(@types/node@18.19.70)(sass@1.62.0) + vite-node: 3.2.3(@types/node@18.19.70)(sass@1.62.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.70 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vue-demi@0.13.11(vue@3.3.4): dependencies: vue: 3.3.4 @@ -4878,6 +5218,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wicked-good-xpath@1.3.0: {} word-wrap@1.2.5: {} diff --git a/tests/common.test.ts b/tests/common.test.ts new file mode 100644 index 000000000..a1f33d53e --- /dev/null +++ b/tests/common.test.ts @@ -0,0 +1,88 @@ +import { describe, expect, it } from 'vitest'; +import { + changeTimeStamp, + getDomId, + getSearchUrlParams, + getUrlParams, + getVersionFromUrl, + getYearByOffset, + isValidKey, +} from '../app/.vitepress/src/utils/common'; + +describe('changeTimeStamp', () => { + it('获取格式化时间', () => { + const date = new Date(); + const result = changeTimeStamp(date.getTime() / 1000); + const month = ('0' + (date.getMonth() + 1)).slice(-2); + const day = ('0' + date.getDate()).slice(-2); + const format = `${date.getFullYear()}/${month}/${day}`; + expect(result).toBe(format); + }); +}); + +describe('getUrlParams', () => { + it('存在 url 参数', () => { + expect(getUrlParams('http://example.com?a=1')).toHaveProperty('a'); + expect(getUrlParams('http://example.com?a=1&b=2')).toHaveProperty('b'); + }); + + it('不存在 url 参数', () => { + expect(getUrlParams('http://example.com?a=1')).not.toHaveProperty('c'); + expect(getUrlParams('http://example.com?a=1&b=2')).not.toHaveProperty('c'); + }); + + it('非法 url 地址', () => { + expect(getUrlParams('sdfgdfsgasDKJBFSJKFB')).toBe(undefined); + }); +}); + +describe('getSearchUrlParams', () => { + it('getSearchUrlParams', () => { + const result = getSearchUrlParams('http://example.com?a=1&b=2'); + expect(result.get('a')).toBe('1'); + }); +}); + +describe('isValidKey', () => { + it('key 为 string', () => { + const obj1 = { key: 1 }; + expect(isValidKey('key', obj1)).toBe(true); + expect(isValidKey('b', obj1)).toBe(false); + }); + + it('key 为 number', () => { + const obj1 = { 1: 1 }; + expect(isValidKey(1, obj1)).toBe(true); + expect(isValidKey(2, obj1)).toBe(false); + }); + + it('key 为 symbol', () => { + const symbol1 = Symbol('key1'); + const symbol2 = Symbol('key2'); + const obj1 = { [symbol1]: 1 }; + expect(isValidKey(symbol1, obj1)).toBe(true); + expect(isValidKey(symbol2, obj1)).toBe(false); + }); +}); + +describe('getYearByOffset', () => { + it('getYearByOffset', () => { + const date = new Date(); + expect(getYearByOffset()).toBe(date.getFullYear()); + }); +}); + +describe('getVersionFromUrl', () => { + it('getVersionFromUrl', () => { + expect(getVersionFromUrl('/zh/docs/25.03/server/index.html')).toBe('25.03'); + expect(getVersionFromUrl('/zh/docs/common/contribute/directory_structure_introductory.html')).toBe('common'); + }); +}); + +describe('getDomId', () => { + it('getDomId', () => { + expect(getDomId('aa bb cc')).toBe('aa-bb-cc'); + expect(getDomId('a&b')).toBe('a-b'); + expect(getDomId('a-c')).toBe('a-c'); + }); +}); diff --git a/tests/tree.test.ts b/tests/tree.test.ts new file mode 100644 index 000000000..54b8b1140 --- /dev/null +++ b/tests/tree.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it } from 'vitest'; +import { DocMenuTree, getNodeHrefSafely } from '../app/.vitepress/src/utils/tree'; + +const data = [{ + id: '1', + label: '1', + type: 'menu', + sections: [ + { + id: '1-1', + label: '1-1', + type: 'menu', + sections: [ + { + id: '1-1-1', + label: '1-1-1', + type: 'page', + href: '1-1-1', + }, + { + id: '1-1-2', + label: '1-1-2', + type: 'page', + href: '1-1-2.html', + }, + ], + }, + { + id: '1-2', + label: '1-2', + type: 'page', + href: '1-2', + }, + ], +}]; + + +describe('DocMenuTree', () => { + const tree = new DocMenuTree(data); + + it('getNode', () => { + expect(tree.getNode(tree.root, 'id', '1-1')?.id).toBe('1-1'); + expect(tree.getNode(tree.root, 'label', '1-1-1')?.label).toBe('1-1-1'); + expect(tree.getNode(tree.root, 'href', '1-1-2.html')?.href).toBe('1-1-2.html'); + }); + + it('getPrevNodes', () => { + expect(tree.getPrevNodes(tree.root).length).toBe(0); + expect(tree.getPrevNodes(tree.getNode(tree.root, 'id', '1')!!).length).toBe(1); + expect(tree.getPrevNodes(tree.getNode(tree.root, 'id', '1-1')!!).length).toBe(2); + expect(tree.getPrevNodes(tree.getNode(tree.root, 'id', '1-1-1')!!).length).toBe(3); + }); + + it('getNodeHrefSafely', () => { + expect(getNodeHrefSafely(tree.getNode(tree.root, 'id', '1-1')!!)).toBe('1-1-2.html'); + }); +}); \ No newline at end of file -- Gitee