Open9
supabase CLIのtype generationをC#でもやりたい
Supbase CLIにはTypeScriptの型情報を生成する機能があって、結構便利
これがあるとtype-safeにClientからDBにアクセスできるようになる
SupbaseのSDKのうち、C#はコミュニティによる提供であり、実際JS SDKと比べると機能性は劣る
かつ、CLIではC#のコード生成はできないので、自分でDBスキーマに対応するクラスを定義する必要がある
これをいい感じにできないかなぁというのが今回の話題
実装案としては、実際TSコードは生成できるので
TSコードを解析して、それをもとにC#のコード生成をすればよいかなぁという感じ
これをTypeScriptかC#で実装したい
TSのコード解析は自前実装はきついので、TS Compiler APIかC#でパーサがあればよかったけど
後者は良さげなものが見つからなかったので、CompilerAPIがいいかなぁ
C#のコード生成は、単純なクラス生成だったら自前でできそうだよねっていう雰囲気
どうやら、TSコード生成をするには
Supabase Management APIをたたけばいいらしい
こんな感じにTSコードを実行したら、普通にコードが生成された
import { writeFile } from "node:fs";
async function main() {
const baseUrl = "https://api.supabase.com";
const projectRef = "{project id}";
const url = `${baseUrl}/v1/projects/${projectRef}/types/typescript`;
const res = await fetch(url, {
method: "GET",
headers: {
"Authorization": "Bearer {PAT}",
},
// body: JSON.stringify({
// included_schemas: "public",
// }),
}).then((r) => r.json()) as { types: string };
console.log(res.types);
await writeFile("./types.d.ts", res.types, () => {});
}
await main();
ただ、生成されたTSコードの課題点があって
- CompilerAPIを使ってASTを作って解析しなければいけない
- 数値型がnumberになってしまい、int, floatに復元できない
- プライマリキーがわからない
ManagementAPIの他のエンドポイントを見ると、deprecatedだけどスキーマ定義がJSONで帰ってくるやつがあった
これでいいな?になったな
けっこうたくさんの情報が入ってるけど、スキーマ情報があるのがわかる
そしたら、このJSONからテーブル名とカラム、型、コメントなどを取得して
RoslynAPIでC#のコード生成するのがいいかなぁ