Compare commits

...

149 Commits

Author SHA1 Message Date
Sebastian McKenzie
23db842cb8 v5.1.0 2015-04-12 21:22:25 -07:00
Sebastian McKenzie
41c82e00f9 add 5.1.0 changelog 2015-04-12 21:21:35 -07:00
Sebastian McKenzie
766099e783 5.0.13 2015-04-12 21:21:31 -07:00
Sebastian McKenzie
53bc54b3b2 v5.0.13 2015-04-12 21:14:12 -07:00
Sebastian McKenzie
bb70f37123 Merge branch 'master' of github.com:babel/babel 2015-04-12 20:59:26 -07:00
Sebastian McKenzie
8a0317132e deopt array unpack optimisation on member expressions - fixes #1241 2015-04-12 20:59:17 -07:00
Sebastian McKenzie
f598c70841 Merge pull request #1215 from AluisioASG/es7-trailing-function-commas
ES7 trailing function commas
2015-04-12 19:17:02 -07:00
Sebastian McKenzie
61b57ea055 rejigger decorator alias 2015-04-12 19:10:22 -07:00
Sebastian McKenzie
a971ad7fd2 Merge branch 'master' of github.com:babel/babel 2015-04-12 19:07:19 -07:00
Sebastian McKenzie
27b6f804ce clean up class decorators #1185 2015-04-12 19:06:59 -07:00
Sebastian McKenzie
8ab79f3a72 Merge pull request #1240 from JaRail/master
Fix broken dead-code-removal case.
2015-04-12 18:58:45 -07:00
James Railton
0c2bf2f5a2 Fix broken dead-code-removal case.
The "test" local variable was removed with path work. The last dead-code-removal check used this var. By reintroducing the local var, the unknown variable reference is fixed.
2015-04-12 18:52:37 -07:00
Sebastian McKenzie
7e1a4be085 add use strict header to decorators test 2015-04-12 09:09:26 -07:00
Sebastian McKenzie
bbc951dfe1 fix decorators order - thanks to some random japanese tweet i translated... 2015-04-12 09:05:46 -07:00
Sebastian McKenzie
b3e4aefe12 update runtime transformer to not use $for module - cc @zloirock 2015-04-12 09:00:32 -07:00
Sebastian McKenzie
26b5174dfa add descriptor for all class properties - fixes #1235 2015-04-12 08:53:01 -07:00
Sebastian McKenzie
652d3c7320 move eval and arguments identifier handling to nameMethod helper 2015-04-11 20:51:01 -07:00
Sebastian McKenzie
edc2cd320c don't consider eval and arguments valid identifiers - fixes #1232 2015-04-11 20:45:44 -07:00
Sebastian McKenzie
274a6e01dc add support for inheriting from statically inlined native constructors - closes #1172 2015-04-11 19:47:11 -07:00
Sebastian McKenzie
3561efdb86 update runtime transformer to modular core-js - fixes #1206 2015-04-11 19:07:39 -07:00
Sebastian McKenzie
1a30f1aafc fix regression with completion records for assignment expressions - fixes #1204 2015-04-11 18:13:47 -07:00
Sebastian McKenzie
e362512af3 switch to my branch of regenerator - #1123, fixes #1015 2015-04-11 17:59:14 -07:00
Sebastian McKenzie
cf5d2429b4 add support for replacement of for inits with statements - fixes #1217 2015-04-11 17:40:12 -07:00
Sebastian McKenzie
72098036b2 remove useless this from lodash map 2015-04-11 17:39:50 -07:00
Sebastian McKenzie
7905f48280 clean up dynamic imports, disable hoisting in system module formatter when **any** dynamic imports are included - fixes #1219 2015-04-11 17:22:48 -07:00
Sebastian McKenzie
aba2d1c23c fix loop constants test error message 2015-04-11 16:50:08 -07:00
Sebastian McKenzie
5326e0543d fix scope tracking for constants in loop heads - fixes #1229 2015-04-11 16:39:18 -07:00
Sebastian McKenzie
1360c93e4b fix enumerable property position in test 2015-04-11 16:35:19 -07:00
Sebastian McKenzie
235cbc18cf Merge branch 'master' of github.com:babel/babel 2015-04-11 16:31:11 -07:00
Sebastian McKenzie
98c5255b91 add support for object literal decorators - fixes #1154 2015-04-11 16:30:55 -07:00
Sebastian McKenzie
2a9777cc20 add solo helpers
# Conflicts:
#	src/babel/transformation/file/index.js
2015-04-11 14:33:56 -07:00
Sebastian McKenzie
1cfca745a4 Merge pull request #1228 from Hermanya/patch-1
Update README.md
2015-04-11 08:52:30 -07:00
Herman Starikov
a3459deecf Update README.md 2015-04-11 11:52:01 -04:00
Sebastian McKenzie
070152f6c1 parse await expression as a unary instead of an assignment - fixes #1225 2015-04-10 15:23:11 -07:00
Sebastian McKenzie
719fdf5ca1 set canBeArrow to true when parsing async functions 2015-04-10 13:51:30 -07:00
Sebastian McKenzie
f2460c6173 update to latest acorn 2015-04-10 13:44:50 -07:00
Sebastian McKenzie
155c640409 remove null regex check - fixes #1222 2015-04-10 13:44:41 -07:00
Sebastian McKenzie
7de4718b27 Merge branch 'master' of github.com:babel/babel 2015-04-09 14:58:41 -07:00
Sebastian McKenzie
4e6aed0408 don't shadow default parameter scope iife and instead just apply the this and arguments - fixes #1128 2015-04-09 14:58:33 -07:00
Brian Donovan
3be8ccf68d Prevent this command from failing during CI. 2015-04-09 14:49:45 -07:00
Sebastian McKenzie
704b31f44f use path basename as non-default import fallback - fixes #1207 2015-04-09 14:36:00 -07:00
Sebastian McKenzie
1a9f193841 Merge pull request #1216 from leebyron/update-deps
Update package dependencies
2015-04-09 13:50:23 -07:00
Lee Byron
7ff67589a7 Update package dependencies
Babel currently relies on some older versions of some dependencies. When using babel alongside other projects which use similar dependencies, this can cause npm to install multiple versions of these or to result in Babel loading a version of a dependency it doesn't claim to support.

This was mostly clean, though esutils did have a minor API change.
2015-04-09 13:38:20 -07:00
Brian Donovan
80f109efeb Ensure arrow function bodies are wrapped in parens if needed.
Closes #1214.
2015-04-09 11:50:52 -07:00
Brian Donovan
77c72bb5a6 Unlink global babel before bootstrapping to make it idempotent. 2015-04-09 09:55:48 -07:00
Aluísio Augusto Silva Gonçalves
6c5e0e6590 Add Acorn tests for trailing function commas 2015-04-09 13:35:48 -03:00
Sebastian McKenzie
83324b977d Merge branch 'master' of github.com:babel/babel
# Conflicts:
#	packages/babel-cli/package.json
2015-04-09 06:46:26 -07:00
Sebastian McKenzie
5feab11d3f Merge pull request #1212 from paulmillr/patch-2
Update to stable chokidar.
2015-04-09 06:45:58 -07:00
Sebastian McKenzie
7b4172ce7b remove chokidar from root package.json 2015-04-09 06:45:48 -07:00
Paul Miller
84439384c0 Update to stable chokidar. 2015-04-09 16:45:30 +03:00
Sebastian McKenzie
c9e7c306cc don't emit tokens when doing a lookahead 2015-04-09 06:44:16 -07:00
Sebastian McKenzie
1e398e45ff 5.0.12 2015-04-09 06:44:06 -07:00
Sebastian McKenzie
475324c4b5 Update to stable chokidar. 2015-04-09 06:43:58 -07:00
Sebastian McKenzie
407daf4bac Merge pull request #1205 from suryagaddipati/patch-1
Fix typo
2015-04-08 16:00:32 -07:00
Surya Gaddipati
4155590cd8 Fix typo 2015-04-08 18:00:03 -05:00
Sebastian McKenzie
0be6fd7abe Merge pull request #1203 from sindresorhus/modularize-userhome
modularize `user-home`
2015-04-08 09:49:03 -07:00
Sindre Sorhus
cf51bf1395 modularize user-home
No reason Babel should have to care about the intricacies of this.

This module is already used by `bower`, `eslint`, `yo`, etc.
2015-04-08 22:59:16 +07:00
Sebastian McKenzie
06a31c419a v5.0.12 2015-04-08 08:55:02 -07:00
Sebastian McKenzie
da566110c0 add 5.0.12 changelog 2015-04-08 08:53:40 -07:00
Sebastian McKenzie
c12c4a5c39 don't touch function name containers when remapping modules - fixes #1160 2015-04-08 08:52:53 -07:00
Sebastian McKenzie
d114349890 5.0.11 2015-04-08 08:15:15 -07:00
Sebastian McKenzie
8d6ae0e1eb v5.0.11 2015-04-08 08:14:28 -07:00
Sebastian McKenzie
cb8b47ee2f add missing curly brace to regression test 2015-04-08 08:13:33 -07:00
Sebastian McKenzie
daf24c5c59 add 5.0.10 changelog 2015-04-08 08:12:33 -07:00
Sebastian McKenzie
cdb2784e75 add #1199 regression test 2015-04-08 08:11:01 -07:00
Sebastian McKenzie
93feabb82e fix forOf loop inheritance - fixes #1169 2015-04-08 08:10:53 -07:00
Sebastian McKenzie
982c142bf6 Merge branch 'master' of github.com:babel/babel 2015-04-08 07:47:52 -07:00
Sebastian McKenzie
de5520a94f disable scope caching 2015-04-08 07:42:04 -07:00
Sebastian McKenzie
c239d06f10 fix MetaProperty generation 2015-04-08 07:41:56 -07:00
Sebastian McKenzie
a5fed376d8 Merge pull request #1191 from zertosh/babelrc-comments
Strip out comments before parsing babelrc
2015-04-07 18:09:07 -07:00
Sebastian McKenzie
e99fd77d89 downgrade and fix mocha version - fixes #1196 2015-04-07 18:07:23 -07:00
Sebastian McKenzie
1374863b9c 5.0.10 2015-04-07 18:06:52 -07:00
Andres Suarez
e88c28f88b Strip out comments before parsing babelrc 2015-04-07 18:50:01 -04:00
Sebastian McKenzie
7a0fd26f56 v5.0.10 2015-04-07 13:04:25 -07:00
Sebastian McKenzie
17583e4807 fix decrators modules test 2015-04-07 13:03:41 -07:00
Sebastian McKenzie
37dd5137ff don't modules reassign _ignoreModulesRemap assignments 2015-04-07 13:02:28 -07:00
Sebastian McKenzie
24fced406e Merge branch 'master' of github.com:babel/babel 2015-04-07 09:55:11 -07:00
Sebastian McKenzie
0ab1362893 don't reassign decorated classes - fixes #1167 2015-04-07 09:54:14 -07:00
Sebastian McKenzie
96506f4249 5.0.9 2015-04-07 09:20:40 -07:00
Sebastian McKenzie
ed747f88bd Merge pull request #1185 from Dignifiedquire/class-decorators-scope
Take 2: Fix class decorator scoping.
2015-04-07 08:49:56 -07:00
dignifiedquire
3987545b4f Ensure correct scope for decorated classes. 2015-04-07 14:57:15 +02:00
dignifiedquire
148aa3f96d Use a functionExpression with class decorators. Fixes #1161. 2015-04-07 14:16:48 +02:00
Sebastian McKenzie
0cb5a7c91e Revert "Use a functionExpression with class decorators. Fixes #1161."
This reverts commit f8d56d9612.
2015-04-07 04:40:39 -07:00
Sebastian McKenzie
fc34d5a9b0 Merge pull request #1184 from Dignifiedquire/class-decorators
Use a functionExpression with class decorators. Fixes #1161.
2015-04-07 03:39:59 -07:00
dignifiedquire
f8d56d9612 Use a functionExpression with class decorators. Fixes #1161. 2015-04-07 12:11:49 +02:00
Brian Donovan
737be0e95e Merge pull request #1173 from alawatthe/patch-1
Fixed path for mocha tests in CONTRIBUTING.md
2015-04-06 09:56:31 -07:00
Alexander Zeilmann
26e2b392e8 Fixed path for mocha tests 2015-04-06 18:38:33 +02:00
Sebastian McKenzie
708cdfb993 v5.0.9 2015-04-06 06:28:58 -07:00
Sebastian McKenzie
8cb3aabefa add 5.0.9 changelog 2015-04-06 06:26:11 -07:00
Sebastian McKenzie
4a87b35d20 fix function name self referencing test 2015-04-06 06:23:46 -07:00
Sebastian McKenzie
543554b258 flow tests style nit 2015-04-06 06:20:09 -07:00
Sebastian McKenzie
afd95cf663 add #1168 regression test 2015-04-06 06:20:05 -07:00
Sebastian McKenzie
87ce4b9cd8 fix order of parameter type annotation parsing - fixes #1168 2015-04-06 06:19:13 -07:00
Sebastian McKenzie
6b76f26ed8 use module id if available for umd global name - fixes #1166 2015-04-06 06:14:09 -07:00
Sebastian McKenzie
c2776e63ae rename umd module variable name - fixes #1166 2015-04-06 06:13:43 -07:00
Sebastian McKenzie
3f2fe363d1 Merge pull request #1163 from chocolateboy/babel_node_print_fix
babel-node --print: don't mangle percent characters (%)
2015-04-06 06:06:21 -07:00
Sebastian McKenzie
8de28098f4 Merge pull request #1170 from alawatthe/master
Replaced FUNCTION_ID by FUNCTION_KEY - fixes #1164
2015-04-06 06:02:49 -07:00
Aluísio Augusto Silva Gonçalves
584532cc2c [ES7] Trailing comma in function parameter list
Currenly a stage 1 proposal.
See https://github.com/jeffmo/es-trailing-function-commas.
2015-04-06 09:10:44 -03:00
alawatthe
9a28f3fdb1 Replaced FUNCTION_ID by FUNCTION_KEY - fixes #1164 2015-04-06 10:53:41 +02:00
chocolateboy
88941b3270 babel-node --print: don't mangle percent characters (%)
This applies the babel fix in #528 to babel-node.

