## 方針 ### 設定 - **設定をしなければデフォルトでコマンドや機能は無効化**されている ### 実装 - 設定の定義は[[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 } } } ```