From 650437e0536e870f5037a0f1344bcb6797eb377e Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 1 Nov 2026 07:58:48 +0000 Subject: [PATCH 01/10] docs: add the oxfmt migration plan Co-Authored-By: Claude Opus 5.5 --- .../2026-10-21/oxfmt-migration/plan.md | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 docs/dev-notes/2026-10-21/oxfmt-migration/plan.md diff --git a/docs/dev-notes/2026-10-21/oxfmt-migration/plan.md b/docs/dev-notes/2026-10-21/oxfmt-migration/plan.md new file mode 100644 index 000000000..67113fb94 --- /dev/null +++ b/docs/dev-notes/2026-10-21/oxfmt-migration/plan.md @@ -0,0 +1,128 @@ +# Prettier から oxfmt への移行(#2226) + +## 概要 + +[#2226](https://github.com/AtCoder-NoviSteps/AtCoderNoviSteps/issues/2226) の残りの作業として、formatter を Prettier から oxfmt に置き換える。 + +lint は今の構成を続ける。JS/TS は oxlint(#3309 で導入済み)、`.svelte` は ESLint(eslint-plugin-svelte)が担当する。 + +## 着手の前提 + +- oxfmt はまだ 0.x のベータ版。影響は整形の結果だけで、実行時の動作には及ばず、diff で確認でき、元に戻すのも簡単なので、ベータ版を受け入れるかをユーザーが判断してから着手する。 + +## 確認の結果(2026-11-01) + +staging(`aea72aa8`)を `git archive` したコピーで、`oxfmt@0.75.0`(2026-10-27 公開、latest)を使って確認した。repo 本体は変えていない。 + +### oxfmt の出力 + +- 設定: `oxfmt --migrate=prettier` で `.prettierrc` から `.oxfmtrc.json` を生成した。`prettier-plugin-svelte` の設定は `"svelte": {}` に、`.svelte` の parser 指定は `associations` に、`.prettierignore` は `ignorePatterns` に変換された。 +- `sortPackageJson` は `false` で出力された。oxfmt の既定は `true` なので、`false` のまま使う。 +- `.svelte`: 100ファイルすべてが Prettier と同じ結果。わざと整形を崩した `Footer.svelte` を検出したので、読み飛ばしてはいない。 +- Prettier との違いは3ファイル(と生成物1つ)だけ。 + - `.ts` 2ファイル(`src/features/workbooks/utils/workbook_tasks.ts`・`src/lib/contests/fixtures/contest_name_and_task_index.ts`): 1行に収まる union 型を、oxfmt は先頭に `|` を付けて1メンバー1行に分ける。 + - `docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md`: 段落の折り返し位置が違う。 + - `prisma/migrations/migration_lock.toml`: Prettier は TOML を整形しないが、oxfmt は整形する。Prisma の生成物なので対象外にする。 +- 2026-10-21 に Kit 3 の branch(`444e4daf`)と `oxfmt@0.74.0` で行った確認でも、同じ結果だった。 + +### oxfmt の CLI と設定 + +- ignore: `--ignore-path` が無ければ `.gitignore` と `.prettierignore` を読む。 +- ignore の対象のファイル(`prisma/ERD.md`)だけを渡すと、「Expected at least one target file」で exit 2 になる。`--no-error-on-unmatched-pattern` を付けると exit 0 になる。 +- 設定の schema には `sortTailwindcss`(prettier-plugin-tailwindcss と同じ並べ替え)・`sortImports`・`sortPackageJson`・`svelte`(`allowShorthand`・`indentScriptAndStyle`・`sortOrder`)がある。 +- `.svelte` の整形は既定で無効で、`svelte` の設定と、実行時の `svelte` package(`svelte/compiler`)が要る。`svelte` は devDependencies にある。 + +### 速さ + +同じツリーで、cache を使わずに測った。 + +| コマンド | 時間 | +| -------------------- | ----------- | +| `prettier --check .` | 4.0〜4.8 秒 | +| `oxfmt --check` | 0.72 秒 | +| `oxlint .` | 約0.1 秒 | +| `eslint .` | 1.6〜2.0 秒 | + +formatter だけで約6倍速く、`pnpm lint` 全体は約6秒から約2.6秒になる見込み。CI は pnpm の store だけを cache し、Prettier の cache は残らないので、毎回この差が出る。手元では `lint` の `--cache` が効くので、2回目以降の差はこれより小さい。 + +### lint と format の担当 + +- formatter と linter が食い違うのは、linter が整形のルールを持つ場合だけ。ESLint は整形のルールを `meta.type: "layout"` と分類する。 +- `src/routes/+page.svelte` に対して `ESLint#calculateConfigForFile` で有効なルールを数えると41個で、`problem` 23個・`suggestion` 18個・`layout` 0個だった(ESLint 10.14.0)。 +- oxlint は `.oxlintrc.json` で追加のカテゴリを有効にしておらず、`oxlint --rules` にインデント・行の長さ・改行などの整形のルールは無い。 +- 今は linter が整形を見ていないので、formatter を Prettier から oxfmt に変えても lint の結果とは衝突しない。 + +### oxlint の Svelte への対応 + +- oxlint 1.90.0(latest)の `oxlint --rules` に Svelte のルールは無く、Svelte 用の plugin のオプションも無い。 +- 公式の compatibility ページでも、Svelte のテンプレートの lint は未対応。言語 plugin の issue(oxc-project/oxc#23207)は open のままで、Svelte の実装は始まっていない。 + +### 既存の問題 + +- Prettier は `.prettierrc` を優先して読む(`prettier --find-config-path` で確認)。`prettier.config.js` の `prettier-plugin-tailwindcss` は使われておらず、Tailwind のクラスは並べ替えられていない。 +- `eslint-config-prettier` は devDependencies にあるが、`eslint.config.mjs` を含めてどこからも import されていない。 + +## 方針 + +- **整形は formatter だけが担当する:** ESLint・oxlint には `layout` のルール(`svelte/indent`・`svelte/html-quotes`・`svelte/max-attributes-per-line` など)を入れない。ルールを足すときは、そのルールの `meta.type` が `layout` でないことを確かめる。この方針を `AGENTS.md` に書く。 +- **出力は Prettier に揃える:** `--migrate=prettier` の設定をそのまま使い、`sortImports`・`sortPackageJson`・`sortTailwindcss` は有効にしない。違いの出る3ファイルは一度だけ整形し直す。 +- **一度に切り替える:** Prettier と oxfmt は2つの `.ts` で結果が違い、両方を同時に通すことはできない。script・lefthook・整形し直しを同じ PR で行う。 +- **Tailwind の並べ替えは別に決める:** 今も並べ替えは効いていないので、移行で挙動は変わらない。有効にすると多くのファイルのクラス順が変わり、formatter の変更の review と混ざる。 + +## 採らなかった案 + +- **ESLint も oxlint に置き換える:** oxlint は Svelte のテンプレートを lint できず、`.svelte` のテンプレートへのチェック(`svelte/require-each-key`・`svelte/no-navigation-without-resolve` など)が無くなる。 +- **`.svelte` だけ Prettier に残す:** formatter が2つになり、設定と ignore を二重に持つことになる。oxfmt は `.svelte` の100ファイルすべてで Prettier と同じ結果だったので、分ける理由が無い。 +- **Tailwind の並べ替えを同時に有効にする:** 「方針」のとおり、差分が大きく review が混ざる。 +- **`eslint-config-prettier` で衝突を防ぐ:** ESLint の整形のルールを無効にする config だが、今は整形のルールが0個で、そもそも import されていない。方針で防ぎ、依存は消す。 +- **`layout` のルールが無いことを自動で検査する:** 今は0個で、ルールを足すことは少ない。規約と review で十分。 + +## フェーズ + +### Phase 0: 直前の再確認 + +- [ ] oxfmt の latest を確かめ、「確認の結果」と同じ比較(`--migrate=prettier`、`--list-different`、`.svelte` を1つ崩して検出されるか、時間)をもう一度行う。違いが増えていたら、ここで止めて相談する。 +- [ ] oxfmt の版を決めて、exact で入れる(0.x の間は範囲指定にしない)。 + +### Phase 1: 切り替え + +- [ ] `oxfmt` を devDependencies に足し、`pnpm exec oxfmt --migrate=prettier` で `.oxfmtrc.json` を作る。`ignorePatterns` に `prisma/migrations/migration_lock.toml` を足す。 +- [ ] `package.json` の script を変える。`lint` の `prettier --check . --cache` は `oxfmt --check` にする。 + + ```json + "format": "oxfmt", + "lint": "oxfmt --check && oxlint . && eslint ." + ``` + +- [ ] `lefthook.yml` の format の job を `pnpm exec oxfmt --no-error-on-unmatched-pattern {staged_files}` にする。glob は今と同じ。ignore の対象のファイルだけが staged のときに失敗しないよう、`--no-error-on-unmatched-pattern` を付ける。 +- [ ] `pnpm format` を実行し、変わるのが「確認の結果」の3ファイルだけであることを確かめる。整形し直しは、設定の変更とは別の commit にする(`style: reformat with oxfmt`)。 +- 確認: `pnpm lint` が通る。`.svelte` を1つ崩すと `pnpm lint` が失敗する。lefthook の pre-commit で、staged の `.svelte` が整形される。 +- 設定と整形だけで分岐が無いので、テスト先行は省略する。 + +### Phase 2: Prettier の撤去 + +- [ ] devDependencies から `prettier`・`prettier-plugin-svelte`・`prettier-plugin-tailwindcss`・`eslint-config-prettier` を消す。 +- [ ] `.prettierrc`・`prettier.config.js`・`.prettierignore` を消す。ignore は `.oxfmtrc.json` の `ignorePatterns` と `.gitignore` で足りる。 +- [ ] repo 全体で `rg -ni prettier -g '!docs/dev-notes/**' -g '!pnpm-lock.yaml'` を実行し、残りが意図した記述だけであることを確かめる。 +- 確認: `pnpm install` 後に `pnpm lint`・`pnpm format` が通り、`pnpm format` で差分が出ない。 + +### Phase 3: エディターと docs + +- [ ] `.devcontainer/devcontainer.json` の `editor.defaultFormatter`(全体・言語ごと・`[svelte]` の `svelte.svelte-vscode`)を `oxc.oxc-vscode` に変え、`esbenp.prettier-vscode` を外す。この拡張機能は LSP で動き、npm で入れた oxfmt を使う。release notes によれば `.svelte` も oxfmt に渡す(oxc-vscode #111)。 +- [ ] `.devcontainer/init-firewall.sh` の `vscode_extension_publishers` に `oxc` を足し(CONTRIBUTING.md の規約)、`esbenp` を消す。`esbenp` は `prettier-vscode` だけの発行者で、許可先は最小限にする。 +- [ ] `AGENTS.md` の「Lefthook runs Prettier, …」を oxfmt にし、「整形は oxfmt だけが担当し、ESLint・oxlint には layout のルールを入れない」を足す。 +- [ ] `CONTRIBUTING.md` の Prettier の記述(ツールの一覧、拡張機能の例、`prettier --write` の説明)を更新する。 +- 確認: devcontainer を作り直し、`.ts`・`.svelte`・`.md` の保存時に整形される。 + +## 後で決めること + +- Tailwind のクラスの並べ替え: `sortTailwindcss` を有効にするかを別 PR で決める。有効にしない場合は、Phase 2 で `prettier.config.js` と一緒に plugin も消えるので、そのままでよい。 +- ESLint から oxlint への完全な移行: oxlint が Svelte のテンプレートの lint に対応したら、使っている41個のルールが揃うかを確かめて判断する。 +- oxfmt が 1.0 になったら、版の指定の仕方(exact か範囲か)を見直す。 + +## 確認限界 + +- 確認は devcontainer 上のコピーで行った。oxfmt はほぼ毎週更新されるので、Phase 0 でやり直す。 +- 拡張機能が `.svelte` を実際に整形するかは試していない(Phase 3 で確認)。 +- lefthook 経由の動作は試していない。`--no-error-on-unmatched-pattern` の挙動は、CLI に直接ファイルを渡して確かめた。 +- oxc.rs は dev container の firewall で取得できなかった。公式の情報は、npm の tarball の `--help`・`configuration_schema.json` と、検索で得た公式ページの内容で確かめた。 From 70166b3a8e28c8f080d558c5b619867356ed93c7 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 1 Nov 2026 07:59:47 +0000 Subject: [PATCH 02/10] build: switch the formatter from Prettier to oxfmt (#2226) Co-Authored-By: Claude Opus 5.5 --- .oxfmtrc.json | 34 ++++++++ lefthook.yml | 3 +- package.json | 5 +- pnpm-lock.yaml | 229 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 268 insertions(+), 3 deletions(-) create mode 100644 .oxfmtrc.json diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 000000000..ccc8bf60d --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,34 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "useTabs": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "printWidth": 100, + "sortPackageJson": false, + "svelte": {}, + "associations": [ + { + "files": ["*.svelte"], + "language": "svelte" + } + ], + "ignorePatterns": [ + ".DS_Store", + "node_modules", + "/build", + "/.svelte-kit", + "/package", + ".env", + ".env.*", + "!.env.example", + "/.pnpm-store", + "pnpm-lock.yaml", + "package-lock.json", + "yarn.lock", + "vite.config.js.timestamp-*", + "vite.config.ts.timestamp-*", + "prisma/ERD.md", + "prisma/migrations/migration_lock.toml" + ] +} diff --git a/lefthook.yml b/lefthook.yml index 7009dea10..a1a61ee44 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -4,7 +4,8 @@ pre-commit: parallel: true jobs: - name: format - run: pnpm exec prettier --write {staged_files} + # Without the flag, oxfmt exits 2 when every staged file is ignored (e.g. prisma/ERD.md) + run: pnpm exec oxfmt --no-error-on-unmatched-pattern {staged_files} glob: '**/*.{js,jsx,ts,tsx,md,svelte}' - name: oxlint diff --git a/package.json b/package.json index 6afc9c8a4..6ffc616ff 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "test": "npm run test:e2e && npm run test:unit", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --check . --cache && oxlint . && eslint .", - "format": "prettier --write .", + "lint": "oxfmt --check && oxlint . && eslint .", + "format": "oxfmt", "test:e2e": "playwright test", "test:unit": "vitest", "postinstall": "prisma generate", @@ -49,6 +49,7 @@ "jsdom": "30.1.3", "lefthook": "2.2.2", "nock": "15.0.5", + "oxfmt": "0.75.0", "oxlint": "1.90.0", "pnpm": "12.16.1", "prettier": "3.9.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4afc66ec..4b47eae15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -286,6 +286,9 @@ importers: nock: specifier: 15.0.5 version: 15.0.5(supports-color@7.2.0) + oxfmt: + specifier: 0.75.0 + version: 0.75.0(svelte@5.57.3(@typescript-eslint/types@8.72.1)) oxlint: specifier: 1.90.0 version: 1.90.0 @@ -751,6 +754,128 @@ packages: '@oxc-project/types@0.154.0': resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} + '@oxfmt/binding-android-arm-eabi@0.75.0': + resolution: {integrity: sha512-zHJ7LcTN46/5mtoLxsUu14pdF9ixFwDURtmxZ0CeNwqom5qB5NRVqU6o2GRZ7QPdNBW8G6j9UTJzQ+EDevMH0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.75.0': + resolution: {integrity: sha512-IdxsKZJvHZUvI7q6kLmzXdEFpFiBEDQw/WJtSp1QlzNXBw1JlLN3tY50WwWd4doPnq86XW4P+7BsQwu6meCW+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.75.0': + resolution: {integrity: sha512-vyiqZilO5jal/nXZ0143NyKcP6TkzjaQdVEWU/kwgyWqugAgIRgAbrnO3MOF+e6LkQu3CrtrkPoc3mrsZZY6cA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.75.0': + resolution: {integrity: sha512-oua7eVqVe769mDam6ORcavygxTzG3ovo5QRQ1kJCPaEbnWXPYhtAiYDj8pajVmFjO7j8Elf3gInnWpTX0LLYtg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.75.0': + resolution: {integrity: sha512-NWkbezhg7mx2Ep94g/TysR3c1bsISsU4lQ6t5xI4841PAk0Kqcn1+UEe+BoFH2/UK2YegPXq+OF+0bUcSvUalA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.75.0': + resolution: {integrity: sha512-CAHX87kJplTq2E0OWP7opG8gEVlHc7CeLEi4nMJOyx3psuqBKf84HZ3UIkX2guWEJ5UljU2zJF0o46XylywVVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.75.0': + resolution: {integrity: sha512-jmxYOiQzx2fp+OwQb7717K1zI8AMKEykw04sfr95/mU8SIL/oKgQq8nXH42sEznEquBL2RU7nLY36eBnYFT+vg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.75.0': + resolution: {integrity: sha512-eimaiAhx08dbOg12Fj3PYhymXY8vRbaiJB505vDXMy6ohne3Y1qTS0e5KEwFMq3LmDjEO+16BX38c/oXFI/SAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.75.0': + resolution: {integrity: sha512-bjSONIG1ba2xugr9oHQau0E6oPFYOMjPaa5hK/wpVC/Q1pcgf2BZMKwbuA8/cWzhWX5QV/UdPzD+rw1kQHpikQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.75.0': + resolution: {integrity: sha512-wDksWQXC/KZucISyqlhBtvpW+pyHh8z0Cjm6Qxiv22XlllM2Bx5gJGDnPYjV+H0lL+o1iqLlEli8jmBuRCLcjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.75.0': + resolution: {integrity: sha512-5JkNwViqaVuk4I+9+zgVrEYiHOAPXFxgDgP6iDnpdOBjm7XAHAOjSvolHZZAokWPx7CGOw8tKteXmn4WPIInaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.75.0': + resolution: {integrity: sha512-1EVqRIE0eZLB08j3ZCVN47Ors7LCXGmOI+3xJYgyoFUKUerD3Glxb+Q1Bp3lK8NeT5R3ZdS9uhX/wobNBYZ6jw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.75.0': + resolution: {integrity: sha512-UJWRVNT6Yuw4ssLv2BwaBUWU1GWtByE+EnoHu8I+P1t8Kn+WozYU5WYOqb5aj8gbXJJ8gGZt+w40Hi/7L6iVLw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.75.0': + resolution: {integrity: sha512-FHdvHhyz8ChBctBUvVGti49kSEwANd1PZQwlXUEoF9Ed4plxXxk/wWc0mfZmrze2lRgmME7ytDmVIOixYauQhg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.75.0': + resolution: {integrity: sha512-6MjtsF96s9mSBV0GEwUe4pOFPP2Mz7ahcHPAit0DSKL5fM6oMM7RG1zvYxwB7+SBkIxsWBRhhxuqmy7pibNwsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.75.0': + resolution: {integrity: sha512-1D6T6aL1Pj+U5GLxqwV1fKjUJ5+FFm+bn7UrqNDMveZmWs0jo/3vc+dzzuV/jF/FdVo12gowODk3SnAO2YOwLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.75.0': + resolution: {integrity: sha512-RX2eUmy7J/nM8+tnM3nzR8t1eqkwj1q8Kgo7beA+4DVgKYYHHyrEa3qEmthxw7Z+HqpCCEOWuoqa+jelo9/w2Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.75.0': + resolution: {integrity: sha512-UpKta0iSZmPLII0dYXYdbzdBTsGREUbSHLqgLdtKcqBvs40qjmUz+cgUcaU1smPx13DfbEG4XqnaSn5MoFN0og==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.75.0': + resolution: {integrity: sha512-pjiLiCk0QMCWxs0n5XiNU85YLAKA+wJxPjxlDVygmr4bP4glcfTU2nOpso5nR4Rdi2Pxv5YwakD4UE+eh7M0BQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxlint/binding-android-arm-eabi@1.90.0': resolution: {integrity: sha512-sgfalb1HuxYjiAa4wESZ626z1FGusqNcXYHyB5oIOEprS2sbPg0UYEfo83uF1GNG70DIfZxHkXuE6KFrlSdn8Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2423,6 +2548,22 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + oxfmt@0.75.0: + resolution: {integrity: sha512-/ZKvY5asfsVi9hdkOmRIumqOPu6kxlTgiJSZf54uq29kKew+Gu1FFAnEkGePyvLVW+MAYu41D6XggnzoElQzPw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@astrojs/compiler-rs': ^0.5.0 + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + '@astrojs/compiler-rs': + optional: true + svelte: + optional: true + vite-plus: + optional: true + oxlint@1.90.0: resolution: {integrity: sha512-RkTN9EmgIUpLuhNoLhO3OliMGJlvb3Dk7XVjBZnfoMCHrVpuz5ESd97klfiyYeV7XfA2lNLnDCPMkUI+Qw5How==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2825,6 +2966,10 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinypool@2.2.0: + resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.2.0: resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} @@ -3455,6 +3600,63 @@ snapshots: '@oxc-project/types@0.154.0': {} + '@oxfmt/binding-android-arm-eabi@0.75.0': + optional: true + + '@oxfmt/binding-android-arm64@0.75.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.75.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.75.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.75.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.75.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.75.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.75.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.75.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.75.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.75.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.75.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.75.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.75.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.75.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.75.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.75.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.75.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.75.0': + optional: true + '@oxlint/binding-android-arm-eabi@1.90.0': optional: true @@ -4998,6 +5200,31 @@ snapshots: outvariant@1.4.3: {} + oxfmt@0.75.0(svelte@5.57.3(@typescript-eslint/types@8.72.1)): + dependencies: + tinypool: 2.2.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.75.0 + '@oxfmt/binding-android-arm64': 0.75.0 + '@oxfmt/binding-darwin-arm64': 0.75.0 + '@oxfmt/binding-darwin-x64': 0.75.0 + '@oxfmt/binding-freebsd-x64': 0.75.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.75.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.75.0 + '@oxfmt/binding-linux-arm64-gnu': 0.75.0 + '@oxfmt/binding-linux-arm64-musl': 0.75.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.75.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.75.0 + '@oxfmt/binding-linux-riscv64-musl': 0.75.0 + '@oxfmt/binding-linux-s390x-gnu': 0.75.0 + '@oxfmt/binding-linux-x64-gnu': 0.75.0 + '@oxfmt/binding-linux-x64-musl': 0.75.0 + '@oxfmt/binding-openharmony-arm64': 0.75.0 + '@oxfmt/binding-win32-arm64-msvc': 0.75.0 + '@oxfmt/binding-win32-ia32-msvc': 0.75.0 + '@oxfmt/binding-win32-x64-msvc': 0.75.0 + svelte: 5.57.3(@typescript-eslint/types@8.72.1) + oxlint@1.90.0: optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.90.0 @@ -5379,6 +5606,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 + tinypool@2.2.0: {} + tinyrainbow@3.2.0: {} tldts-core@7.0.29: {} From 6f1d35523af937fee1ef5d0e8a8eded28b7a1365 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 1 Nov 2026 07:59:55 +0000 Subject: [PATCH 03/10] style: reformat with oxfmt (#2226) Co-Authored-By: Claude Opus 5.5 --- .../2026-03-27/atcoder-verified-voting/plan.md | 6 +++--- src/features/workbooks/utils/workbook_tasks.ts | 3 ++- .../contests/fixtures/contest_name_and_task_index.ts | 12 +++++++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md b/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md index 92372d3c2..be5a6d6c9 100644 --- a/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md +++ b/docs/dev-notes/2026-03-27/atcoder-verified-voting/plan.md @@ -509,9 +509,9 @@ return { `EDIT_PROFILE_PAGE` は `$lib/constants/navbar-links` からインポートし、`