Skip to content

chore(deps): 依存更新 + markuplint 5 移行 + pnpm 設定の置き場の移動 - #267

Merged
shunei-web merged 7 commits into
mainfrom
chore/deps-v1.0.5
Sep 16, 2026
Merged

shunei-web merged 7 commits into
mainfrom
chore/deps-v1.0.5

Conversation

@shunei-web

Copy link
Copy Markdown
Collaborator

依存を更新し、あわせて markuplint 5 への移行と pnpm 設定の置き場の移動を行います。src/ は 1 行も変えていません。

依存更新

パッケージ 旧 新 範囲
vite 8.0.16 8.3.0 ~8.0.16 → ~8.3.0
@types/node 25.6.0 24.13.4 ^25.5.0 → ^24.13.4(.nvmrc = 24 と系列を揃える)
markuplint 4.18.1 5.0.0 ^4.18.1 → ^5.0.0
eslint 10.2.1 10.10.0 範囲内
stylelint 17.9.0 17.15.0 範囲内
prettier 3.8.3 3.9.6 範囲内
globals 17.5.0 17.12.0 範囲内
stylelint-config-recess-order 7.7.0 7.8.0 範囲内

markuplint 5 が推移的に持ち込む image-size@2.0.2 に高深刻度の advisory が 2 件(GHSA-w3rx-r6r6-pgpr / GHSA-5p2g-fcmc-qvqq)あるため、override に image-size: >=2.0.3 <3 を追加しました。上限は、消費者の @markuplint/rules が ^2.0.2 を宣言しており、上限なしだと将来の 3.x を強制しうるためです。

ビルド成果物の差分

旧依存に戻して再ビルドし、A/B で比較しました。

  • CSS 30065 → 30079 バイト。差分は半角スペース 14 個の挿入のみ(lightningcss 1.33.0 が var(--lightningcss-light,X)var(--lightningcss-dark,Y) の間に空白を入れるようになった)。整形して diff を取ると 0 行差で、意味は同一
  • JS 4494 → 4465 バイト。差分は minifier の等価変換 2 箇所(三項演算子の共通化、ド・モルガン変形)
  • pnpm preview の挙動は、生ソケットによる 15 ターゲットのプローブで従来と全件一致

markuplint 5 への移行

現行 config のまま v5 を走らせると error 0 / warning 37 件でした。内訳と対処:

件数 規則 対処
1 rule-deprecation required-attr → require-attr に改名(v5 で改名、v6 で旧名は削除)
29 performance/head-element-order(v5 の新規) 既定値を上書き。差は 1 点だけで、{ selector: 'meta', order: 'alphabetical', attr: 'name' } を素の 'meta' にした
7 a11y/wai-aria/presentational-children(v5 の新規) [aria-hidden="true"] に対して無効化する nodeRule を追加

いずれも v4 では出ていなかった指摘です(v4 + 旧 config では 3 ファイルとも passed)。

head-element-order の既定値は name 属性をソートキーにするため、property しか持たない og:* がキー空文字として全ての name 付き meta より前に要求され、description より前へ寄ります。twitter:* は name を持つので color-scheme / format-detection と混ざって散ります。結果として「基本 meta → OGP → Twitter」というまとまりが崩れるため、meta 群だけソース順に戻しました。charset → viewport → title → meta → link → style → script の保証は維持しています(<meta charset> を <title> の後ろへ動かすと警告が出ることを確認)。

理由はすべて config のコメントに書いてあります。「Use this template」でコピーされたリポジトリには履歴が付いてこないためです。

pnpm 設定の置き場

pnpm v11 は package.json の pnpm フィールドと .npmrc の pnpm 専用キーを読みません。現状のまま install 側を v11 に上げると override 6 件が警告 1 行だけ出して黙って外れ、対策済みの advisory が戻ります(--frozen-lockfile ではハードエラー)。

pnpm-workspace.yaml を新設して overrides と minimumReleaseAgeExclude を移しました。npm 利用者向けの package.json の overrides はミラーとして維持しています。

🔴 pnpm の下限が 10.5.1 に上がります

pnpm-workspace.yaml に packages: キーが無いため、pnpm 10.4.1 以前と pnpm 9 は ERROR packages field missing or empty で止まります。packages: を足すと install は通るようになりますが、その場合 overrides が黙って外れるため、回避策としては採れません。実測:

pnpm 結果
9.15.9 ERROR packages field missing or empty
10.4.1 同上
10.5.0 ERR_PNPM_UNSUPPORTED_ENGINE(engines.pnpm による。従来はここで override が黙って外れていた)
10.5.1 / 10.34.5 / 11.26.0 / 12.4.2 正常、override 保持

