You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
450 lines
12 KiB
Markdown
450 lines
12 KiB
Markdown
6 years ago
|
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.<anonymous> (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.<anonymous> (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.<anonymous> (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(<Foo />).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
|