Tauri コンフィグの JSON5 対応

# はじめに

今回は Tauri のコンフィグにおける小ネタをサクっと。

Tauri のコンフィグ形式の管理は現状2つのフォーマットに分かれる。
それらは、JSON と TOML。
[ある特殊ケース]() においては 片方しか許されないこともあるが、基本的には両方対応という状況。

この共存の理由としては、これは個人的な推測だが、フロントエンドフレームワークの、package.json に具体する主に NodeJS の文化である JSON と、Rust の Cargo.toml に観られる Cargo の TOML 文化の合いの子であるが故の状況だと思う。

どちらがいいか？という話は野暮で、別にどちらを使うのでもいいというのが僕の意見ではあるが、一つだけ大きな不満がある。
それは JSON 形式のコンフィグに対して。

その一つが、JSON は、データのみを管理するのに特化した形式として生まれているため、**コメントアウトの表記が仕様上では許されていない**ということ。
YAML や TOMLに代表されるコンフィグ形式は、基本的にコメントアウトをサポートしている。
誰がどの意図でその設定をそこに埋め込んだか。
`application/json` ペイロードのような中間データ形式であるならまだしも、人が管理するコンフィグファイルにコメントアウトが打てないのは流石にキツい。

また他の一つとして、末端カンマのつけ忘れで Syntax Error が出るというのも罪深い。
あくまで中間データならまだしも、人の手で書かれたファイルに最後のカンマがあるかどうかが判定されるのは納得がいかない。（それくらいパーサー側で解釈してよと…。

とまぁ、そんなうっぷんを解決すべく探していたら JSON5 対応方法の案内を見つけて、お？と希望を感じたので、このポストとしてまとめるに至った。

素の JSON への不満に関しては、こちらのポストにもまとめられている。

https://qiita.com/jkr_2255/items/026e0fdb4570c88c4f51

# JSON5 自体のドキュメント

https://json5.org

# Tauri v2 のコンフィグ管理事情

Tauri のコンフィグを JSON 5 形式で扱うとなると、まずは、 **「Tauri パイプラインに JSON 5 を使いますよ」** という宣言と依存ライブラリのインストールを行う必要がある。

https://v2.tauri.app/develop/configuration-files/#cargotoml

`dependencies` 及び `build-dependencies` において、 `features` に `config-json5` を追加する。

```diff_toml:src-tauri/Cargo.toml
[build-dependencies]
tauri-build = { version = "2.0.0", features = [] }

[dependencies]
- tauri = { version = "2.0.0", features = [] }
+ tauri = { version = "2.0.0", features = [ "config-json5" ] }
```

実際はこれを追加するだけ。

対象ファイルの拡張子は `.json5` に変更する。
こうする事で、エディタ側のサポートも得られるようになる。

# 実際に試してみる

こんな感じに `config-json5` を追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/f4a2bde6-bbda-b722-b71f-942c152e9e40.png)

追記した内容は、コメントアウトと末端のコンマを追加。

```diff_json:src-tauri/tauri.conf.json5
{
  // -- 省略
  "app": {
    // -- 省略
    "security": {
      "csp": null,
      "capabilities": [
        {
          "$schema": "./gen/schemas/desktop-schema.json",
          "identifier": "custom-window",
          "description": "Capability for the main custom window",
          "windows": ["main"],
          "permissions": [
            // ウィンドウクローズを許可
            "core:window:allow-close",
            // ウィンドウ最小化を許可
            "core:window:allow-minimize",
            // ウィンドウの最大化状態取得を許可
            "core:window:allow-is-maximized",
            // ウィンドウの最大化解除を許可
            "core:window:allow-unmaximize",
            // ウィンドウの最大化を許可
            "core:window:allow-maximize",
            // 最大化・最大化解除のトグルの許可 - こちらは設定されてなくてもよさそう
            // "core:window:allow-toggle-maximize",
            // 最大化・最大化解除の内部によるトグルの許可
            "core:window:allow-internal-toggle-maximize",
            // ウィンドウドラッグの許可
            "core:window:allow-start-dragging",
          ]
        }
      ]
    }
  },
  // -- 省略
}
```

これらの設定は、フロントエンドからのコマンドに対する Permissions となるので、先の例からフレームレスウィンドウを作成して動作確認してみる。

ビルドも問題なし。
ちゃんと動いた。

![output-palette.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/b2bd7e48-55dd-1210-6bb3-57eeccef3815.gif)

:::note info
**JSON5 のシンタックスハイライト**
`.json5` 拡張子で扱っていれば、大体の最近のエディタ状況であれば対応していると思われる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/cfbfe448-f78e-2840-024e-e4252b57ac4d.png)
:::

# JSON5 ファイルの Tauri 利用制限

以上の様に、JSON5 ファイルの利用が可能という事が分かった。
しかしながら、現状 Tauri 内での利用に関して制限がある。

現状は、JSON5 をコンフィグフォーマットとして選べるのは、Tauri コンフィグの `tauri.conf.json5` や
JSON5 くらいでしか使えない。

一応、[Capabilities にも使えそうな記載がある](https://v2.tauri.app/security/permissions/#configuration-files)が、どうやら現状は機能していない様子。
恐らく将来対応かと思われる。もし更新されたらここら辺の部分は訂正したい。

# まとめ

* ファイルを `.json5` 拡張子形式にする
* tauri と tauri-build の features に `config-json5` を追加する

という事で対応可能なことが分かった。

JSON5 形式は、JSON フォーマットとしての安定性はもちろん、「コンフィグファイル」としての機能性をちゃんと有している。
今後 JSON 形式をベースとした管理を主体とするなら、JSON5 での管理も有力候補に入れたい。

というかむしろ、JSON をフォーマットに選択するのであれば、JSON5 形式をデフォルトにしてほしい…。