Google Apps Scriptでもスキーマ駆動開発したい!
Google Apps Script(以下GAS
)いいですよね。
サーバーを準備せずとも、Googleの各サービスを使ったウェブアプリを簡単に作ることができます。
※ウェブアプリ以外も作れますが、今回はウェブアプリに焦点を当てた内容になります。
GASでウェブアプリを作る際、フロントエンド(.html)からバックエンド(.gs)の関数を呼び出すことが多いと思います。
ローカル環境での開発も十分にできるようになった今、コード生成の力を借りてより型安全な開発ができるのでは?と思い、あるCLIツールを作り始めました。
何を作っているのか
OpenAPI仕様からGASの関数呼び出し、関数インターフェースのコードを生成するCLIを作っています。
リポジトリはこちらです。
OpenAPIの仕様(現時点ではyml形式のみサポート)を書いてこのCLIを実行すると↓のコードが生成されます。
詳しい使い方はREADMEを見てみてください。
-
--frontend
を指定した場合- Promiseでラップされた関数呼び出しのコード、関数の引数の型、関数の戻り値の型
-
--backend
を指定した場合- 関数の型定義(関数の引数の型、関数の戻り値の型)
あとは各々のビルドツール[1]で成果物を作成して アップロードしてください。
なぜOpenAPIか
OpenAPI周辺のエコシステムやツールを利用できるためです。
Redocly CLIやSwagger関連のツールを使えばLintやプレビュー、ymlやjsonファイルを1つにまとめることができます。
実際に、このツールでは複数の入力ファイルには対応せず、Redocly CLIで対応してもらうことにしています。
また、OpenAPIのexample
フィールドを使用してモックサーバーを立ち上げられるのも大きい利点だと感じています。
google.script.run
がundefinedかどうかを見て、ローカル開発時にはモックサーバーを使い、GASにデプロイしたらgoogle.script.run
を使うようなコードを生成できるのではないかと考えています。
GASの関数仕様を定義するだけであれば独自に仕様を作っても良いとは思うのですが
こういった理由からOpenAPIの仕様を使うことにしました。
※とはいえ、ツール内部で使っていないプロパティを定義する必要があるといった制約はあります。(OpenAPIの仕様に則っていることが第一です)
足りない機能
認識している範囲だけでもいくつもの未実装機能があります。
現時点では、引数や戻り値の型はdepth=1のオブジェクトしか生成できない(配列/オブジェクトを含めることができない)、エラー時(withFailuerHandler)の引数の型を生成できない、などがあります。
今後どうしていくか
時間を見つけて足りない機能を実装していきます。
いい勉強のネタができたので楽しくやっていきたいと思います!
-
フロントエンドはvite-plugin-singlefile、サーバーサイドはgas-webpack-pluginやesbuild-gas-pluginあたりがおすすめだと思います ↩︎
Discussion