この記事は公開から2年以上経過しています。
VSCode Macros拡張を使い、VSCodeエディタ上の選択範囲に記述されたTypeScript型定義からJSONスキーマを生成するマクロを作成したので紹介します。
即席ツールなので、エラーチェックなどは最低限になっています。
本記事のマクロを利用する場合、システムに予めnode.jsを導入(インストール)しておく必要があります。
マクロの動作イメージ
TypeScriptのinterface定義からJSON Schemaを生成する様子です。
既定の変換設定では、変換する型をexport
で公開しておく必要があります。
利用できる型や詳細な利用方法については、参考ウェブサイトのts-json-schema-generator
のドキュメントをご参照ください。
npmライブラリのインストール手順
以下の手順で、マクロ内で利用するnpmライブラリを導入しておきます。
-
マクロディレクトリに
package.json
が存在しない場合は、カレントをマクロディレクトリに移動して以下のコマンドでVSCodeMacrosで利用するプライベートnpmライブラリ用のpackage.json
を生成します(npmライブラリをグローバルインストールする場合は不要)。echo '{"private":true}' >> package.json
※Windowsのコマンドプロンプト(cmd.exe)の場合はシングルクォート
'
は不要。 -
以下のコマンドでnpmライブラリをインストールします。
npm i ts-json-schema-generator tmp-promise
マクロのサンプルソースコード
const vscode = require('vscode');
const tsjsg = require('ts-json-schema-generator');
const tmpp = require('tmp-promise');
module.exports.macroCommands = {
TS2JSONSchema: {
no: 1,
func: ts2JSONSchemaFunc,
},
};
async function ts2JSONSchemaFunc() {
const editor = vscode.window.activeTextEditor;
if (!editor) {
return 'Editor is not open.';
}
const document = editor.document;
const selection = editor.selection;
const text = document.getText(selection);
if (!text.length) {
return 'Nothing is selected.';
}
let tmpFile = null;
try {
tmpFile = await tmpp.file({ postfix: '.ts' });
const textBuf = new TextEncoder().encode(text);
await vscode.workspace.fs.writeFile(vscode.Uri.file(tmpFile.path), textBuf);
const config = {
path: tmpFile.path,
// expose: "all",
type: '*',
};
const jsonSchema = tsjsg.createGenerator(config).createSchema(config.type);
const jsonText = JSON.stringify(jsonSchema, null, 2);
const jsonDoc = await vscode.workspace.openTextDocument({
language: 'json',
content: jsonText
});
await vscode.window.showTextDocument(jsonDoc);
}
catch (e) {
return e.message;
}
finally {
tmpFile?.cleanup();
}
}
参考ウェブサイトなど
以上です。