## 方針
### 設定
- **設定をしなければデフォルトでコマンドや機能は無効化**されている
### 実装
- 設定の定義は[[TypeScript]]の型定義で実現する
- 上記の定義はプラグイン開発ソースの型定義としても利用する
- 設定ファイルは[[JSON]]にし、[[JSON Schema]]を使う
- [[ts-json-schema-generator]]を使って[[TypeScript]]の型定義から[[JSON Schema]]に変換する
- [[JSON Schema]]は[[🦉Carnelian]]に同梱する
## 型定義ファイルの作成
`src/definitions/config.ts`
```ts
/**
* data.jsonの設定ファイルを定義するインターフェース
* JSON Schemaを生成するためにも使用される
*/
export interface Config {
/**
* エディタ本文の機能
*/
editor?: {
/** 切り替え */
toggle?: {
/** エディタの長さ(横幅) */
length?: boolean;
/** Live Previewの切り替え */
livePreview?: boolean;
};
/** テーブル */
table?: {
format?: boolean;
};
// あとは省略
};
// あとは省略
}
```
基本的に設定をしなければコマンドは有効にならない。`enabled` でその条件を指定する。
`src/commands.ts`
```ts
function createCarnelianCommands(settings: PluginSettings) {
return [
{
name: "Toggle editor length",
kind: "all",
enabled: settings.editor?.toggle?.length,
executor: toggleEditorLength,
},
{
name: "Toggle Live preview",
kind: "all",
enabled: settings.editor?.toggle?.livePreview,
executor: toggleLivePreview,
},
{
name: "Format table",
kind: "editor",
enabled: settings.editor?.table?.format,
executor: formatTable,
},
] as const satisfies (CarnelianCommand & { enabled: unknown })[];
}
```
設定の方はエイリアス。
`src/settings.ts`
```ts
export type PluginSettings = Config;
```
## JSON Schemaへの変換
[[ts-json-schema-generator]]を使う。[[Parameters (TypeScript)|Parameters]]や[[ReturnType (TypeScript)|ReturnType]]を使わなければ大抵のことはできる。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" />
<span class="link-card-v2-site-name">Minerva</span>
</div>
<div class="link-card-v2-title">
📜2025-08-23 ts-json-schema-generatorを試す
</div>
<div class="link-card-v2-content">Neovim風の設定ファイルを作成し、JSON Schemaによる補完を目指してts-json-schema-generatorをmacOS 15.6.1環境で試した。標準的な型や高度な型(keyof型演算子、Mapped Types、条件付き型、テンプレートリテラル型)には対応していたが、ParametersやReturnTypeには未対応だった。</div>
<img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/activity.webp" />
<a data-href="📜2025-08-23 ts-json-schema-generatorを試す" class="internal-link"></a>
</div>
%%[[📜2025-08-23 ts-json-schema-generatorを試す]]%%
[[ts-json-schema-generator]]をインストール。
```console
bun add -D ts-json-schema-generator
```
通常の`tsconfig.json`だと[[Node.js]]や[[Bun]]の型定義でエラーになるので、専用の[[TSConfig]]ファイルを作成する。
> [!info] 参考
> https://chatgpt.com/c/68a95870-c028-8324-bc1c-903593b3bbfc
`tsconfig.schema.json`
```json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"lib": ["ES2022"],
"skipLibCheck": true
},
"include": ["src/definitions/config.ts"]
}
```
変換コマンドを定義する。
`package.json`
```json
{
"scripts": {
"schema": "ts-json-schema-generator --path src/definitions/config.ts --tsconfig tsconfig.schema.json > config.schema.json"
}
}
```
コマンドを実行する。
```console
bun schema
```
`config.schema.json` が作成される。
```json
{
"$ref": "#/definitions/Config",
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"Config": {
"additionalProperties": false,
"description": "data.jsonの設定ファイルを定義するインターフェース JSON Schemaを生成するためにも使用される",
"properties": {
"editor": {
"additionalProperties": false,
"description": "エディタ本文の機能",
"properties": {
"table": {
"additionalProperties": false,
"description": "テーブル",
"properties": {
"format": {
"type": "boolean"
}
},
"type": "object"
},
"toggle": {
"additionalProperties": false,
"description": "切り替え",
"properties": {
"length": {
"description": "エディタの長さ(横幅)",
"type": "boolean"
},
"livePreview": {
"description": "Live Previewの切り替え",
"type": "boolean"
}
},
"type": "object"
},
},
"type": "object"
},
},
"type": "object"
}
}
}
```
## JSON Schemaの設定の仕方
`data.json` の `$schema` に `config.schema.json` への相対パスを書く。同じディレクトリ内なので `./config.schema.json` でOK。
```json
{
"$schema": "./config.schema.json",
"editor": {
"table": { "format": true },
"toggle": { "length": true, "livePreview": true }
}
}
```