/**
* シード(`scripts/seed-local-db.ts`)が `dwatch_local` 以外に書き込むことを
* 構造的に防ぐガード(指示書M 段階2-4)。
*
* ★参照用アカウントはSELECTのみなので実際には書き込みに失敗するが、
* 「失敗に頼らない」ためにコードでも止める★
* ★呼び出し側はエラーメッセージに DATABASE_URL の値を出さないこと★
* (CLAUDE.md §9.3。パスワードがログに残るため、この関数自身も受け取った url を返さない)
*/
export function isLocalDwatchDatabaseUrl(url: string): boolean {
let parsed: URL;
try {
parsed = new URL(url);
} catch {
return false;
}
const isLocalHost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
const databaseName = parsed.pathname.replace(/^\//, "");
return isLocalHost && databaseName === "dwatch_local";
}
/** ローカル `dwatch_local` を指していなければ例外を投げる */
export function assertLocalDwatchDatabaseUrl(url: string): void {
if (!isLocalDwatchDatabaseUrl(url)) {
throw new Error(
"[seed-local-db] DATABASE_URL がローカルの dwatch_local を指していません。" +
"書き込み先を間違えている可能性があるため中断しました。" +
"環境変数 DATABASE_URL(.env.local など)を確認してください(値はこのエラーには出しません)。"
);
}
}