From 114dcf5660d646bd2bd9bbe8769e8b7ba3097fb8 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Tue, 27 Jan 2026 13:49:49 +0800 Subject: [PATCH 1/2] release: v0.3.0 --- .gitignore | 4 + CHANGELOG.md | 6 ++ docs/.vitepress/plugins/webapp-loader.ts | 57 ++++++++++-- manifest.json | 4 +- package.json | 5 +- plaoc.json | 66 ++++++++++++++ pnpm-lock.yaml | 105 +++++++++++++++++++++++ scripts/build.ts | 22 +++-- scripts/release.ts | 22 +++-- 9 files changed, 266 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 50bd5ac22..412a4e087 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,10 @@ docs/public/webapp docs/public/webapp-dev docs/public/webapp-beta docs/public/webapp-alpha +docs/public/dweb +docs/public/dweb-dev +docs/public/dweb-beta +docs/public/dweb-alpha # dependencies node_modules diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a88bf4f9..8d3ce6559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # 更新日志 +## [0.3.0] - 2026-01-27 + +DWEB 路由与打包优化 + + + ## [0.2.0] - 2026-01-26 DWEB 安装资源与发布流程优化 diff --git a/docs/.vitepress/plugins/webapp-loader.ts b/docs/.vitepress/plugins/webapp-loader.ts index 1d92b9fc4..5e1c1870d 100644 --- a/docs/.vitepress/plugins/webapp-loader.ts +++ b/docs/.vitepress/plugins/webapp-loader.ts @@ -58,12 +58,21 @@ function copyDirContents(src: string, dest: string) { } } -function commandExists(command: string): boolean { +function resolvePlaocBin(): string | null { try { - execSync(`${command} --version`, { stdio: 'ignore' }) - return true + execSync('plaoc --version', { stdio: 'ignore' }) + return 'plaoc' } catch { - return false + const voltaHome = process.env.VOLTA_HOME ?? (process.env.HOME ? join(process.env.HOME, '.volta') : null) + if (!voltaHome) return null + const plaocPath = join(voltaHome, 'bin', 'plaoc') + if (!existsSync(plaocPath)) return null + try { + execSync(`${plaocPath} --version`, { stdio: 'ignore' }) + return plaocPath + } catch { + return null + } } } @@ -287,7 +296,8 @@ function ensureDwebBundle(): boolean { return false } - if (!commandExists('plaoc')) { + const plaocBin = resolvePlaocBin() + if (!plaocBin) { log.warn('plaoc CLI 未安装,无法生成 DWEB metadata.json') return false } @@ -296,21 +306,50 @@ function ensureDwebBundle(): boolean { if (existsSync(DISTS_DIR)) { rmSync(DISTS_DIR, { recursive: true, force: true }) } - execSync(`plaoc bundle "${DIST_DWEB_DIR}" -c ./ -o "${DISTS_DIR}"`, { cwd: ROOT, stdio: 'inherit' }) + execSync(`${plaocBin} bundle "${DIST_DWEB_DIR}" -c ./ -o "${DISTS_DIR}"`, { cwd: ROOT, stdio: 'inherit' }) return existsSync(metadataPath) } catch { return false } } +function isPlaocMetadata( + metadata: { id?: string; server?: { root?: string }; bundle_url?: string }, + channel: 'stable' | 'beta', +): boolean { + if (!metadata?.server?.root) return false + if (!metadata?.bundle_url || !metadata.bundle_url.includes('.dweb-')) return false + if (channel === 'beta' && !String(metadata.id ?? '').startsWith('dev.')) return false + return true +} + async function prepareDwebAssets(channel: 'stable' | 'beta', outputDir: string, dwebPath: string): Promise { const zipName = channel === 'stable' ? 'bfmpay-dweb.zip' : 'bfmpay-dweb-beta.zip' const logoFileName = 'logo-256.webp' const absoluteBaseUrl = resolveAbsoluteBaseUrl() - if (existsSync(outputDir) && existsSync(join(outputDir, 'metadata.json'))) { - log.info(`${channel} dweb 已存在,跳过`) - return + if (channel === 'beta') { + if (existsSync(outputDir)) { + rmSync(outputDir, { recursive: true, force: true }) + log.info('beta dweb 强制刷新') + } + } else if (existsSync(outputDir)) { + const metadataPath = join(outputDir, 'metadata.json') + if (existsSync(metadataPath)) { + try { + const metadata = JSON.parse(readFileSync(metadataPath, 'utf-8')) as { + id?: string + server?: { root?: string } + bundle_url?: string + } + if (isPlaocMetadata(metadata, channel)) { + log.info(`${channel} dweb 已存在,跳过`) + return + } + } catch { + // fall through to regenerate + } + } } if (!existsSync(DIST_DWEB_DIR)) { diff --git a/manifest.json b/manifest.json index c9ee7cd81..afcfb59e4 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "short_name": "BFM Pay", "description": "BFM Pay - 多链钱包应用", "logo": "logos/logo-256.webp", - "change_log": "DWEB 安装资源与发布流程优化", + "change_log": "DWEB 路由与打包优化", "icons": [ { "src": "logos/logo-256.webp", @@ -19,7 +19,7 @@ "author": [ "@bfmeta.info" ], - "version": "0.2.0", + "version": "0.3.0", "categories": [ "application", "wallet" diff --git a/package.json b/package.json index 0dd7e1ef7..c8397f493 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@biochain/keyapp", "private": true, - "version": "0.2.0", + "version": "0.3.0", "type": "module", "packageManager": "pnpm@10.28.0", "scripts": { @@ -143,6 +143,7 @@ "@biochain/e2e-tools": "workspace:*", "@inquirer/prompts": "^8.0.2", "@playwright/test": "^1.57.0", + "@plaoc/cli": "^1.2.2", "@storybook/addon-docs": "^10.1.4", "@storybook/addon-vitest": "^10.1.4", "@storybook/react": "^10.1.4", @@ -208,5 +209,5 @@ "packages/*", "miniapps/*" ], - "lastChangelogCommit": "7cddd6e285c9bf0c16d7061521d7dc429bb808d7" + "lastChangelogCommit": "4ce13102056c2879f39fd47740c660628e193446" } diff --git a/plaoc.json b/plaoc.json index f5a6af189..629fe6c99 100644 --- a/plaoc.json +++ b/plaoc.json @@ -15,6 +15,17 @@ "removeHeaders": [] } }, + { + "matchMethod": ["*"], + "matchUrl": { + "pathname": "/plaoc.json" + }, + "to": { + "url": "/plaoc.json", + "appendHeaders": {}, + "removeHeaders": [] + } + }, { "matchMethod": ["*"], "matchUrl": { @@ -26,6 +37,61 @@ "removeHeaders": [] } }, + { + "matchMethod": ["*"], + "matchUrl": { + "pathname": "{/}configs/*" + }, + "to": { + "url": "/{{pattern.pathname.input}}", + "appendHeaders": {}, + "removeHeaders": [] + } + }, + { + "matchMethod": ["*"], + "matchUrl": { + "pathname": "{/}icons/*" + }, + "to": { + "url": "/{{pattern.pathname.input}}", + "appendHeaders": {}, + "removeHeaders": [] + } + }, + { + "matchMethod": ["*"], + "matchUrl": { + "pathname": "{/}logos/*" + }, + "to": { + "url": "/{{pattern.pathname.input}}", + "appendHeaders": {}, + "removeHeaders": [] + } + }, + { + "matchMethod": ["*"], + "matchUrl": { + "pathname": "{/}miniapps/*/" + }, + "to": { + "url": "/{{pattern.pathname.input}}index.html", + "appendHeaders": {}, + "removeHeaders": [] + } + }, + { + "matchMethod": ["*"], + "matchUrl": { + "pathname": "{/}miniapps/*" + }, + "to": { + "url": "/{{pattern.pathname.input}}", + "appendHeaders": {}, + "removeHeaders": [] + } + }, { "matchMethod": ["*"], "matchUrl": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f007e6af..d786e330b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,6 +225,9 @@ importers: '@inquirer/prompts': specifier: ^8.0.2 version: 8.1.0(@types/node@24.10.4) + '@plaoc/cli': + specifier: ^1.2.2 + version: 1.2.2(@types/node@24.10.4)(tslib@2.8.1)(typescript@5.9.3) '@playwright/test': specifier: ^1.57.0 version: 1.57.0 @@ -1576,9 +1579,15 @@ packages: '@deno/shim-deno-test@0.4.0': resolution: {integrity: sha512-oYWcD7CpERZy/TXMTM9Tgh1HD/POHlbY9WpzmAk+5H8DohcxG415Qws8yLGlim3EaKBT2v3lJv01x4G0BosnaQ==} + '@deno/shim-deno-test@0.5.0': + resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} + '@deno/shim-deno@0.16.1': resolution: {integrity: sha512-s9v0kzF5bm/o9TgdwvsraHx6QNllYrXXmKzgOG2lh4LFXnVMr2gpjK/c/ve6EflQn1MqImcWmVD8HAv5ahuuZQ==} + '@deno/shim-deno@0.18.2': + resolution: {integrity: sha512-oQ0CVmOio63wlhwQF75zA4ioolPvOwAoK0yuzcS5bDC1JUvH3y1GS8xPh8EOpcoDQRU4FTG8OQfxhpR+c6DrzA==} + '@docsearch/css@3.8.2': resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} @@ -1620,6 +1629,9 @@ packages: '@dweb-browser/polyfill@0.0.9': resolution: {integrity: sha512-1siZWAvzXMVZ5z6TmFPCSYXHTNTu5qmZv5UR0QSlujXuQr93I+BX6bhyu2FG4pCqqkoE3OAVlQ15D9Nj+beS4g==} + '@dweb-browser/svg-wasm@0.9.0': + resolution: {integrity: sha512-Fal8zN6eC5AKIZW5WGpMSQubpuqDE7SyvrL2TJEs4BHDx4iYrNLdFa/1KmZonifkrVEQ+mjxZ1naPg9uLHj/VQ==} + '@ecies/ciphers@0.2.5': resolution: {integrity: sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} @@ -2861,9 +2873,19 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@plaoc/cli@1.2.2': + resolution: {integrity: sha512-4txWq8sytf6HCNt+ryWJzjhXVtNMrckdO/sBb2Xd3MbHPBMo1rvRIvVy0FCkPHe8cODF60SF9W/tovAFyYSuVw==} + hasBin: true + '@plaoc/plugins@1.1.9': resolution: {integrity: sha512-TnFNddIYsX0myjhhNVRR+HZS415CPnw0Xe4ipyP0ICUm94dleGZodJTDAPkgsKZi085gI7dlSXp8hYsNI3TIhw==} + '@plaoc/server@0.3.9': + resolution: {integrity: sha512-3IyWqT1TKWewz4eKa0H8lstQJ4t5XsVKfe8d+wAhHxpLzPfPDDIdyvMhU8L/ewoRizmzjpIRpwxECyda+0mYoA==} + peerDependencies: + '@types/node': '*' + tslib: '*' + '@playwright/test@1.57.0': resolution: {integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==} engines: {node: '>=18'} @@ -6316,6 +6338,11 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -7241,6 +7268,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -7701,6 +7732,9 @@ packages: ts-morph@26.0.0: resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + ts-qrcode-terminal@1.0.1: + resolution: {integrity: sha512-8wGzM7+j5yxgTdL2AxW3zWBuWemRAjpZ6B0Qm15uM1InGDV9RjtV5ZnEY+R7+CqPDYBTLH38GlgTVsKaTo5rrA==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -8309,6 +8343,10 @@ packages: resolution: {integrity: sha512-kQSF2NlHk8yjS3SRiJW3S+U5ibkEmVRhB4/GYsVwGvdAkFC2b+EIE1Ob7J56OmqW9VBZgkx1+SuWqo5JTIJSYQ==} engines: {node: '>=14.0.0', npm: '>=6.12.0'} + webdav-server@2.6.2: + resolution: {integrity: sha512-0iHdrOzlKGFD96bTvPF8IIEfxw9Q7jB5LqWqhjyBYsofD6T6mOYqWtAvR88VY9Mq0xeg8bCRHC2Vifc9iuTYuw==} + engines: {node: '>= 4'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -8452,6 +8490,14 @@ packages: wujie@1.0.29: resolution: {integrity: sha512-u7PmBT4l5ov7ciwmZNG8DLIRKrYrnXDa0LnAFgRQikJ/ZrVZYzzSNz6duzEJoj8/o46dnMy/g9Hh/PBYGbgFUw==} + xml-js-builder@1.0.3: + resolution: {integrity: sha512-BoLgG/glT45M0jK5PGh9h+iGrQxa8jJk9ofR63GroRifl2tbGB3/yYiVY3wQWHrZgWWfl9+7fhEB/VoD9mWnSg==} + engines: {node: '>= 4'} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -9422,11 +9468,18 @@ snapshots: '@deno/shim-deno-test@0.4.0': {} + '@deno/shim-deno-test@0.5.0': {} + '@deno/shim-deno@0.16.1': dependencies: '@deno/shim-deno-test': 0.4.0 which: 2.0.2 + '@deno/shim-deno@0.18.2': + dependencies: + '@deno/shim-deno-test': 0.5.0 + which: 4.0.0 + '@docsearch/css@3.8.2': {} '@docsearch/js@3.8.2(@algolia/client-search@5.46.2)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(search-insights@2.17.3)': @@ -9486,6 +9539,8 @@ snapshots: '@dweb-browser/polyfill@0.0.9': {} + '@dweb-browser/svg-wasm@0.9.0': {} + '@ecies/ciphers@0.2.5(@noble/ciphers@1.3.0)': dependencies: '@noble/ciphers': 1.3.0 @@ -10715,6 +10770,24 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@plaoc/cli@1.2.2(@types/node@24.10.4)(tslib@2.8.1)(typescript@5.9.3)': + dependencies: + '@deno/shim-deno': 0.18.2 + '@dweb-browser/svg-wasm': 0.9.0 + '@plaoc/server': 0.3.9(@types/node@24.10.4)(tslib@2.8.1)(typescript@5.9.3) + ajv: 8.13.0 + jszip: 3.10.1 + mime: 4.1.0 + ts-qrcode-terminal: 1.0.1 + webdav-server: 2.6.2 + ws: 8.18.3 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - tslib + - typescript + - utf-8-validate + '@plaoc/plugins@1.1.9(typescript@5.9.3)': dependencies: '@dweb-browser/core': 0.1.4(typescript@5.9.3) @@ -10725,6 +10798,17 @@ snapshots: transitivePeerDependencies: - typescript + '@plaoc/server@0.3.9(@types/node@24.10.4)(tslib@2.8.1)(typescript@5.9.3)': + dependencies: + '@dweb-browser/core': 0.1.4(typescript@5.9.3) + '@dweb-browser/helper': 0.1.4(typescript@5.9.3) + '@dweb-browser/js-process': 0.4.7(typescript@5.9.3) + '@types/node': 24.10.4 + tslib: 2.8.1 + urlpattern-polyfill: 10.1.0 + transitivePeerDependencies: + - typescript + '@playwright/test@1.57.0': dependencies: playwright: 1.57.0 @@ -14437,6 +14521,8 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@4.1.0: {} + mimic-fn@2.1.0: {} mimic-fn@3.1.0: {} @@ -15304,6 +15390,8 @@ snapshots: safer-buffer@2.1.2: {} + sax@1.4.4: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -15873,6 +15961,10 @@ snapshots: '@ts-morph/common': 0.27.0 code-block-writer: 13.0.3 + ts-qrcode-terminal@1.0.1: + dependencies: + tslib: 2.8.1 + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -16661,6 +16753,11 @@ snapshots: - utf-8-validate - zod + webdav-server@2.6.2: + dependencies: + mime-types: 2.1.35 + xml-js-builder: 1.0.3 + webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} @@ -16770,6 +16867,14 @@ snapshots: dependencies: '@babel/runtime': 7.28.4 + xml-js-builder@1.0.3: + dependencies: + xml-js: 1.6.11 + + xml-js@1.6.11: + dependencies: + sax: 1.4.4 + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} diff --git a/scripts/build.ts b/scripts/build.ts index ff37173c9..912877c53 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -75,12 +75,21 @@ function exec(cmd: string, options?: { cwd?: string; env?: Record { if (existsSync(distsDir)) { rmSync(distsDir, { recursive: true }) } - if (commandExists('plaoc')) { - exec(`plaoc bundle "${distDwebDir}" -c ./ -o "${distsDir}"`) + const plaocBin = resolvePlaocBin() + if (plaocBin) { + exec(`${plaocBin} bundle "${distDwebDir}" -c ./ -o "${distsDir}"`) } else { log.warn('Plaoc CLI 未安装,使用 dist-dweb 作为 dists 兜底') cpSync(distDwebDir, distsDir, { recursive: true }) From 971bbce7f1973a3a7fdf35a6bd25b664989fa3aa Mon Sep 17 00:00:00 2001 From: Gaubee Date: Tue, 27 Jan 2026 13:50:30 +0800 Subject: [PATCH 2/2] feat: complete implementation --- deno.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/deno.lock b/deno.lock index aa4d20a87..01b73c89e 100644 --- a/deno.lock +++ b/deno.lock @@ -10152,6 +10152,7 @@ "npm:@noble/hashes@^2.0.1", "npm:@noble/secp256k1@3", "npm:@number-flow/react@~0.5.10", + "npm:@plaoc/cli@^1.2.2", "npm:@plaoc/plugins@^1.1.9", "npm:@playwright/test@^1.57.0", "npm:@radix-ui/react-avatar@^1.1.11",