プログラミング

TypeScript CLIツール開発入門:ASTと環境構築から始める

TypeScript CLIツール開発入門:ASTと環境構築から始める

Table of Contents

1. TypeScript開発環境の構築とASTの概要

まず、TypeScriptの開発環境を構築します。Node.jsとnpm(またはyarn)がインストールされていることを確認してください。 その後、以下のコマンドでプロジェクトを作成します。

npm init -y
npm install typescript @types/node commander --save-dev

commander はコマンドライン引数を扱うための便利なライブラリです。@types/node はNode.jsの型定義ファイルです。 2025年4月時点での最新バージョンがインストールされるように、npm install を使用しています。

次に、tsconfig.json を作成し、コンパイラの設定を行います。

{
  "compilerOptions": {
    "target": "es2020",
    "module": "commonjs",
    "esModuleInterop": true,
    "outDir": "./dist",
    "strict": true,
    "skipLibCheck": true
  }
}

ASTとは、ソースコードを木構造で表現したものです。コンパイラやリンター、コード解析ツールは、このASTを解析することで、コードの構造を理解し、様々な処理を行います。TypeScriptでは、typescript パッケージの ts.createSourceFile 関数などを利用してASTを作成・操作できます。

2. 簡単なCLIツールの作成

今回は、コマンドライン引数を受け取り、その内容を出力するシンプルなCLIツールを作成します。

// src/index.ts
import { Command } from 'commander';
import * as ts from 'typescript';

const program = new Command();

program
  .command('hello <name>')
  .description('Greet a person')
  .action((name) => {
    console.log(`Hello, ${name}!`);
  });

program.parse(process.argv);

// サンプルのAST操作 (ここでは簡略化)
const sourceFile = ts.createSourceFile('test.ts', 'console.log("Hello, world!");', ts.ScriptTarget.ES2020, true);
const firstStatement = sourceFile.statements[0];
console.log(firstStatement.kind); // Nodeの種類を出力

このコードでは、commander を使用してコマンドライン引数を解析し、hello コマンドに名前を渡すと、挨拶メッセージを出力します。 また、コメントアウトされた部分では、typescript パッケージを使って簡単なAST操作の例を示しています。 実際のAST操作は、コードの解析、変換、生成など、より複雑な処理を行うために必要となります。

3. ASTを用いた高度なCLIツールの開発

より高度なCLIツールを作成するには、ASTを積極的に活用する必要があります。例えば、特定のコードパターンを検出したり、コードを自動的に修正したり、コードの複雑さを分析したりといったことが可能です。

例えば、特定の関数呼び出しを検出するツールを開発する場合、ASTを巡回して、該当するノードを探し出す必要があります。 これは、TypeScriptのASTノードの種類とプロパティを理解することで実現できます。

// src/analyzer.ts
import * as ts from 'typescript';

function findFunctionCalls(sourceFile: ts.SourceFile, functionName: string): ts.Node[] {
  const calls: ts.Node[] = [];
  function visit(node: ts.Node) {
    if (ts.isCallExpression(node) && (node.expression as ts.Identifier).text === functionName) {
      calls.push(node);
    }
    ts.forEachChild(node, visit);
  }
  visit(sourceFile);
  return calls;
}

// 使用例
const sourceFile = ts.createSourceFile('test.ts', 'console.log("Hello"); myFunction();', ts.ScriptTarget.ES2020, true);
const calls = findFunctionCalls(sourceFile, 'console.log');
console.log(calls);

この例では、console.log 関数の呼び出しを検出する関数 findFunctionCalls を実装しています。 より複雑なコード解析を行うには、ASTの構造を深く理解し、再帰的な処理などを駆使する必要があります。 さらに、ASTを操作してコードを生成・変換するライブラリを使うことで、リファクタリングツールやコードジェネレーターなどの高度なCLIツールを開発することも可能です。

まとめ

本記事では、TypeScriptを用いたCLIツールの開発において、ASTの基礎知識と環境構築、そして簡単なツールの作成方法を紹介しました。 ASTの活用は、高度なコード解析や変換を可能にし、強力なCLIツールの開発に繋がります。 typescript パッケージや commander などのライブラリを効果的に活用することで、効率的で安全なCLIツールを構築できることを理解していただけたと思います。 さらに高度な機能を実装するには、ASTの深い理解と、TypeScriptの豊富な機能を習得することが重要となります。 Think ITの記事にあるような開発効率向上ツールを自作することで、自身の開発スキルを向上させることができるでしょう。

Background