gulp plugin 作成とKii Cloud

なぜ

なぜプラグインを作ったかと言うと、
Kii CloudのカスタムAPIを作ろうと考えていたのですが、
Kii の仕様上、コードファイルとフックファイル1つずつしかデプロイ出来ず、
だからといってひとつのファイルに書いていくのも現実的ではないため、
gulpでデプロイすることにしました。

Kii Cloudへのデプロイ (イメージ)

以下のような流れでデプロイすることになると思います。

  1. コードファイル(js)をひとつにまとめる
  2. フックファイル(json)をひとつにまとめる
  3. 完成したファイルをデプロイする

1についてはjavascriptをまとめるプラグインがあるからいいのですが、
2のjson形式のファイルを作成するプラグインが良さそうなのがなかったため、
今回作ることにしました。

ソース

gulp-unite-json

"use strict";

var _        = require('underscore');
var through2 = require('through2');
var util     = require('util');
var gutil    = require('gulp-util');

var PluginError = gutil.PluginError;
var File        = gutil.File;
var format      = util.format;
var PLUGIN_NAME = 'gulp-unite-json';

module.exports = function (resultFileName) {
  if (!resultFileName) {
    throw new PluginError(PLUGIN_NAME, 'Missing fileName option for ' + PLUGIN_NAME);
  }
  var jsonObject = {};
  var firstFile = null;
  function transform(file, encode, callback) {
    if (file.isStream()) {
      this.emit('error', new PluginError(PLUGIN_NAME,  'Streaming not supported'));
      callback();
      return;
    }
    if (!firstFile) {
      firstFile = file;
    }
    var content = JSON.parse(file.contents.toString());
    _.each(content, function(value, key, obj){
      if (!_.has(jsonObject, key)){
        jsonObject[key] = value;
      } else {
        callback(new PluginError(PLUGIN_NAME, format('Key[%s] is Duplicated for %s', key, PLUGIN_NAME)));
      }
    });
    callback();
  }
  function flush(callback){
    var output = new gutil.File({
      cwd:  firstFile.cwd,
      base: firstFile.base,
      path: firstFile.base + resultFileName,
    });
    output.contents = new Buffer(JSON.stringify(jsonObject));
    this.push(output);
  }
  return through2.obj(transform, flush);
}

大したことはやっていませんが、transformでJsonObjectを作成、
flushでファイル書き出しをしています。

flushでの書き出し場所はなぜかfirstFileの場所を利用しています。
これはなぜかよくわかりませんが、他のgulpプラグインでも
同様のことがおこなれている為こうしてます。
正直きもちわるいです。