package.json に engines: { node: ">=24", pnpm: ">=10.5.1" } を宣言し、pnpm-workspace.yaml 冒頭・README・CODING_GUIDE にも明記しました。Node 24 以上は markuplint 5 の要求です。

CI は pnpm/action-setup の version: 10 が 10.34.5 に解決されるため影響を受けません。

除外リストの再生成

minimumReleaseAgeExclude は rolldown の依存閉包を列挙したものですが、rolldown は対象を dependencies と optionalDependencies の両方に持つため、従来のリストは @oxc-project/types(=0.149.0 の完全固定)を取りこぼしていました。依存閉包から再生成し、生成コマンドを CODING_GUIDE に載せて手作業での維持をやめました。

その他

  • vite.config.ts の __dirname 7 箇所を import.meta.dirname に置換。vite 8.3 が configLoader: 'native' で未対応として警告するようになったため
  • CODING_GUIDE の override 剪定 dry-run 手順に、実行環境を固定する指定を追加。minimum-release-age の有無で同じ手順が逆の結論を返すため
  • CODING_GUIDE に yarn では pin が効かないこと(yarn は resolutions)を追記
  • CONTRIBUTING のリリース手順に、依存更新リリースでは剪定 dry-run を回すステップを追加

確認

rm -rf node_modules から pnpm install --frozen-lockfile → pnpm dlx pnpm@11 audit --audit-level high(No known vulnerabilities found)→ pnpm run check(markuplint 0 problems)→ pnpm run build → tsc --noEmit がすべて exit 0。

CHANGELOG はリリース直前に一括で追記する運用のため、この PR では触っていません。

この PR に含めていないもの

  • override の剪定 — image-size 以外の 5 件(uuid / js-yaml / brace-expansion / fast-uri / postcss)は、dry-run で冗長と確認しました(override を全て外してゼロから解決 → pnpm audit 全レベル 0 件。実効性が残るのは js-yaml のみで、uuid はツリーに存在しない)。剪定は従来どおり専用 PR で行います
  • CI の pnpm マトリクス — 宣言した下限 10.5.1 を CI で保証する案。pnpm dlx pnpm@11 audit の回避策と併せて見直しが要るため別 PR
  • 型検査の CI ステップ — typescript はこのリポの依存に無く、check にも CI にも型検査がありません。この PR 以前からのギャップ

- vite 8.0.16 → 8.3.0(範囲を `~8.0.16` → `~8.3.0`)
- @types/node 25.6.0 → 24.13.4(範囲を `^25.5.0` → `^24.13.4`。.nvmrc = 24 と系列を揃える)
- markuplint 4.18.1 → 5.0.0
- eslint 10.2.1 → 10.10.0 / stylelint 17.9.0 → 17.15.0 / prettier 3.8.3 → 3.9.6
- globals 17.5.0 → 17.12.0 / stylelint-config-recess-order 7.7.0 → 7.8.0

markuplint 5 が推移的に持ち込む image-size 2.0.2 に高深刻度の advisory 2 件
(GHSA-w3rx-r6r6-pgpr / GHSA-5p2g-fcmc-qvqq)があるため、override に
`image-size: ">=2.0.3"` を追加して 2.0.4 に解決する。
- `required-attr` を `require-attr` へ改名(v5 で改名、v6 で旧名は削除)
- `performance/head-element-order`(v5 の markuplint:performance で新規有効化)の
  既定値は og:* を description より前に置くことを要求し、OGP / Twitter の
  まとまりを崩すため、meta 群を source order に戻した値で上書きする。
  charset → viewport → title → meta → link → style → script の保証は維持
- 装飾要素の `aria-hidden="true"` に対してのみ
  `no-aria-on-presentational-children` を無効化する nodeRules を追加
vite 8.3.0 が `configLoader: 'native'` で未対応の機能として `__dirname` を
警告するようになったため。build / preview の挙動は置換前と一致。
pnpm v11 は package.json の `pnpm` フィールドと .npmrc の pnpm 専用設定を
読まない。現状のまま install 側を v11 に上げると override 6 件が警告だけ出して
黙って外れ、対策済みの advisory が戻る。

- `pnpm.overrides` → `pnpm-workspace.yaml` の `overrides`
  (npm 利用者向けの package.json `overrides` はミラーとして維持)
- `.npmrc` の `minimum-release-age-exclude[]` → `minimumReleaseAgeExclude`
- CODING_GUIDE「脆弱性 pin」「剪定 policy」の記述を新しい置き場に合わせる

