Skip to content

Commit 72a0ec1

Browse files
committed
Merge pull request #5 from power-assert-js/babel6
Babel 6.x support
2 parents cbb5318 + 5d57824 commit 72a0ec1

40 files changed

+831
-207
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ sudo: false
33
node_js:
44
- "0.10"
55
- "0.12"
6+
- "4.2"
67
- "stable"
78
script:
89
- "npm test"

CHANGELOG.md

+17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
## [2.0.0](https://github.com/power-assert-js/babel-plugin-espower/releases/tag/v2.0.0) (2015-11-12)
2+
3+
4+
#### Features
5+
6+
* [Babel 6.x support](https://github.com/power-assert-js/babel-plugin-espower/pull/5)
7+
8+
9+
#### Breaking Changes
10+
11+
Babel6 is incompatible with Babel5. For Babel 5 or lower, you need to use the 1.x release of babel-plugin-espower.
12+
13+
```
14+
$ npm install --save-dev [email protected]
15+
```
16+
17+
118
## [1.1.0](https://github.com/power-assert-js/babel-plugin-espower/releases/tag/v1.1.0) (2015-11-06)
219

320

README.md

+54-26
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Babel plugin for power-assert.
1111

1212
DESCRIPTION
1313
---------------------------------------
14+
1415
`babel-plugin-espower` is a [Babel](http://babeljs.io/) plugin for [power-assert](http://github.com/power-assert-js/power-assert).
1516

1617
`power-assert` provides descriptive assertion messages for your tests, like this.
@@ -46,20 +47,35 @@ $ npm install --save-dev babel-plugin-espower
4647
```
4748

4849

49-
HOW TO USE
50+
CAUTION
5051
---------------------------------------
5152

52-
53-
### via [Babel CLI](http://babeljs.io/docs/usage/cli/)
53+
Babel6 is incompatible with Babel5. For Babel 5 or lower, you need to use the 1.x release of babel-plugin-espower.
5454

5555
```
56-
$ $(npm bin)/babel --plugins babel-plugin-espower /path/to/test/some_test.js > /path/to/build/some_test.js
56+
$ npm install --save-dev babel-plugin-espower@1.1.0
5757
```
5858

59-
or shortly,
59+
60+
HOW TO USE
61+
---------------------------------------
62+
63+
64+
### via [.babelrc](http://babeljs.io/docs/usage/babelrc/)
65+
66+
```javascript
67+
{
68+
"presets": [
69+
...
70+
],
71+
"plugins": [
72+
"babel-plugin-espower"
73+
]
74+
}
75+
```
6076

6177
```
62-
$ $(npm bin)/babel --plugins espower /path/to/test/some_test.js > /path/to/build/some_test.js
78+
$ babel /path/to/test/some_test.js > /path/to/build/some_test.js
6379
```
6480

6581

@@ -69,6 +85,7 @@ $ $(npm bin)/babel --plugins espower /path/to/test/some_test.js > /path/to/build
6985
var babel = require('babel-core');
7086
var jsCode = fs.readFileSync('/path/to/test/some_test.js');
7187
var transformed = babel.transform(jsCode, {
88+
presets: [...],
7289
plugins: ['babel-plugin-espower']
7390
});
7491
console.log(transformed.code);
@@ -78,10 +95,9 @@ console.log(transformed.code);
7895
### via [Babel Require Hook](http://babeljs.io/docs/usage/require/)
7996

8097
```javascript
81-
require('babel/register')({
82-
only: /test\/tobe_instrumented/,
83-
plugins: ['babel-plugin-espower'],
84-
extensions: ['.es6', '.js']
98+
require('babel-register')({
99+
presets: [...],
100+
plugins: ['babel-plugin-espower']
85101
});
86102
```
87103

@@ -100,14 +116,17 @@ var browserify = require('browserify');
100116
var babelify = require('babelify');
101117
var glob = require('glob'),
102118
browserify({ entries: glob.sync('./test/*_test.js'), debug: true })
103-
.transform(babelify.configure({ plugins: ['babel-plugin-espower'] }))
119+
.transform(babelify.configure({
120+
presets: [...],
121+
plugins: ['babel-plugin-espower']
122+
}))
104123
.bundle()
105124
.on('error', function (err) { console.log('Error : ' + err.message); })
106125
.pipe(fs.createWriteStream('all_test.js'));
107126
```
108127

109128
```
110-
$ $(npm bin)/browserify -d -e ./test/*_test.js -t [ babelify --plugins babel-plugin-espower ]
129+
$ $(npm bin)/browserify -d -e ./test/*_test.js -t [ babelify --presets ... --plugins babel-plugin-espower ]
111130
```
112131

113132

@@ -121,6 +140,7 @@ gulp.task('build_test', function() {
121140
var files = glob.sync('./test/*_test.js');
122141
var b = browserify({entries: files, debug: true});
123142
b.transform(babelify.configure({
143+
presets: [...],
124144
plugins: ['babel-plugin-espower']
125145
}));
126146
return b.bundle()
@@ -145,7 +165,12 @@ module.exports = function(config) {
145165
browserify: {
146166
debug: true,
147167
transform: [
148-
['babelify', {plugins: ['babel-plugin-espower']}]
168+
[
169+
'babelify', {
170+
presets: [...],
171+
plugins: ['babel-plugin-espower']
172+
}
173+
]
149174
]
150175
},
151176
// ...
@@ -156,7 +181,7 @@ EXAMPLE
156181
---------------------------------------
157182
158183
159-
For given test file `demo_test.js` below,
184+
For given test file `test/demo_test.js` below,
160185
161186
```javascript
162187
import assert from 'power-assert';
@@ -184,16 +209,19 @@ describe('ES6 demo', () => {
184209
});
185210
```
186211
187-
Run `babel` with `--plugins espower` to transform tests.
212+
prepare `babel_hook.js` to transform tests.
188213
189-
```
190-
$ $(npm bin)/babel --plugins espower /path/to/test/demo_test.js > /path/to/build/demo_test.js
214+
```javascript
215+
require('babel-register')({
216+
presets: [...], // presets of your choice
217+
plugins: ['babel-plugin-espower']
218+
});
191219
```
192220
193-
Then run. You will see the power-assert output appears.
221+
Run `mocha` with `--require` option. You will see the power-assert output appears.
194222
195223
```
196-
$ $(npm bin)/mocha /path/to/build/demo_test.js
224+
$ $(npm bin)/mocha --require ./babel_hook test/demo_test.js
197225

198226
ES6 demo
199227
1) Destructuring and TemplateLiteral
@@ -222,7 +250,7 @@ $ $(npm bin)/mocha /path/to/build/demo_test.js
222250
-bob and alice
223251
+alice and bob
224252

225-
at Context.<anonymous> (build/demo_test.js:19:28)
253+
at Context.<anonymous> (test/demo_test.js:19:28)
226254

227255
2) ES6 demo ArrowFunctionExpression and SpreadElement:
228256

@@ -239,7 +267,7 @@ $ $(npm bin)/mocha /path/to/build/demo_test.js
239267
[number] seven
240268
=> 7
241269

242-
at Context.<anonymous> (build/demo_test.js:29:28)
270+
at Context.<anonymous> (test/demo_test.js:29:28)
243271

244272
3) ES6 demo Enhanced Object Literals:
245273
AssertionError: # test/demo_test.js:17
@@ -251,7 +279,7 @@ $ $(npm bin)/mocha /path/to/build/demo_test.js
251279
| "bobby's greet"
252280
Object{name:"bobby","bobby's greet":"Hello, I'm bobby"}
253281

254-
at Context.<anonymous> (build/demo_test.js:40:29)
282+
at Context.<anonymous> (test/demo_test.js:40:29)
255283
```
256284
257285
@@ -267,6 +295,7 @@ var babel = require('babel-core');
267295
var createEspowerPlugin = require('babel-plugin-espower/create');
268296
var jsCode = fs.readFileSync('/path/to/test/some_test.js');
269297
var transformed = babel.transform(jsCode, {
298+
presets: [...],
270299
plugins: [
271300
createEspowerPlugin(babel, {
272301
patterns: [
@@ -284,8 +313,8 @@ or via [Require Hook](http://babeljs.io/docs/usage/require/).
284313
285314
```javascript
286315
var createEspowerPlugin = require('babel-plugin-espower/create');
287-
require('babel/register')({
288-
only: /test\/tobe_instrumented/,
316+
require('babel-register')({
317+
presets: [...],
289318
plugins: [
290319
createEspowerPlugin(babel, {
291320
patterns: [
@@ -294,8 +323,7 @@ require('babel/register')({
294323
'assert.near(actual, expected, delta, [message])'
295324
]
296325
})
297-
],
298-
extensions: ['.es6', '.js']
326+
]
299327
});
300328
```
301329

create.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
var createEspowerVisitor = require('./lib/create-espower-visitor');
44

55
module.exports = function createEspowerPlugin (babel, options) {
6-
return new babel.Transformer('babel-plugin-espower', createEspowerVisitor(babel, options));
6+
return createEspowerVisitor(babel, options);
77
};

lib/babel-assertion-visitor.js

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
'use strict';
2+
3+
var espower = require('espower');
4+
var inherits = require('util').inherits;
5+
var babelgen = require('babel-generator');
6+
var define = require('define-properties');
7+
var toBeCaptured = require('./to-be-captured');
8+
var toBeSkipped = require('./to-be-skipped');
9+
10+
function BabelAssertionVisitor (babel, matcher, esPath, enclosingFunc, options) {
11+
espower.AssertionVisitor.call(this, matcher, esPath, enclosingFunc, options);
12+
this.babel = babel;
13+
}
14+
inherits(BabelAssertionVisitor, espower.AssertionVisitor);
15+
16+
BabelAssertionVisitor.prototype.generateCanonicalCode = function (node) {
17+
var gen = new babelgen.CodeGenerator(node, { concise: true });
18+
return gen.generate().code;
19+
};
20+
21+
BabelAssertionVisitor.prototype.isArgumentModified = function () {
22+
return !!this.argumentModified;
23+
};
24+
25+
BabelAssertionVisitor.prototype.captureArgument = function (node) {
26+
var t = this.babel.types;
27+
var props = {
28+
content: this.canonicalCode,
29+
filepath: this.filepath,
30+
line: this.lineNum
31+
};
32+
if (this.withinAsync) {
33+
props.async = true;
34+
}
35+
if (this.withinGenerator) {
36+
props.generator = true;
37+
}
38+
var newNode = t.callExpression(
39+
t.memberExpression(this.powerAssertCalleeObject, t.identifier('_expr')),
40+
[
41+
node,
42+
t.valueToNode(props)
43+
]
44+
);
45+
define(newNode, { _generatedByEspower: true });
46+
return newNode;
47+
};
48+
49+
BabelAssertionVisitor.prototype.captureNode = function (target, path) {
50+
var t = this.babel.types;
51+
this.argumentModified = true;
52+
var relativeEsPath = path.slice(this.assertionPath.length).join('/');
53+
var newNode = t.callExpression(
54+
t.memberExpression(this.powerAssertCalleeObject, t.identifier('_capt')),
55+
[
56+
target,
57+
t.valueToNode(relativeEsPath)
58+
]);
59+
define(newNode, { _generatedByEspower: true });
60+
return newNode;
61+
};
62+
63+
BabelAssertionVisitor.prototype.toBeSkipped = function (currentNode, parentNode, currentKey) {
64+
return toBeSkipped(this.babel.types, currentNode, parentNode, currentKey);
65+
};
66+
67+
BabelAssertionVisitor.prototype.toBeCaptured = function (currentNode, parentNode, currentKey) {
68+
return toBeCaptured(this.babel.types, currentNode, parentNode, currentKey);
69+
};
70+
71+
module.exports = BabelAssertionVisitor;

0 commit comments

Comments
 (0)