Open9

supabase CLIのtype generationをC#でもやりたい

にー兄さんにー兄さん

Supbase CLIにはTypeScriptの型情報を生成する機能があって、結構便利
これがあるとtype-safeにClientからDBにアクセスできるようになる

https://supabase.com/docs/guides/api/rest/generating-types

SupbaseのSDKのうち、C#はコミュニティによる提供であり、実際JS SDKと比べると機能性は劣る
かつ、CLIではC#のコード生成はできないので、自分でDBスキーマに対応するクラスを定義する必要がある
これをいい感じにできないかなぁというのが今回の話題

にー兄さんにー兄さん

実装案としては、実際TSコードは生成できるので
TSコードを解析して、それをもとにC#のコード生成をすればよいかなぁという感じ

これをTypeScriptかC#で実装したい

にー兄さんにー兄さん

TSのコード解析は自前実装はきついので、TS Compiler APIかC#でパーサがあればよかったけど
後者は良さげなものが見つからなかったので、CompilerAPIがいいかなぁ

C#のコード生成は、単純なクラス生成だったら自前でできそうだよねっていう雰囲気

にー兄さんにー兄さん

こんな感じに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に復元できない
  • プライマリキーがわからない
にー兄さんにー兄さん

そしたら、このJSONからテーブル名とカラム、型、コメントなどを取得して
RoslynAPIでC#のコード生成するのがいいかなぁ