Skip to content

chore(deps): 依存を更新して脆弱性を解消し astro 7 へ移行 - #334

Merged
sajikix merged 3 commits into
masterfrom
deps-audit-2026-09
Sep 18, 2026
Merged

sajikix merged 3 commits into
masterfrom
deps-audit-2026-09

Conversation

@sajikix

@sajikix sajikix commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

概要

npm audit で検出された脆弱性(GitHub の Dependabot でも default branch に 82 件検出)を解消するために依存を更新しました。あわせて astro 7 への追随に必要な content collections の移行を行っています。

更新後の npm audit は found 0 vulnerabilities です。

更新内容

パッケージ 変更前 変更後
astro ^5.5.6 ^7.3.1
@astrojs/check ^0.9.4 ^0.9.10
dayjs ^1.11.7 ^1.11.23
github-markdown-css ^4.0.0 ^5.9.0
typescript ^5.2.2 ^5.9.3
@types/node ^18.11.18 ^24.13.3
prettier ^2.8.3 ^3.9.6
prettier-plugin-astro ^0.7.2 ^0.14.1

バージョン選定は .npmrc の min-release-age=14 に従い、公開から 14 日以上経過したものに限定しています。

なぜ astro 7 まで上げるのか

critical だった astro の AVIF 画像最適化経由の RCE(GHSA-26w7-cxv4-gfx2)は、修正が 7.2.8 以降にしか入っておらず 5 系にバックポートされていません。astro 5 系最新(5.18.2)に留めた場合、critical 1 件と high 4 件を含む 13 件が残ります。

content collections の移行(破壊的変更への対応)

astro 6 でレガシー content collections(src/content/config.ts と defineCollection の type: "data")が削除され、astro 7 には legacy.collectionsBackwardsCompat という一時的な逃げ道しか残っていないため、loader API へ移行しました。

  • src/content/config.ts を src/content.config.ts へ移し glob() loader 化
  • z は astro:content からの re-export が astro 8 で削除予定のため astro/zod から import
  • post.render() → render(post)
  • params に渡す post.slug → post.id

URL は変わりません。 glob loader の id 生成は frontmatter の slug を優先する実装で、全 69 件の md が slug: "YYYY-MM" を持つため従来どおり /posts/YYYY-MM/ が生成されます。

lookback はトップレベルが配列の JSON ですが、glob() loader と z.array() スキーマの組み合わせでそのまま読めたため、JSON データ側の変更は不要でした。

github-markdown-css v5 での import 先変更

v5 の github-markdown.css は prefers-color-scheme: dark で自動的にダーク配色へ切り替わります。このサイトは light 固定(.main の color は #24292e、背景は指定なし)のため、OS がダーク設定のユーザーで記事本文だけがダークになって崩れます。現状の見た目を維持するため github-markdown-light.css を明示的に指定しました。ダークモード対応自体は別途デザインの判断が必要です。

確認したこと

  • 3 コミットそれぞれの時点で npm run build(astro check && tsc --noEmit && astro build)が 0 errors / 0 warnings、生成ページ数は移行前と同じ 72
  • npm ci --ignore-scripts でクリーンインストールが成功(lockfile は CI で再現可能)
  • astro preview でトップ / 記事ページ(本文・メンバーアバター・シンタックスハイライト)/ /lookback/2024/ のタイムライン(月別グルーピング)を目視確認

申し送り

  • prettier 3 に上げましたが整形は実行していません。 format スクリプトが無いため既存ファイルは無変更ですが、prettier 3 で trailingComma の既定が es5 → all に変わるため、今後エディタで保存したファイルには差分が出ます。一括整形するなら独立した PR にするのが無難です
  • typescript は 7.0.2 が最新ですが、@astrojs/check@0.9.10 の peerDependencies が ^5.0.0 || ^6.0.0 のため 5 系に留めています
  • min-release-age の都合で今回見送ったもの(14 日経過後に追随可能): astro 7.3.3 / sass 1.104.1 / prettier 3.9.8 / prettier-plugin-astro 1.0.1

脆弱性の解消を目的に、破壊的変更の影響が小さい依存をまとめて更新する。

- @astrojs/check 0.9.4 -> 0.9.10 (cross-spawn / fast-uri / lodash 経由の
  high を解消)
- sass 1.57.1 -> 1.104.0 (immutable / picomatch 経由の high を解消)
- dayjs 1.11.7 -> 1.11.23
- typescript 5.2.2 -> 5.9.3
- @types/node 18.11.18 -> 24.13.3 (.node-version の Node 24 に合わせる)
- prettier 2.8.7 -> 3.9.6
- prettier-plugin-astro 0.7.2 -> 0.14.1 (prettier 3 対応)

typescript は 7.0.2 が最新だが @astrojs/check 0.9.10 の
peerDependencies が ^5.0.0 || ^6.0.0 のため 5 系に留める。

prettier 3 では trailingComma の既定が es5 から all に変わる。format
スクリプトが無く既存ファイルは無変更だが、以降エディタで保存したファイル
には差分が出る。
astro の critical (AVIF 画像最適化経由の RCE, GHSA-26w7-cxv4-gfx2) は
修正が 7.2.8 以降にしか入っておらず 5 系にバックポートされていないため、
7 系まで更新する。

astro 6 でレガシー content collections (src/content/config.ts と
defineCollection の type: "data") が削除され、astro 7 には
legacy.collectionsBackwardsCompat という一時的な逃げ道しか残っていない
ため、loader API へ移行する。

- src/content/config.ts を src/content.config.ts へ移し glob() loader 化
- z は astro:content からの re-export が astro 8 で削除予定のため
  astro/zod から import する
- post.render() を render(post) に変更
- params に渡す post.slug を post.id に変更

URL は変わらない。glob loader の id 生成は frontmatter の slug を優先
する実装で、全 69 件の md が slug: "YYYY-MM" を持つため従来どおり
/posts/YYYY-MM/ が生成される。

lookback はトップレベルが配列の JSON だが、glob() loader と
z.array() スキーマの組み合わせでそのまま読めるため JSON 側の変更は不要。

astro check / tsc --noEmit は 0 errors 0 warnings、生成ページ数は移行前
と同じ 72。
あわせて import 先を github-markdown.css から
github-markdown-light.css に変更する。

v5 の github-markdown.css は prefers-color-scheme: dark で自動的に
ダーク配色へ切り替わるが、このサイトは light 固定 (.main の color は
#24292e、背景は指定なし) のため、OS がダーク設定のユーザーで記事本文
だけがダークになって崩れる。現状の見た目を維持するため light 版を
明示的に指定する。ダークモード対応自体は別途デザインの判断が必要。
@sajikix
sajikix merged commit c7ee769 into master Sep 18, 2026
1 check passed
@sajikix
sajikix deleted the deps-audit-2026-09 branch September 18, 2026 08:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant