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

Welcome to thesui Tech Blog!

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

8分
ClaudeCodeOpenTelemetryCloudflare

Claude Code で「さっきの続きやって」が一番高いのか確かめた

Claude Code の利用状況を Cloudflare D1 にためています。3 か月半ぶんのデータで、「1 時間以上あけて同じセッションに戻る最初の入力が一番高い」が自分の環境でも成り立つのかを確かめました。

記事を読む
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 を確かめている仕組みと、直し方をまとめます。

記事を読む

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, // 開発環境では有効、本番ビルドでは無視される
});