From 227bc247975b38adc020d27705c5f484156782ec Mon Sep 17 00:00:00 2001 From: wait4xx Date: Mon, 2 Nov 2026 15:27:28 +0800 Subject: [PATCH] =?UTF-8?q?build(deps):=20Node=2026.13.0=20+=20Astro=207.4?= =?UTF-8?q?.4=20=E5=8D=87=E7=BA=A7=EF=BC=88=E5=90=AB=20exif=20loader=20?= =?UTF-8?q?=E5=8F=A5=E6=9F=84=E4=BF=AE=E5=A4=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 宿主 Node 22.22.3 → 用户级安装 26.13.0(~/.local/node),systemd unit PATH 前置,CI 构建链同步吃到新版本 - Astro 7.3.8 → 7.4.4(7.4 要求 Node ≥22.23.4,此前升级因 Node 版本 不足被 CI 拒绝;本次先升 Node 再升框架) - exif loader 修复:Node 22.23+/26 把"GC 时仍打开的 FileHandle"从警告 升级为错误,exifr 接收文件路径时自开 fd 不显式关闭 → 全线 content/ photos/*.jpg 触发构建失败。改为一律 readFile 成 Buffer 再喂 exifr (无 fd 参与) 验证: 全量构建 44 页 exit 0(node v26.13.0 + astro 7.4.4);E2E 37/37; content-lint 0/0/0;后处理链(字体子集/首页内联)复跑通过; unit PATH 实测已前置 node26 Spec: none (运行时与框架升级,全链验收) Co-authored-by: GLM-5.3 --- package.json | 2 +- pnpm-lock.yaml | 112 +++++++++++++++++++++--------------------------- src/lib/exif.ts | 8 +++- 3 files changed, 56 insertions(+), 66 deletions(-) diff --git a/package.json b/package.json index 9937dcf..f89701b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@fontsource-variable/noto-serif-sc": "^5.3.1", "@fontsource/jetbrains-mono": "^5.3.0", "@fontsource/noto-sans-sc": "^5.3.1", - "astro": "^7.3.8", + "astro": "^7.4.4", "astro-pagefind": "^2.0.1", "exifr": "^7.1.3", "lxgw-wenkai-screen-webfont": "^1.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5be1514..7926bd7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,11 +27,11 @@ importers: specifier: ^5.3.1 version: 5.3.1 astro: - specifier: ^7.3.8 - version: 7.3.8(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1) + specifier: ^7.4.4 + version: 7.4.4(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1) astro-pagefind: specifier: ^2.0.1 - version: 2.0.1(astro@7.3.8(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1)) + version: 2.0.1(astro@7.4.4(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1)) exifr: specifier: ^7.1.3 version: 7.1.3 @@ -125,21 +125,14 @@ packages: resolution: {integrity: sha512-IvwYLB8t1M86rKO4oPdBi9GP4gzXcgrVlNgocjwos1jeeUuEIV8d9Crn1PvYD/5IKteWOxpIHomf7e8iYlkE+Q==} engines: {node: '>=22.12.0'} - '@astrojs/internal-helpers@0.12.0': - resolution: {integrity: sha512-pKPuwCDtO0L7zgmt1JGd9X4Aes1+0SX3IEBSqBNPHsScYdPMlfmed3Y7DTbXyF7E+8ylnb563o/0OzGQPOFehw==} - '@astrojs/internal-helpers@0.13.0': resolution: {integrity: sha512-20jxQqnSmpskcGyad7N5l6Xf1gz0UCa6lNde44bEBdaXGpncEYfAZJ142r2ZgzBaG4dUyzGmhqZWv1INU2eiHQ==} '@astrojs/markdown-remark@7.3.5': resolution: {integrity: sha512-Xk0gvOMEpBul2zj5jZXS5WH2Gng/6dW7c3WWLXgip+LZGpY64frwTvBChznMtpnNIqVgFXSsu44RYrISojcodQ==} - '@astrojs/markdown-satteri@0.4.3': - resolution: {integrity: sha512-PFbEHPnwUlLvpXd7RXrrKM+j12akF4bG+DSuNuoN+3eiwjOwp4HaPi+QQdbkBV7QEYXmzyKca50OJsmGxhNIUA==} - - '@astrojs/prism@4.0.2': - resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} - engines: {node: '>=22.12.0'} + '@astrojs/markdown-satteri@0.4.6': + resolution: {integrity: sha512-6biKp2lEAYycF3jhv91br+Otyf4EgDFkF1oRL9ks0u/m/YRGmI7XkGQ2MgaM35DslT03f7NtozKtlqfBNkp6bw==} '@astrojs/prism@4.1.2': resolution: {integrity: sha512-jMrUEpFDarDO1KWPvVc9eSa8DSfwBlwEOHwX+8zvZQpiqXRGDxFnOXHsYqV6DP7w+0qIgTr98gS1GdQlm8ypWg==} @@ -151,9 +144,9 @@ packages: '@astrojs/sitemap@3.7.4': resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} - '@astrojs/telemetry@3.3.3': - resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==} - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/telemetry@3.4.2': + resolution: {integrity: sha512-2JOMRUxJrBSfiVDfeKLv1wBmvSIx1Y6u2YEO8awZ9qSq3u/rNAiUyFdOYi8dHv91kHrmYEQX7pRDw0J4xyj3UA==} + engines: {node: '>=22.23.4'} '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} @@ -707,9 +700,9 @@ packages: peerDependencies: astro: ^2.0.4 || ^3 || ^4 || ^5 || ^6 || ^7 - astro@7.3.8: - resolution: {integrity: sha512-LHzDHSaV+YzZiR3EFndDYTLLeNeuMtP1qX1FLcCNUUHOCqTTIWPczy2UV3zpA5VqvJe5cWZolqM9Z8JFqR2i9w==} - engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + astro@7.4.4: + resolution: {integrity: sha512-e+BzhGCaIY/H1tV/BQPTbOPZVZ8wuu6+bbpc+3oSMH2UgoB1l9peSGASk6nswtYra9PO9OoMREhldKtQkZ5TVw==} + engines: {node: '>=22.23.4', npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true peerDependencies: '@astrojs/markdown-remark': ^7.3.0 @@ -826,8 +819,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.9.4: - resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + devalue@6.0.3: + resolution: {integrity: sha512-3woMEITftG1wKeO/4d/QXH1DVKctTSZg3jNGPpjp9hNr5Hos8MCFF5McTML5ZtgKDObm2R591B0spRp2IVernA==} + engines: {node: '>=18'} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -929,14 +923,13 @@ packages: picomatch: optional: true - find-proc@0.2.0: - resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==} - engines: {node: ^20.19.0 || >=22.12.0} - flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} + fnv1a-64@0.1.2: + resolution: {integrity: sha512-mJbcILTPybAR1jdOwt/lVv8N2cffeJFFP+gVbSAwLEx1ujXH27RpPd8Rokec/KX9c76UYIB6Co+H4lQzxPnJfA==} + fontace@0.4.1: resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} @@ -1338,9 +1331,6 @@ packages: ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - ohash@2.0.12: - resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} - oniguruma-parser@0.12.2: resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} @@ -1552,6 +1542,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -1587,6 +1580,9 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyps@0.5.1: + resolution: {integrity: sha512-B6Ykif5HflC3AdDkS4Zst/2muYVfeXoVMy+KorqH80s/1x4vunIORpNySH681X7fjj+dFM9MDKD6/Hsccjb87Q==} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -1622,8 +1618,8 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unifont@0.7.5: - resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==} + unifont@1.0.3: + resolution: {integrity: sha512-XGnEwj5sWdCbiBX01mWLSBncS0yMRjnLygau3IfdOlfjMacNIQvTGW4VH7pWBq+gGWArfSef/CensMLjMmIr/A==} unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1863,17 +1859,6 @@ snapshots: dependencies: '@astrojs/compiler-binding': 0.5.2 - '@astrojs/internal-helpers@0.12.0': - dependencies: - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - picomatch: 4.0.7 - retext-smartypants: 6.2.0 - shiki: 4.5.0 - smol-toml: 1.9.1 - unified: 11.0.5 - yaml: 2.9.1 - '@astrojs/internal-helpers@0.13.0': dependencies: '@types/hast': 3.0.5 @@ -1912,17 +1897,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/markdown-satteri@0.4.3': + '@astrojs/markdown-satteri@0.4.6': dependencies: - '@astrojs/internal-helpers': 0.12.0 - '@astrojs/prism': 4.0.2 + '@astrojs/internal-helpers': 0.13.0 + '@astrojs/prism': 4.1.2 github-slugger: 2.0.0 satteri: 0.10.5 - '@astrojs/prism@4.0.2': - dependencies: - prismjs: 1.30.0 - '@astrojs/prism@4.1.2': dependencies: prismjs: 1.30.0 @@ -1938,7 +1919,7 @@ snapshots: sitemap: 9.0.1 zod: 4.6.7 - '@astrojs/telemetry@3.3.3': + '@astrojs/telemetry@3.4.2': dependencies: ci-info: 4.4.0 dset: 3.1.4 @@ -2392,19 +2373,19 @@ snapshots: astring@1.9.0: {} - astro-pagefind@2.0.1(astro@7.3.8(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1)): + astro-pagefind@2.0.1(astro@7.4.4(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1)): dependencies: '@pagefind/component-ui': 1.5.2 - astro: 7.3.8(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1) + astro: 7.4.4(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1) pagefind: 1.5.2 sirv: 3.0.2 - astro@7.3.8(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1): + astro@7.4.4(@astrojs/markdown-remark@7.3.5)(@types/node@24.19.2)(yaml@2.9.1): dependencies: '@astrojs/compiler-rs': 0.5.2 - '@astrojs/internal-helpers': 0.12.0 - '@astrojs/markdown-satteri': 0.4.3 - '@astrojs/telemetry': 3.3.3 + '@astrojs/internal-helpers': 0.13.0 + '@astrojs/markdown-satteri': 0.4.6 + '@astrojs/telemetry': 3.4.2 '@capsizecss/unpack': 4.0.1 '@clack/prompts': 1.8.1 '@oslojs/encoding': 1.1.0 @@ -2415,11 +2396,10 @@ snapshots: clsx: 2.1.1 common-ancestor-path: 2.0.0 cookie: 2.0.1 - devalue: 5.9.4 + devalue: 6.0.3 diff: 9.0.0 dset: 3.1.4 es-module-lexer: 3.0.4 - find-proc: 0.2.0 flattie: 1.1.1 fontace: 0.4.1 get-tsconfig: 5.0.0-beta.6 @@ -2444,8 +2424,9 @@ snapshots: tinyclip: 1.0.3 tinyexec: 1.3.1 tinyglobby: 0.2.17 + tinyps: 0.5.1 ultrahtml: 1.7.0 - unifont: 0.7.5 + unifont: 1.0.3 unstorage: 1.17.6 verkit: 0.5.0 vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) @@ -2575,7 +2556,7 @@ snapshots: detect-libc@2.1.2: {} - devalue@5.9.4: {} + devalue@6.0.3: {} devlop@1.1.0: dependencies: @@ -2692,10 +2673,10 @@ snapshots: optionalDependencies: picomatch: 4.0.7 - find-proc@0.2.0: {} - flattie@1.1.1: {} + fnv1a-64@0.1.2: {} + fontace@0.4.1: dependencies: fontkitten: 1.0.3 @@ -3420,8 +3401,6 @@ snapshots: node-fetch-native: 1.6.7 ufo: 1.6.4 - ohash@2.0.12: {} - oniguruma-parser@0.12.2: {} oniguruma-to-es@4.3.6: @@ -3753,6 +3732,8 @@ snapshots: space-separated-tokens@2.0.2: {} + std-env@4.3.0: {} + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -3795,6 +3776,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tinyps@0.5.1: {} + totalist@3.0.1: {} trim-lines@3.0.1: {} @@ -3827,10 +3810,11 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unifont@0.7.5: + unifont@1.0.3: dependencies: css-tree: 3.2.1 - ohash: 2.0.12 + fnv1a-64: 0.1.2 + std-env: 4.3.0 undici: 8.12.3 unist-util-is@6.0.1: diff --git a/src/lib/exif.ts b/src/lib/exif.ts index 76d3a70..f1e1174 100644 --- a/src/lib/exif.ts +++ b/src/lib/exif.ts @@ -67,7 +67,13 @@ export function mapExifTags(raw: ExifRaw): PhotoExif { */ export async function extractPhotoExif(input: string | URL | Uint8Array): Promise { try { - const source = input instanceof URL ? fileURLToPath(input) : input; + // Node 22.23+/26 把"GC 时仍打开的 FileHandle"升级为错误:exifr 收到文件 + // 路径会自行开 fd 且不显式关闭,故这里统一读成 Buffer 再喂(2026-11-02 + // Node 26 升级实测炸点,content/photos/*.jpg 全量触发) + const source = + input instanceof Uint8Array + ? input + : await readFile(input instanceof URL ? fileURLToPath(input) : input); return mapExifTags(await exifr.parse(source, { tiff: true, exif: true })); } catch { return {};