before:

    $ babel-node --print --eval '"%%"'
    '%'

after:

    $ babel-node --print --eval '"%%"'
    '%%'
2015-04-05 06:26:29 +01:00
Sebastian McKenzie
3a768db2bf fix missing this in acorn parseExprAtom 2015-04-05 03:26:41 +10:00
Sebastian McKenzie
320a39f4c4 fix computed properties in es7 object rest/spread - thanks @AluisioASG! 2015-04-05 02:52:14 +10:00
Sebastian McKenzie
dc98ac7c93 5.0.8 2015-04-04 17:09:35 +11:00
Sebastian McKenzie
6e456f0ec1 v5.0.8 2015-04-04 17:05:47 +11:00
Sebastian McKenzie
793090628d fix #1157 regression test 2015-04-04 17:03:54 +11:00
Sebastian McKenzie
9ed251cb08 add 5.0.8 changelog 2015-04-04 17:02:50 +11:00
Sebastian McKenzie
480fa7f4e0 add regression test for #1157 2015-04-04 16:59:29 +11:00
Sebastian McKenzie
3e642dfa1b Merge pull request #1157 from jayphelps/patch-1
[BUGFIX] Check whether `value` key is in descriptor instead of checking truthy value
2015-04-04 16:57:57 +11:00
Jay Phelps
d9cbce1862 [BUGFIX] checking whether value key is in descriptor instead of checking if value is truthy since !!0 === false
class Foo {
  static bar = 0;
}

Foo.bar++;
// Cannot assign to read only property 'bar' of function
2015-04-03 22:49:34 -07:00
Sebastian McKenzie
4bd19da3c2 fix tests, better block scoped collisions 2015-04-04 14:17:26 +11:00
Sebastian McKenzie
7c710a0378 move var scope collector to before block - fixes #1153 2015-04-04 14:09:34 +11:00
Sebastian McKenzie
56335409d3 stop constructor verification traversal on FunctionDeclaration/FunctionExpression - fixes #1155 2015-04-04 14:01:26 +11:00
Sebastian McKenzie
91d78afc67 update 5.0.7 changelog 2015-04-04 05:32:32 +11:00
Sebastian McKenzie
54c6339f20 5.0.7 2015-04-04 04:51:24 +11:00
Sebastian McKenzie
fdcf64265e v5.0.7 2015-04-04 04:49:31 +11:00
Sebastian McKenzie
ffdfb491eb disable identifier resolution - fixes #1149 2015-04-04 04:46:49 +11:00
Sebastian McKenzie
eedd431f2b remove HOMEPATH from register cache home resolution 2015-04-04 04:40:10 +11:00
Sebastian McKenzie
db9ed0235f finally fix cli tests 2015-04-04 04:39:28 +11:00
Sebastian McKenzie
6c98d39937 grr, debugging travis builds is hard 2015-04-04 04:01:35 +11:00
Sebastian McKenzie
20651df3ce try and fix babel cli bootstrap 2015-04-04 03:47:47 +11:00
Sebastian McKenzie
f3155919fe shift USERPROFILE over in home resolution in babel/register - fixes #1148 2015-04-04 03:46:07 +11:00
Sebastian McKenzie
0ac8330899 remove bable-core in babel-cli bootstrap 2015-04-04 03:40:01 +11:00
Sebastian McKenzie
67201e9698 add ignore/only option to cli 2015-04-04 03:31:19 +11:00
Sebastian McKenzie
c715d96e46 wrap non-arrays/strings/falsys in an array in util.list - fixes babel/babelify#69 2015-04-04 02:40:09 +11:00
Sebastian McKenzie
b7a08100a6 add default live bindings to common module formatter 2015-04-04 01:56:58 +11:00
Sebastian McKenzie
5f91ee8a1a 5.0.6 2015-04-03 23:15:34 +11:00
Sebastian McKenzie
bc1abb5103 v5.0.6 2015-04-03 23:13:43 +11:00
Sebastian McKenzie
4b9207e5df add 5.0.6 changelog 2015-04-03 23:12:10 +11:00
Sebastian McKenzie
e847f3685f should only throw an error for colliding param bindings for let and const 2015-04-03 23:11:04 +11:00
Sebastian McKenzie
d64c2c0c45 turn internalRemap into a null inherited object, fixes a nasty bug where module import live bindings would return a function if they referenced a method on Object.prototype (eg. toString) 2015-04-03 23:10:09 +11:00
Sebastian McKenzie
76d0fb4ba6 5.0.5 2015-04-03 22:44:16 +11:00
Sebastian McKenzie
0f33b7bfbc v5.0.5 2015-04-03 22:42:50 +11:00
Sebastian McKenzie
630224e504 add 5.0.5 changelog 2015-04-03 22:41:06 +11:00
Sebastian McKenzie
62980ab6b4 Merge branch 'master' of github.com:babel/babel
t push
2015-04-03 22:38:28 +11:00
Sebastian McKenzie
d34480b42b add support for arrays to util.list - fixes #["foo", "bar"] 2015-04-03 22:38:08 +11:00
Sebastian McKenzie
306de2edbf Merge pull request #1144 from tricknotes/fix-for-browserify
Update core-js to ^0.8.1
2015-04-03 22:23:48 +11:00
Ryunosuke SATO
c33e84730d Update core-js to ^0.8.1
This version fixes the error for some environments that
has no `setTimeout`/`setInterval`.
2015-04-03 18:38:33 +09:00
Sebastian McKenzie
20f28aba64 5.0.4 2015-04-03 15:34:20 +11:00
Sebastian McKenzie
9c312607d1 Merge branch 'master' of github.com:babel/babel 2015-04-03 15:33:27 +11:00
Sebastian McKenzie
33659711c3 Merge pull request #1142 from cesarandreu/add-babel-readme
Add README.md to babel-cli
2015-04-03 15:33:00 +11:00
Sebastian McKenzie
b154af48a7 Merge branch 'master' of github.com:babel/babel 2015-04-03 15:32:52 +11:00
Cesar Andreu
bad877946f Add README.md to babel-cli 2015-04-02 21:31:47 -07:00
Sebastian McKenzie
dff3751e7f v5.0.4 2015-04-03 15:31:08 +11:00
Sebastian McKenzie
23038dcfff Merge pull request #1141 from fkling/patch-1
Update SO link in README.md
2015-04-03 15:30:47 +11:00
Felix Kling
7c7a7ee17f Update README.md
The SO link currently points to https://github.com/babel/babel/blob/master/stackoverflow.com, which is incorrect. After this change it points to the list of babeljs questions.
2015-04-02 21:29:56 -07:00
Sebastian McKenzie
9f467ef7c0 5.0.3 2015-04-03 15:29:16 +11:00
Sebastian McKenzie
a52f9ab346 add 5.0.4 changelog 2015-04-03 15:29:11 +11:00
Sebastian McKenzie
5ccbed585b Merge pull request #1140 from cesarandreu/patch-2
Avoid searching .babelrc if breakConfig is set
2015-04-03 15:27:24 +11:00
Cesar Andreu
ed58c80c64 Avoid searching .babelrc if breakConfig is set 2015-04-02 21:24:06 -07:00
192 changed files with 1844 additions and 528 deletions

1
.gitignore vendored
View File

