babel-nodeでbabel pulginsを使うには.babelrcを設定する


## 目的

ES2015で書いて、かつ[power-assert](https://github.com/power-assert-js/power-assert)を使ったソースコードを[babel-node](http://babeljs.io/docs/usage/cli/#babel-node)で動かす。
そのために、babel-nodeに[babel-plugin-espower](https://github.com/power-assert-js/babel-plugin-espower)をプラグインとして指定したい。

## 結論

[.babelrc](https://babeljs.io/docs/usage/babelrc/)にpluginsを設定します。

```json:.babelrc
{
  "plugins": [
    "babel-plugin-espower"
  ]
}
```

## 背景

テストコードはmochaのcompilersオプションでespower-babelを指定すれば動かせます。

```
mocha --compilers js:espower-babel/guess test"
```

プロダクトコードはbabelのplugisオプションを使うと動くソースコードを作成できます。

```
babel --plugins babel-plugin-espower test.js
```

しかし、babel-nodeにはpluginsオプションがありません。

```
babel-node --plugins babel-plugin-espower
```

は動きません。

```
error: unknown option `--plugins'
```

が出力されます。


babel-nodeが使えれば、babelで毎回トランスパイルしなくてもよくなります。試しに動かすのが楽になります。
nodemonと組み合わせた、ソースコードの変更監視もできます。



## babel-nodeの挙動の確認

試しにbabel-nodeの引数を増やして

```
babel-node --plugins babel-plugin-espower hoge.js
```

を実行すると

```
module.js:338
    throw err;
          ^
Error: Cannot find module '/Users/shigerunakajima/syamo/babel-plugin-espower'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Function.Module.runMain (module.js:501:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/babel/lib/_babel-node.js:144:25)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
```

node_modules配下を探してくれません。これは

```
babel-node babel-plugin-espower
```

と同じ挙動です。エラーメッセージ通りに、`plugins`オプションは無視されます。

## .babelrcの検証

次のソースコードで検証します。

```js:sample.js
import assert from 'power-assert'

let a = false

assert(a, 'a is not true.')
```

### .babelrcなし

```
npm install power-assert
babel-node sapmle.js
```

出力結果

```
assert.js:86
  throw new assert.AssertionError({
        ^
AssertionError: a is not true.
    at decoratedAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/lib/decorate.js:44:25)
    at powerAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/index.js:58:32)
    at Object.<anonymous> (/Users/shigerunakajima/syamo/test.js:5:1)
    at Module._compile (module.js:460:26)
    at normalLoader (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5)
    at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/babel/lib/_babel-node.js:144:25)
```

assertとしては動きますが、power-assertの詳細表示はされません。

### .babelrcあり
.babelrcで[babel-plugin-espower](https://github.com/power-assert-js/espower-babel)を指定します。

```
npm install power-assert babel-plugin-espower
babel-node sapmle.js
```

出力結果

```
/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/lib/decorator.js:66
        throw this.errorToRethrow(e, message, context);
                   ^
AssertionError: a is not true.   # test.js:5

  assert(a, 'a is not true.')
         |
         false

    at decoratedAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/lib/decorate.js:42:30)
    at powerAssert (/Users/shigerunakajima/syamo/node_modules/power-assert/node_modules/empower/index.js:58:32)
    at Object.<anonymous> (/Users/shigerunakajima/syamo/test.js:5:1)
    at Module._compile (module.js:460:26)
    at normalLoader (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5)
    at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/babel/lib/_babel-node.js:144:25)
```

パチパチ:blush: