gulpでtsconfig.jsonを生成する

Sublime TextやAtom, Visual Studio CodeはTypeScriptの入力補完の機能があり、 正しく動作させるには tsconfig.json でコンパイラオプション等を指定する必要がある。

コンパイル対象のファイルを指定するにはデフォルト設定 (ルート以下のすべての *.ts) または files プロパティを指定する必要があるのだが、 node.js環境では node_modules 以下に不要な *.ts が入っているため前者が使用できず、 後者はglobが効かないため tsconfig.json のメンテナンスが大変面倒くさい。

そのうちglobとかexcludeとかが実装されるんじゃないかと思うが、 当面はgulpから tsconfig.json を生成することにした。

以下 Gulpfile.js:

var gulp = require('gulp');
var ts = require('gulp-typescript');
var merge = require('merge2');
var tsconfig = require('@atsushi_suzuki/gulp-tsconfig');

var tsProject = ts.createProject({
  noImplicitAny: true,
  noLib: true,
  target: 'ES5',
  module: 'commonjs',
  typescript: require('typescript')
});

gulp.task('compile', function () {
  var tsResult = gulp.src(['**/*.ts', '!node_modules/**/*'])
    .pipe(ts(tsProject));
  return merge([
    tsResult.dts.pipe(gulp.dest('.')),
    tsResult.js.pipe(gulp.dest('.'))
  ]);
});

gulp.task('tsconfig', function () {
  gulp.src(['tsconfig.json', '**/*.ts', '!node_modules/**/*'])
    .pipe(tsconfig())
    .pipe(gulp.dest('.'));
});

gulp.task('watch', ['tsconfig', 'compile'], function () {
  gulp.watch(['tsconfig.json', '**/*.ts', '!node_modules/**/*'], ['tsconfig', 'compile']);
});

gulp.task('default', ['tsconfig', 'compile']);