実測: pnpm 10.34.5 / 11.26.0 のどちらでも override が効き(image-size は 2.0.4 に解決)、
`minimumReleaseAgeExclude` は pnpm 10 でも pnpm-workspace.yaml から読まれる。
pnpm 11 は .npmrc の除外を読まない(`config get minimumReleaseAgeExclude` が undefined)。
lockfile に差分なし。
- pnpm-workspace.yaml: 要 pnpm 10.5.1 以降であることと、`packages:` を足して
  回避してはいけない理由を冒頭に明記。pnpm 10.4.1 以前 / pnpm 9 は
  `ERROR packages field missing or empty` で止まり、`packages:` を足すと
  install は通る代わりに overrides が黙って外れる(実測)
- package.json に `engines` を追加(node >=24 / pnpm >=10.5.1)。markuplint 5 が
  node >=24 を要求する。pnpm 10.5.0 はこの宣言で明示的に止まるようになった
  (従来は overrides が黙って外れていた)
- image-size の override に上限を付与(`>=2.0.3` → `>=2.0.3 <3`)。消費者の
  @markuplint/rules は `^2.0.2` を宣言しており、上限なしだと 3.x を強制しうる
- 直前のコミットで落ちた説明を復元: markuplint.config.cjs の viewport 免除の理由
  (require-attr の error 3 件を抑止している)、.npmrc の追加日と削除条件
- markuplint.config.cjs: head-element-order の上書きが既定値と 1 点だけ異なる
  ことと、その理由(og:* が name を持たず description より前に寄る)をコメント化。
  aria-hidden の免除は根拠(@markuplint/html-spec の summary の注記)を明示
- minimumReleaseAgeExclude を rolldown 1.2.8 の optionalDependencies と突き合わせ、
  `@rolldown/binding-android-arm-eabi` を追加し、存在しない
  `@rolldown/binding-wasm32-wasi` を削除。有効化時のみ効く旨も注記
- CODING_GUIDE: 剪定 dry-run の実行環境を固定する手順を追記(minimum-release-age
  の有無で同じ手順が逆の結論を返すため)。yarn では pin が効かないこと、
  markuplint 更新時に head-element-order の既定値を突き合わせることを追記
- CONTRIBUTING: 依存更新リリースでは剪定 dry-run を回す手順を追加
- README: Node / pnpm の下限を前提として明示
- pnpm-workspace.yaml: minimumReleaseAgeExclude に `@oxc-project/types` を追加。
  rolldown はこれを dependencies 側に `=0.149.0` と完全固定で持つため、
  optionalDependencies だけを見た従来のリストでは取りこぼしていた。
  対照実験で確認(リストに有れば解決、抜くと ERR_PNPM_NO_MATURE_MATCHING_VERSION)
- CODING_GUIDE に「pnpm 設定のメンテナンス」節を新設。除外リストは手で直さず
  依存閉包から再生成する。掲載コマンドの出力は現行リストと完全一致
- CODING_GUIDE の head-element-order 既定値の確認コマンドを、実際に動くものへ差し替え。
  `require('@markuplint/rules/...')` は root の依存ではなく ESM でもあるため解決できない。
  上流ソースの URL も併記
- CODING_GUIDE の剪定手順から、overrides を消す前に実行してしまう手順 0 のコマンド行を削除。
  環境を固定するのはフラグであって手順ではない
- markuplint.config.cjs: 「並び順に性能差は無い」の根拠として、規則自身が
  category: 'structure' を宣言していることを明記
rolldown の依存は現状いずれも自分の依存を持たないため今日時点では閉包と一致するが、
将来これが変わったら深さを見直す必要がある。
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying starter with  Cloudflare Pages  Cloudflare Pages

Latest commit: 02891cd
Status: ✅  Deploy successful!
Preview URL: https://01f4daa6.starter-20t.pages.dev
Branch Preview URL: https://chore-deps-v1-0-5.starter-20t.pages.dev

View logs

