babel-plugin-espower ================================ Babel plugin for power-assert. [![Build Status][travis-image]][travis-url] [![NPM version][npm-image]][npm-url] [![Dependency Status][depstat-image]][depstat-url] [![License][license-image]][license-url] DESCRIPTION --------------------------------------- `babel-plugin-espower` is a [Babel](https://babeljs.io/) plugin for [power-assert](https://github.com/power-assert-js/power-assert). `power-assert` provides descriptive assertion messages for your tests, like this. ``` 1) ES6 demo Destructuring and TemplateLiteral: AssertionError: # test/demo_test.js:7 assert(`${ alice.name } and ${ bob.name }` === `bob and alice`) | | | | | | | | | | | | | "bob and alice" | | | | "bob" false | | "alice" Object{name:"bob"} | Object{name:"alice"} "alice and bob" --- [string] `bob and alice` +++ [string] `${ alice.name } and ${ bob.name }` @@ -1,13 +1,13 @@ -bob and alice +alice and bob ``` Pull-requests, issue reports and patches are always welcomed. See [power-assert](https://github.com/power-assert-js/power-assert) project for more documentation. FYI: There's a [babel preset for all power-assert plugins](https://github.com/power-assert-js/babel-preset-power-assert) INSTALL --------------------------------------- ``` $ npm install --save-dev babel-plugin-espower ``` CAUTION --------------------------------------- Babel6 is incompatible with Babel5. For Babel 5 or lower, you need to use the 1.x release of babel-plugin-espower. ``` $ npm install --save-dev babel-plugin-espower@1.1.1 ``` HOW TO USE --------------------------------------- ### via [.babelrc](https://babeljs.io/docs/usage/babelrc/) ```javascript { "presets": [ ... ], "plugins": [ "babel-plugin-espower" ] } ``` ``` $ babel /path/to/test/some_test.js > /path/to/build/some_test.js ``` For example, with `babel-register` module and `.babelrc` above, you can run mocha without code generation steps. ``` $ $(npm bin)/mocha --require babel-register test/some_test.js ``` ### via [Babel API](https://babeljs.io/docs/usage/api/) ```javascript var babel = require('babel-core'); var jsCode = fs.readFileSync('/path/to/test/some_test.js'); var transformed = babel.transform(jsCode, { presets: [...], plugins: ['babel-plugin-espower'] }); console.log(transformed.code); ``` ### via [Babel Require Hook](https://babeljs.io/docs/usage/require/) ```javascript require('babel-register')({ presets: [...], plugins: ['babel-plugin-espower'] }); ``` For example, with `babel_hook.js` above, you can run mocha without code generation steps. ``` $ $(npm bin)/mocha --require ./babel_hook /path/to/test/demo_test.js ``` ### with [babelify](https://github.com/babel/babelify) ```javascript var fs = require('fs'); var browserify = require('browserify'); var babelify = require('babelify'); var glob = require('glob'), browserify({ entries: glob.sync('./test/*_test.js'), debug: true }) .transform(babelify.configure({ presets: [...], plugins: ['babel-plugin-espower'] })) .bundle() .on('error', function (err) { console.log('Error : ' + err.message); }) .pipe(fs.createWriteStream('all_test.js')); ``` ``` $ $(npm bin)/browserify -d -e ./test/*_test.js -t [ babelify --presets ... --plugins babel-plugin-espower ] ``` ### with [babelify](https://github.com/babel/babelify) and [gulp](http://gulpjs.com/) ```javascript var source = require('vinyl-source-stream'); var browserify = require('browserify'); var glob = require('glob'), gulp.task('build_test', function() { var files = glob.sync('./test/*_test.js'); var b = browserify({entries: files, debug: true}); b.transform(babelify.configure({ presets: [...], plugins: ['babel-plugin-espower'] })); return b.bundle() .pipe(source('all_test.js')) .pipe(gulp.dest('./build')); }); ``` ### with [babelify](https://github.com/babel/babelify) and [Karma](https://karma-runner.github.io) ```javascript module.exports = function(config) { config.set({ frameworks: ['mocha', 'browserify'], files: [ "test/**/*.js" ], preprocessors: { "test/**/*.js": "browserify" }, browserify: { debug: true, transform: [ [ 'babelify', { presets: [...], plugins: ['babel-plugin-espower'] } ] ] }, // ... ``` EXAMPLE --------------------------------------- For given test file `test/demo_test.js` below, ```javascript import assert from 'power-assert'; describe('ES6 demo', () => { it('Destructuring and TemplateLiteral', () => { let [alice, bob] = [ { name: 'alice' }, { name: 'bob' } ]; assert(`${alice.name} and ${bob.name}` === `bob and alice`); }); it('ArrowFunctionExpression and SpreadElement', () => { let seven = 7, ary = [4, 5]; assert(seven === ((v, i) => v + i)(...[...ary])); }); it('Enhanced Object Literals', () => { let name = 'bobby'; assert.deepEqual({ name, [ `${name}'s greet` ]: `Hello, I'm ${name}` }, null); }); }); ``` prepare `babel_hook.js` to transform tests. ```javascript { "presets": [ ... ], "plugins": [ "babel-plugin-espower" ] } ``` Run `mocha` with `--require babel-register` option. You will see the power-assert output appears. ``` $ $(npm bin)/mocha --require babel-register test/demo_test.js ES6 demo 1) Destructuring and TemplateLiteral 2) ArrowFunctionExpression and SpreadElement 3) Enhanced Object Literals 0 passing 3 failing 1) ES6 demo Destructuring and TemplateLiteral: AssertionError: # test/demo_test.js:7 assert(`${ alice.name } and ${ bob.name }` === `bob and alice`) | | | | | | | | | | | | | "bob and alice" | | | | "bob" false | | "alice" Object{name:"bob"} | Object{name:"alice"} "alice and bob" --- [string] `bob and alice` +++ [string] `${ alice.name } and ${ bob.name }` @@ -1,13 +1,13 @@ -bob and alice +alice and bob at Context. (test/demo_test.js:19:28) 2) ES6 demo ArrowFunctionExpression and SpreadElement: AssertionError: # test/demo_test.js:12 assert(seven === ((v, i) => v + i)(...[...ary])) | | | | | | | | | [4,5] | | 9 [4,5] 7 false [number] ((v, i) => v + i)(...[...ary]) => 9 [number] seven => 7 at Context. (test/demo_test.js:29:28) 3) ES6 demo Enhanced Object Literals: AssertionError: # test/demo_test.js:17 assert.deepEqual({name,[`${ name }'s greet`]: `Hello, I'm ${ name }`}, null) | | | | | | | | | "bobby" | | "bobby" "Hello, I'm bobby" | "bobby's greet" Object{name:"bobby","bobby's greet":"Hello, I'm bobby"} at Context. (test/demo_test.js:40:29) ``` CUSTOMIZE --------------------------------------- ### by plugin options You can customize configs such as assertion patterns via [.babelrc](https://babeljs.io/docs/usage/babelrc/) ```javascript { "presets": [ ... ], "plugins": [ ["babel-plugin-espower", { "embedAst": true, "patterns": [ "assert.isNull(object, [message])", "assert.same(actual, expected, [message])", "assert.near(actual, expected, delta, [message])" ] }] ] } ``` ### by API #### var plugin = createEspowerPlugin(babel, [options]) You can customize configs such as assertion patterns via [Babel API](https://babeljs.io/docs/usage/api/), ```javascript var babel = require('babel-core'); var createEspowerPlugin = require('babel-plugin-espower/create'); var jsCode = fs.readFileSync('/path/to/test/some_test.js'); var transformed = babel.transform(jsCode, { presets: [...], plugins: [ createEspowerPlugin(babel, { embedAst: true, patterns: [ 'assert.isNull(object, [message])', 'assert.same(actual, expected, [message])', 'assert.near(actual, expected, delta, [message])' ] }) ] }); console.log(transformed.code); ``` or via [Require Hook](https://babeljs.io/docs/usage/require/). ```javascript var createEspowerPlugin = require('babel-plugin-espower/create'); require('babel-register')({ presets: [...], plugins: [ createEspowerPlugin(babel, { embedAst: true, patterns: [ 'assert.isNull(object, [message])', 'assert.same(actual, expected, [message])', 'assert.near(actual, expected, delta, [message])' ] }) ] }); ``` #### options | type | default value | |:---------|:--------------------| | `object` | objects shown below | Configuration options for `babel-plugin-espower`. If not passed, default options will be used (return value of `defaultOptions()` with default `embedAst`, `visitorKeys`, `astWhiteList`, `path`, `sourceRoot` and `sourceMap`. `visitorKeys` is value of `babel.types.VISITOR_KEYS`. `astWhiteList` is value of `babel.types.BUILDER_KEYS`. `path` is filename passed to babel. `sourceRoot` is be return value of `process.cwd()`, `sourceMap` is babel's internal SourceMap object). ```javascript { patterns: [ 'assert(value, [message])', 'assert.ok(value, [message])', 'assert.equal(actual, expected, [message])', 'assert.notEqual(actual, expected, [message])', 'assert.strictEqual(actual, expected, [message])', 'assert.notStrictEqual(actual, expected, [message])', 'assert.deepEqual(actual, expected, [message])', 'assert.notDeepEqual(actual, expected, [message])', 'assert.deepStrictEqual(actual, expected, [message])', 'assert.notDeepStrictEqual(actual, expected, [message])' ], embedAst: false, visitorKeys: babel.types.VISITOR_KEYS, astWhiteList: babel.types.BUILDER_KEYS, sourceRoot: process.cwd(), path: file.opts.filename, sourceMap: file.opts.inputSourceMap } ``` #### options.embedAst If you want to use non-ECMASCript-standard features such as JSX tags in your `assert()`, you should set `embedAst` option to `true`. ```js assert(shallow().is('.foo')); ``` CHANGELOG --------------------------------------- See [CHANGELOG](https://github.com/power-assert-js/babel-plugin-espower/blob/master/CHANGELOG.md) AUTHOR --------------------------------------- * [Takuto Wada](https://github.com/twada) CONTRIBUTORS --------------------------------------- * [James Talmage (jamestalmage)](https://github.com/jamestalmage) OUR SUPPORT POLICY --------------------------------------- We support Node under maintenance. In other words, we stop supporting old Node version when [their maintenance ends](https://github.com/nodejs/LTS). This means that any other environment is not supported. NOTE: If babel-plugin-espower works in any of the unsupported environments, it is purely coincidental and has no bearing on future compatibility. Use at your own risk. LICENSE --------------------------------------- Licensed under the [MIT](https://github.com/power-assert-js/babel-plugin-espower/blob/master/LICENSE) license. [npm-url]: https://npmjs.org/package/babel-plugin-espower [npm-image]: https://badge.fury.io/js/babel-plugin-espower.svg [travis-url]: https://travis-ci.org/power-assert-js/babel-plugin-espower [travis-image]: https://secure.travis-ci.org/power-assert-js/babel-plugin-espower.svg?branch=master [depstat-url]: https://gemnasium.com/power-assert-js/babel-plugin-espower [depstat-image]: https://gemnasium.com/power-assert-js/babel-plugin-espower.svg [license-url]: https://github.com/power-assert-js/babel-plugin-espower/blob/master/LICENSE [license-image]: https://img.shields.io/badge/license-MIT-brightgreen.svg