diff options
| -rw-r--r-- | src/components/Updates.astro | 20 | ||||
| -rw-r--r-- | src/content/docs/index.mdx | 2 | ||||
| -rw-r--r-- | src/data/updates.json | 354 | ||||
| -rw-r--r-- | src/plugins/updates.ts | 77 |
4 files changed, 274 insertions, 179 deletions
diff --git a/src/components/Updates.astro b/src/components/Updates.astro index 47278fe..9b6862d 100644 --- a/src/components/Updates.astro +++ b/src/components/Updates.astro @@ -1,7 +1,7 @@ --- import updates from "../data/updates.json"; -type Update = { date: string; title: string; url: string; group: string }; +type Update = { date: string; title: string; url: string; group: string; kind: "new" | "update" }; const initial = Number(Astro.props.limit ?? 5); const step = Number(Astro.props.step ?? 10); @@ -27,6 +27,9 @@ function toJapaneseDate(iso: string): string { {items.map((u, index) => ( <li hidden={index >= initial}> <time datetime={u.date}>{toJapaneseDate(u.date)}</time> + <span class:list={["updates-kind", u.kind === "update" ? "is-update" : "is-new"]}> + {u.kind === "update" ? "更新" : "新規"} + </span> {u.group && <span class="updates-group">{u.group}</span>} <a href={u.url}>{u.title}</a> </li> @@ -104,6 +107,21 @@ function toJapaneseDate(iso: string): string { font-variant-numeric: tabular-nums; flex-shrink: 0; } + .updates-kind { + font-size: 0.75rem; + border-radius: 3px; + padding: 0.05rem 0.35rem; + flex-shrink: 0; + } + /* 新規公開は目立たせ、更新は控えめにする */ + .updates-kind.is-new { + color: var(--sl-color-accent-high); + background: var(--sl-color-accent-low); + } + .updates-kind.is-update { + color: var(--sl-color-gray-2); + background: var(--sl-color-gray-6); + } .updates-group { font-size: 0.75rem; color: var(--sl-color-gray-2); diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 737eeee..3894a0a 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -205,7 +205,7 @@ import Updates from '@/components/Updates.astro'; ## <span style="text-align:center;display:block">更新情報</span> -直近の更新です(最新5件)。 +直近の更新です(最新5件)。「新規」は新しく公開したページ、「更新」は既存のページを更新したものです。 「次へ」を押すと、それ以前の更新を10件ずつ表示します。 diff --git a/src/data/updates.json b/src/data/updates.json index 09db92a..62b548e 100644 --- a/src/data/updates.json +++ b/src/data/updates.json @@ -1,242 +1,282 @@ [ { + "title": "請願第19号の審査(令和8年8月26日 厚生委員会)", + "url": "/iinkai/r8d/1-seigan19/", + "group": "", "date": "2026-09-22", - "title": "いじめ重大事態対応フロー図", - "url": "/ijime-judai-jitai/flow/", - "group": "" + "kind": "update" }, { - "date": "2026-09-20", - "title": "湖南衛生組合の議員報酬・給与見直しの軌跡", - "url": "/konan-eisei-kumiai/", - "group": "" + "title": "いじめ重大事態への対応の軌跡", + "url": "/ijime-judai-jitai/", + "group": "", + "date": "2026-09-22", + "kind": "update" }, { - "date": "2026-09-19", - "title": "メディア掲載", - "url": "/media/", - "group": "" + "title": "いじめ重大事態対応フロー図", + "url": "/ijime-judai-jitai/flow/", + "group": "", + "date": "2026-09-22", + "kind": "new" }, { - "date": "2026-09-18", - "title": "請願第19号の審査(令和8年8月26日 厚生委員会)", - "url": "/iinkai/r8d/1-seigan19/", - "group": "" + "title": "(1)市はときわ会虐待通報職員の解雇撤回・和解を事実確認せよ", + "url": "/ippan-situmon/r7d/3gatu/1-tokiwakai-gyakutaigosoku-wakai/", + "group": "令和7年3月定例会", + "date": "2026-09-22", + "kind": "update" }, { - "date": "2026-09-15", - "title": "(1)管理不全ごみ集積所の現状と、善意の清掃支援について", - "url": "/ippan-situmon/r8d/9gatu/1-gomi-syusekisyo-kanri-furyo/", - "group": "令和8年9月定例会" + "title": "(4)スクールカウンセラー出勤簿の廃棄と守秘義務等について", + "url": "/ippan-situmon/r8d/9gatu/4-school-counselor-shukkinbo-haiki/", + "group": "令和8年9月定例会", + "date": "2026-09-22", + "kind": "update" }, { - "date": "2026-09-15", - "title": "(2)従業員に未払い賃金の計算をさせる社会福祉法人を許す小平市", - "url": "/ippan-situmon/r8d/9gatu/2-mibarai-chingin-keisan-marunage/", - "group": "令和8年9月定例会" + "title": "実績", + "url": "/jisseki/", + "group": "", + "date": "2026-09-22", + "kind": "update" }, { - "date": "2026-09-15", - "title": "(3)いじめ対策委員会記録がほぼ皆無だった件に絡む矛盾について", - "url": "/ippan-situmon/r8d/9gatu/3-ijime-taisaku-kiroku-mujun/", - "group": "令和8年9月定例会" + "title": "湖南衛生組合の議員報酬・給与見直しの軌跡", + "url": "/konan-eisei-kumiai/", + "group": "", + "date": "2026-09-22", + "kind": "update" }, { - "date": "2026-09-15", - "title": "(4)スクールカウンセラー出勤簿の廃棄と守秘義務等について", - "url": "/ippan-situmon/r8d/9gatu/4-school-counselor-shukkinbo-haiki/", - "group": "令和8年9月定例会" + "title": "メディア掲載", + "url": "/media/", + "group": "", + "date": "2026-09-22", + "kind": "update" }, { - "date": "2026-07-02", - "title": "(1)公文書改ざん疑いに関する新事実と、様々な問題について", - "url": "/ippan-situmon/r8d/6gatu/1-koubunsyo-kaizan-utagai/", - "group": "令和8年6月定例会" + "title": "自閉症・情緒障害特別支援学級(情緒固定級)とは", + "url": "/about-dyslexia/emotional-support-class/", + "group": "", + "date": "2026-09-21", + "kind": "update" }, { - "date": "2026-07-02", - "title": "(2)学校いじめ対策委員会の記録がほぼ皆無だった件について", - "url": "/ippan-situmon/r8d/6gatu/2-ijime-taisaku-iinkai-kiroku-kaimu/", - "group": "令和8年6月定例会" + "title": "(1)小平市内の事業者でできることを第一に考えよ", + "url": "/ippan-situmon/r2d/12gatu/1-kodaira-first/", + "group": "令和2年12月定例会", + "date": "2026-09-21", + "kind": "update" }, { - "date": "2026-07-02", - "title": "(3)開示文書に見られる差異と新たな改ざん疑いについて", - "url": "/ippan-situmon/r8d/6gatu/3-kaiji-bunsyo-sai-kaizan-utagai/", - "group": "令和8年6月定例会" + "title": "(3)公共トイレの重要性を認識し、協力店事業を行ってはどうか", + "url": "/ippan-situmon/r3d/12gatu/3-kokyo-toire-kyouryokuten/", + "group": "令和3年12月定例会", + "date": "2026-09-21", + "kind": "update" }, { - "date": "2026-07-02", - "title": "(4)いじめ重大事態の対応遅れと再調査について", - "url": "/ippan-situmon/r8d/6gatu/4-ijime-judai-jitai-taiou-okure/", - "group": "令和8年6月定例会" + "title": "(2)東京サレジオ学園北側の大規模開発について", + "url": "/ippan-situmon/r4d/9gatu/2-tokyo-saresio-kaihatu/", + "group": "令和4年9月定例会", + "date": "2026-09-21", + "kind": "update" + }, + { + "title": "(3)いじめ対策委員会記録がほぼ皆無だった件に絡む矛盾について", + "url": "/ippan-situmon/r8d/9gatu/3-ijime-taisaku-kiroku-mujun/", + "group": "令和8年9月定例会", + "date": "2026-09-21", + "kind": "update" }, { - "date": "2026-06-30", - "title": "textlintで文章校正する方法", - "url": "/textlint-guide/", - "group": "" + "title": "湖南衛生組合の議員報酬・給与見直しの軌跡", + "url": "/konan-eisei-kumiai/", + "group": "", + "date": "2026-09-20", + "kind": "new" }, { - "date": "2026-06-19", - "title": "誰も見過ごさないためのアセスメント", - "url": "/about-dyslexia/assessment/", - "group": "" + "title": "(1)管理不全ごみ集積所の現状と、善意の清掃支援について", + "url": "/ippan-situmon/r8d/9gatu/1-gomi-syusekisyo-kanri-furyo/", + "group": "令和8年9月定例会", + "date": "2026-09-19", + "kind": "update" }, { - "date": "2026-06-19", - "title": "ディスレクシアの著名人", - "url": "/about-dyslexia/celebrities/", - "group": "" + "title": "(2)従業員に未払い賃金の計算をさせる社会福祉法人を許す小平市", + "url": "/ippan-situmon/r8d/9gatu/2-mibarai-chingin-keisan-marunage/", + "group": "令和8年9月定例会", + "date": "2026-09-19", + "kind": "update" }, { - "date": "2026-06-19", - "title": "デイジー教科書と音声教材", - "url": "/about-dyslexia/daisy-and-onsei/", - "group": "" + "title": "メディア掲載", + "url": "/media/", + "group": "", + "date": "2026-09-19", + "kind": "new" }, { - "date": "2026-06-19", - "title": "自閉症・情緒障害特別支援学級(情緒固定級)とは", - "url": "/about-dyslexia/emotional-support-class/", - "group": "" + "title": "請願第19号の審査(令和8年8月26日 厚生委員会)", + "url": "/iinkai/r8d/1-seigan19/", + "group": "", + "date": "2026-09-18", + "kind": "new" }, { - "date": "2026-06-19", - "title": "チャレンジスクール・エンカレッジスクール", - "url": "/about-dyslexia/high-school-options/", - "group": "" + "title": "(1)管理不全ごみ集積所の現状と、善意の清掃支援について", + "url": "/ippan-situmon/r8d/9gatu/1-gomi-syusekisyo-kanri-furyo/", + "group": "令和8年9月定例会", + "date": "2026-09-15", + "kind": "new" }, { - "date": "2026-06-19", - "title": "小平市の状況", - "url": "/about-dyslexia/kodaira/", - "group": "" + "title": "(2)従業員に未払い賃金の計算をさせる社会福祉法人を許す小平市", + "url": "/ippan-situmon/r8d/9gatu/2-mibarai-chingin-keisan-marunage/", + "group": "令和8年9月定例会", + "date": "2026-09-15", + "kind": "new" }, { - "date": "2026-06-19", - "title": "潜在的人数と文部科学省調査", - "url": "/about-dyslexia/potential-number/", - "group": "" + "title": "(3)いじめ対策委員会記録がほぼ皆無だった件に絡む矛盾について", + "url": "/ippan-situmon/r8d/9gatu/3-ijime-taisaku-kiroku-mujun/", + "group": "令和8年9月定例会", + "date": "2026-09-15", + "kind": "new" }, { - "date": "2026-06-19", - "title": "合理的配慮と関連法律", - "url": "/about-dyslexia/reasonable-accommodation/", - "group": "" + "title": "(4)スクールカウンセラー出勤簿の廃棄と守秘義務等について", + "url": "/ippan-situmon/r8d/9gatu/4-school-counselor-shukkinbo-haiki/", + "group": "令和8年9月定例会", + "date": "2026-09-15", + "kind": "new" }, { - "date": "2026-06-19", - "title": "就学相談・通級指導について", - "url": "/about-dyslexia/school-consultation/", - "group": "" + "title": "(1)公文書改ざん疑いに関する新事実と、様々な問題について", + "url": "/ippan-situmon/r8d/6gatu/1-koubunsyo-kaizan-utagai/", + "group": "令和8年6月定例会", + "date": "2026-07-07", + "kind": "update" }, { - "date": "2026-06-19", - "title": "支援リソース・参考情報", - "url": "/about-dyslexia/support-resources/", - "group": "" + "title": "自閉症・情緒障害特別支援学級(情緒固定級)の軌跡", + "url": "/joutyo-koteikyu/", + "group": "", + "date": "2026-07-07", + "kind": "update" }, { - "date": "2026-06-19", - "title": "長期欠席児童・生徒支援シート", - "url": "/about-dyslexia/support-sheet/", - "group": "" + "title": "(2)教育委員会の不正対応と、市組織としての自浄機能の必要性", + "url": "/ippan-situmon/r6d/12gatu/2-kyouiku-iinkai-husei-taiou-zijyou-kinou/", + "group": "令和6年12月定例会", + "date": "2026-07-06", + "kind": "update" }, { - "date": "2026-06-19", - "title": "本人や保護者の声", - "url": "/about-dyslexia/voices/", - "group": "" + "title": "(2)学校いじめ対策委員会の記録がほぼ皆無だった件について", + "url": "/ippan-situmon/r8d/6gatu/2-ijime-taisaku-iinkai-kiroku-kaimu/", + "group": "令和8年6月定例会", + "date": "2026-07-06", + "kind": "update" }, { - "date": "2026-06-19", - "title": "ディスレクシアとは", - "url": "/about-dyslexia/what-is-dyslexia/", - "group": "" + "title": "(3)開示文書に見られる差異と新たな改ざん疑いについて", + "url": "/ippan-situmon/r8d/6gatu/3-kaiji-bunsyo-sai-kaizan-utagai/", + "group": "令和8年6月定例会", + "date": "2026-07-06", + "kind": "update" }, { - "date": "2026-06-19", - "title": "合気公園(旧佐川邸公園)の軌跡", - "url": "/aiki-kouen/", - "group": "" + "title": "(4)いじめ重大事態の対応遅れと再調査について", + "url": "/ippan-situmon/r8d/6gatu/4-ijime-judai-jitai-taiou-okure/", + "group": "令和8年6月定例会", + "date": "2026-07-06", + "kind": "update" }, { - "date": "2026-06-19", - "title": "ディスレクシア(読み書き障害)対応の軌跡", - "url": "/dislexia-taiou/", - "group": "" + "title": "(1)進学先へいじめ情報引き継がれず再発、教育長答弁と真逆だが", + "url": "/ippan-situmon/r6d/6gatu/1-singakusaki-ijime-jouhou-hikitugarezu-saihatu/", + "group": "令和6年6月定例会", + "date": "2026-07-05", + "kind": "update" }, { - "date": "2026-06-19", - "title": "障害者福祉施設における虐待通報対応の軌跡", - "url": "/fukushi-shisetsu-gyakutai/", - "group": "" + "title": "(2)疑問だらけのいじめ重大事態調査報告書が公表されたが", + "url": "/ippan-situmon/r6d/6gatu/2-gimon-darake-ijime-judai-jitai-houkokusyo/", + "group": "令和6年6月定例会", + "date": "2026-07-05", + "kind": "update" }, { - "date": "2026-06-19", - "title": "いじめ重大事態への対応の軌跡", - "url": "/ijime-judai-jitai/", - "group": "" + "title": "(3)いじめ重大事態調査に時間がかかれば新たな問題が生じる", + "url": "/ippan-situmon/r6d/6gatu/3-ijime-judai-tyousa-jikan-kakeruto-aratana-mondai/", + "group": "令和6年6月定例会", + "date": "2026-07-05", + "kind": "update" }, { - "date": "2026-06-19", - "title": "(1)ふるさと納税の健全な活用と、指定寄附制度の拡充で市民参加の推進を", - "url": "/ippan-situmon/r1d/12gatu/1-furusato-nouzei-kakuju/", - "group": "令和元年12月定例会" + "title": "(4)事実捏造が起きた件と、改ざんの疑い等について", + "url": "/ippan-situmon/r6d/6gatu/4-jijitu-netuzou-kaizan-tou/", + "group": "令和6年6月定例会", + "date": "2026-07-05", + "kind": "update" }, { - "date": "2026-06-19", - "title": "(2)巨費を投じるごみ処理施設の、より丁寧な情報提供等を", - "url": "/ippan-situmon/r1d/12gatu/2-gomi-sisetu-jouhou/", - "group": "令和元年12月定例会" + "title": "(1)公文書管理の様々な問題について", + "url": "/ippan-situmon/r7d/12gatu/1-koubunsyo-kanri/", + "group": "令和7年12月定例会", + "date": "2026-07-04", + "kind": "update" }, { - "date": "2026-06-19", - "title": "(1)ディスレクシアの子どもをひとりも見過ごさず成長できる環境整備を、いますぐに", - "url": "/ippan-situmon/r1d/3gatu/1-dyslexia-kankyo/", - "group": "令和元年3月定例会" + "title": "(2)いじめ重大事態調査報告書作成費用の予算計上経緯について", + "url": "/ippan-situmon/r7d/12gatu/2-ijime-judai-yosan/", + "group": "令和7年12月定例会", + "date": "2026-07-04", + "kind": "update" }, { - "date": "2026-06-19", - "title": "(2)人口推計のひとり歩きを防ぐため、より科学的な提示を", - "url": "/ippan-situmon/r1d/3gatu/2-jinkou-suikei-kagaku/", - "group": "令和元年3月定例会" + "title": "(3)入札不調が続いた後の随意契約について", + "url": "/ippan-situmon/r7d/12gatu/3-nyusatsu-hutyou-zuii-keiyaku/", + "group": "令和7年12月定例会", + "date": "2026-07-04", + "kind": "update" }, { - "date": "2026-06-19", "title": "(1)市議会議員選挙の投票率向上に向けて", "url": "/ippan-situmon/r1d/6gatu/1-touhyouritu-koujou/", - "group": "令和元年6月定例会" + "group": "令和元年6月定例会", + "date": "2026-07-03", + "kind": "update" }, { - "date": "2026-06-19", "title": "(2)小平市の顔ともいえるホームページで市民参加・協働の推進を", "url": "/ippan-situmon/r1d/6gatu/2-homepage-siminsanka/", - "group": "令和元年6月定例会" - }, - { - "date": "2026-06-19", - "title": "土地取引、土地利用における条例軽視は、まちづくりの根幹を揺るがす大問題", - "url": "/ippan-situmon/r1d/9gatu/1-tochi-jourei-keisi/", - "group": "令和元年9月定例会" + "group": "令和元年6月定例会", + "date": "2026-07-03", + "kind": "update" }, { - "date": "2026-06-19", - "title": "(1)小平市内の事業者でできることを第一に考えよ", - "url": "/ippan-situmon/r2d/12gatu/1-kodaira-first/", - "group": "令和2年12月定例会" + "title": "ディスレクシア(読み書き障害)対応の軌跡", + "url": "/dislexia-taiou/", + "group": "", + "date": "2026-07-02", + "kind": "update" }, { - "date": "2026-06-19", - "title": "(2)公共施設予約システム改修の内容は", - "url": "/ippan-situmon/r2d/12gatu/2-koukyou-sisetu-naiyou/", - "group": "令和2年12月定例会" + "title": "障害者福祉施設における虐待通報対応の軌跡", + "url": "/fukushi-shisetsu-gyakutai/", + "group": "", + "date": "2026-07-02", + "kind": "update" }, { - "date": "2026-06-19", - "title": "(3)市内の歴史的人物を発掘し、まちに物語を持たせよう", - "url": "/ippan-situmon/r2d/12gatu/3-machi-story/", - "group": "令和2年12月定例会" + "title": "(1)公文書改ざん疑いに関する新事実と、様々な問題について", + "url": "/ippan-situmon/r8d/6gatu/1-koubunsyo-kaizan-utagai/", + "group": "令和8年6月定例会", + "date": "2026-07-02", + "kind": "new" } ] diff --git a/src/plugins/updates.ts b/src/plugins/updates.ts index 4b383c8..6078cd1 100644 --- a/src/plugins/updates.ts +++ b/src/plugins/updates.ts @@ -4,34 +4,65 @@ import { readFileSync, writeFileSync, mkdirSync } from "node:fs"; /** * ホームページの「更新情報」をビルド時に生成する。 * - * git の履歴から「新しく公開したページ」だけを拾い(--diff-filter=A)、 - * そのページのフロントマターの title と URL を組みにして src/data/updates.json に書き出す。 - * 加筆や内部の修正は拾わないので、一覧が作業ログで埋まらない。 + * git の履歴から、ページごとに次の2つを調べて、イベントとして書き出す。 + * 新規: そのページが追加されたコミットの日付 + * 更新: そのページを最後に変更したコミットの日付(追加より新しい場合だけ) + * ただし、一度に多くのファイルを変更したコミット(表記の一括修正、画像の整理など)は + * 「更新」とはみなさない。作業ログで一覧が埋まらないようにするため。 * * 生成結果はコミットしておく(git の履歴がない環境でもビルドできるように)。 */ +const BULK_FILES = 5; // これを超える数のファイルを変更したコミットは一括修正とみなす + +type Item = { + date: string; + title: string; + url: string; + group: string; + kind: "new" | "update"; +}; + +type Commit = { date: string; files: { status: string; path: string }[] }; + export default function updatesIntegration() { return { name: "build-updates", hooks: { "astro:config:setup": () => { - const items: { date: string; title: string; url: string; group: string }[] = []; + const items: Item[] = []; try { const out = execSync( - 'git log --diff-filter=A --name-only --date=short --format="%x01%ad" -- src/content/docs', + 'git log --no-merges --date=short --format="%x01%ad" --name-status', { encoding: "utf-8", maxBuffer: 64 * 1024 * 1024 }, ); - // 新しく追加されたファイル → そのコミットの日付(git log は新しい順なので最初の出現が追加時) - const added = new Map<string, string>(); - let date = ""; + + // 新しい順のコミットを、日付と変更ファイルの一覧に組み直す + const commits: Commit[] = []; + let cur: Commit | null = null; for (const line of out.split("\n")) { if (line.startsWith("\u0001")) { - date = line.slice(1).trim(); + cur = { date: line.slice(1).trim(), files: [] }; + commits.push(cur); continue; } - const file = line.trim(); - if (!file.endsWith(".mdx") || file.endsWith("/index.mdx")) continue; - if (!added.has(file)) added.set(file, date); + if (!line.trim() || !cur) continue; + const parts = line.split("\t"); + const status = parts[0][0]; + if (status === "R" || status === "C") continue; // リネーム・コピーは対象外 + cur.files.push({ status, path: parts[parts.length - 1] }); + } + + const added = new Map<string, string>(); // 追加されたコミットの日付(新しい順なので最初のAが追加時) + const modified = new Map<string, string>(); // 最後に変更された日付(一括修正は除く) + for (const c of commits) { + // 一括修正かどうかは、そのコミットが変更した全ファイルの数で判定する + const bulk = c.files.length > BULK_FILES; + for (const f of c.files) { + if (!f.path.startsWith("src/content/docs/")) continue; + if (!f.path.endsWith(".mdx") || f.path.endsWith("/index.mdx")) continue; + if (f.status === "A" && !added.has(f.path)) added.set(f.path, c.date); + if (!bulk && !modified.has(f.path)) modified.set(f.path, c.date); + } } const reiwa = (dir: string) => { @@ -39,7 +70,8 @@ export default function updatesIntegration() { return n === 1 ? "令和元年" : `令和${n}年`; }; - for (const [file, d] of added) { + for (const [file, addDate] of added) { + const modDate = modified.get(file) ?? ""; try { const src = readFileSync(file, "utf-8"); // 下書き(draft: true)は本番に出ないので除外する @@ -50,26 +82,31 @@ export default function updatesIntegration() { const slug = file .replace(/^src\/content\/docs\//, "") .replace(/\.mdx$/, ""); - const url = `/${slug}/`; let group = ""; const mm = slug.match(/^ippan-situmon\/(r\d+d)\/(\d+)gatu\//); if (mm) group = `${reiwa(mm[1])}${mm[2]}月定例会`; - items.push({ date: d, title: m[1], url, group }); + const base = { title: m[1], url: `/${slug}/`, group }; + // 追加より後に更新があれば、更新のイベントも出す + if (modDate > addDate) { + items.push({ ...base, date: modDate, kind: "update" }); + } + items.push({ ...base, date: addDate, kind: "new" }); } catch { // 追加後に改名・削除されたファイルは飛ばす } } - items.sort((a, b) => b.date.localeCompare(a.date)); + items.sort( + (a, b) => b.date.localeCompare(a.date) || a.url.localeCompare(b.url), + ); } catch (e) { console.warn("[updates] git から取得できませんでした:", (e as Error).message); } try { mkdirSync("src/data", { recursive: true }); - writeFileSync( - "src/data/updates.json", - JSON.stringify(items.slice(0, 40), null, 2) + "\n", + writeFileSync("src/data/updates.json", JSON.stringify(items.slice(0, 40), null, 2) + "\n"); + console.log( + `[updates] ${items.length}件のうち直近${Math.min(items.length, 40)}件を書き出しました`, ); - console.log(`[updates] ${items.length}件のうち直近${Math.min(items.length, 40)}件を書き出しました`); } catch (e) { console.warn("[updates] 書き出しに失敗しました:", (e as Error).message); } |