@shunei-web
shunei-web merged commit 01abcd5 into main Sep 16, 2026
2 checks passed
@shunei-web
shunei-web deleted the chore/deps-v1.0.5 branch September 16, 2026 07:17
shunei-web added a commit that referenced this pull request Sep 16, 2026
依存更新リリース (#267 / #268) で設定ファイルのコメントが増え、同じ事実が
最大 8 箇所に写っていた。正本を 1 つに決め、各設定ファイルはポインタに寄せる。
配布物の散文が約 46 行減る。src とビルド出力は変えていない。

## .npmrc (13 行 → 3 行)

コメントが「override と minimum-release-age の除外を 2026-04-23 に .npmrc へ
追加し 2026-09-16 に移設」と書いていたが、**override が .npmrc にあったことは
一度もない** (v1.0.4 の .npmrc は minimum-release-age-exclude[]= のみ。override は
package.json の pnpm.overrides にあった)。設定を 1 行も持たないファイルに残った
唯一の実質的な文が誤りだったので訂正する。

ファイル自体は残す。pnpm 11 は .npmrc の pnpm 専用キーを**警告を出さずに**無視し、
CI が使う pnpm 10 系は逆に honor するため、ここに pnpm 専用キーを書き戻す事故を
機械で検出する経路が 1 つも無い。人間向けの掲示が唯一の関門になる。

あわせて 2 点訂正:
- overrides は ini 形式の .npmrc では表現できず、pnpm がここから読んだことはない
  (起き得ない事故を警告していた) ので、列挙を minimumReleaseAge 系に絞った
- yarn berry は .npmrc を読まない (.yarnrc.yml) ので「npm / yarn / pnpm 共通」から
  yarn を外した

## pnpm-workspace.yaml (コメント 22 行 → 12 行)

- 「2026-04-23 追加」「2026-09-16 の vite 8.0→8.3 更新の時点では 1.2.5〜1.2.8 が
  7 日間隔」といった変更経緯と実測値を削除 (CODING_GUIDE「コメント方針」が
  コミットログ・PR に書くべきものとしている)
- 「rolldown は週次リリースで 3 日以内の版が入る」と「1.2.5〜1.2.8 が 7 日間隔」が
  3 行以内で食い違っていたので、「高頻度リリースのため」に抽象化した
- 「手作業だと dependencies と optionalDependencies を取りこぼす」理由は
  CODING_GUIDE に同内容があるので、ここは再生成のポインタだけにした
- image-size に、dry-run が「冗長」と出ても剪定しない理由を 1 行付けた
  (CODING_GUIDE から日付つきの該当リストを削る代わり)

残した: `ERROR packages field missing or empty` の逐語 / 「`packages:` を足して
回避するな」/「有効にしていない環境では no-op」/ npm 側 overrides とのミラー規定。
旧 pnpm で実際に出るのはこのエラーで、engines の案内は出ない。

## markuplint.config.cjs (コメント 25 行 → 11 行)

- head-element-order: 既定値を上書きした理由を 11 行 → 4 行に。「性能差は無い」
  ことの裏取り (規則自身が category: 'structure' を宣言している) は PR 本文へ移した
- aria-hidden の免除: 「src 内 7 箇所: ハンバーガーの空 span 3 / アコーディオンの
  装飾 svg 4」を削除。テンプレート利用者がサンプル HTML を書き換えた時点で腐る実数で、
  かつセレクタ自体は src 内 17 要素にマッチするため「7 箇所が対象」と誤読させる。
  「セレクタを狭めない理由」3 行も PR 本文へ移した

viewport.js の defer 免除のコメントは変更していない。設定 3 件のうち、外すと
markuplint が exit 1 になるのはこれだけ。

## ドキュメント

- CODING_GUIDE: pnpm 版数の「詳細は同ファイル冒頭」を同ドキュメント内の
  「脆弱性 pin」へ向け直した (設定ファイル → ガイドの一方向に揃える)
- CODING_GUIDE: 「2026-09-16 時点でこれに当たるのは image-size のみ」を削除し、
  日付に依存しない注意書きだけを直前の段落へ移した
- README: クイックスタートの pnpm 行が「でも可」と「推奨」を同時に言っていたので
  1 つの指示に直した
- CONTRIBUTING: markuplint を上げたリリースで既定値を突き合わせる手順を追加。
  この突き合わせは CI も npm run check も検出できないと CODING_GUIDE 自身が
  書いているのに、どこからも指されていなかった

## 確認

`npm run check` が exit 0 (markuplint 3 files / 0 problems)。
`pnpm install --frozen-lockfile` が exit 0 で lockfile に変化なし。
shunei-web added a commit that referenced this pull request Sep 16, 2026
依存更新 + markuplint 5 移行 + pnpm 設定の置き場の移動(#267)、冗長 override の剪定(#268)、設定ファイルのコメント剪定(#269)をまとめてリリースする。

CHANGELOG に [1.0.5] を追記し、link references を更新。package.json の version を 1.0.5 に。
あわせて、pnpm / Node の下限引き上げを patch に含める根拠として、SemVer の適用基準を CHANGELOG 冒頭に明記した。
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