@@ -11,6 +11,7 @@ test/core/tmp
coverage
dist
.package.json
packages/babel-runtime/core-js
packages/babel-runtime/helpers/*.js
packages/babel-runtime/regenerator/*.js
lib

View File

@@ -13,6 +13,87 @@ _Note: Gaps between patch versions are faulty/broken releases._
See [CHANGELOG - 6to5](CHANGELOG-6to5.md) for the pre-4.0.0 version changelog.
## 5.1.0
* **Bug Fix**
* Fix super reference when using decorators.
* Don't do array unpack optimisation when member expressions are present.
* Add missing descriptors for undecorated class properties.
* Don't consider `arguments` and `eval` valid function names when doing function name inferrence.
* Fix scope tracking of constants in loop heads.
* Parse `AwaitExpression` as a unary instead of an assignment.
* Fix regex evaluation when attempting static evaluation.
* Don't emit tokens when doing a lookahead.
* **Internal**
* Upgrade `regenerator` to the latest and use my branch with the hope of eventually switching to vanilla regenerator.
* Add support for the replacement of for loop `init`s with statements.
* Upgrade dependencies.
* **Polish**
* When adding the scope IIFE when using default parameters, don't shadow the function expression, just `apply` `this` and `arguments` if necessary.
* Use path basename as non-default import fallback.
* **New Feature**
* Add [trailing function comma proposal](https://github.com/jeffmo/es-trailing-function-commas). Thanks [@AluisioASG](https://github.com/AluisioASG)!
* Add support for object literal decorators.
## 5.0.12
* **Bug Fix**
* Fix incorrect remapping of module references inside of a function id redirection container.
## 5.0.11
* **Bug Fix**
* Fix new `for...of` loops not properly inheriting their original loop.
* **Internal**
* Disable scope instance cache.
* **Polish**
* Allow comments in `.babelrc` JSON.
## 5.0.9
* **Polish**
* Use `moduleId` for UMD global name if available.
* **Bug Fix**
* Fix UMD global `module` variable shadowing the `amd`/`common` `module` variable.
* Fix Flow param type annotation regression.
* Fix function name collision `toString` wrapper. Thanks [@alawatthe](https://github.com/alawatthe)!
## 5.0.8
* **Bug Fix**
* Fix falsy static class properties not being writable.
* Fix block scoping collisions not properly detecting modules and function clashes.
* Skip `this` before `super` for derived constructors on functions.
## 5.0.7
* **New Feature**
* Add `--ignore` and `--only` support to the CLI.
* **Bug Fix**
* Remove `HOMEPATH` environment variable from home resolution in `babel/register` cache.
* **Internal**
* Disable WIP path resolution introducing infinite recursion in some code examples.
* **Polish**
* Add live binding to CommonJS default imports.
## 5.0.6
* **Bug Fix**
* Fix mangling of import references that collide with properties on `Object.prototype`.
* Fix duplicate declarations incorrectly being reported for `var`.
## 5.0.5
* **Internal**
* Upgrade `core-js`.
* **Bug Fix**
* Fix arrays not being supported in `util.list`.
## 5.0.4
* **Polish**
* Check for top level `breakConfig` in `resolveRc`.
## 5.0.3
* **Bug Fix**

View File

@@ -35,13 +35,13 @@ This is mostly overkill and you can limit the tests to a select few by directly
running them with `mocha`:
```sh
$ mocha test/transformation.js
$ mocha test/core/transformation.js
```
Use mocha's `--grep` option to run a subset of tests by name:
```sh
$ mocha test/transformation.js --grep es7
$ mocha test/core/transformation.js --grep es7
```
#### Workflow

View File

@@ -109,9 +109,10 @@ publish-cli:
npm publish
bootstrap:
npm list --global --depth 1 babel >/dev/null 2>&1 && npm uninstall -g babel || true
npm install
npm link
cd packages/babel-cli && npm install && npm link
cd packages/babel-cli && npm install && npm link && npm link babel-core
git submodule update --init
cd vendor/regenerator && npm install
cd vendor/compat-table && npm install object-assign

View File

@@ -9,7 +9,7 @@
</p>
<p align="center">
For questions and support please visit the <a href="https://gitter.im/babel/babel">gitter room</a> or <a href="stackoverflow.com">StackOverflow</a>. The Babel issue tracker is <strong>exclusively</strong> for bug reports and future requests.
For questions and support please visit the <a href="https://gitter.im/babel/babel">gitter room</a> or <a href="http://stackoverflow.com/questions/tagged/babeljs">StackOverflow</a>. The Babel issue tracker is <strong>exclusively</strong> for bug reports and feature requests.
</p>
<p align="center">

View File

@@ -1,7 +1,7 @@
{
"name": "babel-core",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "5.0.3",
"version": "5.1.0",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://babeljs.io/",
"repository": "babel/babel",
@@ -29,44 +29,46 @@
"dependencies": {
"ast-types": "~0.7.0",
"chalk": "^1.0.0",
"convert-source-map": "^0.5.0",
"core-js": "^0.8.0",
"convert-source-map": "^1.0.0",
"core-js": "^0.8.1",
"debug": "^2.1.1",
"detect-indent": "^3.0.0",
"estraverse": "^1.9.1",
"esutils": "^1.1.6",
"estraverse": "^3.0.0",
"esutils": "^2.0.0",
"fs-readdir-recursive": "^0.1.0",
"globals": "^6.2.0",
"globals": "^6.4.0",
"is-integer": "^1.0.4",
"js-tokens": "1.0.0",
"leven": "^1.0.1",
"line-numbers": "0.2.0",
"lodash": "^3.2.0",
"lodash": "^3.6.0",
"minimatch": "^2.0.3",
"output-file-sync": "^1.1.0",
"path-is-absolute": "^1.0.0",
"private": "^0.1.6",
"regenerator-babel": "0.8.13-2",
"regenerator": "https://github.com/sebmck/regenerator/archive/block-hoist.tar.gz",
"regexpu": "^1.1.2",
"repeating": "^1.1.2",
"shebang-regex": "^1.0.0",
"slash": "^1.0.0",
"source-map": "^0.4.0",
"source-map-support": "^0.2.9",
"source-map-support": "^0.2.10",
"strip-json-comments": "^1.0.2",
"to-fast-properties": "^1.0.0",
"trim-right": "^1.0.0"
"trim-right": "^1.0.0",
"user-home": "^1.1.1"
},
"devDependencies": {
"babel": "4.7.13",
"browserify": "^9.0.3",
"chai": "^2.0.0",
"eslint": "^0.15.1",
"babel-eslint": "^1.0.1",
"browserify": "^9.0.8",
"chai": "^2.2.0",
"eslint": "^0.18.0",
"babel-eslint": "^2.0.0",
"esvalid": "^1.1.0",
"istanbul": "^0.3.5",
"matcha": "^0.6.0",
"mocha": "^2.1.0",
"rimraf": "^2.2.8",
"mocha": "2.2.0",
"rimraf": "^2.3.2",
"uglify-js": "^2.4.16"
}
}

View File

@@ -0,0 +1,5 @@
# babel-cli
Babel CLI
For more information please look at [babel](https://github.com/babel/babel).

View File

@@ -4,6 +4,7 @@ var pathIsAbsolute = require("path-is-absolute");
var commander = require("commander");
var Module = require("module");
var babel = require("babel-core");
var inspect = require("util").inspect;
var path = require("path");
var repl = require("repl");
var util = require("babel-core").util;
@@ -71,7 +72,10 @@ if (program.eval || program.print) {
global.require = module.require.bind(module);
var result = _eval(code, global.__filename);
if (program.print) console.log(result);
if (program.print) {
var output = _.isString(result) ? result : inspect(result);
process.stdout.write(output + "\n");
}
} else {
if (program.args.length) {
// slice all arguments up to the first filename since they're babel args that we handle

View File

@@ -28,6 +28,8 @@ module.exports = function (commander, filenames, opts) {
};
var handleFile = function (src, filename) {
if (util.shouldIgnore(src)) return;
if (util.canCompile(filename)) {
write(src, filename);
} else if (commander.copyFiles) {

View File

@@ -107,6 +107,8 @@ module.exports = function (commander, filenames, opts) {
});
_.each(_filenames, function (filename) {
if (util.shouldIgnore(filename)) return;
results.push(util.compile(filename));
});

View File

@@ -102,12 +102,15 @@ if (errors.length) {
//
exports.opts = {};
var opts = exports.opts = {};
each(options, function (opt, key) {
exports.opts[key] = commander[key];
opts[key] = commander[key];
});
opts.ignore = util.arrayify(opts.ignore, util.regexify);
opts.only = util.arrayify(opts.only, util.regexify);
var fn;
if (commander.outDir) {

View File

@@ -16,6 +16,10 @@ exports.readdir = readdir;
exports.canCompile = util.canCompile;
exports.shouldIgnore = function (loc) {
return util.shouldIgnore(loc, index.opts.ignore, index.opts.only);
};
exports.addSourceMappingUrl = function (code, loc) {
return code + "\n//# sourceMappingURL=" + path.basename(loc);
};
@@ -23,6 +27,8 @@ exports.addSourceMappingUrl = function (code, loc) {
exports.transform = function (filename, code, opts) {
opts = _.defaults(opts || {}, index.opts);
opts.filename = filename;
opts.ignore = null;
opts.only = null;
var result = babel.transform(code, opts);
result.filename = filename;

View File

@@ -1,14 +1,14 @@
{
"name": "babel",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "5.0.2",
"version": "5.0.13",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://babeljs.io/",
"repository": "babel/babel",
"preferGlobal": true,
"dependencies": {
"chokidar": "^0.12.6",
"babel-core": "^5.0.2",
"babel-core": "^5.0.13",
"chokidar": "^1.0.0",
"commander": "^2.6.0",
"fs-readdir-recursive": "^0.1.0",
"output-file-sync": "^1.1.0",

View File

@@ -1,7 +1,7 @@
{
"name": "babel-runtime",
"description": "babel selfContained runtime",
"version": "5.0.2",
"version": "5.0.13",
"repository": "babel/babel",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"dependencies": {

View File

@@ -13,16 +13,20 @@ function relative(filename) {
return __dirname + "/babel-runtime/" + filename;
}
function readFile(filename, defaultify) {
function readFile(filename, shouldDefaultify) {
var file = fs.readFileSync(require.resolve(filename), "utf8");
if (defaultify) {
file += '\nmodule.exports = { "default": module.exports, __esModule: true };\n';
if (shouldDefaultify) {
file += "\n" + defaultify("module.exports") + "\n";
}
return file;
}
function defaultify(name) {
return 'module.exports = { "default": ' + name + ', __esModule: true };';
}
function updatePackage() {
var pkgLoc = relative("package.json");
var pkg = require(pkgLoc);
@@ -69,4 +73,26 @@ each(File.helpers, function (helperName) {
writeFile("regenerator/index.js", readFile("regenerator-babel/runtime-module", true));
writeFile("regenerator/runtime.js", selfContainify(readFile("regenerator-babel/runtime")));
//
var coreDefinitions = require("../lib/babel/transformation/transformers/other/runtime/definitions");
var paths = [];
each(coreDefinitions.builtins, function (path) {
paths.push(path);
});
each(coreDefinitions.methods, function (props) {
each(props, function (path) {
paths.push(path);
});
});
each(paths, function (path) {
writeFile("core-js/" + path + ".js", defaultify('require("core-js/library/fn/' + path + '")'));
});
//
updatePackage();

View File

@@ -93,13 +93,15 @@ pp.parseMaybeAssign = function(noIn, refShorthandDefaultPos, afterLeftParse) {
failOnShorthandAssign = false
}
let start = this.markPosition()
if (this.type == tt.parenL || this.type == tt.name)
this.potentialArrowAt = this.start
let left = this.parseMaybeConditional(noIn, refShorthandDefaultPos)
if (afterLeftParse) left = afterLeftParse.call(this, left, start)
if (this.type.isAssign) {
let node = this.startNodeAt(start)
node.operator = this.value
node.left = this.type === tt.eq ? this.toAssignable(left) : left
refShorthandDefaultPos.start = 0; // reset because shorthand default was used correctly
refShorthandDefaultPos.start = 0 // reset because shorthand default was used correctly
this.checkLVal(left)
if (left.parenthesizedExpression) {
if (left.type === "ObjectPattern") {
@@ -224,7 +226,7 @@ pp.parseSubscripts = function(base, start, noCalls) {
} else if (!noCalls && this.eat(tt.parenL)) {
let node = this.startNodeAt(start)
node.callee = base
node.arguments = this.parseExprList(tt.parenR, false)
node.arguments = this.parseExprList(tt.parenR, this.options.features["es7.trailingFunctionCommas"])
return this.parseSubscripts(this.finishNode(node, "CallExpression"), start, noCalls)
} else if (this.type === tt.backQuote) {
let node = this.startNodeAt(start)
@@ -240,7 +242,7 @@ pp.parseSubscripts = function(base, start, noCalls) {
// or `{}`.
pp.parseExprAtom = function(refShorthandDefaultPos) {
let node
let node, canBeArrow = this.potentialArrowAt == this.start
switch (this.type) {
case tt._this:
case tt._super:
@@ -250,7 +252,7 @@ pp.parseExprAtom = function(refShorthandDefaultPos) {
return this.finishNode(node, type)
case tt._yield:
if (this.inGenerator) unexpected()
if (this.inGenerator) this.unexpected()
case tt._do:
if (this.options.features["es7.doExpressions"]) {
@@ -271,7 +273,7 @@ pp.parseExprAtom = function(refShorthandDefaultPos) {
if (id.name === "async") {
// arrow functions
if (this.type === tt.parenL) {
let expr = this.parseParenAndDistinguishExpression(start, true)
let expr = this.parseParenAndDistinguishExpression(start, true, true)
if (expr && expr.type === "ArrowFunctionExpression") {
return expr
} else {
@@ -302,9 +304,8 @@ pp.parseExprAtom = function(refShorthandDefaultPos) {
}
//
if (!this.canInsertSemicolon() && this.eat(tt.arrow)) {
if (canBeArrow && !this.canInsertSemicolon() && this.eat(tt.arrow))
return this.parseArrowExpression(this.startNodeAt(start), [id])
}
return id
case tt.regexp:
@@ -324,7 +325,7 @@ pp.parseExprAtom = function(refShorthandDefaultPos) {
return this.finishNode(node, "Literal")
case tt.parenL:
return this.parseParenAndDistinguishExpression()
return this.parseParenAndDistinguishExpression(null, null, canBeArrow)
case tt.bracketL:
node = this.startNode()
@@ -378,7 +379,7 @@ pp.parseParenExpression = function() {
return val
}
pp.parseParenAndDistinguishExpression = function(start, isAsync) {
pp.parseParenAndDistinguishExpression = function(start, isAsync, canBeArrow) {
start = start || this.markPosition()
let val
if (this.options.ecmaVersion >= 6) {
@@ -407,7 +408,7 @@ pp.parseParenAndDistinguishExpression = function(start, isAsync) {
let innerEnd = this.markPosition()
this.expect(tt.parenR)
if (!this.canInsertSemicolon() && this.eat(tt.arrow)) {
if (canBeArrow && !this.canInsertSemicolon() && this.eat(tt.arrow)) {
if (innerParenStart) this.unexpected(innerParenStart)
return this.parseParenArrowList(start, exprList, isAsync)
}
@@ -515,10 +516,15 @@ pp.parseObj = function(isPattern, refShorthandDefaultPos) {
if (this.afterTrailingComma(tt.braceR)) break
} else first = false
while (this.type === tt.at) {
this.decorators.push(this.parseDecorator())
}
let prop = this.startNode(), isGenerator = false, isAsync = false, start
if (this.options.features["es7.objectRestSpread"] && this.type === tt.ellipsis) {
prop = this.parseSpread()
prop.type = "SpreadProperty"
this.takeDecorators(prop)
node.properties.push(prop)
continue
}
@@ -544,8 +550,12 @@ pp.parseObj = function(isPattern, refShorthandDefaultPos) {
}
this.parseObjPropValue(prop, start, isGenerator, isAsync, isPattern, refShorthandDefaultPos);
this.checkPropClash(prop, propHash)
this.takeDecorators(prop)
node.properties.push(this.finishNode(prop, "Property"))
}
if (this.decorators.length) {
this.raise(this.start, "You have trailing decorators with no property");
}
return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression")
}
@@ -726,7 +736,7 @@ pp.parseAwait = function (node) {
this.unexpected()
}
node.all = this.eat(tt.star)
node.argument = this.parseMaybeAssign(true)
node.argument = this.parseMaybeUnary()
return this.finishNode(node, "AwaitExpression")
};

View File

@@ -18,17 +18,19 @@ var STATE_KEYS = [
];
pp.getState = function () {
var state = {};
var state = {}
for (var i = 0; i < STATE_KEYS.length; i++) {
var key = STATE_KEYS[i];
state[key] = this[key];
var key = STATE_KEYS[i]
state[key] = this[key]
}
return state;
return state
};
pp.lookahead = function() {
var old = this.getState();
this.next();
this.isLookahead = true
this.next()
this.isLookahead = false
var curr = this.getState();
for (var key in old) this[key] = old[key];
return curr;

View File

@@ -125,7 +125,9 @@ pp.parseBindingList = function(close, allowEmpty, allowTrailingComma) {
this.expect(close)
break
} else {
elts.push(this.parseAssignableListItemTypes(this.parseMaybeDefault()))
var left = this.parseMaybeDefault()
this.parseAssignableListItemTypes(left)
elts.push(this.parseMaybeDefault(null, left))
}
}
return elts

View File

@@ -46,6 +46,9 @@ export function Parser(options, input, startPos) {
this.inModule = this.options.sourceType === "module"
this.strict = this.options.strictMode === false ? false : this.inModule
// Used to signify the start of a potential arrow function
this.potentialArrowAt = -1
// Flags to track whether we are in a function, a generator.
this.inFunction = this.inGenerator = false
// Labels in scope.

View File

@@ -458,7 +458,7 @@ pp.parseFunction = function(node, isStatement, allowExpressionBody, isAsync) {
pp.parseFunctionParams = function(node) {
this.expect(tt.parenL)
node.params = this.parseBindingList(tt.parenR, false, false)
node.params = this.parseBindingList(tt.parenR, false, this.options.features["es7.trailingFunctionCommas"])
}
// Parse a class declaration or literal (depending on the
@@ -475,7 +475,7 @@ pp.parseClass = function(node, isStatement) {
if (this.eat(tt.semi)) continue
if (this.type === tt.at) {
this.decorators.push(this.parseDecorator())
continue;
continue
}
var method = this.startNode()
this.takeDecorators(method)

View File

@@ -28,7 +28,7 @@ const pp = Parser.prototype
// Move to the next token
pp.next = function() {
if (this.options.onToken)
if (this.options.onToken && !this.isLookahead)
this.options.onToken(new Token(this))
this.lastTokEnd = this.end

View File

@@ -1,12 +1,9 @@
import path from "path";
import os from "os";
import fs from "fs";
import userHome from "user-home";
function getUserHome() {
return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
}
const FILENAME = process.env.BABEL_CACHE_PATH || path.join(getUserHome() || os.tmpdir(), ".babel.json");
const FILENAME = process.env.BABEL_CACHE_PATH || path.join(userHome || os.tmpdir(), ".babel.json");
var data = {};
export function save() {

View File

@@ -169,4 +169,8 @@ export function MemberExpression(node, print) {
}
}
export { MemberExpression as MetaProperty };
export function MetaProperty(node, print) {
print(node.meta);
this.push(".");
print(node.property);
}

View File

@@ -75,5 +75,16 @@ export function ArrowFunctionExpression(node, print) {
}
this.push(" => ");
const bodyNeedsParens = t.isObjectExpression(node.body);
if (bodyNeedsParens) {
this.push("(");
}
print(node.body);
if (bodyNeedsParens) {
this.push(")");
}
}

View File

@@ -7,15 +7,15 @@ import * as t from "./types";
extend(estraverse.VisitorKeys, t.VISITOR_KEYS);
// regenerator-babel/ast-types
// regenerator/ast-types
var def = types.Type.def;
var or = types.Type.or;
def("File")
.bases("Node")
.build("program")
.field("program", def("Program"));
//def("File")
// .bases("Node")
// .build("program")
// .field("program", def("Program"));
def("AssignmentPattern")
.bases("Pattern")

View File

@@ -4,4 +4,4 @@ if (global._babelPolyfill) {
global._babelPolyfill = true;
import "core-js/shim";
import "regenerator-babel/runtime";
import "regenerator/runtime";

View File

@@ -1,3 +1,4 @@
import stripJsonComments from "strip-json-comments";
import merge from "lodash/object/merge";
import path from "path";
import fs from "fs";
@@ -24,7 +25,7 @@ export default function (loc, opts = {}) {
var json;
try {
json = jsons[content] ||= JSON.parse(content);
json = jsons[content] ||= JSON.parse(stripJsonComments(content));
} catch (err) {
err.message = `${file}: ${err.message}`;
throw err;
@@ -43,8 +44,11 @@ export default function (loc, opts = {}) {
find(up, rel);
}
}
find(loc, rel);
if (opts.breakConfig !== true) {
find(loc, rel);
}
return opts;
};

View File

@@ -36,10 +36,9 @@ function checkNode(stack, node, scope) {
export default class File {
constructor(opts = {}) {
this.dynamicImportedNoDefault = [];
this.dynamicImportIds = {};
this.dynamicImported = [];
this.dynamicImports = [];
this.dynamicImportAbsoluteDefaults = [];
this.dynamicImportIds = {};
this.dynamicImports = [];
this.usedHelpers = {};
this.dynamicData = {};
@@ -59,6 +58,7 @@ export default class File {
"defaults",
"create-class",
"create-decorated-class",
"create-decorated-object",
"tagged-template-literal",
"tagged-template-literal-loose",
"interop-require",
@@ -85,6 +85,8 @@ export default class File {
"default-props"
];
static soloHelpers = [];
static options = require("./options");
normalizeOptions(opts: Object) {
@@ -267,7 +269,7 @@ export default class File {
// validate Transformer instance
if (!plugin.buildPass || plugin.constructor.name !== "Transformer") {
throw new TypeError(`Plugin ${JSON.stringify(name)} didn't export default a Transformer instance`);
throw new TypeError(`Plugin ${JSON.stringify(name)} didn't export a default Transformer instance`);
}
// build!
@@ -332,7 +334,7 @@ export default class File {
return source;
}
addImport(source: string, name?: string, noDefault?: boolean): Object {
addImport(source: string, name?: string, absoluteDefault?: boolean): Object {
name ||= source;
var id = this.dynamicImportIds[name];
@@ -343,9 +345,7 @@ export default class File {
var specifiers = [t.importDefaultSpecifier(id)];
var declar = t.importDeclaration(specifiers, t.literal(source));
declar._blockHoist = 3;
this.dynamicImported.push(declar);
if (noDefault) this.dynamicImportedNoDefault.push(declar);
if (absoluteDefault) this.dynamicImportAbsoluteDefaults.push(declar);
if (this.transformers["es6.modules"].canTransform()) {
this.moduleFormatter.importSpecifier(specifiers[0], declar, this.dynamicImports);
@@ -375,7 +375,9 @@ export default class File {
}
addHelper(name: string): Object {
if (!includes(File.helpers, name)) {
var isSolo = includes(File.soloHelpers, name);
if (!isSolo && !includes(File.helpers, name)) {
throw new ReferenceError(`Unknown helper ${name}`);
}
@@ -386,24 +388,26 @@ export default class File {
this.usedHelpers[name] = true;
var generator = this.get("helperGenerator");
var runtime = this.get("helpersNamespace");
if (generator) {
return generator(name);
} else if (runtime) {
var id = t.identifier(t.toIdentifier(name));
return t.memberExpression(runtime, id);
} else {
var ref = util.template("helper-" + name);
ref._compact = true;
var uid = this.scope.generateUidIdentifier(name);
this.scope.push({
key: name,
id: uid,
init: ref
});
return uid;
if (!isSolo) {
var generator = this.get("helperGenerator");
var runtime = this.get("helpersNamespace");
if (generator) {
return generator(name);
} else if (runtime) {
var id = t.identifier(t.toIdentifier(name));
return t.memberExpression(runtime, id);
}
}
var ref = util.template("helper-" + name);
ref._compact = true;
var uid = this.scope.generateUidIdentifier(name);
this.scope.push({
key: name,
id: uid,
init: ref
});
return uid;
}
errorWithNode(node, msg, Error = SyntaxError) {
@@ -422,23 +426,7 @@ export default class File {
shouldIgnore() {
var opts = this.opts;
var filename = opts.filename;
var ignore = opts.ignore;
var only = opts.only;
if (only.length) {
for (var i = 0; i < only.length; i++) {
if (only[i].test(filename)) return false;
}
return true;
} else if (ignore.length) {
for (var i = 0; i < ignore.length; i++) {
if (ignore[i].test(filename)) return true;
}
}
return false;
return util.shouldIgnore(opts.filename, opts.ignore, opts.only);
}
parse(code: string) {

View File

@@ -19,7 +19,7 @@ export default function (exports, opts) {
exports.JSXIdentifier = function (node, parent) {
if (node.name === "this" && t.isReferenced(node, parent)) {
return t.thisExpression();
} else if (esutils.keyword.isIdentifierName(node.name)) {
} else if (esutils.keyword.isIdentifierNameES6(node.name)) {
node.type = "Identifier";
} else {
return t.literal(node.name);

View File

@@ -1,10 +1,33 @@
import traverse from "../../traversal";
import * as t from "../../types";
export default function (node) {
var container = t.functionExpression(null, [], node.body, node.generator, node.async);
container.shadow = true;
var visitor = {
enter(node, parent, scope, state) {
if (this.isThisExpression() || this.isReferencedIdentifier({ name: "arguments" })) {
state.found = true;
this.stop();
}
var call = t.callExpression(container, []);
if (this.isFunction()) {
this.skip();
}
}
};
export default function (node, scope) {
var container = t.functionExpression(null, [], node.body, node.generator, node.async);
var callee = container;
var args = [];
var state = { found: false };
scope.traverse(node, visitor, state);
if (state.found) {
callee = t.memberExpression(container, t.identifier("apply"));
args = [t.thisExpression(), t.identifier("arguments")];
}
var call = t.callExpression(callee, args);
if (node.generator) call = t.yieldExpression(call, true);
return t.returnStatement(call);

View File

@@ -4,17 +4,45 @@ import each from "lodash/collection/each";
import has from "lodash/object/has";
import * as t from "../../types";
export function push(mutatorMap, key, kind, computed, value) {
var alias = t.toKeyAlias({ computed }, key);
export function push(mutatorMap, node, kind, file) {
var alias = t.toKeyAlias(node);
//
var map = {};
if (has(mutatorMap, alias)) map = mutatorMap[alias];
mutatorMap[alias] = map;
map._key = key;
if (computed) map._computed = true;
//
map[kind] = value;
map._inherits ||= [];
map._inherits.push(node);
map._key = node.key;
if (node.computed) {
map._computed = true;
}
if (node.decorators) {
var decorators = map.decorators ||= t.arrayExpression([]);
decorators.elements = decorators.elements.concat(node.decorators.map(dec => dec.expression));
}
if (map.value || map.initializer) {
throw file.errorWithNode(node, "Key conflict with sibling node");
}
if (node.value) {
if (node.kind === "init") kind = "value";
if (node.kind === "get") kind = "get";
if (node.kind === "set") kind = "set";
t.inheritsComments(node.value, node);
map[kind] = node.value;
}
return map;
}
export function hasComputed(mutatorMap) {

View File

@@ -27,6 +27,7 @@ var wrap = function (state, method, id, scope) {
FUNCTION_ID: id,
FUNCTION_KEY: scope.generateUidIdentifier(id.name)
});
template.callee._skipModulesRemap = true;
// shim in dummy params to retain function arity, if you try to read the
// source then you'll get the original since it's proxied so it's all good
@@ -98,6 +99,7 @@ export function property(node, file, scope) {
if (!t.isLiteral(key)) return node; // we can't set a function id with this
var name = t.toIdentifier(key.value);
if (name === "eval" || name === "arguments") name = "_" + name;
var id = t.identifier(name);
var method = node.value;

View File

@@ -46,7 +46,11 @@ var remapVisitor = {
}
}
if (t.isAssignmentExpression(node)) {
if (node._skipModulesRemap) {
return this.skip();
}
if (t.isAssignmentExpression(node) && !node._ignoreModulesRemap) {
var exported = formatter.getExport(node.left, scope);
if (exported) {
this.skip();
@@ -61,7 +65,6 @@ var importsVisitor = {
enter(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
extend(formatter.localImports, this.getBindingIdentifiers());
formatter.bumpImportOccurences(node);
}
}
};
@@ -69,7 +72,7 @@ var importsVisitor = {
var exportsVisitor = traverse.explode({
ExportDeclaration: {
enter(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
formatter.hasLocalExports = true;
var declar = this.get("declaration");
if (declar.isStatement()) {
@@ -96,29 +99,23 @@ var exportsVisitor = traverse.explode({
formatter.hasNonDefaultExports = true;
}
}
if (node.source) {
formatter.bumpImportOccurences(node);
}
}
}
});
export default class DefaultFormatter {
constructor(file) {
this.internalRemap = {};
this.defaultIds = object();
this.scope = file.scope;
this.file = file;
this.ids = object();
this.internalRemap = object();
this.defaultIds = object();
this.scope = file.scope;
this.file = file;
this.ids = object();
this.hasNonDefaultExports = false;
this.hasLocalExports = false;
this.hasLocalImports = false;
this.localImportOccurences = object();
this.localExports = object();
this.localImports = object();
@@ -134,15 +131,6 @@ export default class DefaultFormatter {
return (t.isExportDefaultDeclaration(node) || t.isSpecifierDefault(node)) && !this.noInteropRequireExport && !this.hasNonDefaultExports;
}
bumpImportOccurences(node) {
var source = node.source.value;
var occurs = this.localImportOccurences;
occurs[source] ||= 0;
if (node.specifiers) {
occurs[source] += node.specifiers.length;
}
}
getLocalExports() {
this.file.path.traverse(exportsVisitor, this);
}
@@ -152,7 +140,7 @@ export default class DefaultFormatter {
}
remapAssignments() {
if (this.hasLocalImports) {
if (this.hasLocalExports || this.hasLocalImports) {
this.file.path.traverse(remapVisitor, this);
}
}

View File

@@ -6,7 +6,9 @@ import * as util from "../../util";
import * as t from "../../types";
export default class AMDFormatter extends DefaultFormatter {
init = CommonFormatter.prototype.init;
init() {
CommonFormatter.prototype._init.call(this, this.hasNonDefaultExports);
}
buildDependencyLiterals() {
var names = [];
@@ -78,9 +80,10 @@ export default class AMDFormatter extends DefaultFormatter {
this.defaultIds[key] = specifier.local;
}
if (includes(this.file.dynamicImportedNoDefault, node)) {
// Prevent unnecessary renaming of dynamic imports.
if (includes(this.file.dynamicImportAbsoluteDefaults, node)) {
// prevent unnecessary renaming of dynamic imports
this.ids[node.source.value] = ref;
ref = t.memberExpression(ref, t.identifier("default"));
} else if (t.isImportNamespaceSpecifier(specifier)) {
// import * as bar from "foo";
} else if (!includes(this.file.dynamicImported, node) && t.isSpecifierDefault(specifier) && !this.noInteropRequireImport) {
@@ -100,15 +103,34 @@ export default class AMDFormatter extends DefaultFormatter {
this.internalRemap[specifier.local.name] = ref;
}
exportSpecifier() {
CommonFormatter.prototype.exportSpecifier.apply(this, arguments);
exportSpecifier(specifier, node, nodes) {
if (this.doDefaultExportInterop(specifier)) {
nodes.push(util.template("exports-default-assign", {
VALUE: specifier.local
}, true));
} else {
CommonFormatter.prototype.exportSpecifier.apply(this, arguments);
}
}
exportDeclaration(node) {
exportDeclaration(node, nodes) {
if (this.doDefaultExportInterop(node)) {
this.passModuleArg = true;
var declar = node.declaration;
var assign = util.template("exports-default-assign", {
VALUE: this._pushStatement(declar, nodes)
}, true);
if (t.isFunctionDeclaration(declar)) {
// we can hoist this assignment to the top of the file
assign._blockHoist = 3;
}
nodes.push(assign);
return;
}
CommonFormatter.prototype.exportDeclaration.apply(this, arguments);
DefaultFormatter.prototype.exportDeclaration.apply(this, arguments);
}
}

View File

@@ -5,13 +5,17 @@ import * as t from "../../types";
export default class CommonJSFormatter extends DefaultFormatter {
init() {
this._init(this.hasLocalExports);
}
_init(conditional) {
var file = this.file;
var scope = file.scope;
scope.rename("module");
scope.rename("exports");
if (!this.noInteropRequireImport && this.hasNonDefaultExports) {
if (!this.noInteropRequireImport && conditional) {
var templateName = "exports-module-declaration";
if (this.file.isLoose("es6.modules")) templateName += "-loose";
var declar = util.template(templateName, true);
@@ -20,6 +24,20 @@ export default class CommonJSFormatter extends DefaultFormatter {
}
}
transform(program) {
DefaultFormatter.prototype.transform.apply(this, arguments);
if (this.hasDefaultOnlyExport) {
program.body.push(
t.expressionStatement(t.assignmentExpression(
"=",
t.memberExpression(t.identifier("module"), t.identifier("exports")),
t.memberExpression(t.identifier("exports"), t.identifier("default"))
))
);
}
}
importSpecifier(specifier, node, nodes) {
var variableName = specifier.local;
@@ -27,16 +45,18 @@ export default class CommonJSFormatter extends DefaultFormatter {
// import foo from "foo";
if (t.isSpecifierDefault(specifier)) {
if (includes(this.file.dynamicImportedNoDefault, node)) {
if (includes(this.file.dynamicImportAbsoluteDefaults, node)) {
this.internalRemap[variableName.name] = ref;
} else if (this.noInteropRequireImport) {
this.internalRemap[variableName.name] = t.memberExpression(ref, t.identifier("default"));
} else {
if (this.noInteropRequireImport) {
this.internalRemap[variableName.name] = t.memberExpression(ref, t.identifier("default"))
} else if (!includes(this.file.dynamicImported, node)) {
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(variableName, t.callExpression(this.file.addHelper("interop-require"), [ref]))
]));
}
var uid = this.scope.generateUidBasedOnNode(node, "import");
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(uid, t.callExpression(this.file.addHelper("interop-require-wildcard"), [ref]))
]));
this.internalRemap[variableName.name] = t.memberExpression(uid, t.identifier("default"));
}
} else {
if (t.isImportNamespaceSpecifier(specifier)) {
@@ -64,29 +84,15 @@ export default class CommonJSFormatter extends DefaultFormatter {
exportSpecifier(specifier, node, nodes) {
if (this.doDefaultExportInterop(specifier)) {
nodes.push(util.template("exports-default-assign", {
VALUE: specifier.local
}, true));
return;
} else {
DefaultFormatter.prototype.exportSpecifier.apply(this, arguments);
this.hasDefaultOnlyExport = true;
}
DefaultFormatter.prototype.exportSpecifier.apply(this, arguments);
}
exportDeclaration(node, nodes) {
if (this.doDefaultExportInterop(node)) {
var declar = node.declaration;
var assign = util.template("exports-default-assign", {
VALUE: this._pushStatement(declar, nodes)
}, true);
if (t.isFunctionDeclaration(declar)) {
// we can hoist this assignment to the top of the file
assign._blockHoist = 3;
}
nodes.push(assign);
return;
this.hasDefaultOnlyExport = true;
}
DefaultFormatter.prototype.exportDeclaration.apply(this, arguments);
@@ -98,7 +104,7 @@ export default class CommonJSFormatter extends DefaultFormatter {
var call = t.callExpression(t.identifier("require"), [node.source]);
var uid;
if (includes(this.file.dynamicImported, node) && !includes(this.file.dynamicImportedNoDefault, node)) {
if (includes(this.file.dynamicImportAbsoluteDefaults, node)) {
call = t.memberExpression(call, t.identifier("default"));
uid = node.specifiers[0].local;
} else {

View File

@@ -6,12 +6,8 @@ import each from "lodash/collection/each";
import map from "lodash/collection/map";
import * as t from "../../types";
var canHoist = function (node, file) {
return node._blockHoist && !file.transformers.runtime.canTransform();
}
var hoistVariablesVisitor = {
enter(node, parent, scope, hoistDeclarators) {
enter(node, parent, scope, state) {
if (t.isFunction(node)) {
// nothing inside is accessible
return this.skip();
@@ -24,13 +20,13 @@ var hoistVariablesVisitor = {
}
// ignore block hoisted nodes as these can be left in
if (canHoist(node, scope.file)) return;
if (state.formatter.canHoist(node)) return;
var nodes = [];
for (var i = 0; i < node.declarations.length; i++) {
var declar = node.declarations[i];
hoistDeclarators.push(t.variableDeclarator(declar.id));
state.hoistDeclarators.push(t.variableDeclarator(declar.id));
if (declar.init) {
// no initializer so we can just hoist it as-is
var assign = t.expressionStatement(t.assignmentExpression("=", declar.id, declar.init));
@@ -40,14 +36,8 @@ var hoistVariablesVisitor = {
// for (var i in test)
// for (var i = 0;;)
if (t.isFor(parent)) {
if (parent.left === node) {
return node.declarations[0].id;
}
if (parent.init === node) {
return nodes;
}
if (t.isFor(parent) && parent.left === node) {
return node.declarations[0].id;
}
return nodes;
@@ -56,11 +46,11 @@ var hoistVariablesVisitor = {
};
var hoistFunctionsVisitor = {
enter(node, parent, scope, handlerBody) {
enter(node, parent, scope, state) {
if (t.isFunction(node)) this.skip();
if (t.isFunctionDeclaration(node) || canHoist(node, scope.file)) {
handlerBody.push(node);
if (t.isFunctionDeclaration(node) || state.formatter.canHoist(node)) {
state.handlerBody.push(node);
this.remove();
}
}
@@ -174,6 +164,10 @@ export default class SystemFormatter extends AMDFormatter {
}));
}
canHoist(node) {
return node._blockHoist && !this.file.dynamicImports.length;
}
transform(program) {
DefaultFormatter.prototype.transform.apply(this, arguments);
@@ -197,7 +191,10 @@ export default class SystemFormatter extends AMDFormatter {
var returnStatement = handlerBody.pop();
// hoist up all variable declarations
this.file.scope.traverse(block, hoistVariablesVisitor, hoistDeclarators);
this.file.scope.traverse(block, hoistVariablesVisitor, {
formatter: this,
hoistDeclarators: hoistDeclarators
});
if (hoistDeclarators.length) {
var hoistDeclar = t.variableDeclaration("var", hoistDeclarators);
@@ -206,7 +203,10 @@ export default class SystemFormatter extends AMDFormatter {
}
// hoist up function declarations for circular references
this.file.scope.traverse(block, hoistFunctionsVisitor, handlerBody);
this.file.scope.traverse(block, hoistFunctionsVisitor, {
formatter: this,
handlerBody: handlerBody
});
handlerBody.push(returnStatement);

View File

@@ -1,6 +1,7 @@
import DefaultFormatter from "./_default";
import AMDFormatter from "./amd";
import values from "lodash/object/values";
import path from "path";
import * as util from "../../util";
import * as t from "../../types";
@@ -47,11 +48,11 @@ export default class UMDFormatter extends AMDFormatter {
// globals
var browserArgs = [t.memberExpression(t.identifier("module"), t.identifier("exports"))];
if (this.passModuleArg) browserArgs.push(t.identifier("module"));
var browserArgs = [];
if (this.passModuleArg) browserArgs.push(t.identifier("mod"));
for (let name in this.ids) {
var id = this.defaultIds[name] || t.identifier(t.toIdentifier(name));
var id = this.defaultIds[name] || t.identifier(t.toIdentifier(path.basename(name, path.extname(name))));
browserArgs.push(t.memberExpression(t.identifier("global"), id));
}
@@ -60,12 +61,17 @@ export default class UMDFormatter extends AMDFormatter {
var moduleName = this.getModuleName();
if (moduleName) defineArgs.unshift(t.literal(moduleName));
//
var globalArg = this.file.opts.basename;
if (moduleName) globalArg = moduleName;
globalArg = t.identifier(t.toIdentifier(globalArg));
var runner = util.template("umd-runner-body", {
AMD_ARGUMENTS: defineArgs,
COMMON_TEST: commonTests,
COMMON_ARGUMENTS: commonArgs,
BROWSER_ARGUMENTS: browserArgs,
GLOBAL_ARG: t.identifier(t.toIdentifier(this.file.opts.basename))
GLOBAL_ARG: globalArg
});
//

View File

@@ -1,4 +1,4 @@
{
"blacklist": ["useStrict", "es6.blockScoping", "regenerator"],
"blacklist": ["useStrict", "es6.blockScoping", "regenerator", "es6.spread"],
"loose": ["es6.modules"]
}

View File

@@ -0,0 +1,5 @@
if (SUPER_NAME != null) {
var NATIVE_REF = new SUPER_NAME(...arguments);
NATIVE_REF.__proto__ = CLASS_NAME.prototype;
return NATIVE_REF;
}

View File

@@ -1 +0,0 @@
CORE_ID.isIterable(VALUE);

View File

@@ -1 +0,0 @@
CORE_ID.getIterator(VALUE);

View File

@@ -4,7 +4,7 @@
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if (descriptor.value) descriptor.writable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}

View File

@@ -0,0 +1,33 @@
(function (descriptors) {
var target = {};
for (var i = 0; i < descriptors.length; i ++) {
var descriptor = descriptors[i];
var decorators = descriptor.decorators;
var key = descriptor.key;
// don't want to expose these to userland since i know people will rely on them
// and think it's spec behaviour
delete descriptor.key;
delete descriptor.decorators;
descriptor.enumerable = true;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
if (decorators) {
for (var f = 0; f < decorators.length; f++) {
var decorator = decorators[f];
if (typeof decorator === "function") {
descriptor = decorator(target, key, descriptor) || descriptor;
} else {
throw new TypeError("The decorator for method " + descriptor.key + " is of the invalid type " + typeof decorator);
}
}
}
Object.defineProperty(target, key, descriptor);
}
return target;
})

View File

@@ -4,7 +4,7 @@
}
FUNCTION_ID.toString = function () {
return FUNCTION_ID.toString();
return FUNCTION_KEY.toString();
};
return FUNCTION_ID;

View File

@@ -4,7 +4,7 @@
}
FUNCTION_ID.toString = function () {
return FUNCTION_ID.toString();
return FUNCTION_KEY.toString();
}
return FUNCTION_ID;

View File

@@ -4,8 +4,8 @@
} else if (COMMON_TEST) {
factory(COMMON_ARGUMENTS);
} else {
var module = { exports: {} };
factory(BROWSER_ARGUMENTS);
global.GLOBAL_ARG = module.exports;
var mod = { exports: {} };
factory(mod.exports, BROWSER_ARGUMENTS);
global.GLOBAL_ARG = mod.exports;
}
});

View File

@@ -5,14 +5,14 @@ export function check(node) {
return t.isProperty(node) && (node.kind === "get" || node.kind === "set");
}
export function ObjectExpression(node) {
export function ObjectExpression(node, parent, scope, file) {
var mutatorMap = {};
var hasAny = false;
node.properties = node.properties.filter(function (prop) {
if (prop.kind === "get" || prop.kind === "set") {
hasAny = true;
defineMap.push(mutatorMap, prop.key, prop.kind, prop.computed, prop.value);
defineMap.push(mutatorMap, prop, prop.kind, file);
return false;
} else {
return true;

View File

@@ -30,7 +30,7 @@ var collectPropertyReferencesVisitor = {
}
if (this.isReferenced() && scope.getBinding(node.name) === state.scope.getBinding(node.name)) {
state.references[node.name] = true;;
state.references[node.name] = true;
}
}
}
@@ -62,11 +62,27 @@ var verifyConstructorVisitor = traverse.explode({
}
},
FunctionDeclaration: {
enter() {
this.skip();
}
},
FunctionExpression: {
enter() {
this.skip();
}
},
ThisExpression: {
enter(node, parent, scope, state) {
if (state.hasSuper && !state.hasBareSuper) {
throw this.errorWithNode("'this' is not allowed before super()");
}
if (state.isNativeSuper) {
return state.nativeSuperRef;
}
}
}
});
@@ -121,6 +137,15 @@ class ClassTransformer {
//
var superClass = this.node.superClass;
this.isNativeSuper = superClass && t.isIdentifier(superClass) && t.NATIVE_TYPE_NAMES.indexOf(superClass.name) >= 0;
if (this.isNativeSuper) {
this.nativeSuperRef = this.scope.generateUidIdentifier("this");
}
//
var body = this.body;
//
@@ -143,7 +168,6 @@ class ClassTransformer {
var closureArgs = [];
//
if (this.hasSuper) {
closureArgs.push(superName);
@@ -155,27 +179,50 @@ class ClassTransformer {
}
//
var decorators = this.node.decorators;
if (decorators) {
// create a class reference to use later on
this.classRef = this.scope.generateUidIdentifier(classRef);
// this is so super calls and the decorators have access to the raw function
body.push(t.variableDeclaration("var", [
t.variableDeclarator(this.classRef, classRef)
]));
}
//
this.buildBody();
// make sure this class isn't directly called
constructorBody.body.unshift(t.expressionStatement(t.callExpression(file.addHelper("class-call-check"), [
t.thisExpression(),
classRef
this.classRef
])));
//
var decorators = this.node.decorators;
if (decorators) {
// reverse the decorators so we execute them in the right order
decorators = decorators.reverse();
for (var i = 0; i < decorators.length; i++) {
var decorator = decorators[i];
body.push(util.template("class-decorator", {
var decoratorNode = util.template("class-decorator", {
DECORATOR: decorator.expression,
CLASS_REF: classRef
}, true));
}, true);
decoratorNode.expression._ignoreModulesRemap = true;
body.push(decoratorNode);
}
}
if (this.isNativeSuper) {
// we've determined this is inheriting from a native class so return the constructed
// instance
constructorBody.body.push(t.returnStatement(this.nativeSuperRef));
}
if (this.className) {
// named class with only a constructor
if (body.length === 1) return t.toExpression(body[0]);
@@ -216,44 +263,15 @@ class ClassTransformer {
mutatorMap = this.instanceMutatorMap;
}
var alias = t.toKeyAlias(node);
//
var map = {};
if (has(mutatorMap, alias)) map = mutatorMap[alias];
mutatorMap[alias] = map;
//
map._inherits ||= [];
map._inherits.push(node);
map._key = node.key;
var map = defineMap.push(mutatorMap, node, kind, this.file);
if (enumerable) {
map.enumerable = t.literal(true)
}
if (node.computed) {
map._computed = true;
}
if (node.decorators) {
if (map.decorators) {
this.hasDecorators = true;
var decorators = map.decorators ||= t.arrayExpression([]);
decorators.elements = decorators.elements.concat(node.decorators.map(dec => dec.expression));
}
if (map.value || map.initializer) {
throw this.file.errorWithNode(node, "Key conflict with sibling node");
}
if (node.kind === "get") kind = "get";
if (node.kind === "set") kind = "set";
t.inheritsComments(node.value, node);
map[kind] = node.value;
}
/**
@@ -305,7 +323,9 @@ class ClassTransformer {
if (!this.hasConstructor && this.hasSuper) {
var helperName = "class-super-constructor-call";
if (this.isLoose) helperName += "-loose";
if (this.isNativeSuper) helperName = "class-super-native-constructor-call";
constructorBody.body.push(util.template(helperName, {
NATIVE_REF: this.nativeSuperRef,
CLASS_NAME: className,
SUPER_NAME: this.superName
}, true));
@@ -434,19 +454,36 @@ class ClassTransformer {
verifyConstructor(path: TraversalPath) {
var state = {
hasBareSuper: false,
bareSuper: null,
hasSuper: this.hasSuper,
file: this.file
nativeSuperRef: this.nativeSuperRef,
isNativeSuper: this.isNativeSuper,
hasBareSuper: false,
bareSuper: null,
hasSuper: this.hasSuper,
file: this.file
};
path.traverse(verifyConstructorVisitor, state);
path.get("value").traverse(verifyConstructorVisitor, state);
this.bareSuper = state.bareSuper;
if (!state.hasBareSuper && this.hasSuper) {
throw path.errorWithNode("Derived constructor must call super()");
}
if (this.isNativeSuper && this.bareSuper) {
this.bareSuper.replaceWithMultiple([
t.variableDeclaration("var", [
t.variableDeclarator(this.nativeSuperRef, t.newExpression(this.superName, this.bareSuper.node.arguments))
]),
t.expressionStatement(t.assignmentExpression(
"=",
t.memberExpression(this.nativeSuperRef, t.identifier("__proto__")),
t.memberExpression(this.classRef, t.identifier("prototype"))
)),
t.expressionStatement(this.nativeSuperRef)
]);
}
}
/**
@@ -483,8 +520,6 @@ class ClassTransformer {
*/
pushProperty(node: { type: "ClassProperty" }) {
if (!node.value && !node.decorators) return;
var key;
this.scope.traverse(node, collectPropertyReferencesVisitor, {
@@ -511,16 +546,17 @@ class ClassTransformer {
}, true));
}
} else {
if (node.static) {
// can just be added to the static map
this.pushToMap(node, true);
} else {
if (!node.static && node.value) {
// add this to the instancePropBody which will be added after the super call in a derived constructor
// or at the start of a constructor for a non-derived constructor
this.instancePropBody.push(t.expressionStatement(
t.assignmentExpression("=", t.memberExpression(t.thisExpression(), node.key), node.value)
));
node.value = t.identifier("undefined");
}
// can just be added to the static map
this.pushToMap(node, true);
}
}

