メインコンテンツへスキップ
ブログサイトのロゴsui Tech Blog

Welcome to thesui Tech Blog!

日々の開発で得た知見や、実験的な実装を記録する技術ブログです。
TypeScript に関する記事が中心です。

8分
CloudflareWorkersBunCI

Cloudflare Workers Builds のビルド変数は、ダッシュボードから設定しても非本番ブランチには入らない

Bun 1.4 で bun.lock の形式が 2 に上がり、Cloudflare Workers Builds の非本番ブランチのビルドだけが止まりました。ビルド環境の Bun が古いことが原因でしたが、ダッシュボードで BUN_VERSION を設定しても直りません。ビルド設定が本番とプレビューの 2 つのトリガーに分かれて保存されている仕組みと、REST API での修正手順を紹介します。

記事を読む
5分
CloudflareWorkersTypeScriptJavaScript

Cloudflare Workers で fetcher = fetch と書くと Illegal invocation になる

テストのために fetch を差し替えられるクラスを書いたところ、ローカルでは動くのに Cloudflare Workers 上でだけ Illegal invocation で失敗しました。8 通りの呼び出し方を試してエラーになる条件を切り分け、workerd が this を確かめている仕組みと、直し方をまとめます。

記事を読む
5分
GitHubActionspnpm

pnpm のセットアップに 7 分かかっていたので pnpm/setup へ移行した

GitHub Actions で pnpm v11 を pnpm/action-setup で入れていたら、セットアップ step だけで 7 分かかっていました。pnpm v11 以降で使える pnpm/setup へ差し替える手順と、移行時に引っかかる pnpm install の扱い、pnpm v10 以前が対象外である点までを紹介します。

記事を読む

Cloudflare Workers Static Assets は not_found_handling 未設定だと 404 レスポンスに Content-Type が付かない。"not_found_handling": "404-page" を明示することで 404.htmltext/html として配信され、iOS のダウンロードダイアログも解消される。

Playwright で特定のセレクタを待つ場合、page.waitForSelector()非推奨 (discouraged) とされており、代わりに locator.waitFor() を使用することが公式に推奨されています。

// 🤔
await page.waitForSelector('#order-sent');
 
// ☺️
const orderSent = page.locator('#order-sent');
await orderSent.waitFor();

Claude Code の出力で、スキル実行時は必ず Skill ツールが存在し、その後続メッセージとして isMeta: true プロパティが付与される。
skills を利用するように指示したのに isMeta プロパティがない場合、処理を停止するような Hooks の作成も検討できる。

Astro v5 のプリレンダリングされたエンドポイントでは、カスタム Response ヘッダーが本番ビルド時に無視される仕様がある。開発環境では以下のコードで正常に動作するが、本番ビルドでは charset=utf-8 が削除され、日本語が文字化けする。

const headers = new Headers({
  'Content-Type': 'text/markdown; charset=utf-8',
});
return new Response(body, {
  status: 200,
  headers, // 開発環境では有効、本番ビルドでは無視される
});