View File

@@ -126,10 +126,11 @@ export function AssignmentExpression(node, parent, scope, file) {
if (!t.isPattern(node.left)) return;
var ref = scope.generateUidIdentifier("temp");
scope.push({ id: ref });
var nodes = [];
nodes.push(t.expressionStatement(t.assignmentExpression("=", ref, node.right)));
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(ref, node.right)
]));
var destructuring = new DestructuringTransformer({
operator: node.operator,
@@ -137,6 +138,11 @@ export function AssignmentExpression(node, parent, scope, file) {
scope: scope,
nodes: nodes
});
if (t.isArrayExpression(node.right)) {
destructuring.arrays[ref.name] = true;
}
destructuring.init(node.left, ref);
nodes.push(t.expressionStatement(ref));
@@ -332,7 +338,7 @@ class DestructuringTransformer {
if (t.isSpreadProperty(prop)) continue;
var key = prop.key;
if (t.isIdentifier(key)) key = t.literal(prop.key.name);
if (t.isIdentifier(key) && !prop.computed) key = t.literal(prop.key.name);
keys.push(key);
}
@@ -397,9 +403,14 @@ class DestructuringTransformer {
if (pattern.elements.length > arr.elements.length) return;
if (pattern.elements.length < arr.elements.length && !hasRest(pattern)) return false;
// deopt on holes
for (var i = 0; i < pattern.elements.length; i++) {
if (!pattern.elements[i]) return false;
var elem = pattern.elements[i];
// deopt on holes
if (!elem) return false;
// deopt on member expressions
if (t.isMemberExpression(elem)) return false;
}
// deopt on reference to left side identifiers

View File

@@ -17,9 +17,6 @@ export function ForOfStatement(node, parent, scope, file) {
var loop = build.loop;
var block = loop.body;
// inherit comments from the original loop
t.inheritsComments(loop, node);
// ensure that it's a block so we can take all its statements
t.ensureBlock(node);
@@ -32,6 +29,7 @@ export function ForOfStatement(node, parent, scope, file) {
block.body = block.body.concat(node.body.body);
t.inherits(loop, node);
t.inherits(loop.body, node.body);
if (build.replaceParent) {
this.parentPath.replaceWithMultiple(build.node);

View File

@@ -92,7 +92,7 @@ exports.Function = function (node, parent, scope, file) {
node.params = node.params.slice(0, lastNonDefaultParam);
if (state.iife) {
body.push(callDelegate(node));
body.push(callDelegate(node, scope));
node.body = t.blockStatement(body);
} else {
node.body.body = body.concat(node.body.body);

View File

@@ -179,7 +179,7 @@ class TailCallTransformer {
if (this.vars.length > 0) {
var declarations = flatten(map(this.vars, function (decl) {
return decl.declarations;
}, this));
}));
var assignment = reduceRight(declarations, function (expr, decl) {
return t.assignmentExpression("=", decl.id, expr);
}, t.identifier("undefined"));

View File

@@ -1,4 +1,33 @@
import * as defineMap from "../../helpers/define-map";
import * as t from "../../../types";
export var metadata = {
optional: true,
stage: 1
};
export function check(node) {
return !!node.decorators;
}
export function ObjectExpression(node, parent, scope, file) {
var hasDecorators = false;
for (var i = 0; i < node.properties.length; i++) {
var prop = node.properties[i];
if (prop.decorators) {
hasDecorators = true;
break;
}
}
if (!hasDecorators) return;
var mutatorMap = {};
for (var i = 0; i < node.properties.length; i++) {
defineMap.push(mutatorMap, node.properties[i], null, file);
}
var obj = defineMap.toClassObject(mutatorMap);
obj = defineMap.toComputedObjectFromClass(obj);
return t.callExpression(file.addHelper("create-decorated-object"), [obj]);
}

View File

@@ -0,0 +1,7 @@
export var metadata = {
stage: 1
};
export function check() {
return false;
}

View File

@@ -1,5 +1,6 @@
export default {
"es7.classProperties": require("./es7/class-properties"),
"es7.trailingFunctionCommas": require("./es7/trailing-function-commas"),
"es7.asyncFunctions": require("./es7/async-functions"),
"es7.decorators": require("./es7/decorators"),

View File

@@ -15,7 +15,7 @@ exports.Function = function (node, parent, scope, file) {
return remapAsyncToGenerator(
node,
t.memberExpression(file.addImport("bluebird", null, true), t.identifier("coroutine")),
t.memberExpression(file.addImport("bluebird"), t.identifier("coroutine")),
scope
);
};

View File

@@ -1,4 +1,4 @@
import regenerator from "regenerator-babel";
import regenerator from "regenerator";
import * as t from "../../../types";
export function check(node) {

View File

@@ -0,0 +1,99 @@
{
"builtins": {
"Symbol": "symbol",
"Promise": "promise",
"Map": "map",
"WeakMap": "weak-map",
"Set": "set",
"WeakSet": "weak-set"
},
"methods": {
"Array": {
"concat": "array/concat",
"copyWithin": "array/copy-within",
"entries": "array/entries",
"every": "array/every",
"fill": "array/fill",
"filter": "array/filter",
"findIndex": "array/find-index",
"find": "array/find",
"forEach": "array/for-each",
"from": "array/from",
"includes": "array/includes",
"indexOf": "array/index-of",
"join": "array/join",
"keys": "array/keys",
"lastIndexOf": "array/last-index-of",
"map": "array/map",
"of": "array/of",
"pop": "array/pop",
"push": "array/push",
"reduceRight": "array/reduce-right",
"reduce": "array/reduce",
"reverse": "array/reverse",
"shift": "array/shift",
"slice": "array/slice",
"some": "array/some",
"sort": "array/sort",
"splice": "array/splice",
"turn": "array/turn",
"unshift": "array/unshift",
"values": "array/values"
},
"Object": {
"assign": "object/assign",
"classof": "object/classof",
"define": "object/define",
"entries": "object/entries",
"freeze": "object/freeze",
"getOwnPropertyDescriptor": "object/get-own-property-descriptor",
"getOwnPropertyDescriptors": "object/get-own-property-descriptors",
"getOwnPropertyNames": "object/get-own-property-names",
"getOwnPropertySymbols": "object/get-own-property-symbols",
"getPrototypePf": "object/get-prototype-of",
"index": "object/index",
"isExtensible": "object/is-extensible",
"isFrozen": "object/is-frozen",
"isObject": "object/is-object",
"isSealed": "object/is-sealed",
"is": "object/is",
"keys": "object/keys",
"make": "object/make",
"preventExtensions": "object/prevent-extensions",
"seal": "object/seal",
"setPrototypeOf": "object/set-prototype-of",
"values": "object/values"
},
"RegExp": {
"escape": "regexp/escape"
},
"Function": {
"only": "function/only",
"part": "function/part"
},
"Math": {
"acosh": "math/acosh",
"asinh": "math/asinh",
"atanh": "math/atanh",
"cbrt": "math/cbrt",
"clz32": "math/clz32",
"cosh": "math/cosh",
"expm1": "math/expm1",
"fround": "math/fround",
"pot": "math/pot",
"imul": "math/imul",
"log10": "math/log10",
"log1p": "math/log1p",
"log2": "math/log2",
"sign": "math/sign",
"sinh": "math/sinh",
"tanh": "math/tanh",
"trunc": "math/trunc"
},
"Date": {
"addLocale": "date/add-locale",
"formatUTC": "date/format-utc",
"format": "date/format"
}
}
}

View File

@@ -1,23 +1,12 @@
import core from "core-js/library";
import includes from "lodash/collection/includes";
import * as util from "../../../util";
import * as util from "../../../../util";
import has from "lodash/object/has";
import * as t from "../../../types";
import * as t from "../../../../types";
import definitions from "./definitions";
var isSymbolIterator = t.buildMatchMemberExpression("Symbol.iterator");
var ALIASABLE_CONSTRUCTORS = [
"Symbol",
"Promise",
"Map",
"WeakMap",
"Set",
"WeakSet"
];
function coreHas(node) {
return node.name !== "_" && has(core, node.name);
}
const RUNTIME_MODULE_NAME = "babel-runtime";
var astVisitor = {
enter(node, parent, scope, file) {
@@ -30,13 +19,17 @@ var astVisitor = {
if (!t.isReferenced(obj, node)) return;
if (!node.computed && coreHas(obj) && has(core[obj.name], prop.name) && !scope.getBindingIdentifier(obj.name)) {
this.skip();
return t.prependToMemberExpression(node, file.get("coreIdentifier"));
}
} else if (this.isReferencedIdentifier() && !t.isMemberExpression(parent) && includes(ALIASABLE_CONSTRUCTORS, node.name) && !scope.getBindingIdentifier(node.name)) {
if (node.computed) return;
if (!has(definitions.methods, obj.name)) return;
if (!has(definitions.methods[obj.name], prop.name)) return;
if (scope.getBindingIdentifier(obj.name)) return;
var modulePath = definitions.methods[obj.name][prop.name];
return file.addImport(`${RUNTIME_MODULE_NAME}/core-js/${modulePath}`, `${obj.name}$${prop.name}`, true);
} else if (this.isReferencedIdentifier() && !t.isMemberExpression(parent) && has(definitions.builtins, node.name) && !scope.getBindingIdentifier(node.name)) {
// Symbol() -> _core.Symbol(); new Promise -> new _core.Promise
return t.memberExpression(file.get("coreIdentifier"), node);
var modulePath = definitions.builtins[node.name];
return file.addImport(`${RUNTIME_MODULE_NAME}/core-js/${modulePath}`, node.name, true);
} else if (this.isCallExpression()) {
// arr[Symbol.iterator]() -> _core.$for.getIterator(arr)
@@ -49,10 +42,7 @@ var astVisitor = {
prop = callee.property;
if (!isSymbolIterator(prop)) return false;
return util.template("corejs-iterator", {
CORE_ID: file.get("coreIdentifier"),
VALUE: callee.object
});
return t.callExpression(file.addImport(`${RUNTIME_MODULE_NAME}/core-js/get-iterator`, "getIterator", true), [callee.object]);
} else if (this.isBinaryExpression()) {
// Symbol.iterator in arr -> core.$for.isIterable(arr)
@@ -61,10 +51,7 @@ var astVisitor = {
var left = node.left;
if (!isSymbolIterator(left)) return;
return util.template("corejs-is-iterator", {
CORE_ID: file.get("coreIdentifier"),
VALUE: node.right
});
return t.callExpression(file.addImport(`${RUNTIME_MODULE_NAME}/core-js/is-iterator`, "isIterable", true), [node.right]);
}
}
};
@@ -79,15 +66,11 @@ exports.Program = function (node, parent, scope, file) {
exports.pre = function (file) {
file.set("helperGenerator", function (name) {
return file.addImport(`babel-runtime/helpers/${name}`, name);
});
file.setDynamic("coreIdentifier", function () {
return file.addImport("babel-runtime/core-js", "core");
return file.addImport(`${RUNTIME_MODULE_NAME}/helpers/${name}`, name, true);
});
file.setDynamic("regeneratorIdentifier", function () {
return file.addImport("babel-runtime/regenerator", "regeneratorRuntime");
return file.addImport(`${RUNTIME_MODULE_NAME}/regenerator`, "regeneratorRuntime", true);
});
};

View File

@@ -34,6 +34,7 @@ export var IfStatement = {
exit(node, parent, scope) {
var consequent = node.consequent;
var alternate = node.alternate;
var test = node.test;
var evaluateTest = this.get("test").evaluateTruthy();

View File

@@ -57,7 +57,7 @@ export function evaluate(): { confident: boolean; value: any } {
}
if (path.isLiteral()) {
if (node.regex && node.value === null) {
if (node.regex) {
// we have a regex and we can't represent it natively
} else {
return node.value;

View File

@@ -91,6 +91,9 @@ export default class TraversalPath {
if (this.parentPath.isExpressionStatement() || this.parentPath.isLabeledStatement()) {
return this.parentPath.insertBefore(nodes);
} else if (this.isPreviousType("Expression") || (this.parentPath.isForStatement() && this.key === "init")) {
if (this.node) nodes.push(this.node);
this.replaceExpressionWithStatements(nodes);
} else if (this.isPreviousType("Statement")) {
this._maybePopFromStatements(nodes);
if (Array.isArray(this.container)) {
@@ -101,15 +104,11 @@ export default class TraversalPath {
} else {
throw new Error("We don't know what to do with this node type. We were previously a Statement but we can't fit in here?");
}
} else if (this.isPreviousType("Expression")) {
if (this.node) nodes.push(this.node);
this.replaceExpressionWithStatements(nodes);
} else {
throw new Error("No clue what to do with this node type.");
}
}
_containerInsert(from, nodes) {
this.updateSiblingKeys(from, nodes.length);
@@ -133,11 +132,24 @@ export default class TraversalPath {
_maybePopFromStatements(nodes) {
var last = nodes[nodes.length - 1];
if (t.isExpressionStatement(last) && t.isIdentifier(last.expression)) {
if (t.isExpressionStatement(last) && t.isIdentifier(last.expression) && !this.isCompletionRecord()) {
nodes.pop();
}
}
isCompletionRecord() {
var path = this;
do {
var container = path.container;
if (Array.isArray(container) && path.key !== container.length - 1) {
return false;
}
} while (path = path.parentPath && !path.isProgram());
return true;
}
isStatementOrBlock() {
if (t.isLabeledStatement(this.parent) || t.isBlockStatement(this.container)) {
return false;
@@ -152,6 +164,13 @@ export default class TraversalPath {
if (this.parentPath.isExpressionStatement() || this.parentPath.isLabeledStatement()) {
return this.parentPath.insertAfter(nodes);
} else if (this.isPreviousType("Expression") || (this.parentPath.isForStatement() && this.key === "init")) {
if (this.node) {
var temp = this.scope.generateTemp();
nodes.unshift(t.expressionStatement(t.assignmentExpression("=", temp, this.node)));
nodes.push(t.expressionStatement(temp));
}
this.replaceExpressionWithStatements(nodes);
} else if (this.isPreviousType("Statement")) {
this._maybePopFromStatements(nodes);
if (Array.isArray(this.container)) {
@@ -159,16 +178,10 @@ export default class TraversalPath {
} else if (this.isStatementOrBlock()) {
if (this.node) nodes.unshift(this.node);
this.container[this.key] = t.blockStatement(nodes);
this.replaceExpressionWithStatements(nodes);
} else {
throw new Error("We don't know what to do with this node type. We were previously a Statement but we can't fit in here?");
}
} else if (this.isPreviousType("Expression")) {
if (this.node) {
var temp = this.scope.generateTemp();
nodes.unshift(t.expressionStatement(t.assignmentExpression("=", temp, this.node)));
nodes.push(t.expressionStatement(temp));
}
this.replaceExpressionWithStatements(nodes);
} else {
throw new Error("No clue what to do with this node type.");
}
@@ -547,6 +560,9 @@ export default class TraversalPath {
var binding = this.scope.getBinding(this.node.name);
if (!binding || !binding.constant) return;
// todo: take into consideration infinite recursion #1149
return;
if (binding.path === this) {
return this;
} else {

View File

@@ -80,7 +80,7 @@ export default class Scope {
if (cached && cached.parent === parent) {
return cached;
} else {
path.setData("scope", this);
//path.setData("scope", this);
}
this.parent = parent;
@@ -237,10 +237,15 @@ export default class Scope {
var local = this.getOwnBindingInfo(name);
if (!local) return;
if (kind === "param") return;
if (kind === "hoisted" && local.kind === "let") return;
if (local.kind === "let" || local.kind === "const" || local.kind === "module" || local.kind === "param") {
var duplicate = false;
duplicate ||= kind === "let" || kind === "const" || local.kind === "let" || local.kind === "const" || local.kind === "module";
duplicate ||= local.kind === "param" && (kind === "let" || kind === "const");
if (duplicate) {
throw this.file.errorWithNode(id, messages.get("scopeDuplicateDeclaration", name), TypeError);
}
}
@@ -444,7 +449,7 @@ export default class Scope {
if (path.isLoop()) {
for (let i = 0; i < t.FOR_INIT_KEYS.length; i++) {
var node = path.get(t.FOR_INIT_KEYS[i]);
if (node.isBlockScoped()) this.registerBinding("let", node);
if (node.isBlockScoped()) this.registerBinding(node.node.kind, node);
}
}
@@ -472,6 +477,15 @@ export default class Scope {
this.traverse(path.get("body").node, blockVariableVisitor, this);
}
// Program, Function - var variables
if (path.isProgram() || path.isFunction()) {
this.traverse(path.node, functionVariableVisitor, {
blockId: path.get("id").node,
scope: this
});
}
// Program, BlockStatement, Function - let variables
if (path.isBlockStatement() || path.isProgram()) {
@@ -490,15 +504,6 @@ export default class Scope {
this.registerBinding("let", path);
}
// Program, Function - var variables
if (path.isProgram() || path.isFunction()) {
this.traverse(path.node, functionVariableVisitor, {
blockId: path.get("id").node,
scope: this
});
}
// Program
if (path.isProgram()) {

View File

@@ -57,7 +57,8 @@
"id": null,
"params": null,
"body": null,
"generator": false
"generator": false,
"async": false
},
"GenericTypeAnnotation": {

View File

@@ -115,7 +115,8 @@ export function isReferencedIdentifier(node: Object, parent: Object, opts?: Obje
*/
export function isValidIdentifier(name: string): boolean {
return isString(name) && esutils.keyword.isIdentifierName(name) && !esutils.keyword.isReservedWordES6(name, true);
if (!isString(name) || esutils.keyword.isReservedWordES6(name, true)) return false;
return esutils.keyword.isIdentifierNameES6(name);
}
/**

View File

@@ -11,8 +11,8 @@
"CallExpression": ["callee", "arguments"],
"CatchClause": ["param", "body"],
"ClassBody": ["body"],
"ClassDeclaration": ["id", "body", "superClass", "typeParameters", "superTypeParameters", "implements"],
"ClassExpression": ["id", "body", "superClass", "typeParameters", "superTypeParameters", "implements"],
"ClassDeclaration": ["id", "body", "superClass", "typeParameters", "superTypeParameters", "implements", "decorators"],
"ClassExpression": ["id", "body", "superClass", "typeParameters", "superTypeParameters", "implements", "decorators"],
"ComprehensionBlock": ["left", "right", "body"],
"ComprehensionExpression": ["filter", "blocks", "body"],
"ConditionalExpression": ["test", "consequent", "alternate"],
@@ -40,12 +40,12 @@
"LogicalExpression": ["left", "right"],
"MemberExpression": ["object", "property"],
"MetaProperty": ["meta", "property"],
"MethodDefinition": ["key", "value"],
"MethodDefinition": ["key", "value", "decorators"],
"NewExpression": ["callee", "arguments"],
"ObjectExpression": ["properties"],
"ObjectPattern": ["properties", "typeAnnotation"],
"Program": ["body"],
"Property": ["key", "value"],
"Property": ["key", "value", "decorators"],
"RestElement": ["argument", "typeAnnotation"],
"ReturnStatement": ["argument"],
"SequenceExpression": ["expressions"],

View File

@@ -55,7 +55,15 @@ export function resolveRelative(loc: string) {
}
export function list(val: string): Array<string> {
return val ? val.split(",") : [];
if (!val) {
return [];
} else if (Array.isArray(val)) {
return val;
} else if (typeof val === "string") {
return val.split(",");
} else {
return [val];
}
}
export function regexify(val: any): RegExp {
@@ -85,6 +93,21 @@ export function booleanify(val: any): boolean {
return val;
}
export function shouldIgnore(filename, ignore, only) {
if (only.length) {
for (var i = 0; i < only.length; i++) {
if (only[i].test(filename)) return false;
}
return true;
} else if (ignore.length) {
for (var i = 0; i < ignore.length; i++) {
if (ignore[i].test(filename)) return true;
}
}
return false;
}
var templateVisitor = {
enter(node, parent, scope, nodes) {
if (t.isExpressionStatement(node)) {

View File

@@ -2787,6 +2787,66 @@ test('class Foo { @bar static foo = "bar"; }', {
features: { "es7.classProperties": true, "es7.decorators": true }
});
test("var obj = { @foo bar: 'wow' };", {
"start": 0,
"body": [{
"start": 0,
"declarations": [{
"start": 4,
"id": {
"start": 4,
"name": "obj",
"type": "Identifier",
"end": 7
},
"init": {
"start": 10,
"properties": [{
"start": 17,
"key": {
"start": 17,
"name": "bar",
"type": "Identifier",
"end": 20
},
"value": {
"start": 22,
"value": "wow",
"raw": "'wow'",
"type": "Literal",
"end": 27
},
"kind": "init",
"decorators": [{
"start": 12,
"expression": {
"start": 13,
"name": "foo",
"type": "Identifier",
"end": 16
},
"type": "Decorator",
"end": 16
}],
"type": "Property",
"end": 27
}],
"type": "ObjectExpression",
"end": 29
},
"type": "VariableDeclarator",
"end": 29
}],
"kind": "var",
"type": "VariableDeclaration",
"end": 30
}],
"type": "Program",
"end": 30
}, {
features: { "es7.decorators": true }
});
// ES7 export extensions - https://github.com/leebyron/ecmascript-more-export-from
test('export foo, { bar } from "bar";', {
@@ -2940,3 +3000,99 @@ test('export * as foo from "bar";', {
sourceType: "module",
features: { "es7.exportExtensions": true }
});
// ES7: Trailing Function Commas
test("log(n, '=', 2,);", {
type: "Program",
start: 0,
end: 16,
body: [{
type: "ExpressionStatement",
start: 0,
end: 16,
expression: {
type: "CallExpression",
callee: {
type: "Identifier",
name: "log",
start: 0,
end: 3
},
arguments: [{
type: "Identifier",
name: "n",
start: 4,
end: 5
}, {
type: "Literal",
value: "=",
raw: "'='",
start: 7,
end: 10
}, {
type: "Literal",
raw: "2",
value: 2,
start: 12,
end: 13
}]
}
}]
}, {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
test("function log(n, op, val,) { }", {
type: "Program",
start: 0,
end: 29,
body: [{
type: "FunctionDeclaration",
id: {
type: "Identifier",
name: "log",
start: 9,
end: 12
},
start: 0,
end: 29,
expression: false,
params: [{
type: "Identifier",
name: "n",
start: 13,
end: 14
}, {
type: "Identifier",
name: "op",
start: 16,
end: 18
}, {
type: "Identifier",
name: "val",
start: 20,
end: 23
}],
body: {
type: "BlockStatement",
start: 26,
end: 29,
body: []
}
}]
}, {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
testFail("log(,);", "Unexpected token (1:4)", {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});
testFail("function log(,) { }", "Unexpected token (1:13)", {
ecmaVersion: 7,
features: { "es7.trailingFunctionCommas": true }
});

View File

@@ -10959,7 +10959,7 @@ var fbTestFixture = {
}
},
},
'Bounded Polymorphism': {
'Bounded Polymorphism': {
'class A<T: Foo> {}': {
type: 'ClassDeclaration',
id: {

View File

@@ -1714,6 +1714,8 @@ test("([a, , b]) => 42", {
testFail("([a.a]) => 42", "Assigning to rvalue (1:2)", {ecmaVersion: 6});
testFail("console.log(typeof () => {});", "Unexpected token (1:20)", {ecmaVersion: 6});
test("(x=1) => x * x", {
type: "Program",
body: [{

View File

@@ -70,6 +70,7 @@ var buildTest = function (binName, testName, opts) {
return function (callback) {
this.timeout(5000);
clear();
saveInFiles(opts.inFiles);
var args = [binLoc].concat(opts.args);
@@ -109,11 +110,11 @@ var buildTest = function (binName, testName, opts) {
};
};
before(function () {
var clear = function () {
if (fs.existsSync(tmpLoc)) rimraf.sync(tmpLoc);
fs.mkdirSync(tmpLoc);
process.chdir(tmpLoc);
});
};
_.each(fs.readdirSync(fixtureLoc), function (binName) {
if (binName[0] === ".") return;

View File

@@ -12,10 +12,7 @@ suite("browserify", function() {
assert.ok(bundle.length, "bundle output code");
// ensure that the code runs without throwing an exception
vm.runInNewContext("var global = this;\n" + bundle, {
setInterval: function () {},
setTimeout: function () {}
});
vm.runInNewContext("var global = this;\n" + bundle, {});
done();
})
})

View File

@@ -0,0 +1 @@
bar;

View File

@@ -0,0 +1,3 @@
{
"args": ["src", "--out-dir", "lib", "--ignore", "src/foo/*"]
}

View File

@@ -0,0 +1 @@
src/bar/index.js -> lib/bar/index.js

View File

@@ -0,0 +1 @@
bar;

View File

@@ -0,0 +1,3 @@
{
"args": ["src", "--out-dir", "lib", "--only", "src/bar/*"]
}

View File

@@ -0,0 +1 @@
src/bar/index.js -> lib/bar/index.js

View File

@@ -0,0 +1,4 @@
var foo = arr.map(v => ({
x: v.bar,
y: v.bar*2
}));

View File

@@ -0,0 +1,4 @@
var foo = arr.map(v => ({
x: v.bar,
y: v.bar * 2
}));

View File

@@ -2,6 +2,8 @@
var _bluebird2 = require("bluebird");
var _bluebird3 = babelHelpers.interopRequireWildcard(_bluebird2);
var Foo = (function () {
function Foo() {
babelHelpers.classCallCheck(this, Foo);
@@ -9,7 +11,7 @@ var Foo = (function () {
babelHelpers.createClass(Foo, [{
key: "foo",
value: _bluebird2.coroutine(function* () {
value: _bluebird3["default"].coroutine(function* () {
var wat = yield bar();
})
}]);

View File

@@ -2,6 +2,10 @@
var _bluebird2 = require("bluebird");
var foo = _bluebird2.coroutine(function* () {
var _bluebird3 = _interopRequireWildcard(_bluebird2);
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; };
var foo = _bluebird3["default"].coroutine(function* () {
var wat = yield bar();
});

View File

@@ -2,9 +2,13 @@
var _bluebird2 = require("bluebird");
var _bluebird3 = _interopRequireWildcard(_bluebird2);
var _bar;
var foo = _bar = _bluebird2.coroutine(function* () {
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; };
var foo = _bar = _bluebird3["default"].coroutine(function* () {
console.log(_bar);
});

View File

@@ -2,6 +2,10 @@
var _bluebird2 = require("bluebird");
var foo = _bluebird2.coroutine(function* () {
var _bluebird3 = _interopRequireWildcard(_bluebird2);
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; };
var foo = _bluebird3["default"].coroutine(function* () {
var wat = yield bar();
});

View File

@@ -0,0 +1,10 @@
class Foo extends Array {
}
class Bar extends Array {
constructor() {
super();
this.foo = "bar";
}
}

View File

@@ -0,0 +1,27 @@
class Foo extends Array {
}
class Bar extends Array {
constructor() {
super();
this.foo = "bar";
}
}
var foo = new Foo;
assert.ok(Array.isArray(foo));
foo.push(1);
foo.push(2);
assert.equal(foo[0], 1);
assert.equal(foo[1], 2);
assert.equal(foo.length, 2);
var bar = new Bar;
assert.ok(Array.isArray(bar));
assert.equal(bar.foo, "bar");
bar.push(1);
bar.push(2);
assert.equal(bar[0], 1);
assert.equal(bar[1], 2);
assert.equal(bar.length, 2);

View File

@@ -0,0 +1,35 @@
"use strict";
var Foo = (function (_Array) {
function Foo() {
babelHelpers.classCallCheck(this, Foo);
if (_Array != null) {
var _this = new (babelHelpers.bind.apply(_Array, [null].concat(babelHelpers.slice.call(arguments))))();
_this.__proto__ = Foo.prototype;
return _this;
}
return _this;
}
babelHelpers.inherits(Foo, _Array);
return Foo;
})(Array);
var Bar = (function (_Array2) {
function Bar() {
babelHelpers.classCallCheck(this, Bar);
var _this2 = new _Array2();
_this2.__proto__ = Bar.prototype;
_this2.foo = "bar";
return _this2;
}
babelHelpers.inherits(Bar, _Array2);
return Bar;
})(Array);

View File

@@ -0,0 +1,3 @@
for (const i = 0; i < 3; i = i + 1) {
console.log(i);
}

View File

@@ -0,0 +1,3 @@
{
"throws": "\"i\" is read-only"
}

View File

@@ -8,3 +8,4 @@ var [[a, b, ...c]] = [[1, 2, 3, 4]];
var [a, b] = [1, 2, 3];
var [[a, b]] = [[1, 2, 3]];
var [a, b] = [a, b];
[a[0], a[1]] = [a[1], a[0]];

View File

@@ -22,3 +22,7 @@ var b = _ref2[1];
var _ref3 = [a, b];
var a = _ref3[0];
var b = _ref3[1];
var _temp = [a[1], a[0]];
a[0] = _temp[0];
a[1] = _temp[1];
_temp;

View File

@@ -0,0 +1,2 @@
var x, y;
[x, y] = [1, 2];

View File

@@ -0,0 +1,7 @@
"use strict";
var x, y;
var _temp = [1, 2];
x = _temp[0];
y = _temp[1];
_temp;

View File

@@ -1,5 +1,5 @@
"use strict";
var _temp, _temp2;
var _temp;
console.log((_temp = [123], _temp2 = babelHelpers.slicedToArray(_temp, 1), x = _temp2[0], _temp));
console.log((_temp = [123], x = _temp[0], _temp));

View File

@@ -1,4 +1,5 @@
var z = {};
var { ...x } = z;
var { x, ...y } = z;
var { [x]: x, ...y } = z;
(function({ x, ...y }) { })

View File

@@ -4,6 +4,8 @@ var z = {};
var x = babelHelpers.objectWithoutProperties(z, []);
var x = z.x;
var y = babelHelpers.objectWithoutProperties(z, ["x"]);
var x = z[x];
var y = babelHelpers.objectWithoutProperties(z, [x]);
(function (_ref) {
var x = _ref.x;

View File

@@ -1,6 +1,7 @@
"use strict";
foo.foo = 1;
foo.bar = 2;
var _ref = [1, 2];
foo.foo = _ref[0];
foo.bar = _ref[1];
;

View File

@@ -2,13 +2,16 @@
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
module.exports = foo;
module.exports = 42;
module.exports = {};
module.exports = [];
module.exports = foo;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = foo;
exports["default"] = 42;
exports["default"] = {};
exports["default"] = [];
exports["default"] = foo;
module.exports = function () {};
exports["default"] = function () {};
var _default = (function () {
var _class = function _default() {
@@ -18,7 +21,7 @@ var _default = (function () {
return _class;
})();
module.exports = _default;
exports["default"] = _default;
function foo() {}
@@ -26,5 +29,6 @@ var Foo = function Foo() {
_classCallCheck(this, Foo);
};
module.exports = Foo;
module.exports = foo;
exports["default"] = Foo;
exports["default"] = foo;
module.exports = exports["default"];

Some files were not shown because too many files have changed in this diff Show More