Compare commits

...

176 Commits

Author SHA1 Message Date
Sebastian McKenzie
2053610429 v5.5.3 2015-06-05 12:20:22 +01:00
Sebastian McKenzie
cd4f83b299 fix linting errors 2015-06-05 12:19:32 +01:00
Sebastian McKenzie
ec29ba19a9 add 5.5.3 changelog 2015-06-05 12:18:43 +01:00
Sebastian McKenzie
9dc03e0978 traverse over ClassProperty path rather than node 2015-06-05 12:17:55 +01:00
Sebastian McKenzie
bc4258eca9 add type inferrence for template literals 2015-06-05 12:17:45 +01:00
Sebastian McKenzie
b0e58f9770 add completion statement test and enable experimental option on deadCodeElimination tests 2015-06-05 12:17:36 +01:00
Sebastian McKenzie
a1e2641c91 5.5.2 2015-06-05 12:17:18 +01:00
Sebastian McKenzie
9108422f99 v5.5.2 2015-06-05 12:03:38 +01:00
Sebastian McKenzie
9e8f4b25ca add missing semicolon 2015-06-05 12:02:30 +01:00
Sebastian McKenzie
1cecd24823 make experimental warning more scary 2015-06-05 12:01:52 +01:00
Sebastian McKenzie
97f6e1469b add 5.5.2 changelog 2015-06-05 12:01:44 +01:00
Sebastian McKenzie
ec46eaf224 add scary experimental warning for people who use obscure transformers that are still WIP 2015-06-05 11:55:09 +01:00
Sebastian McKenzie
a102692103 when using babel/register always use the cwd - fixes #1689 2015-06-05 11:54:52 +01:00
Sebastian McKenzie
0376ec8ff0 t.isPure -> this.isPure - fixes #1688 2015-06-05 11:33:25 +01:00
Sebastian McKenzie
5932a07610 5.5.1 2015-06-05 09:57:21 +01:00
Sebastian McKenzie
6110b0c0b3 v5.5.1 2015-06-05 09:56:27 +01:00
Sebastian McKenzie
365e221d95 fix deoptValue binding boolean - fixes #1687 2015-06-05 09:55:47 +01:00
Sebastian McKenzie
acbc4859c0 only remove ClassProperty in flow transformer when it has no value 2015-06-05 09:53:59 +01:00
Sebastian McKenzie
55750e05e7 Revert "enable es6.spec.symbols by default"
This reverts commit f3acedbf08.
2015-06-05 09:44:22 +01:00
Sebastian McKenzie
ba9c4db673 finish 5.5.1 changelog - ref #1686 2015-06-05 09:43:34 +01:00
Sebastian McKenzie
ba8a63a69e remove trailing json comma 2015-06-05 09:42:53 +01:00
Sebastian McKenzie
25581981b5 always remove ClassProperty nodes in flow transformer - fixes #1686 2015-06-05 09:42:46 +01:00
Sebastian McKenzie
02a6feed73 update template literal parsing to properly handle newlines 2015-06-05 09:36:37 +01:00
Sebastian McKenzie
f3acedbf08 enable es6.spec.symbols by default 2015-06-05 08:43:41 +01:00
Sebastian McKenzie
35ab4ffaab 5.5.0 2015-06-05 08:12:17 +01:00
Sebastian McKenzie
ddfb7f2c11 v5.5.0 2015-06-05 08:11:10 +01:00
Sebastian McKenzie
e2ca03f92d fix linting errors 2015-06-05 08:10:22 +01:00
Sebastian McKenzie
c75a3c68e5 add 5.5.0 changelog 2015-06-05 08:08:20 +01:00
Sebastian McKenzie
5d617ea99b upgrade regenerator - fixes #1685 2015-06-05 07:56:33 +01:00
Sebastian McKenzie
58059a2c48 add deoptValue method to Binding that ignores all subsequent setValue calls 2015-06-05 07:52:57 +01:00
Sebastian McKenzie
4c2936773a update type inferrence to support unary operators 2015-06-05 07:47:22 +01:00
Sebastian McKenzie
c7c16ad9c1 add control flow support and deopt bindings on assignments that we can't understand 2015-06-05 07:46:32 +01:00
Sebastian McKenzie
7b676d608b allow NodePaths to be returned in node removal/replacement methods and coerce them to nodes 2015-06-05 07:46:10 +01:00
Sebastian McKenzie
48ecec1e2e move more transformers to builtin-pre group 2015-06-05 07:45:32 +01:00
Sebastian McKenzie
9dc72e71d4 add skipKey method to skip traversal of subsequent keys 2015-06-05 07:45:19 +01:00
Sebastian McKenzie
4a7a02b9af rename builtin-setup transformer group to builtin-pre 2015-06-05 07:44:45 +01:00
Sebastian McKenzie
7cb460d2f3 add eval optional transformer 2015-06-05 07:44:29 +01:00
Sebastian McKenzie
0a7dac8744 move flow to builtin-trailing group 2015-06-05 07:44:15 +01:00
Sebastian McKenzie
667d595a73 use type inferrence to work out whether to wrap template literals with the String constructor 2015-06-05 07:43:58 +01:00
Sebastian McKenzie
2d2d957be5 add back ComprehensionBlock binding identifier keys and remove body form ComprehensionBlock visitor keys 2015-06-04 22:50:17 +01:00
Sebastian McKenzie
5aef7afade fix remaining AssignmentExpression LHS ReferencedIdentifier bugs 2015-06-04 22:43:50 +01:00
Sebastian McKenzie
d5e7b5616c Merge branch 'master' of github.com:babel/babel 2015-06-04 22:23:42 +01:00
Sebastian McKenzie
9aa17a6cc2 don't consider JSXIdentifier HTML tags to be references - fixes #1683 2015-06-04 22:23:24 +01:00
Sebastian McKenzie
0f13097f59 add basic naive constant folding of assignment expressions 2015-06-04 22:08:38 +01:00
Sebastian McKenzie
355ffbdaf8 don't consider the LHS of an AssignmentExpression to be a reference 2015-06-04 22:07:44 +01:00
Sebastian McKenzie
45b0d63d72 copy parent class binding to class in the collection visitor 2015-06-04 22:07:19 +01:00
Sebastian McKenzie
c515271fbd Merge pull request #1677 from jmm/node_modules-robust3
Complete "Fix flawed require hook node_modules check" properly
2015-06-03 19:23:41 +01:00
Jesse McCarthy
6f3501876a Add test for require-hook node_modules check. 2015-06-03 09:04:59 -04:00
Jesse McCarthy
f8afc5fa17 Revert "Add test for require-hook node_modules check."
This reverts commit 1488d88c81.

Wrong branch was accidentally merged. There is a better test.
2015-06-03 09:04:59 -04:00
Sebastian McKenzie
4ecda93147 move deprecated minification.inlineExpressions to aliases 2015-06-03 10:05:56 +01:00
Sebastian McKenzie
41847162b1 check if es7.exportExtensions ie enabled in parser 2015-06-03 10:05:39 +01:00
Sebastian McKenzie
0f7e010e3e remove isSpecifierDefault check for ExportDefaultSpecifier - fixes #1673 2015-06-03 10:05:19 +01:00
Sebastian McKenzie
8201ea0aa2 Merge branch 'master' of github.com:babel/babel
# Conflicts:
#	src/babel/api/register/node.js
2015-06-03 07:26:46 +01:00
Sebastian McKenzie
a7848c1822 Merge branch 'jmm-node_modules-robust' 2015-06-03 07:26:19 +01:00
Sebastian McKenzie
d4abaeeecf Merge branch 'node_modules-robust' of https://github.com/jmm/babel into jmm-node_modules-robust 2015-06-03 07:26:12 +01:00
Sebastian McKenzie
871a82df0a Merge pull request #1665 from Jabher/master
Making babel able to run in node_modules directory
2015-06-03 07:25:22 +01:00
Sebastian McKenzie
ffbf5b0b47 convert property key to computed before checking if it's a displayName property in the react transformer builder - closes #1671 2015-06-02 23:08:46 +01:00
Sebastian McKenzie
9dcceaeb40 move minification.deadCodeElimination back to the builtin-setup transformer group 2015-06-02 17:08:49 +01:00
Sebastian McKenzie
556e58a4ab register function declarations anyway as we may not have hit them 2015-06-02 17:08:31 +01:00
Sebastian McKenzie
b6c35743e6 add import types 2015-06-02 16:24:32 +01:00
Sebastian McKenzie
0abd34f7e6 Merge branch 'master' of github.com:babel/babel 2015-06-02 16:18:13 +01:00
Sebastian McKenzie
cafd7f8e39 add Infinity/NaN, string/number member expressions/calls and Math calls static evaluation 2015-06-02 16:18:08 +01:00
Sebastian McKenzie
43c0a0e65f remove all non-function statements after completion statements in blocks 2015-06-02 16:16:36 +01:00
Sebastian McKenzie
7b359f46fd rename minification.inlineExpressions to minification.constantFolding 2015-06-02 16:16:10 +01:00
Sebastian McKenzie
880827f6ce Merge pull request #1669 from wincent/mixed-type
Add "mixed" Flow type
2015-06-02 16:15:23 +01:00
Greg Hurrell
0c300058a3 Add "mixed" Flow type
"mixed" is one of the base types listed here:

http://flowtype.org/docs/base-types.html

So this commit adds support for it.
2015-06-02 07:15:06 -07:00
Sebastian McKenzie
d35be22f7d add support for resolving array expression elements 2015-06-02 00:32:18 +01:00
Sebastian McKenzie
ff8d90061f add "istanbul ignore next" auxiliary comment when using istanbul compat mode for babel/register 2015-06-02 00:32:07 +01:00
Vsevolod Rodionov
e66109f9d0 Making babel able to run in node_modules directory (while still ignoring node_modules packages)
In case if app is installed by npm install <git tarball url> which is very comfortable thing (postinstall hooks, automatic package installation and so on) babel is unable to run over packages, e.g.
```
 ~/node_modules/some_app$ node-babel app.js
  ```
 is crashing as babel do not want in node_modules directory.

 relative path gives ability to check whether lib is in node_modules _relative_ to current app, so that if app is ran in node_modules by itself it will not be captured.
2015-06-01 14:55:51 -07:00
Sebastian McKenzie
1934c16f0f don't use initializer property for decorators on concise methods in object literals 2015-06-01 22:32:04 +01:00
Sebastian McKenzie
012ac7d9ec remove accidental console.log introduced in 80a7f13460 2015-06-01 22:01:27 +01:00
Jesse McCarthy
efb3b04225 Make node_modules path check robust. 2015-06-01 16:54:56 -04:00
Jesse McCarthy
1488d88c81 Add test for require-hook node_modules check.
(Failing.)
2015-06-01 16:54:52 -04:00
Sebastian McKenzie
80a7f13460 register named method id as a reference to avoid collisions - fixes #1664 2015-06-01 21:53:34 +01:00
Sebastian McKenzie
8919fc22b1 only infer single identifier new expression callees 2015-06-01 21:52:54 +01:00
Sebastian McKenzie
b1273cb774 Merge pull request #1663 from pangratz/fix_for_referencesImport
Minor fix for `referencesImport`
2015-06-01 18:13:49 +01:00
pangratz
0843b8355e Minor fix for referencesImport 2015-06-01 19:09:33 +02:00
Sebastian McKenzie
6457677fb4 add support for NewExpression and reference plain node 2015-06-01 17:29:02 +01:00
Sebastian McKenzie
f8a860bf21 remove unused import 2015-06-01 14:32:58 +01:00
Sebastian McKenzie
f2bed33db8 add type inference for ConditionalExpression, SequenceExpression, AssignmentExpression and add support for base type aliases in isTypeAnnotationGeneric method 2015-06-01 14:25:06 +01:00
Sebastian McKenzie
7d2c6525d8 flesh out type inferrence some more, rename some of the NodePath methods to be less ambiguous, remove dead Binding type methods 2015-06-01 14:01:14 +01:00
Sebastian McKenzie
de652dc747 change getBindingIdentifier keys to be just a string instead of an array 2015-06-01 12:06:36 +01:00
Sebastian McKenzie
9f1053212b add EmptyStatement to t.toSequenceExpression 2015-06-01 12:06:16 +01:00
Sebastian McKenzie
76690a3deb renamed Path#isPreviousType to isType 2015-06-01 12:05:42 +01:00
Sebastian McKenzie
50f2f2fc98 remove DoExpression statement parsing and clear labels and set inFunction to false when parsing DoExpression body - fixes #1658 2015-06-01 03:36:14 +01:00
Sebastian McKenzie
5c27234d19 change TCO BlockStatement visitor back to enter 2015-06-01 00:17:44 +01:00
Sebastian McKenzie
6f5d16f397 remove TCOable check 2015-06-01 00:14:12 +01:00
Sebastian McKenzie
e42a43e3d1 remove unnecessary strict helper 2015-05-31 23:40:59 +01:00
Sebastian McKenzie
bfd307cd57 move some visitors out of deoptimising enter method 2015-05-31 23:40:42 +01:00
Sebastian McKenzie
beb5ee1333 remove useless generator test helpers 2015-05-31 21:26:22 +01:00
Sebastian McKenzie
cde871555d don't pass comments in tokens to estraverse 2015-05-31 21:26:12 +01:00
Sebastian McKenzie
51b0ffa7bf prepend Comment to comment node types 2015-05-31 20:25:26 +01:00
Sebastian McKenzie
255c819727 optimise ES6 tail call transformer to only try TOC on functions that include a call to themselves 2015-05-31 15:40:41 +01:00
Sebastian McKenzie
152ccb2ce8 check if ObjectExpression has any gets/sets before filtering 2015-05-31 15:40:07 +01:00
Sebastian McKenzie
bdb3adfeea revert parts of 07a992e 2015-05-31 09:47:27 +01:00
Sebastian McKenzie
236086bee5 ignore trailing commas when inferring newlines - fixes #1304 2015-05-31 09:46:05 +01:00
Sebastian McKenzie
1436753e6d fix linting errors 2015-05-31 09:24:12 +01:00
Sebastian McKenzie
eadf8ef799 fix syntax error in helpers/parse 2015-05-31 09:20:16 +01:00
Sebastian McKenzie
f1e20cf6ff remove useless comment 2015-05-31 09:16:34 +01:00
Sebastian McKenzie
82a0851526 push comments to token stream to avoid having to re-sort - #1486 2015-05-31 09:16:27 +01:00
Sebastian McKenzie
07a992e6d3 add support for tail calls when in completion record position - fixes #1572 2015-05-31 09:07:44 +01:00
Sebastian McKenzie
f642c2baa8 relax key aliases for plain methods - fixes #1649 2015-05-30 23:53:39 -04:00
Sebastian McKenzie
2f7743cafb optimise module metadata retrieval - #1486 2015-05-30 23:42:24 -04:00
Sebastian McKenzie
44112f2d87 remove unused variable 2015-05-30 23:18:50 -04:00
Sebastian McKenzie
99c4810770 add regeneratot transform to builtin-advanced group 2015-05-30 23:18:45 -04:00
Sebastian McKenzie
9f2ac15695 move jscript transformer to the builtin-trailing group and perform transform on exit - closes #1652, fixes #1651 2015-05-30 23:09:25 -04:00
Sebastian McKenzie
19c1ee157f simplify scope parent alias keys 2015-05-30 23:08:42 -04:00
Sebastian McKenzie
973270772b use ForX alias instead of manually listing all types 2015-05-30 23:08:28 -04:00
Sebastian McKenzie
7334326042 remove extra semicolon 2015-05-30 22:37:18 -04:00
Sebastian McKenzie
4043e8e8b9 fix destructuring transformer AssignmentExpression to properly handle completion records 2015-05-30 22:33:09 -04:00
Sebastian McKenzie
7fd403998c remove dead code 2015-05-30 22:32:48 -04:00
Sebastian McKenzie
1f7fcc2985 Merge branch 'master' of github.com:babel/babel 2015-05-30 22:13:59 -04:00
Sebastian McKenzie
ba19bd36a4 optimise scope tracking into a single pass - #1486 2015-05-30 22:07:03 -04:00
Sebastian McKenzie
e119681b1f return paths accordingly in insertBefore and insertAfter methods 2015-05-30 22:03:25 -04:00
Sebastian McKenzie
fbe22e53a9 add check for dynamic node and output error message accordingly 2015-05-30 22:02:56 -04:00
Sebastian McKenzie
79e826fcc8 attempt to optimise node printing by shifting it into a class 2015-05-30 22:02:29 -04:00
Sebastian McKenzie
cf940268b9 add noScope to template visitor 2015-05-30 22:02:15 -04:00
Sebastian McKenzie
96bb572307 use flow type shorthand for eaching over specifiers 2015-05-30 19:09:23 -04:00
Sebastian McKenzie
5dafe0b66a collapse t.getBindingIdentifiers comment 2015-05-30 19:08:14 -04:00
Sebastian McKenzie
29e24a4cbe don't evaluate non-referenced identifiers 2015-05-30 19:07:58 -04:00
Sebastian McKenzie
f979d55b71 remove special ExpressionStatement handling in destructuring transformer 2015-05-30 19:07:31 -04:00
Sebastian McKenzie
164b2116a3 switch expontentation evaluation to just use the operator 2015-05-30 19:05:31 -04:00
Dan Abramov
55e623a099 Merge pull request #1650 from jmm/contrib-build-version
Make note about buildable versions more prominent.
2015-05-30 11:29:59 +03:00
Jesse McCarthy
a60b4b1302 Make note about buildable versions more prominent. 2015-05-29 14:14:15 -04:00
Dan Abramov
bf23e59bbf Add a note about building older versions. Fixes #1643 2015-05-29 16:50:34 +03:00
Sebastian McKenzie
eb4cee89c5 add referencesImport path method - fixes #1423 2015-05-28 11:39:51 -04:00
Sebastian McKenzie
fb94a87a4d add support for cluster forking - fixes #1611 2015-05-28 10:36:29 -04:00
Sebastian McKenzie
9613c7fdb6 fix linting error 2015-05-28 10:30:09 -04:00
Sebastian McKenzie
d8c97fba15 check plugin.default and then just plugin to support ES6 modules - closes #1627 2015-05-28 10:25:50 -04:00
Sebastian McKenzie
0f663560d4 add --nolazy to babel-node - fixes #1639 2015-05-28 10:24:31 -04:00
Sebastian McKenzie
4901075960 deopt rest parameter member expression optimisation on child arrow functions - fixes #1631 2015-05-28 10:22:12 -04:00
Sebastian McKenzie
4aec242979 add some comments to some path methods and remove some dead code 2015-05-28 10:04:46 -04:00
Sebastian McKenzie
d1d95e0e49 check LHS of ForIn/ForOfStatement for constants - closes #1630 2015-05-28 10:04:32 -04:00
Sebastian McKenzie
d3c643b004 clean up path resolution and add in path resolution recursion detection - cc @RReverser 2015-05-25 19:08:08 +01:00
Sebastian McKenzie
98eb30c482 rename Path#remove to Path#dangerouslyRemove 2015-05-25 16:17:28 +01:00
Sebastian McKenzie
2d43ffb5b4 remove removal scope hooks 2015-05-25 15:57:22 +01:00
Sebastian McKenzie
a195701de2 remove dead code 2015-05-25 15:28:23 +01:00
Sebastian McKenzie
f639f4bea7 upgrade babel-eslint 2015-05-25 15:28:16 +01:00
Sebastian McKenzie
334cbb06c6 flesh out removal hooks more 2015-05-25 15:28:11 +01:00
Sebastian McKenzie
f4a3b2f01a add link to readme in contributing guide so people can't whinge and note in the README that issues without reproducible examples will be closed 2015-05-25 14:55:37 +01:00
Sebastian McKenzie
dbe6f1b9a9 merge remove parent context checks 2015-05-25 04:30:17 +01:00
Sebastian McKenzie
73ada57a17 don't inline classes and functions when they're in different scopes in the utility.deadCodeElimination transformer 2015-05-25 03:33:12 +01:00
Sebastian McKenzie
8e2b743f7e add support for resyncing container on changes 2015-05-25 03:32:25 +01:00
Sebastian McKenzie
a533042503 fix bad .gitignore paths resulting in some tests and path/lib files not being included... 2015-05-25 01:42:54 +01:00
Sebastian McKenzie
49953e3464 enable no-unused-vars in eslint 2015-05-25 01:32:06 +01:00
Sebastian McKenzie
0bf95d6aea even more split up of path methods 2015-05-25 01:01:21 +01:00
Sebastian McKenzie
7d88a1ca0b rename TraversalPath to NodePath and further split up methods into separate files 2015-05-25 00:43:46 +01:00
Sebastian McKenzie
ec74eb41cf reneable eslint and fix assorted linting errors 2015-05-25 00:42:59 +01:00
Sebastian McKenzie
3139482358 clean and fix up visitor merging 2015-05-24 18:15:46 +01:00
Sebastian McKenzie
32f19aff99 clean up file processing API 2015-05-24 18:15:34 +01:00
Sebastian McKenzie
23bead9226 Merge branch 'master' of github.com:babel/babel 2015-05-24 01:45:00 +01:00
Sebastian McKenzie
bd3812c255 handle SwitchStatements as a different type of path when pushing a declaration - fixes #1614 2015-05-24 01:43:04 +01:00
Sebastian McKenzie
e498185a76 Merge pull request #1610 from dekelcohen/master
Fixed Remove Debugger transformer to use DebuggerStatement
2015-05-22 23:36:47 +01:00
Dekel Cohen
167eda4750 Fixed Remove Debugger transformer to use DebuggerStatement 2015-05-23 01:13:23 +03:00
Sebastian McKenzie
3b52ddce6d 5.4.7 2015-05-21 19:00:16 +01:00
Sebastian McKenzie
0e771c5d38 v5.4.7 2015-05-21 18:59:30 +01:00
Sebastian McKenzie
2ec1544f2d add 5.4.7 changelog 2015-05-21 18:58:49 +01:00
Sebastian McKenzie
049ef430b2 5.4.6 2015-05-21 18:58:12 +01:00
Sebastian McKenzie
34eb2babdb don't consider JSXAttribute keys to be referenced identifiers - fixes #1596 2015-05-21 18:58:07 +01:00
Sebastian McKenzie
8706754550 v5.4.6 2015-05-21 18:46:22 +01:00
Sebastian McKenzie
c7b507e119 add 5.4.6 changelog 2015-05-21 18:45:31 +01:00
Sebastian McKenzie
221c632c05 deprecate custom module formatters 2015-05-21 18:44:02 +01:00
Sebastian McKenzie
7dbde208ef spec.functionName transformer: hasBinding(name) returns true for built-in globals, so we attempt to rename the binding but it doesn't exist so exits early, add a check that doesn't perform the renaming and instead uses the wrapper - fixes #1598 2015-05-21 18:43:55 +01:00
Sebastian McKenzie
52a2e3e17c return original input if glob returned nothing in babel-cli - fixes #1591 2015-05-21 10:57:37 +01:00
Sebastian McKenzie
fa22d7dca0 5.4.5 2015-05-21 01:52:03 +01:00
Sebastian McKenzie
9fcdebde08 v5.4.5 2015-05-21 01:44:29 +01:00
Sebastian McKenzie
92157161f0 fix prettyCall generation option 2015-05-21 01:43:02 +01:00
Sebastian McKenzie
82b5479436 add 5.4.5 changelog 2015-05-21 01:41:30 +01:00
Sebastian McKenzie
91a037af55 Merge pull request #1590 from Khan/fix_retainLines_with_jsx
tests for retainLines formatting
2015-05-21 01:39:33 +01:00
Kevin Barabash
067fccc2c9 tests for retainLines formatting 2015-05-20 18:36:47 -06:00
Sebastian McKenzie
348c0d2542 handle TCO for calls that exceed the functions parameter count - fixes #1589 2015-05-21 01:21:49 +01:00
Sebastian McKenzie
f2f6bbb02c clean up explosion of module declarations, remove and inherit comments when taking off the declaration - fixes #1583 2015-05-21 01:03:23 +01:00
Sebastian McKenzie
16f7b967b5 ignore CallExpression _prettyCall when retainLines is enabled - fixes #1585 2015-05-21 00:21:18 +01:00
Sebastian McKenzie
270a8be68d add JSXIdentifier as a valid ReferencedIdentifier - fixes #1584 2015-05-21 00:20:53 +01:00
Sebastian McKenzie
82254d9d9b force push space for await/async - fixes #1581 2015-05-20 12:45:04 +01:00
Sebastian McKenzie
759a265fb0 5.4.4 2015-05-20 10:52:28 +01:00
186 changed files with 3412 additions and 2365 deletions

View File

@@ -3,18 +3,21 @@
"rules": {
"strict": 0,
"no-underscore-dangle": 0,
"no-unused-vars": 0,
"curly": 0,
"no-multi-spaces": 0,
"key-spacing": 0,
"no-return-assign": 0,
"consistent-return": 0,
"no-shadow": 0,
"no-comma-dangle": 0,
"comma-dangle": 0,
"no-use-before-define": 0,
"no-empty": 0,
"new-parens": 0,
"no-cond-assign": 0
"no-cond-assign": 0,
"no-fallthrough": 0,
"new-cap": 0,
"no-loop-func": 0,
"no-unreachable": 0
},
"env": {
"node": true

14
.gitignore vendored
View File

@@ -8,10 +8,10 @@ test/core/tmp
/browser.js
/browser-polyfill.js
/runtime.js
coverage
dist
.package.json
packages/babel-runtime/core-js
packages/babel-runtime/helpers/*.js
packages/babel-runtime/regenerator/*.js
lib
/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,68 @@ _Note: Gaps between patch versions are faulty/broken releases._
See [CHANGELOG - 6to5](CHANGELOG-6to5.md) for the pre-4.0.0 version changelog.
## 5.5.3
* **Bug Fix**
* Fix weird state bug when traversing overa `node` `ClassProperty` instead of `path` in the `es6.classes` transformer.
## 5.5.2
* **Bug Fix**
* Fix `NodePath#isPure` on `Property` nodes.
* Use cwd instead of entry file directory when working out relative directory for `babel/register`.
* **Internal**
* Add scary warning for those few who choose to use the WIP experimental transformers.
## 5.5.1
* **Bug Fix**
* Remove `ClassProperty` nodes always in the `Flow` transformer. This is fine now since class properties aren't supported in any engine that supports classes but the `es7.classProperties` transformer will need to be updated in the future to desugar to ES6 classes instead of relying on the `es6.classes` transformer from being ran.
## 5.5.0
* **Bug Fix**
* Allow pushing declarations to `SwitchStatement`s.
* Fix `minification.removeDebugger` to remove `DebuggerStatement`s rather than `ExpressionStatement`s with an identifier of `debugger`.
* Check LHS in `ForInStatement` and `ForOfStatement` for constant violations.
* Register function `id` as a reference when naming methods to avoid collisions.
* Support key literals when checking for the existence of `displayName` property when attempting to add it for `React.createClass`.
* Remove `ExportDefaultSpecifier` check from `t.isDefaultSpecifier`.
* Don't consider `JSXIdentifier` HTML tag identifiers to be references.
* **Polish**
* Update `minification.deadCodeElimination` transformer to remove all statements after completion statements.
* Update `minification.deadCodeElimination` transformer to not inline single used bindings that exist in different scopes.
* When performing Istanbul interop in `babel/register`, add the auxiliary comment `"istanbul ignore text"` to get more accurate coverage.
* Add `--nolazy` argument to `babel-node`.
* Add support for `cluster` forking.
* Perform scope tracking in a single pass instead of multiple.
* Smarten up type inferrence and resolution to support the whole array of language constructs.
* Optimise module metadata retrieval into a single pass.
* Ignore trailing commas when inferring newlines.
* Rename `minification.inlineExpressions` transformer to `minification.constantFolding`.
* Check path relative to entry file when checking to see if we're inside `node_modules` when using `babel/register`.
* Upgrade `regenerator`.
## 5.4.7
* **Bug Fix**
* Don't consider `JSXAttribute` `names` to be valid `ReferencedIdentifier`s.
## 5.4.6
* **Bug Fix**
* Fix `spec.functionName` transformer incorrectly attempting to rename a binding that doesn't exist as it's a global.
* **Internal**
* Deprecate custom module formatters.
## 5.4.5
* **Bug Fix**
* Add `JSXIdentifier` as a valid `ReferencedIdentifier` visitor virtual type.
* Ignore `CallExpression` `_prettyCall` when the `retainLines` option is enabled.
* Inherit comments to new declaration node when exploding module declarations.
* Fix `es6.tailCall` transformer failing on calls that exceed the max parameters of the function.
## 5.4.4
* **Bug Fix**

View File

@@ -1,3 +1,7 @@
# NOTE: BEFORE OPENING AN ISSUE PLEASE SEE THE [README](https://github.com/babel/babel#readme).
----
<p align="center">
<strong><a href="#setup">Setup</a></strong>
|
@@ -21,6 +25,9 @@ contributing, please read the
## Developing
>Note: Babel moves fast. Only the latest release is guaranteed to build correctly.
>Older releases are not officially supported. If you attempt to build them, do that at your own risk.
#### Setup
```sh
@@ -79,7 +86,6 @@ your [`$PATH`](http://unix.stackexchange.com/questions/26047/how-to-correctly-ad
* Ensure the test are passing (`make test`)
* Create new pull request explaining your proposed change or reference an issue in your commit message
#### Dependencies
+ [ast-types](http://ghub.io/ast-types) This is required to monkeypatch regenerators AST definitions. Could be improved in the future.

View File

@@ -22,6 +22,9 @@ watch-core: clean-core
clean-core:
rm -rf lib
lint:
eslint src/babel
build:
mkdir -p dist
make build-core
@@ -61,7 +64,7 @@ test-cov:
test-parser:
node test/acorn/run.js
test-travis: bootstrap build test
test-travis: bootstrap lint build test
test-browser:
mkdir -p dist
@@ -73,7 +76,7 @@ test-browser:
test -n "`which open`" && open test/browser.html
publish:
publish: lint
git pull --rebase
make test

View File

@@ -12,6 +12,10 @@
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">
Issues without instructions to reproduce <strong>will be immediately closed<strong>.
</p>
<p align="center">
For documentation and website issues please visit the <a href="https://github.com/babel/babel.github.io">babel.github.io</a> repo.
</p>

View File

@@ -1,7 +1,7 @@
{
"name": "babel-core",
"description": "A compiler for writing next generation JavaScript",
"version": "5.4.4",
"version": "5.5.3",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://babeljs.io/",
"license": "MIT",
@@ -51,7 +51,7 @@
"output-file-sync": "^1.1.0",
"path-is-absolute": "^1.0.0",
"private": "^0.1.6",
"regenerator": "^0.8.20",
"regenerator": "^0.8.28",
"regexpu": "^1.1.2",
"repeating": "^1.1.2",
"resolve": "^1.1.6",
@@ -67,8 +67,8 @@
"babel": "5.3.1",
"browserify": "^9.0.8",
"chai": "^2.2.0",
"eslint": "^0.18.0",
"babel-eslint": "^2.0.0",
"eslint": "^0.21.2",
"babel-eslint": "^3.1.9",
"esvalid": "^1.1.0",
"istanbul": "^0.3.5",
"matcha": "^0.6.0",

View File

@@ -107,6 +107,7 @@ if (program.eval || program.print) {
// add back on node and concat the sliced args
process.argv = ["node"].concat(args);
process.execArgv.unshift(__filename);
Module.runMain();
} else {

View File

@@ -412,6 +412,7 @@ babelArgs.forEach(function(arg){
case "--prof_auto":
case "--prof_lazy":
case "--sliding_state_window":
case "--nolazy":
args.unshift(arg);
break;

View File

@@ -79,7 +79,9 @@ if (commander.extensions) {
var errors = [];
var filenames = commander.args.reduce(function (globbed, input) {
return globbed.concat(glob.sync(input));
var files = glob.sync(input);
if (!files.length) files = [input];
return globbed.concat(files);
}, []);
each(filenames, function (filename) {

View File

@@ -1,14 +1,14 @@
{
"name": "babel",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "5.4.3",
"version": "5.5.2",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "babel/babel",
"preferGlobal": true,
"dependencies": {
"babel-core": "^5.4.3",
"babel-core": "^5.5.2",
"chokidar": "^1.0.0",
"commander": "^2.6.0",
"convert-source-map": "^1.1.0",

View File

@@ -1,7 +1,7 @@
{
"name": "babel-runtime",
"description": "babel selfContained runtime",
"version": "5.4.3",
"version": "5.5.2",
"license": "MIT",
"repository": "babel/babel",
"author": "Sebastian McKenzie <sebmck@gmail.com>",

View File

@@ -415,6 +415,9 @@ pp.flow_identToTypeAnnotation = function (start, node, id) {
case "boolean":
return this.finishNode(node, "BooleanTypeAnnotation")
case "mixed":
return this.finishNode(node, "MixedTypeAnnotation")
case "number":
return this.finishNode(node, "NumberTypeAnnotation")

View File

@@ -274,7 +274,13 @@ pp.parseExprAtom = function(refShorthandDefaultPos) {
if (this.options.features["es7.doExpressions"]) {
let node = this.startNode()
this.next()
var oldInFunction = this.inFunction
var oldLabels = this.labels
this.labels = []
this.inFunction = false
node.body = this.parseBlock()
this.inFunction = oldInFunction
this.labels = oldLabels
return this.finishNode(node, "DoExpression")
}
@@ -507,7 +513,7 @@ pp.parseNew = function() {
pp.parseTemplateElement = function() {
let elem = this.startNode()
elem.value = {
raw: this.input.slice(this.start, this.end),
raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, '\n'),
cooked: this.value
}
this.next()

View File

@@ -168,12 +168,6 @@ pp.parseDoStatement = function(node) {
this.labels.push(loopLabel)
node.body = this.parseStatement(false)
this.labels.pop()
if (this.options.features["es7.doExpressions"] && this.type !== tt._while) {
let container = this.startNodeAt(start)
container.expression = this.finishNode(node, "DoExpression")
this.semicolon()
return this.finishNode(container, "ExpressionStatement")
}
this.expect(tt._while)
node.test = this.parseParenExpression()
if (this.options.ecmaVersion >= 6)
@@ -574,7 +568,7 @@ pp.parseExport = function(node) {
this.parseExportFrom(node)
return this.finishNode(node, "ExportAllDeclaration")
}
} else if (this.isExportDefaultSpecifier()) {
} else if (this.options.features["es7.exportExtensions"] && this.isExportDefaultSpecifier()) {
let specifier = this.startNode()
specifier.exported = this.parseIdent(true)
node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")]

View File

@@ -577,11 +577,15 @@ pp.readTmplToken = function() {
} else if (isNewLine(ch)) {
out += this.input.slice(chunkStart, this.pos)
++this.pos
if (ch === 13 && this.input.charCodeAt(this.pos) === 10) {
++this.pos
out += "\n"
} else {
out += String.fromCharCode(ch)
switch (ch) {
case 13:
if (this.input.charCodeAt(this.pos) === 10) ++this.pos;
case 10:
out += "\n";
break;
default:
out += String.fromCharCode(ch);
break;
}
if (this.options.locations) {
++this.curLine

View File

@@ -1,3 +1,5 @@
/* eslint no-new-func: 0 */
require("./node");
var transform = module.exports = require("../transformation");

View File

@@ -1,5 +1,5 @@
// required to safely use babel/register within a browserify codebase
export default function () {};
export default function () {}
import "../../polyfill";

View File

@@ -1,5 +1,4 @@
import path from "path";
import os from "os";
import fs from "fs";
import homeOrTmp from "home-or-tmp";

View File

@@ -6,7 +6,7 @@ import * as babel from "../node";
import each from "lodash/collection/each";
import * as util from "../../util";
import fs from "fs";
import slash from "slash";
import path from "path";
sourceMapSupport.install({
handleUncaughtExceptions: false,
@@ -38,14 +38,20 @@ var only;
var oldHandlers = {};
var maps = {};
var cwd = process.cwd();
var getRelativePath = function (filename){
return path.relative(cwd, filename);
};
var mtime = function (filename) {
return +fs.statSync(filename).mtime;
};
var compile = function (filename) {
var compile = function (filename, opts = {}) {
var result;
var opts = extend({}, transformOpts);
opts = extend(opts, transformOpts);
// this will be done when the file is transformed anyway but we need all
// the options so we can generate the cache key
@@ -82,7 +88,7 @@ var compile = function (filename) {
var shouldIgnore = function (filename) {
if (!ignore && !only) {
return /node_modules/.test(filename);
return getRelativePath(filename).split(path.sep).indexOf("node_modules") >= 0;
} else {
return util.shouldIgnore(filename, ignore || [], only || []);
}
@@ -98,7 +104,9 @@ if (process.env.running_under_istanbul) {
fs.readFileSync = function (filename) {
if (istanbulMonkey[filename]) {
delete istanbulMonkey[filename];
var code = compile(filename);
var code = compile(filename, {
attachAuxiliaryComment: "istanbul ignore next"
});
istanbulMonkey[filename] = true;
return code;
} else {
@@ -164,4 +172,4 @@ export default function (opts = {}) {
delete opts.only;
extend(transformOpts, opts);
};
}

View File

@@ -1,5 +1,5 @@
export function File(node, print) {
print(node.program);
print.plain(node.program);
}
export function Program(node, print) {

View File

@@ -4,15 +4,15 @@ export function ClassDeclaration(node, print) {
if (node.id) {
this.push(" ");
print(node.id);
print.plain(node.id);
}
print(node.typeParameters);
print.plain(node.typeParameters);
if (node.superClass) {
this.push(" extends ");
print(node.superClass);
print(node.superTypeParameters);
print.plain(node.superClass);
print.plain(node.superTypeParameters);
}
if (node.implements) {
@@ -21,7 +21,7 @@ export function ClassDeclaration(node, print) {
}
this.space();
print(node.body);
print.plain(node.body);
}
export { ClassDeclaration as ClassExpression };
@@ -46,13 +46,13 @@ export function ClassProperty(node, print) {
print.list(node.decorators);
if (node.static) this.push("static ");
print(node.key);
print(node.typeAnnotation);
print.plain(node.key);
print.plain(node.typeAnnotation);
if (node.value) {
this.space();
this.push("=");
this.space();
print(node.value);
print.plain(node.value);
}
this.semicolon();
}

View File

@@ -1,9 +1,9 @@
export function ComprehensionBlock(node, print) {
this.keyword("for");
this.push("(");
print(node.left);
print.plain(node.left);
this.push(" of ");
print(node.right);
print.plain(node.right);
this.push(")");
}
@@ -16,12 +16,12 @@ export function ComprehensionExpression(node, print) {
if (node.filter) {
this.keyword("if");
this.push("(");
print(node.filter);
print.plain(node.filter);
this.push(")");
this.space();
}
print(node.body);
print.plain(node.body);
this.push(node.generator ? ")" : "]");
}

View File

@@ -16,40 +16,40 @@ export function UnaryExpression(node, print) {
this.push(node.operator);
if (hasSpace) this.push(" ");
print(node.argument);
print.plain(node.argument);
}
export function DoExpression(node, print) {
this.push("do");
this.space();
print(node.body);
print.plain(node.body);
}
export function UpdateExpression(node, print) {
if (node.prefix) {
this.push(node.operator);
print(node.argument);
print.plain(node.argument);
} else {
print(node.argument);
print.plain(node.argument);
this.push(node.operator);
}
}
export function ConditionalExpression(node, print) {
print(node.test);
print.plain(node.test);
this.space();
this.push("?");
this.space();
print(node.consequent);
print.plain(node.consequent);
this.space();
this.push(":");
this.space();
print(node.alternate);
print.plain(node.alternate);
}
export function NewExpression(node, print) {
this.push("new ");
print(node.callee);
print.plain(node.callee);
this.push("(");
print.list(node.arguments);
this.push(")");
@@ -69,17 +69,19 @@ export function Super() {
export function Decorator(node, print) {
this.push("@");
print(node.expression);
print.plain(node.expression);
}
export function CallExpression(node, print) {
print(node.callee);
print.plain(node.callee);
this.push("(");
var separator = ",";
if (node._prettyCall) {
var isPrettyCall = node._prettyCall && !this.format.retainLines;
if (isPrettyCall) {
separator += "\n";
this.newline();
this.indent();
@@ -89,7 +91,7 @@ export function CallExpression(node, print) {
print.list(node.arguments, { separator: separator });
if (node._prettyCall) {
if (isPrettyCall) {
this.newline();
this.dedent();
}
@@ -106,8 +108,8 @@ var buildYieldAwait = function (keyword) {
}
if (node.argument) {
this.space();
print(node.argument);
this.push(" ");
print.plain(node.argument);
}
};
};
@@ -120,23 +122,23 @@ export function EmptyStatement() {
}
export function ExpressionStatement(node, print) {
print(node.expression);
print.plain(node.expression);
this.semicolon();
}
export function AssignmentExpression(node, print) {
// todo: add cases where the spaces can be dropped when in compact mode
print(node.left);
print.plain(node.left);
this.push(" ");
this.push(node.operator);
this.push(" ");
print(node.right);
print.plain(node.right);
}
export function BindExpression(node, print) {
print(node.object);
print.plain(node.object);
this.push("::");
print(node.callee);
print.plain(node.callee);
}
export {
@@ -149,7 +151,7 @@ var SCIENTIFIC_NOTATION = /e/i;
export function MemberExpression(node, print) {
var obj = node.object;
print(obj);
print.plain(obj);
if (!node.computed && t.isMemberExpression(node.property)) {
throw new TypeError("Got a MemberExpression for MemberExpression property");
@@ -162,7 +164,7 @@ export function MemberExpression(node, print) {
if (computed) {
this.push("[");
print(node.property);
print.plain(node.property);
this.push("]");
} else {
// 5..toFixed(2);
@@ -171,12 +173,12 @@ export function MemberExpression(node, print) {
}
this.push(".");
print(node.property);
print.plain(node.property);
}
}
export function MetaProperty(node, print) {
print(node.meta);
print.plain(node.meta);
this.push(".");
print(node.property);
print.plain(node.property);
}

View File

@@ -5,7 +5,7 @@ export function AnyTypeAnnotation() {
}
export function ArrayTypeAnnotation(node, print) {
print(node.elementType);
print.plain(node.elementType);
this.push("[");
this.push("]");
}
@@ -21,27 +21,27 @@ export function DeclareClass(node, print) {
export function DeclareFunction(node, print) {
this.push("declare function ");
print(node.id);
print(node.id.typeAnnotation.typeAnnotation);
print.plain(node.id);
print.plain(node.id.typeAnnotation.typeAnnotation);
this.semicolon();
}
export function DeclareModule(node, print) {
this.push("declare module ");
print(node.id);
print.plain(node.id);
this.space();
print(node.body);
print.plain(node.body);
}
export function DeclareVariable(node, print) {
this.push("declare var ");
print(node.id);
print(node.id.typeAnnotation);
print.plain(node.id);
print.plain(node.id.typeAnnotation);
this.semicolon();
}
export function FunctionTypeAnnotation(node, print, parent) {
print(node.typeParameters);
print.plain(node.typeParameters);
this.push("(");
print.list(node.params);
@@ -51,7 +51,7 @@ export function FunctionTypeAnnotation(node, print, parent) {
this.space();
}
this.push("...");
print(node.rest);
print.plain(node.rest);
}
this.push(")");
@@ -65,33 +65,33 @@ export function FunctionTypeAnnotation(node, print, parent) {
}
this.space();
print(node.returnType);
print.plain(node.returnType);
}
export function FunctionTypeParam(node, print) {
print(node.name);
print.plain(node.name);
if (node.optional) this.push("?");
this.push(":");
this.space();
print(node.typeAnnotation);
print.plain(node.typeAnnotation);
}
export function InterfaceExtends(node, print) {
print(node.id);
print(node.typeParameters);
print.plain(node.id);
print.plain(node.typeParameters);
}
export { InterfaceExtends as ClassImplements, InterfaceExtends as GenericTypeAnnotation };
export function _interfaceish(node, print) {
print(node.id);
print(node.typeParameters);
print.plain(node.id);
print.plain(node.typeParameters);
if (node.extends.length) {
this.push(" extends ");
print.join(node.extends, { separator: ", " });
}
this.space();
print(node.body);
print.plain(node.body);
}
export function InterfaceDeclaration(node, print) {
@@ -103,9 +103,13 @@ export function IntersectionTypeAnnotation(node, print) {
print.join(node.types, { separator: " & " });
}
export function MixedTypeAnnotation() {
this.push("mixed");
}
export function NullableTypeAnnotation(node, print) {
this.push("?");
print(node.typeAnnotation);
print.plain(node.typeAnnotation);
}
export function NumberTypeAnnotation() {
@@ -128,17 +132,17 @@ export function TupleTypeAnnotation(node, print) {
export function TypeofTypeAnnotation(node, print) {
this.push("typeof ");
print(node.argument);
print.plain(node.argument);
}
export function TypeAlias(node, print) {
this.push("type ");
print(node.id);
print(node.typeParameters);
print.plain(node.id);
print.plain(node.typeParameters);
this.space();
this.push("=");
this.space();
print(node.right);
print.plain(node.right);
this.semicolon();
}
@@ -146,7 +150,7 @@ export function TypeAnnotation(node, print) {
this.push(":");
this.space();
if (node.optional) this.push("?");
print(node.typeAnnotation);
print.plain(node.typeAnnotation);
}
export function TypeParameterInstantiation(node, print) {
@@ -183,37 +187,37 @@ export function ObjectTypeAnnotation(node, print) {
export function ObjectTypeCallProperty(node, print) {
if (node.static) this.push("static ");
print(node.value);
print.plain(node.value);
}
export function ObjectTypeIndexer(node, print) {
if (node.static) this.push("static ");
this.push("[");
print(node.id);
print.plain(node.id);
this.push(":");
this.space();
print(node.key);
print.plain(node.key);
this.push("]");
this.push(":");
this.space();
print(node.value);
print.plain(node.value);
}
export function ObjectTypeProperty(node, print) {
if (node.static) this.push("static ");
print(node.key);
print.plain(node.key);
if (node.optional) this.push("?");
if (!t.isFunctionTypeAnnotation(node.value)) {
this.push(":");
this.space();
}
print(node.value);
print.plain(node.value);
}
export function QualifiedTypeIdentifier(node, print) {
print(node.qualification);
print.plain(node.qualification);
this.push(".");
print(node.id);
print.plain(node.id);
}
export function UnionTypeAnnotation(node, print) {
@@ -222,8 +226,8 @@ export function UnionTypeAnnotation(node, print) {
export function TypeCastExpression(node, print) {
this.push("(");
print(node.expression);
print(node.typeAnnotation);
print.plain(node.expression);
print.plain(node.typeAnnotation);
this.push(")");
}

View File

@@ -1,11 +1,10 @@
import each from "lodash/collection/each";
import * as t from "../../types";
export function JSXAttribute(node, print) {
print(node.name);
print.plain(node.name);
if (node.value) {
this.push("=");
print(node.value);
print.plain(node.value);
}
}
@@ -14,32 +13,32 @@ export function JSXIdentifier(node) {
}
export function JSXNamespacedName(node, print) {
print(node.namespace);
print.plain(node.namespace);
this.push(":");
print(node.name);
print.plain(node.name);
}
export function JSXMemberExpression(node, print) {
print(node.object);
print.plain(node.object);
this.push(".");
print(node.property);
print.plain(node.property);
}
export function JSXSpreadAttribute(node, print) {
this.push("{...");
print(node.argument);
print.plain(node.argument);
this.push("}");
}
export function JSXExpressionContainer(node, print) {
this.push("{");
print(node.expression);
print.plain(node.expression);
this.push("}");
}
export function JSXElement(node, print) {
var open = node.openingElement;
print(open);
print.plain(open);
if (open.selfClosing) return;
this.indent();
@@ -47,17 +46,17 @@ export function JSXElement(node, print) {
if (t.isLiteral(child)) {
this.push(child.value, true);
} else {
print(child);
print.plain(child);
}
}
this.dedent();
print(node.closingElement);
print.plain(node.closingElement);
}
export function JSXOpeningElement(node, print) {
this.push("<");
print(node.name);
print.plain(node.name);
if (node.attributes.length > 0) {
this.push(" ");
print.join(node.attributes, { separator: " " });
@@ -67,7 +66,7 @@ export function JSXOpeningElement(node, print) {
export function JSXClosingElement(node, print) {
this.push("</");
print(node.name);
print.plain(node.name);
this.push(">");
}

View File

@@ -1,18 +1,18 @@
import * as t from "../../types";
export function _params(node, print) {
print(node.typeParameters);
print.plain(node.typeParameters);
this.push("(");
print.list(node.params, {
iterator: (node) =>{
if (node.optional) this.push("?");
print(node.typeAnnotation);
print.plain(node.typeAnnotation);
}
});
this.push(")");
if (node.returnType) {
print(node.returnType);
print.plain(node.returnType);
}
}
@@ -35,15 +35,15 @@ export function _method(node, print) {
if (node.computed) {
this.push("[");
print(key);
print.plain(key);
this.push("]");
} else {
print(key);
print.plain(key);
}
this._params(value, print);
this.push(" ");
print(value.body);
print.plain(value.body);
}
export function FunctionExpression(node, print) {
@@ -53,14 +53,14 @@ export function FunctionExpression(node, print) {
if (node.id) {
this.push(" ");
print(node.id);
print.plain(node.id);
} else {
this.space();
}
this._params(node, print);
this.space();
print(node.body);
print.plain(node.body);
}
export { FunctionExpression as FunctionDeclaration };
@@ -69,7 +69,7 @@ export function ArrowFunctionExpression(node, print) {
if (node.async) this.push("async ");
if (node.params.length === 1 && t.isIdentifier(node.params[0])) {
print(node.params[0]);
print.plain(node.params[0]);
} else {
this._params(node, print);
}
@@ -82,7 +82,7 @@ export function ArrowFunctionExpression(node, print) {
this.push("(");
}
print(node.body);
print.plain(node.body);
if (bodyNeedsParens) {
this.push(")");

View File

@@ -1,43 +1,42 @@
import each from "lodash/collection/each";
import * as t from "../../types";
export function ImportSpecifier(node, print) {
print(node.imported);
print.plain(node.imported);
if (node.local && node.local.name !== node.imported.name) {
this.push(" as ");
print(node.local);
print.plain(node.local);
}
}
export function ImportDefaultSpecifier(node, print) {
print(node.local);
print.plain(node.local);
}
export function ExportDefaultSpecifier(node, print) {
print(node.exported);
print.plain(node.exported);
}
export function ExportSpecifier(node, print) {
print(node.local);
print.plain(node.local);
if (node.exported && node.local.name !== node.exported.name) {
this.push(" as ");
print(node.exported);
print.plain(node.exported);
}
}
export function ExportNamespaceSpecifier(node, print) {
this.push("* as ");
print(node.exported);
print.plain(node.exported);
}
export function ExportAllDeclaration(node, print) {
this.push("export *");
if (node.exported) {
this.push(" as ");
print(node.exported);
print.plain(node.exported);
}
this.push(" from ");
print(node.source);
print.plain(node.source);
this.semicolon();
}
@@ -56,14 +55,14 @@ function ExportDeclaration(node, print) {
if (node.declaration) {
var declar = node.declaration;
print(declar);
print.plain(declar);
if (t.isStatement(declar) || t.isFunction(declar) || t.isClass(declar)) return;
} else {
var first = specifiers[0];
var hasSpecial = false;
if (t.isExportDefaultSpecifier(first) || t.isExportNamespaceSpecifier(first)) {
hasSpecial = true;
print(specifiers.shift());
print.plain(specifiers.shift());
if (specifiers.length) {
this.push(", ");
}
@@ -81,7 +80,7 @@ function ExportDeclaration(node, print) {
if (node.source) {
this.push(" from ");
print(node.source);
print.plain(node.source);
}
}
@@ -99,7 +98,7 @@ export function ImportDeclaration(node, print) {
if (specfiers && specfiers.length) {
var first = node.specifiers[0];
if (t.isImportDefaultSpecifier(first) || t.isImportNamespaceSpecifier(first)) {
print(node.specifiers.shift());
print.plain(node.specifiers.shift());
if (node.specifiers.length) {
this.push(", ");
}
@@ -107,20 +106,20 @@ export function ImportDeclaration(node, print) {
if (node.specifiers.length) {
this.push("{");
this.space()
this.space();
print.join(node.specifiers, { separator: ", " });
this.space()
this.space();
this.push("}");
}
this.push(" from ");
}
print(node.source);
print.plain(node.source);
this.semicolon();
}
export function ImportNamespaceSpecifier(node, print) {
this.push("* as ");
print(node.local);
print.plain(node.local);
}

View File

@@ -4,7 +4,7 @@ import * as t from "../../types";
export function WithStatement(node, print) {
this.keyword("with");
this.push("(");
print(node.object);
print.plain(node.object);
this.push(")");
print.block(node.body);
}
@@ -12,7 +12,7 @@ export function WithStatement(node, print) {
export function IfStatement(node, print) {
this.keyword("if");
this.push("(");
print(node.test);
print.plain(node.test);
this.push(")");
this.space();
@@ -29,18 +29,18 @@ export function ForStatement(node, print) {
this.keyword("for");
this.push("(");
print(node.init);
print.plain(node.init);
this.push(";");
if (node.test) {
this.push(" ");
print(node.test);
print.plain(node.test);
}
this.push(";");
if (node.update) {
this.push(" ");
print(node.update);
print.plain(node.update);
}
this.push(")");
@@ -50,7 +50,7 @@ export function ForStatement(node, print) {
export function WhileStatement(node, print) {
this.keyword("while");
this.push("(");
print(node.test);
print.plain(node.test);
this.push(")");
print.block(node.body);
}
@@ -59,9 +59,9 @@ var buildForXStatement = function (op) {
return function (node, print) {
this.keyword("for");
this.push("(");
print(node.left);
print.plain(node.left);
this.push(` ${op} `);
print(node.right);
print.plain(node.right);
this.push(")");
print.block(node.body);
};
@@ -72,11 +72,11 @@ export var ForOfStatement = buildForXStatement("of");
export function DoWhileStatement(node, print) {
this.push("do ");
print(node.body);
print.plain(node.body);
this.space();
this.keyword("while");
this.push("(");
print(node.test);
print.plain(node.test);
this.push(");");
}
@@ -87,7 +87,7 @@ var buildLabelStatement = function (prefix, key) {
var label = node[key || "label"];
if (label) {
this.push(" ");
print(label);
print.plain(label);
}
this.semicolon();
@@ -99,50 +99,50 @@ export var ReturnStatement = buildLabelStatement("return", "argument");
export var BreakStatement = buildLabelStatement("break");
export function LabeledStatement(node, print) {
print(node.label);
print.plain(node.label);
this.push(": ");
print(node.body);
print.plain(node.body);
}
export function TryStatement(node, print) {
this.keyword("try");
print(node.block);
print.plain(node.block);
this.space();
// Esprima bug puts the catch clause in a `handlers` array.
// see https://code.google.com/p/esprima/issues/detail?id=433
// We run into this from regenerator generated ast.
if (node.handlers) {
print(node.handlers[0]);
print.plain(node.handlers[0]);
} else {
print(node.handler);
print.plain(node.handler);
}
if (node.finalizer) {
this.space();
this.push("finally ");
print(node.finalizer);
print.plain(node.finalizer);
}
}
export function CatchClause(node, print) {
this.keyword("catch");
this.push("(");
print(node.param);
print.plain(node.param);
this.push(") ");
print(node.body);
print.plain(node.body);
}
export function ThrowStatement(node, print) {
this.push("throw ");
print(node.argument);
print.plain(node.argument);
this.semicolon();
}
export function SwitchStatement(node, print) {
this.keyword("switch");
this.push("(");
print(node.discriminant);
print.plain(node.discriminant);
this.push(")");
this.space();
this.push("{");
@@ -160,7 +160,7 @@ export function SwitchStatement(node, print) {
export function SwitchCase(node, print) {
if (node.test) {
this.push("case ");
print(node.test);
print.plain(node.test);
this.push(":");
} else {
this.push("default:");
@@ -207,12 +207,12 @@ export function VariableDeclaration(node, print, parent) {
}
export function VariableDeclarator(node, print) {
print(node.id);
print(node.id.typeAnnotation);
print.plain(node.id);
print.plain(node.id.typeAnnotation);
if (node.init) {
this.space();
this.push("=");
this.space();
print(node.init);
print.plain(node.init);
}
}

View File

@@ -1,8 +1,6 @@
import each from "lodash/collection/each";
export function TaggedTemplateExpression(node, print) {
print(node.tag);
print(node.quasi);
print.plain(node.tag);
print.plain(node.quasi);
}
export function TemplateElement(node) {
@@ -16,11 +14,11 @@ export function TemplateLiteral(node, print) {
var len = quasis.length;
for (var i = 0; i < len; i++) {
print(quasis[i]);
print.plain(quasis[i]);
if (i + 1 < len) {
this.push("${ ");
print(node.expressions[i]);
print.plain(node.expressions[i]);
this.push(" }");
}
}

View File

@@ -1,4 +1,5 @@
import each from "lodash/collection/each";
/* eslint quotes: 0 */
import * as t from "../../types";
export function Identifier(node) {
@@ -7,7 +8,7 @@ export function Identifier(node) {
export function RestElement(node, print) {
this.push("...");
print(node.argument);
print.plain(node.argument);
}
export { RestElement as SpreadElement, RestElement as SpreadProperty };
@@ -36,16 +37,16 @@ export function Property(node, print) {
} else {
if (node.computed) {
this.push("[");
print(node.key);
print.plain(node.key);
this.push("]");
} else {
// print `({ foo: foo = 5 } = {})` as `({ foo = 5 } = {});`
if (t.isAssignmentPattern(node.value) && t.isIdentifier(node.key) && node.key.name === node.value.left.name) {
print(node.value);
print.plain(node.value);
return;
}
print(node.key);
print.plain(node.key);
// shorthand!
if (node.shorthand &&
@@ -58,7 +59,7 @@ export function Property(node, print) {
this.push(":");
this.space();
print(node.value);
print.plain(node.value);
}
}
@@ -79,7 +80,7 @@ export function ArrayExpression(node, print) {
this.push(",");
} else {
if (i > 0) this.push(" ");
print(elem);
print.plain(elem);
if (i < len - 1) this.push(",");
}
}

View File

@@ -1,5 +1,6 @@
import detectIndent from "detect-indent";
import Whitespace from "./whitespace";
import NodePrinter from "./node/printer";
import repeating from "repeating";
import SourceMap from "./source-map";
import Position from "./position";
@@ -20,7 +21,7 @@ class CodeGenerator {
this.opts = opts;
this.ast = ast;
this.whitespace = new Whitespace(this.tokens, this.comments, this.format);
this.whitespace = new Whitespace(this.tokens);
this.position = new Position;
this.map = new SourceMap(this.position, opts, code);
this.buffer = new Buffer(this.position, this.format);
@@ -67,7 +68,6 @@ class CodeGenerator {
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
if (token.type.label !== "string") continue;
if (checked >= 3) continue;
var raw = code.slice(token.start, token.end);
if (raw[0] === "'") {
@@ -77,6 +77,7 @@ class CodeGenerator {
}
checked++;
if (checked >= 3) break;
}
if (occurences.single > occurences.double) {
@@ -120,33 +121,7 @@ class CodeGenerator {
}
buildPrint(parent) {
var print = (node, opts) => {
return this.print(node, parent, opts);
};
print.sequence = (nodes, opts = {}) => {
opts.statement = true;
return this.printJoin(print, nodes, opts);
};
print.join = (nodes, opts) => {
return this.printJoin(print, nodes, opts);
};
print.list = function (items, opts = {}) {
if (opts.separator == null) opts.separator = ", ";
print.join(items, opts);
};
print.block = (node) => {
return this.printBlock(print, node);
};
print.indentOnComments = (node) => {
return this.printAndIndentOnComments(print, node);
};
return print;
return new NodePrinter(this, parent);
}
catchUp(node, parent, leftParenPrinted) {
@@ -166,6 +141,36 @@ class CodeGenerator {
return false;
}
_printNewline(leading, node, parent, opts) {
if (!opts.statement && !n.isUserWhitespacable(node, parent)) {
return;
}
var lines = 0;
if (node.start != null && !node._ignoreUserWhitespace) {
// user node
if (leading) {
lines = this.whitespace.getNewlinesBefore(node);
} else {
lines = this.whitespace.getNewlinesAfter(node);
}
} else {
// generated node
if (!leading) lines++; // always include at least a single line after
if (opts.addNewlines) lines += opts.addNewlines(leading, node) || 0;
var needs = n.needsWhitespaceAfter;
if (leading) needs = n.needsWhitespaceBefore;
if (needs(node, parent)) lines++;
// generated nodes can't add starting file whitespace
if (!this.buffer.buf) lines = 0;
}
this.newline(lines);
}
print(node, parent, opts = {}) {
if (!node) return;
@@ -178,36 +183,6 @@ class CodeGenerator {
this.format.concise = true;
}
var newline = (leading) => {
if (!opts.statement && !n.isUserWhitespacable(node, parent)) {
return;
}
var lines = 0;
if (node.start != null && !node._ignoreUserWhitespace) {
// user node
if (leading) {
lines = this.whitespace.getNewlinesBefore(node);
} else {
lines = this.whitespace.getNewlinesAfter(node);
}
} else {
// generated node
if (!leading) lines++; // always include at least a single line after
if (opts.addNewlines) lines += opts.addNewlines(leading, node) || 0;
var needs = n.needsWhitespaceAfter;
if (leading) needs = n.needsWhitespaceBefore;
if (needs(node, parent)) lines++;
// generated nodes can't add starting file whitespace
if (!this.buffer.buf) lines = 0;
}
this.newline(lines);
};
if (this[node.type]) {
var needsNoLineTermParens = n.needsParensNoLineTerminator(node, parent);
var needsParens = needsNoLineTermParens || n.needsParens(node, parent);
@@ -219,7 +194,7 @@ class CodeGenerator {
var needsParensFromCatchup = this.catchUp(node, parent, needsParens);
newline(true);
this._printNewline(true, node, parent, opts);
if (opts.before) opts.before();
this.map.mark(node, "start");
@@ -237,7 +212,7 @@ class CodeGenerator {
this.format.concise = oldConcise;
newline(false);
this._printNewline(false, node, parent, opts);
this.printTrailingComments(node, parent);
} else {
@@ -252,21 +227,23 @@ class CodeGenerator {
if (opts.indent) this.indent();
var printOpts = {
statement: opts.statement,
addNewlines: opts.addNewlines,
after: () => {
if (opts.iterator) {
opts.iterator(node, i);
}
if (opts.separator && i < len - 1) {
this.push(opts.separator);
}
}
};
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
print(node, {
statement: opts.statement,
addNewlines: opts.addNewlines,
after: () => {
if (opts.iterator) {
opts.iterator(node, i);
}
if (opts.separator && i < len - 1) {
this.push(opts.separator);
}
}
});
print.plain(node, printOpts);
}
if (opts.indent) this.dedent();
@@ -275,7 +252,7 @@ class CodeGenerator {
printAndIndentOnComments(print, node) {
var indent = !!node.leadingComments;
if (indent) this.indent();
print(node);
print.plain(node);
if (indent) this.dedent();
}
@@ -284,13 +261,13 @@ class CodeGenerator {
this.semicolon();
} else {
this.push(" ");
print(node);
print.plain(node);
}
}
generateComment(comment) {
var val = comment.value;
if (comment.type === "Line") {
if (comment.type === "CommentLine") {
val = `//${val}`;
} else {
val = `/*${val}*/`;
@@ -318,7 +295,7 @@ class CodeGenerator {
nodes.push(node.argument);
}
for (var node of (nodes: Array)) {
for (let node of (nodes: Array)) {
comments = comments.concat(this._getComments(key, node));
}
@@ -366,7 +343,7 @@ class CodeGenerator {
}
//
if (comment.type === "Block" && this.format.indent.adjustMultilineComment) {
if (comment.type === "CommentBlock" && this.format.indent.adjustMultilineComment) {
var offset = comment.loc.start.column;
if (offset) {
var newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g");
@@ -383,7 +360,7 @@ class CodeGenerator {
// force a newline for line comments when retainLines is set in case the next printed node
// doesn't catch up
if (this.format.retainLines && comment.type === "Line") {
if (this.format.retainLines && comment.type === "CommentLine") {
val += "\n";
}

View File

@@ -0,0 +1,32 @@
export default class NodePrinter {
constructor(generator, parent) {
this.generator = generator;
this.parent = parent;
}
plain(node, opts) {
return this.generator.print(node, this.parent, opts);
}
sequence(nodes, opts = {}) {
opts.statement = true;
return this.generator.printJoin(this, nodes, opts);
}
join(nodes, opts) {
return this.generator.printJoin(this, nodes, opts);
}
list(items, opts = {}) {
if (opts.separator == null) opts.separator = ", ";
return this.join(items, opts);
}
block(node) {
return this.generator.printBlock(this, node);
}
indentOnComments(node) {
return this.generator.printAndIndentOnComments(this, node);
}
}

View File

@@ -1,5 +1,3 @@
import sortBy from "lodash/collection/sortBy";
/**
* Returns `i`th number from `base`, continuing from 0 when `max` is reached.
* Useful for shifting `for` loop by a fixed number but going over all items.
@@ -21,8 +19,8 @@ function getLookupIndex(i, base, max) {
}
export default class Whitespace {
constructor(tokens, comments) {
this.tokens = sortBy(tokens.concat(comments), "start");
constructor(tokens) {
this.tokens = tokens;
this.used = {};
// Profiling this code shows that while generator passes over it, indexes
@@ -40,12 +38,11 @@ export default class Whitespace {
var startToken;
var endToken;
var tokens = this.tokens;
var token;
for (var j = 0; j < tokens.length; j++) {
// optimize for forward traversal by shifting for loop index
var i = getLookupIndex(j, this._lastFoundIndex, this.tokens.length);
token = tokens[i];
var token = tokens[i];
// this is the token this node starts with
if (node.start === token.start) {
@@ -64,17 +61,17 @@ export default class Whitespace {
var startToken;
var endToken;
var tokens = this.tokens;
var token;
for (var j = 0; j < tokens.length; j++) {
// optimize for forward traversal by shifting for loop index
var i = getLookupIndex(j, this._lastFoundIndex, this.tokens.length);
token = tokens[i];
var token = tokens[i];
// this is the token this node ends with
if (node.end === token.end) {
startToken = token;
endToken = tokens[i + 1];
if (endToken.type.label === ",") endToken = tokens[i + 2];
this._lastFoundIndex = i;
break;
@@ -85,7 +82,7 @@ export default class Whitespace {
return 1;
} else {
var lines = this.getNewlinesBetween(startToken, endToken);
if (node.type === "Line" && !lines) {
if (node.type === "CommentLine" && !lines) {
// line comment
return 1;
} else {

View File

@@ -85,4 +85,4 @@ export default function (lines: number, lineNumber: number, colNumber: number, o
params.before = params.before.replace(/^./, ">");
}
}).join("\n");
};
}

View File

@@ -6,4 +6,4 @@ export default function (ast, comments, tokens) {
} else {
throw new Error("Not a valid ast?");
}
};
}

View File

@@ -1,3 +1,3 @@
export default function () {
return Object.create(null);
};
}

View File

@@ -3,8 +3,9 @@ import estraverse from "estraverse";
import * as acorn from "../../acorn";
export default function (code, opts = {}) {
var comments = [];
var tokens = [];
var commentsAndTokens = [];
var comments = [];
var tokens = [];
var parseOpts = {
allowImportExportEverywhere: opts.looseModules,
@@ -14,13 +15,31 @@ export default function (code, opts = {}) {
strictMode: opts.strictMode,
sourceType: opts.sourceType,
locations: true,
onComment: comments,
features: opts.features || {},
plugins: opts.plugins || {},
onToken: tokens,
ranges: true
};
parseOpts.onToken = function (token) {
tokens.push(token);
commentsAndTokens.push(token);
};
parseOpts.onComment = function (block, text, start, end, startLoc, endLoc) {
var comment = {
type: block ? "CommentBlock" : "CommentLine",
value: text,
start: start,
end: end,
loc: new acorn.SourceLocation(this, startLoc, endLoc),
range: [start, end]
};
commentsAndTokens.push(comment);
comments.push(comment);
};
if (opts.nonStandard) {
parseOpts.plugins.jsx = true;
parseOpts.plugins.flow = true;
@@ -28,6 +47,6 @@ export default function (code, opts = {}) {
var ast = acorn.parse(code, parseOpts);
estraverse.attachComments(ast, comments, tokens);
ast = normalizeAst(ast, comments, tokens);
ast = normalizeAst(ast, comments, commentsAndTokens);
return ast;
}

View File

@@ -83,4 +83,4 @@ export default function (whitelist, outputType = "global") {
}
return generator(tree).code;
};
}

View File

@@ -56,4 +56,4 @@ export default function (loc, opts = {}) {
}
return opts;
};
}

View File

@@ -3,13 +3,12 @@ import * as optionParsers from "./option-parsers";
import moduleFormatters from "../modules";
import PluginManager from "./plugin-manager";
import shebangRegex from "shebang-regex";
import TraversalPath from "../../traversal/path";
import NodePath from "../../traversal/path";
import Transformer from "../transformer";
import isFunction from "lodash/lang/isFunction";
import isAbsolute from "path-is-absolute";
import resolveRc from "../../tools/resolve-rc";
import sourceMap from "source-map";
import transform from "./../index";
import generate from "../../generation";
import codeFrame from "../../helpers/code-frame";
import defaults from "lodash/object/defaults";
@@ -18,12 +17,10 @@ import traverse from "../../traversal";
import assign from "lodash/object/assign";
import Logger from "./logger";
import parse from "../../helpers/parse";
import Scope from "../../traversal/scope";
import merge from "../../helpers/merge";
import slash from "slash";
import clone from "lodash/lang/clone";
import * as util from "../../util";
import * as api from "../../api/node";
import path from "path";
import * as t from "../../types";
@@ -195,7 +192,7 @@ export default class File {
// build internal transformers
for (var key in this.pipeline.transformers) {
var transformer = this.pipeline.transformers[key];
var pass = transformers[key] = transformer.buildPass(file);
let pass = transformers[key] = transformer.buildPass(file);
if (pass.canTransform()) {
stack.push(pass);
@@ -228,7 +225,7 @@ export default class File {
this.uncollapsedTransformerStack = stack = stack.concat(secondaryStack);
// build dependency graph
for (var pass of (stack: Array)) {
for (let pass of (stack: Array)) {
for (var dep of (pass.transformer.dependencies: Array)) {
this.transformerDependencies[dep] = pass.key;
}
@@ -268,7 +265,6 @@ export default class File {
}
var visitor = traverse.visitors.merge(visitors);
var mergeTransformer = new Transformer(group, visitor);
//console.log(mergeTransformer);
stack.push(mergeTransformer.buildPass(this));
}
@@ -334,7 +330,7 @@ export default class File {
if (comment) {
node.leadingComments = node.leadingComments || [];
node.leadingComments.push({
type: "Line",
type: "CommentLine",
value: " " + comment
});
}
@@ -348,8 +344,6 @@ export default class File {
throw new ReferenceError(`Unknown helper ${name}`);
}
var program = this.ast.program;
var declar = this.declarations[name];
if (declar) return declar;
@@ -390,9 +384,14 @@ export default class File {
}
errorWithNode(node, msg, Error = SyntaxError) {
var loc = node.loc.start;
var err = new Error(`Line ${loc.line}: ${msg}`);
err.loc = loc;
var err;
if (node.loc) {
var loc = node.loc.start;
err = new Error(`Line ${loc.line}: ${msg}`);
err.loc = loc;
} else {
err = new Error("There's been an error on a dynamic node. This is almost certainly an internal error. Please report it.");
}
return err;
}
@@ -410,7 +409,7 @@ export default class File {
outputMapGenerator.applySourceMap(inputMapConsumer);
var mergedMap = outputMapGenerator.toJSON();
mergedMap.sources = inputMap.sources
mergedMap.sources = inputMap.sources;
mergedMap.file = inputMap.file;
return mergedMap;
}
@@ -420,6 +419,10 @@ export default class File {
getModuleFormatter(type: string) {
if (isFunction(type) || !moduleFormatters[type]) {
this.log.deprecate("Custom module formatters are deprecated and will be removed in the next major. Please use Babel plugins instead.");
}
var ModuleFormatter = isFunction(type) ? type : moduleFormatters[type];
if (!ModuleFormatter) {
@@ -463,7 +466,12 @@ export default class File {
}
_addAst(ast) {
this.path = TraversalPath.get(null, ast, ast, "program", this).setContext(null, this);
this.path = NodePath.get({
parentPath: null,
parent: ast,
container: ast,
key: "program"
}).setContext(null, this);
this.scope = this.path.scope;
this.ast = ast;
}
@@ -478,32 +486,30 @@ export default class File {
if (modFormatter.init && this.transformers["es6.modules"].canTransform()) {
modFormatter.init();
}
this.populateModuleMetadata();
this.log.debug("End module formatter init");
}
populateModuleMetadata() {
var modules = {};
this.metadata.modules = modules;
}
transform() {
this.call("pre");
for (var pass of (this.transformerStack: Array)) {
pass.transform();
}
this.call("post");
return this.generate();
}
wrap(code, callback) {
code = code + "";
try {
if (this.shouldIgnore()) {
return {
metadata: this.metadata,
ignored: true,
code: code,
map: null,
ast: null
};
}
callback();
return this.generate();
return callback();
} catch (err) {
if (err._babel) {
throw err;
@@ -532,15 +538,15 @@ export default class File {
}
}
addCode(code: string, parseCode?) {
addCode(code: string) {
code = (code || "") + "";
code = this.parseInputSourceMap(code);
this.code = code;
}
if (parseCode) {
this.parseShebang();
this.addAst(this.parse(this.code));
}
parseCode() {
this.parseShebang();
this.addAst(this.parse(this.code));
}
shouldIgnore() {
@@ -577,28 +583,37 @@ export default class File {
}
}
generate(): {
usedHelpers?: Array<string>;
code: string;
map?: Object;
ast?: Object;
} {
var opts = this.opts;
var ast = this.ast;
makeResult({ code, map = null, ast, ignored }) {
var result = {
metadata: this.metadata,
code: "",
map: null,
ast: null
metadata: null,
ignored: !!ignored,
code: null,
ast: null,
map: map
};
if (this.opts.metadataUsedHelpers) {
if (this.opts.code) {
result.code = code;
}
if (this.opts.ast) {
result.ast = ast;
}
if (this.opts.metadata) {
result.metadata = this.metadata;
result.metadata.usedHelpers = Object.keys(this.usedHelpers);
}
if (opts.ast) result.ast = ast;
if (!opts.code) return result;
return result;
}
generate() {
var opts = this.opts;
var ast = this.ast;
var result = { ast };
if (!opts.code) return this.makeResult(result);
this.log.debug("Generation start");
@@ -625,6 +640,6 @@ export default class File {
result.map = null;
}
return result;
return this.makeResult(result);
}
}

View File

@@ -1,3 +1,4 @@
import type File from "./index";
import buildDebug from "debug/node";
var verboseDebug = buildDebug("babel:verbose");
@@ -15,6 +16,10 @@ export default class Logger {
return parts;
}
warn(msg) {
console.warn(this._buildMessage(msg));
}
error(msg: string, Constructor = Error) {
throw new Constructor(this._buildMessage(msg));
}

View File

@@ -47,7 +47,8 @@
},
"experimental": {
"deprecated": "use `--stage 0`/`{ stage: 0 }` instead"
"description": "allow use of experimental transformers",
"default": false
},
"highlightCode": {
@@ -139,6 +140,12 @@
"type": "boolean"
},
"metadata": {
"hidden": true,
"default": true,
"type": "boolean"
},
"ast": {
"hidden": true,
"default": true,
@@ -179,6 +186,7 @@
},
"metadataUsedHelpers": {
"deprecated": "Not required anymore as this is enabled by default",
"type": "boolean",
"default": false,
"hidden": true

View File

@@ -37,9 +37,10 @@ export default class PluginManager {
var loc = util.resolveRelative(`babel-plugin-${name}`) || util.resolveRelative(name);
if (loc) {
var plugin = require(loc);
return {
position: position,
plugin: require(loc)
plugin: plugin.default || plugin
};
} else {
throw new ReferenceError(messages.get("pluginUnknown", name));

View File

@@ -44,4 +44,4 @@ export default function (opts) {
};
return exports;
};
}

View File

@@ -42,4 +42,4 @@ export default function (exports, opts) {
return nodes;
};
};
}

View File

@@ -10,7 +10,7 @@ import * as react from "./react";
import * as t from "../../types";
export default function (exports, opts) {
exports.JSXIdentifier = function (node, parent) {
exports.JSXIdentifier = function (node) {
if (node.name === "this" && this.isReferenced()) {
return t.thisExpression();
} else if (esutils.keyword.isIdentifierNameES6(node.name)) {
@@ -20,7 +20,7 @@ export default function (exports, opts) {
}
};
exports.JSXNamespacedName = function (node, parent, scope, file) {
exports.JSXNamespacedName = function () {
throw this.errorWithNode(messages.get("JSXNamespacedTags"));
};
@@ -161,7 +161,8 @@ export default function (exports, opts) {
for (var i = 0; i < props.length; i++) {
var prop = props[i];
if (t.isIdentifier(prop.key, { name: "displayName" })) {
var key = t.toComputedKey(prop);
if (t.isLiteral(key, { value: "displayName" })) {
safe = false;
break;
}
@@ -202,4 +203,4 @@ export default function (exports, opts) {
addDisplayName(left.name, right);
}
};
};
}

View File

@@ -1,4 +1,3 @@
import traverse from "../../traversal";
import * as t from "../../types";
var visitor = {
@@ -7,10 +6,10 @@ var visitor = {
state.found = true;
this.stop();
}
},
if (this.isFunction()) {
this.skip();
}
Function() {
this.skip();
}
};

View File

@@ -1,5 +1,3 @@
import cloneDeep from "lodash/lang/cloneDeep";
import traverse from "../../traversal";
import each from "lodash/collection/each";
import has from "lodash/object/has";
import * as t from "../../types";

View File

@@ -68,4 +68,4 @@ export default function (node, nodes, file, scope, allowedSingleIdent) {
uid: uid,
ref: ref
};
};
}

View File

@@ -6,4 +6,4 @@ export default function (node) {
if (!t.isAssignmentPattern(node.params[i])) lastNonDefault = i + 1;
}
return lastNonDefault;
};
}

View File

@@ -2,25 +2,35 @@ import getFunctionArity from "./get-function-arity";
import * as util from "../../util";
import * as t from "../../types";
function visitIdentifier(context, node, scope, state) {
// check if this node matches our function id
if (node.name !== state.name) return;
// check that we don't have a local variable declared as that removes the need
// for the wrapper
var localDeclar = scope.getBindingIdentifier(state.name);
if (localDeclar !== state.outerDeclar) return;
state.selfReference = true;
context.stop();
}
var visitor = {
enter(node, parent, scope, state) {
// check if this node is a referenced identifier that matches the same as our
// function id
if (!this.isReferencedIdentifier({ name: state.name })) return;
ReferencedIdentifier(node, parent, scope, state) {
visitIdentifier(this, node, scope, state);
},
// check that we don't have a local variable declared as that removes the need
// for the wrapper
var localDeclar = scope.getBindingIdentifier(state.name);
if (localDeclar !== state.outerDeclar) return;
state.selfReference = true;
this.stop();
AssignmentExpression(node, parent, scope, state) {
var ids = this.getBindingIdentifiers();
for (var name in ids) {
visitIdentifier(this, ids[name], scope, state);
}
}
};
var wrap = function (state, method, id, scope) {
if (state.selfReference) {
if (scope.hasBinding(id.name)) {
if (scope.hasBinding(id.name) && !scope.hasGlobal(id.name)) {
// we can just munge the local binding
scope.rename(id.name);
} else {
@@ -46,6 +56,7 @@ var wrap = function (state, method, id, scope) {
}
method.id = id;
scope.getProgramParent().references[id.name] = true;
};
var visit = function (node, name, scope) {

View File

@@ -1,4 +1,3 @@
import isString from "lodash/lang/isString";
import * as t from "../../types";
var isCreateClassCallExpression = t.buildMatchMemberExpression("React.createClass");
@@ -26,10 +25,6 @@ export function isCompatTag(tagName) {
return tagName && /^[a-z]|\-/.test(tagName);
}
function isStringLiteral(node) {
return t.isLiteral(node) && isString(node.value);
}
function cleanJSXElementLiteralChild(child, args) {
var lines = child.value.split(/\r\n|\n|\r/);

View File

@@ -1,25 +1,25 @@
import * as t from "../../types";
var awaitVisitor = {
enter(node, parent, scope, state) {
if (t.isFunction(node)) this.skip();
Function() {
this.skip();
},
if (t.isAwaitExpression(node)) {
node.type = "YieldExpression";
AwaitExpression(node) {
node.type = "YieldExpression";
if (node.all) {
// await* foo; -> yield Promise.all(foo);
node.all = false;
node.argument = t.callExpression(t.memberExpression(t.identifier("Promise"), t.identifier("all")), [node.argument]);
}
if (node.all) {
// await* foo; -> yield Promise.all(foo);
node.all = false;
node.argument = t.callExpression(t.memberExpression(t.identifier("Promise"), t.identifier("all")), [node.argument]);
}
}
};
var referenceVisitor = {
enter(node, parent, scope, state) {
ReferencedIdentifier(node, parent, scope, state) {
var name = state.id.name;
if (this.isReferencedIdentifier({ name: name }) && scope.bindingIdentifierEquals(name, state.id)) {
if (node.name === name && scope.bindingIdentifierEquals(name, state.id)) {
return state.ref = state.ref || scope.generateUidIdentifier(name);
}
}
@@ -55,4 +55,4 @@ export default function (node, callId, scope) {
return call;
}
};
}

View File

@@ -1,3 +1,4 @@
import type NodePath from "../../traversal/path";
import * as messages from "../../messages";
import * as t from "../../types";
@@ -130,7 +131,7 @@ export default class ReplaceSupers {
* Description
*/
traverseLevel(path: TraversalPath, topLevel: boolean) {
traverseLevel(path: NodePath, topLevel: boolean) {
var state = { self: this, topLevel: topLevel };
path.traverse(visitor, state);
}
@@ -192,7 +193,7 @@ export default class ReplaceSupers {
* Description
*/
looseHandle(path: TraversalPath, getThisReference: Function) {
looseHandle(path: NodePath, getThisReference: Function) {
var node = path.node;
if (path.isSuper()) {
return this.getLooseSuperProperty(node, path.parent);
@@ -234,7 +235,7 @@ export default class ReplaceSupers {
* Description
*/
specHandle(path: TraversalPath, getThisReference: Function) {
specHandle(path: NodePath, getThisReference: Function) {
var methodNode = this.methodNode;
var property;
var computed;
@@ -274,7 +275,7 @@ export default class ReplaceSupers {
property = node.property;
computed = node.computed;
} else if (t.isUpdateExpression(node) && isMemberExpressionSuper(node.argument)) {
var binary = t.binaryExpression(node.operator[0], node.argument, t.literal(1))
var binary = t.binaryExpression(node.operator[0], node.argument, t.literal(1));
if (node.prefix) {
// ++super.foo; -> super.foo += 1;
return this.specHandleAssignmentExpression(null, path, binary, getThisReference);

View File

@@ -1,19 +0,0 @@
import * as t from "../../types";
export function has(node) {
var first = node.body[0];
return t.isExpressionStatement(first) && t.isLiteral(first.expression, { value: "use strict" });
}
export function wrap(node, callback) {
var useStrictNode;
if (has(node)) {
useStrictNode = node.body.shift();
}
callback();
if (useStrictNode) {
node.body.unshift(useStrictNode);
}
}

View File

@@ -1,12 +1,11 @@
import * as messages from "../../messages";
import traverse from "../../traversal";
import extend from "lodash/object/extend";
import object from "../../helpers/object";
import * as util from "../../util";
import * as t from "../../types";
var remapVisitor = {
enter(node, parent, scope, formatter) {
enter(node) {
if (node._skipModulesRemap) {
return this.skip();
}
@@ -69,46 +68,50 @@ var remapVisitor = {
}
};
var importsVisitor = {
ImportDeclaration: {
enter(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
extend(formatter.localImports, this.getBindingIdentifiers());
var metadataVisitor = {
ModuleDeclaration(node, parent, scope, formatter) {
if (node.source) {
node.source.value = formatter.file.resolveModuleSource(node.source.value);
}
}
};
},
var exportsVisitor = {
ExportDeclaration: {
enter(node, parent, scope, formatter) {
formatter.hasLocalExports = true;
ImportDeclaration(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
extend(formatter.localImports, this.getBindingIdentifiers());
},
var declar = this.get("declaration");
if (declar.isStatement()) {
var bindings = declar.getBindingIdentifiers()
for (var name in bindings) {
var binding = bindings[name];
formatter._addExport(name, binding);
}
}
ExportDeclaration(node, parent, scope, formatter) {
formatter.hasLocalExports = true;
if (this.isExportNamedDeclaration() && node.specifiers) {
for (var i = 0; i < node.specifiers.length; i++) {
var specifier = node.specifiers[i];
var local = specifier.local;
if (!local) continue;
formatter._addExport(local.name, specifier.exported);
}
}
if (!t.isExportDefaultDeclaration(node)) {
var onlyDefault = node.specifiers && node.specifiers.length === 1 && t.isSpecifierDefault(node.specifiers[0]);
if (!onlyDefault) {
formatter.hasNonDefaultExports = true;
}
var declar = this.get("declaration");
if (declar.isStatement()) {
var bindings = declar.getBindingIdentifiers();
for (var name in bindings) {
var binding = bindings[name];
formatter._addExport(name, binding);
}
}
if (this.isExportNamedDeclaration() && node.specifiers) {
for (var i = 0; i < node.specifiers.length; i++) {
var specifier = node.specifiers[i];
var local = specifier.local;
if (!local) continue;
formatter._addExport(local.name, specifier.exported);
}
}
if (!t.isExportDefaultDeclaration(node)) {
var onlyDefault = node.specifiers && node.specifiers.length === 1 && t.isSpecifierDefault(node.specifiers[0]);
if (!onlyDefault) {
formatter.hasNonDefaultExports = true;
}
}
},
Scope() {
this.skip();
}
};
@@ -128,8 +131,7 @@ export default class DefaultFormatter {
this.localExports = object();
this.localImports = object();
this.getLocalExports();
this.getLocalImports();
this.getMetadata();
}
isModuleType(node, type) {
@@ -145,12 +147,15 @@ export default class DefaultFormatter {
return (t.isExportDefaultDeclaration(node) || t.isSpecifierDefault(node)) && !this.noInteropRequireExport && !this.hasNonDefaultExports;
}
getLocalExports() {
this.file.path.traverse(exportsVisitor, this);
}
getLocalImports() {
this.file.path.traverse(importsVisitor, this);
getMetadata() {
var has = false;
for (var node of (this.file.ast.program.body: Array)) {
if (t.isModuleDeclaration(node)) {
has = true;
break;
}
}
if (has) this.file.path.traverse(metadataVisitor, this);
}
remapAssignments() {

View File

@@ -10,4 +10,4 @@ export default function (Parent) {
util.inherits(Constructor, Parent);
return Constructor;
};
}

View File

@@ -1,5 +1,4 @@
import DefaultFormatter from "./_default";
import includes from "lodash/collection/includes";
import * as util from "../../util";
import * as t from "../../types";
@@ -84,7 +83,7 @@ export default class CommonJSFormatter extends DefaultFormatter {
}, true));
}
exportSpecifier(specifier, node, nodes) {
exportSpecifier(specifier) {
if (this.doDefaultExportInterop(specifier)) {
this.hasDefaultOnlyExport = true;
}
@@ -92,7 +91,7 @@ export default class CommonJSFormatter extends DefaultFormatter {
DefaultFormatter.prototype.exportSpecifier.apply(this, arguments);
}
exportDeclaration(node, nodes) {
exportDeclaration(node) {
if (this.doDefaultExportInterop(node)) {
this.hasDefaultOnlyExport = true;
}
@@ -101,8 +100,6 @@ export default class CommonJSFormatter extends DefaultFormatter {
}
_getExternalReference(node, nodes) {
var source = node.source.value;
var call = t.callExpression(t.identifier("require"), [node.source]);
var uid;

View File

@@ -3,7 +3,6 @@ import AMDFormatter from "./amd";
import object from "../../helpers/object";
import * as util from "../../util";
import last from "lodash/array/last";
import each from "lodash/collection/each";
import map from "lodash/collection/map";
import * as t from "../../types";
@@ -45,12 +44,14 @@ var hoistVariablesVisitor = {
};
var hoistFunctionsVisitor = {
enter(node, parent, scope, state) {
if (t.isFunction(node)) this.skip();
Function() {
this.skip();
},
enter(node, parent, scope, state) {
if (t.isFunctionDeclaration(node) || state.formatter._canHoist(node)) {
state.handlerBody.push(node);
this.remove();
this.dangerouslyRemove();
}
}
};
@@ -69,7 +70,7 @@ var runnerSettersVisitor = {
state.nodes.push(node);
}
this.remove();
this.dangerouslyRemove();
}
}
};

View File

@@ -1,5 +1,6 @@
import includes from "lodash/collection/includes";
import type Transformer from "./transformer";
import traverse from "../traversal";
import type File from "./file";
/**
* This class is responsible for traversing over the provided `File`s
@@ -11,8 +12,13 @@ export default class TransformerPass {
this.transformer = transformer;
this.handlers = transformer.handlers;
this.file = file;
this.ran = false;
this.key = transformer.key;
if (this.canTransform() && transformer.metadata.experimental && !file.opts.experimental) {
file.log.warn(`THE TRANSFORMER ${this.key} HAS BEEN MARKED AS EXPERIMENTAL AND IS WIP. USE AT YOUR OWN RISK. ` +
"THIS WILL HIGHLY LIKELY BREAK YOUR CODE SO USE WITH **EXTREME** CAUTION. ENABLE THE " +
"`experimental` OPTION TO IGNORE THIS WARNING.");
}
}
canTransform(): boolean {
@@ -22,13 +28,8 @@ export default class TransformerPass {
transform() {
var file = this.file;
file.log.debug(`Start transformer ${this.key}`);
traverse(file.ast, this.handlers, file.scope, file);
file.log.debug(`Finish transformer ${this.key}`);
this.ran = true;
}
}

View File

@@ -57,10 +57,21 @@ export default class TransformerPipeline {
return true;
}
pretransform(code: string, opts?: Object) {
var file = new File(opts, this);
return file.wrap(code, function () {
file.addCode(code);
file.parseCode(code);
return file;
});
}
transform(code: string, opts?: Object) {
var file = new File(opts, this);
return file.wrap(code, function () {
file.addCode(code, true);
file.addCode(code);
file.parseCode(code);
return file.transform();
});
}
@@ -71,6 +82,7 @@ export default class TransformerPipeline {
return file.wrap(code, function () {
file.addCode(code);
file.addAst(ast);
return file.transform();
});
}

View File

@@ -4,7 +4,6 @@ import isFunction from "lodash/lang/isFunction";
import traverse from "../traversal";
import isObject from "lodash/lang/isObject";
import assign from "lodash/object/assign";
import * as acorn from "../../acorn";
import File from "./file";
import each from "lodash/collection/each";

View File

@@ -1,5 +1,6 @@
{
"useStrict": "strict",
"es5.runtime": "runtime",
"es6.runtime": "runtime"
"es6.runtime": "runtime",
"minification.inlineExpressions": "minification.constantFolding"
}

View File

@@ -5,7 +5,7 @@
"es6.symbols": "es6.spec.symbols",
"es6.blockScopingTDZ": "es6.spec.blockScoping",
"utility.inlineExpressions": "minification.inlineExpressions",
"utility.inlineExpressions": "minification.constantFolding",
"utility.deadCodeElimination": "minification.deadCodeElimination",
"utility.removeConsoleCalls": "minification.removeConsole",
"utility.removeDebugger": "minification.removeDebugger"

View File

@@ -2,12 +2,19 @@ import * as defineMap from "../../helpers/define-map";
import * as t from "../../../types";
export function ObjectExpression(node, parent, scope, file) {
var mutatorMap = {};
var hasAny = false;
for (var prop of (node.properties: Array)) {
if (prop.kind === "get" || prop.kind === "set") {
hasAny = true;
break;
}
}
if (!hasAny) return;
var mutatorMap = {};
node.properties = node.properties.filter(function (prop) {
if (prop.kind === "get" || prop.kind === "set") {
hasAny = true;
defineMap.push(mutatorMap, prop, prop.kind, file);
return false;
} else {
@@ -15,8 +22,6 @@ export function ObjectExpression(node, parent, scope, file) {
}
});
if (!hasAny) return;
return t.callExpression(
t.memberExpression(t.identifier("Object"), t.identifier("defineProperties")),
[node, defineMap.toDefineObject(mutatorMap)]

View File

@@ -1,3 +1,6 @@
import type NodePath from "../../../traversal/path";
import type Scope from "../../../traversal/scope";
import type File from "../../file";
import traverse from "../../../traversal";
import object from "../../../helpers/object";
import * as util from "../../../util";
@@ -258,7 +261,7 @@ class BlockScoping {
* Description
*/
constructor(loopPath?: TraversalPath, blockPath: TraversalPath, parent: Object, scope: Scope, file: File) {
constructor(loopPath?: NodePath, blockPath: NodePath, parent: Object, scope: Scope, file: File) {
this.parent = parent;
this.scope = scope;
this.file = file;
@@ -597,7 +600,6 @@ class BlockScoping {
t.variableDeclarator(ret, call)
]));
var loop = this.loop;
var retCheck;
var has = this.has;
var cases = [];

View File

@@ -1,12 +1,11 @@
import type NodePath from "../../../traversal/path";
import type File from "../../file";
import memoiseDecorators from "../../helpers/memoise-decorators";
import ReplaceSupers from "../../helpers/replace-supers";
import * as nameMethod from "../../helpers/name-method";
import * as defineMap from "../../helpers/define-map";
import * as messages from "../../../messages";
import * as util from "../../../util";
import traverse from "../../../traversal";
import each from "lodash/collection/each";
import has from "lodash/object/has";
import * as t from "../../../types";
const PROPERTY_COLLISION_METHOD_NAME = "__initializeProperties";
@@ -35,22 +34,6 @@ var collectPropertyReferencesVisitor = {
}
};
var constructorVisitor = {
ThisExpression: {
enter(node, parent, scope, ref) {
return ref;
}
},
Function: {
enter(node) {
if (!node.shadow) {
this.skip();
}
}
}
};
var verifyConstructorVisitor = {
MethodDefinition: {
enter() {
@@ -104,7 +87,7 @@ class ClassTransformer {
* Description
*/
constructor(path: TraversalPath, file: File) {
constructor(path: NodePath, file: File) {
this.parent = path.parent;
this.scope = path.scope;
this.node = path.node;
@@ -141,8 +124,6 @@ class ClassTransformer {
run() {
var superName = this.superName;
var className = this.className;
var classBody = this.node.body.body;
var classRef = this.classRef;
var file = this.file;
@@ -262,7 +243,7 @@ class ClassTransformer {
var map = defineMap.push(mutatorMap, node, kind, this.file);
if (enumerable) {
map.enumerable = t.literal(true)
map.enumerable = t.literal(true);
}
if (map.decorators) {
@@ -276,9 +257,6 @@ class ClassTransformer {
buildBody() {
var constructorBody = this.constructorBody;
var constructor = this.constructor;
var className = this.className;
var superName = this.superName;
var classBody = this.node.body.body;
var body = this.body;
@@ -315,7 +293,7 @@ class ClassTransformer {
this.pushMethod(node, path);
}
} else if (t.isClassProperty(node)) {
this.pushProperty(node);
this.pushProperty(node, path);
}
}
@@ -375,7 +353,7 @@ class ClassTransformer {
}
var lastNonNullIndex = 0;
for (var i = 0; i < args.length; i++) {
for (let i = 0; i < args.length; i++) {
if (args[i] !== nullNode) lastNonNullIndex = i;
}
args = args.slice(0, lastNonNullIndex + 1);
@@ -450,7 +428,7 @@ class ClassTransformer {
* Description
*/
verifyConstructor(path: TraversalPath) {
verifyConstructor(path: NodePath) {
var state = {
hasBareSuper: false,
bareSuper: null,
@@ -471,7 +449,7 @@ class ClassTransformer {
* Push a method to its respective mutatorMap.
*/
pushMethod(node: { type: "MethodDefinition" }, path?: TraversalPath, allowedIllegal?) {
pushMethod(node: { type: "MethodDefinition" }, path?: NodePath, allowedIllegal?) {
if (!allowedIllegal && t.isLiteral(t.toComputedKey(node), { value: PROPERTY_COLLISION_METHOD_NAME })) {
throw this.file.errorWithNode(node, messages.get("illegalMethodName", PROPERTY_COLLISION_METHOD_NAME));
}
@@ -500,10 +478,8 @@ class ClassTransformer {
* Description
*/
pushProperty(node: { type: "ClassProperty" }) {
var key;
this.scope.traverse(node, collectPropertyReferencesVisitor, {
pushProperty(node: { type: "ClassProperty" }, path: NodePath) {
path.traverse(collectPropertyReferencesVisitor, {
references: this.instancePropRefs,
scope: this.scope
});
@@ -519,7 +495,6 @@ class ClassTransformer {
this.pushToMap(node, true, "initializer");
var initializers;
var body;
var target;
if (node.static) {
initializers = this.staticInitializersId = this.staticInitializersId || this.scope.generateUidIdentifier("staticInitializers");
@@ -558,7 +533,7 @@ class ClassTransformer {
* Replace the constructor body of our class.
*/
pushConstructor(method: { type: "MethodDefinition" }, path: TraversalPath) {
pushConstructor(method: { type: "MethodDefinition" }, path: NodePath) {
// https://github.com/babel/babel/issues/1077
var fnPath = path.get("value");
if (fnPath.scope.hasOwnBinding(this.classRef.name)) {

View File

@@ -1,13 +1,12 @@
import * as messages from "../../../messages";
import * as t from "../../../types";
export function AssignmentExpression(node, parent, scope, file) {
var ids = this.getBindingIdentifiers();
function checkPath(path, file) {
var ids = path.getBindingIdentifiers();
for (var name in ids) {
var id = ids[name];
var binding = scope.getBinding(name);
var binding = path.scope.getBinding(name);
// no binding exists
if (!binding) continue;
@@ -24,8 +23,19 @@ export function AssignmentExpression(node, parent, scope, file) {
}
}
export function AssignmentExpression(node, parent, scope, file) {
checkPath(this, file);
}
export { AssignmentExpression as UpdateExpression };
export function VariableDeclaration(node) {
if (node.kind === "const") node.kind = "let";
}
export function ForXStatement(node, parent, scope, file) {
var left = this.get("left");
if (left.isIdentifier() || left.isPattern()) {
checkPath(left, file);
}
}

View File

@@ -107,30 +107,10 @@ export function CatchClause(node, parent, scope, file) {
node.body.body = nodes.concat(node.body.body);
}
export function ExpressionStatement(node, parent, scope, file) {
var expr = node.expression;
if (expr.type !== "AssignmentExpression") return;
if (!t.isPattern(expr.left)) return;
if (this.isCompletionRecord()) return;
var destructuring = new DestructuringTransformer({
operator: expr.operator,
scope: scope,
file: file,
});
return destructuring.init(expr.left, expr.right);
}
export function AssignmentExpression(node, parent, scope, file) {
if (!t.isPattern(node.left)) return;
var ref = scope.generateUidIdentifier("temp");
var nodes = [];
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(ref, node.right)
]));
var destructuring = new DestructuringTransformer({
operator: node.operator,
@@ -139,13 +119,24 @@ export function AssignmentExpression(node, parent, scope, file) {
nodes: nodes
});
if (t.isArrayExpression(node.right)) {
destructuring.arrays[ref.name] = true;
var ref;
if (this.isCompletionRecord() || !this.parentPath.isExpressionStatement()) {
ref = scope.generateUidIdentifierBasedOnNode(node.right, "ref");
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(ref, node.right)
]));
if (t.isArrayExpression(node.right)) {
destructuring.arrays[ref.name] = true;
}
}
destructuring.init(node.left, ref);
destructuring.init(node.left, ref || node.right);
nodes.push(t.expressionStatement(ref));
if (ref) {
nodes.push(t.expressionStatement(ref));
}
return nodes;
}
@@ -160,7 +151,7 @@ function variableDeclarationHasPattern(node) {
}
export function VariableDeclaration(node, parent, scope, file) {
if (t.isForInStatement(parent) || t.isForOfStatement(parent)) return;
if (t.isForXStatement(parent)) return;
if (!variableDeclarationHasPattern(node)) return;
var nodes = [];
@@ -498,7 +489,6 @@ class DestructuringTransformer {
// trying to destructure a value that we can't evaluate more than once so we
// need to save it to a variable
var shouldMemoise = true;
if (!t.isArrayExpression(ref) && !t.isMemberExpression(ref)) {
var memo = this.scope.maybeGenerateMemoised(ref, true);
if (memo) {

View File

@@ -31,7 +31,7 @@ export function ForOfStatement(node, parent, scope, file) {
if (build.replaceParent) {
this.parentPath.replaceWithMultiple(build.node);
this.remove();
this.dangerouslyRemove();
} else {
return build.node;
}

View File

@@ -19,8 +19,8 @@ export function ImportDeclaration(node, parent, scope, file) {
var nodes = [];
if (node.specifiers.length) {
for (var i = 0; i < node.specifiers.length; i++) {
file.moduleFormatter.importSpecifier(node.specifiers[i], node, nodes, parent);
for (var specifier of (node.specifiers: Array)) {
file.moduleFormatter.importSpecifier(specifier, node, nodes, parent);
}
} else {
file.moduleFormatter.importDeclaration(node, nodes, parent);

View File

@@ -1,6 +1,5 @@
import callDelegate from "../../helpers/call-delegate";
import * as util from "../../../util";
import traverse from "../../../traversal";
import * as t from "../../../types";
var hasDefaults = function (node) {

View File

@@ -9,6 +9,13 @@ var memberExpressionOptimisationVisitor = {
return this.skip();
}
var stop = () => {
state.canOptimise = false;
this.stop();
};
if (this.isArrowFunctionExpression()) return stop();
// skip over functions as whatever `arguments` we reference inside will refer
// to the wrong function
if (this.isFunctionDeclaration() || this.isFunctionExpression()) {
@@ -31,8 +38,7 @@ var memberExpressionOptimisationVisitor = {
}
}
state.canOptimise = false;
this.stop();
stop();
}
};
@@ -90,8 +96,7 @@ export function Func/*tion*/(node, parent, scope, file) {
// we only have shorthands and there's no other references
if (state.canOptimise && state.candidates.length) {
for (var i = 0; i < state.candidates.length; i++) {
var candidate = state.candidates[i];
for (var candidate of (state.candidates: Array)) {
candidate.replaceWith(argsId);
optimizeMemberExpression(candidate.parent, node.params.length);
}

View File

@@ -1,29 +1,59 @@
import traverse from "../../../traversal";
import * as t from "../../../types";
function buildAssert(node, file) {
return t.callExpression(
file.addHelper("temporal-assert-defined"),
[node, t.literal(node.name), file.addHelper("temporal-undefined")]
);
}
function references(node, scope, state) {
var declared = state.letRefs[node.name];
if (!declared) return false;
// declared node is different in this scope
return scope.getBindingIdentifier(node.name) === declared;
}
var visitor = {
ReferencedIdentifier(node, parent, scope, state) {
if (t.isFor(parent) && parent.left === node) return;
var declared = state.letRefs[node.name];
if (!declared) return;
if (!references(node, scope, state)) return;
// declared node is different in this scope
if (scope.getBindingIdentifier(node.name) !== declared) return;
var assert = t.callExpression(
state.file.addHelper("temporal-assert-defined"),
[node, t.literal(node.name), state.file.addHelper("temporal-undefined")]
);
var assert = buildAssert(node, state.file);
this.skip();
if (t.isAssignmentExpression(parent) || t.isUpdateExpression(parent)) {
if (t.isUpdateExpression(parent)) {
if (parent._ignoreBlockScopingTDZ) return;
this.parentPath.replaceWith(t.sequenceExpression([assert, parent]));
} else {
return t.logicalExpression("&&", assert, node);
}
},
AssignmentExpression: {
exit(node, parent, scope, state) {
if (node._ignoreBlockScopingTDZ) return;
var nodes = [];
var ids = this.getBindingIdentifiers();
for (var name in ids) {
var id = ids[name];
if (references(id, scope, state)) {
nodes.push(buildAssert(id, state.file));
}
}
if (nodes.length) {
node._ignoreBlockScopingTDZ = true;
nodes.push(node);
return nodes.map(t.expressionStatement);
}
}
}
};

View File

@@ -1,7 +1,8 @@
import * as t from "../../../types";
export var metadata = {
optional: true
optional: true,
group: "builtin-pre"
};
export function TemplateLiteral(node, parent, scope, file) {

View File

@@ -1,4 +1,3 @@
import includes from "lodash/collection/includes";
import * as t from "../../../types";
function getSpreadLiteral(spread, scope) {

View File

@@ -1,7 +1,6 @@
import reduceRight from "lodash/collection/reduceRight";
import * as messages from "../../../messages";
import flatten from "lodash/array/flatten";
import traverse from "../../../traversal";
import * as util from "../../../util";
import map from "lodash/collection/map";
import * as t from "../../../types";
@@ -21,7 +20,7 @@ function returnBlock(expr) {
}
var visitor = {
enter(node, parent, scope, state) {
enter(node, parent) {
if (t.isTryStatement(parent)) {
if (node === parent.block) {
this.skip();
@@ -35,7 +34,7 @@ var visitor = {
return state.subTransform(node.argument);
},
Function(node, parent, scope, state) {
Function() {
this.skip();
},
@@ -51,7 +50,7 @@ var visitor = {
},
ReferencedIdentifier(node, parent, scope, state) {
if (node.name === "arguments" && !state.isShadowed) {
if (node.name === "arguments" && (!state.isShadowed || node._shadowedFunctionLiteral)) {
state.needsArguments = true;
state.argumentsPaths.push(this);
}
@@ -128,7 +127,6 @@ class TailCallTransformer {
}
run() {
var scope = this.scope;
var node = this.node;
// only tail recursion can be optimized as for now, so we can skip anonymous
@@ -204,13 +202,14 @@ class TailCallTransformer {
}
if (this.needsArguments || this.setsArguments) {
for (var path of (this.argumentsPaths: Array)) {
for (let path of (this.argumentsPaths: Array)) {
path.replaceWith(this.argumentsId);
}
var decl = t.variableDeclarator(this.argumentsId);
if (this.argumentsId) {
decl.init = t.identifier("arguments");
decl.init._shadowedFunctionLiteral = true;
}
topVars.push(decl);
}
@@ -291,7 +290,8 @@ class TailCallTransformer {
}
subTransformCallExpression(node) {
var callee = node.callee, thisBinding, args;
var callee = node.callee;
var thisBinding, args;
if (t.isMemberExpression(callee, { computed: false }) && t.isIdentifier(callee.property)) {
switch (callee.property.name) {
@@ -301,6 +301,7 @@ class TailCallTransformer {
case "apply":
args = node.arguments[1] || t.identifier("undefined");
this.needsArguments = true;
break;
default:
@@ -334,6 +335,10 @@ class TailCallTransformer {
args = t.arrayExpression(node.arguments);
}
if (t.isArrayExpression(args) && args.elements.length > this.node.params.length) {
this.needsArguments = true;
}
var argumentsId = this.getArgumentsId();
var params = this.getParams();
@@ -349,14 +354,14 @@ class TailCallTransformer {
var elems = args.elements;
for (let i = 0; i < elems.length && i < params.length; i++) {
let param = params[i];
var elem = elems[i] || (elems[i] = t.identifier("undefined"));
let elem = elems[i] || (elems[i] = t.identifier("undefined"));
if (!param._isDefaultPlaceholder) {
elems[i] = t.assignmentExpression("=", param, elem);
}
}
if (!this.needsArguments) {
for (var elem of (elems: Array)) {
for (let elem of (elems: Array)) {
body.push(t.expressionStatement(elem));
}
}

View File

@@ -1,9 +1,26 @@
/* eslint no-unused-vars: 0 */
import * as t from "../../../types";
var buildBinaryExpression = function (left, right) {
return t.binaryExpression("+", left, right);
export var metadata = {
group: "builtin-pre"
};
function buildBinaryExpression(left, right) {
var node = t.binaryExpression("+", left, right);
node._templateLiteralProduced = true;
return node;
}
function crawl(path) {
if (path.is("_templateLiteralProduced")) {
crawl(path.get("left"));
crawl(path.get("right"));
} else if (!path.isTypeAnnotationGeneric("String") && !path.isTypeAnnotationGeneric("Number")) {
path.replaceWith(t.callExpression(t.identifier("String"), [path.node]));
}
}
export function TaggedTemplateExpression(node, parent, scope, file) {
var quasi = node.quasi;
var args = [];
@@ -11,8 +28,7 @@ export function TaggedTemplateExpression(node, parent, scope, file) {
var strings = [];
var raw = [];
for (var i = 0; i < quasi.quasis.length; i++) {
var elem = quasi.quasis[i];
for (var elem of (quasi.quasis: Array)) {
strings.push(t.literal(elem.value.cooked));
raw.push(t.literal(elem.value.raw));
}
@@ -31,11 +47,8 @@ export function TaggedTemplateExpression(node, parent, scope, file) {
export function TemplateLiteral(node, parent, scope, file) {
var nodes = [];
var i;
for (i = 0; i < node.quasis.length; i++) {
var elem = node.quasis[i];
for (let elem of (node.quasis: Array)) {
nodes.push(t.literal(elem.value.cooked));
var expr = node.expressions.shift();
@@ -49,11 +62,12 @@ export function TemplateLiteral(node, parent, scope, file) {
var root = buildBinaryExpression(nodes.shift(), nodes.shift());
for (i = 0; i < nodes.length; i++) {
root = buildBinaryExpression(root, nodes[i]);
for (let node of (nodes: Array)) {
root = buildBinaryExpression(root, node);
}
return root;
this.replaceWith(root);
//crawl(this);
} else {
return nodes[0];
}

View File

@@ -10,7 +10,7 @@ export var metadata = {
export function ComprehensionExpression(node, parent, scope, file) {
var callback = array;
if (node.generator) callback = generator;
return callback(node, parent, scope, file);
return callback(node, parent, scope);
}
function generator(node) {
@@ -25,7 +25,7 @@ function generator(node) {
return t.callExpression(container, []);
}
function array(node, parent, scope, file) {
function array(node, parent, scope) {
var uid = scope.generateUidIdentifierBasedOnNode(parent);
var container = util.template("array-comprehension-container", {

View File

@@ -10,8 +10,8 @@ export var metadata = {
export function ObjectExpression(node, parent, scope, file) {
var hasDecorators = false;
for (var i = 0; i < node.properties.length; i++) {
var prop = node.properties[i];
for (let i = 0; i < node.properties.length; i++) {
let prop = node.properties[i];
if (prop.decorators) {
hasDecorators = true;
break;
@@ -21,12 +21,12 @@ export function ObjectExpression(node, parent, scope, file) {
var mutatorMap = {};
for (var i = 0; i < node.properties.length; i++) {
var prop = node.properties[i];
for (let i = 0; i < node.properties.length; i++) {
let prop = node.properties[i];
if (prop.decorators) memoiseDecorators(prop.decorators, scope);
if (prop.kind === "init") {
if (prop.kind === "init" && !prop.method) {
prop.kind = "";
prop.value = t.functionExpression(null, [], t.blockStatement([
t.returnStatement(prop.value)

View File

@@ -1,16 +1,21 @@
export default {
//- builtin-setup
//- builtin-prepass
"minification.constantFolding": require("./minification/constant-folding"),
//- builtin-pre
strict: require("./other/strict"),
eval: require("./other/eval"),
_explode: require("./internal/explode"),
_validation: require("./internal/validation"),
_hoistDirectives: require("./internal/hoist-directives"),
"minification.removeDebugger": require("./minification/remove-debugger"),
"minification.removeConsole": require("./minification/remove-console"),
"utility.inlineEnvironmentVariables": require("./utility/inline-environment-variables"),
"minification.inlineExpressions": require("./minification/inline-expressions"),
"minification.deadCodeElimination": require("./minification/dead-code-elimination"),
_modules: require("./internal/modules"),
"spec.functionName": require("./spec/function-name"),
"es6.spec.templateLiterals": require("./es6/spec.template-literals"),
"es6.templateLiterals": require("./es6/template-literals"),
//- builtin-basic
// this is where the bulk of the ES6 transformations take place, none of them require traversal state
@@ -32,8 +37,6 @@ export default {
"es6.objectSuper": require("./es6/object-super"),
"es7.objectRestSpread": require("./es7/object-rest-spread"),
"es7.exponentiationOperator": require("./es7/exponentiation-operator"),
"es6.spec.templateLiterals": require("./es6/spec.template-literals"),
"es6.templateLiterals": require("./es6/template-literals"),
"es5.properties.mutators": require("./es5/properties.mutators"),
"es6.properties.shorthand": require("./es6/properties.shorthand"),
"es6.properties.computed": require("./es6/properties.computed"),
@@ -51,8 +54,6 @@ export default {
"es6.spec.symbols": require("./es6/spec.symbols"),
"es7.functionBind": require("./es7/function-bind"),
"spec.undefinedToVoid": require("./spec/undefined-to-void"),
jscript: require("./other/jscript"),
flow: require("./other/flow"),
//- builtin-advanced
"es6.destructuring": require("./es6/destructuring"),
@@ -60,13 +61,11 @@ export default {
"es6.spec.blockScoping": require("./es6/spec.block-scoping"),
reactCompat: require("./other/react-compat"),
react: require("./other/react"),
regenerator: require("./other/regenerator"),
// es6 syntax transformation is **forbidden** past this point since regenerator will chuck a massive
// hissy fit
//- regenerator
regenerator: require("./other/regenerator"),
//- builtin-modules
runtime: require("./other/runtime"),
"es6.modules": require("./es6/modules"),
@@ -83,4 +82,6 @@ export default {
"minification.memberExpressionLiterals": require("./minification/member-expression-literals"),
"minification.propertyLiterals": require("./minification/property-literals"),
_blockHoist: require("./internal/block-hoist"),
jscript: require("./other/jscript"),
flow: require("./other/flow"),
};

View File

@@ -2,7 +2,7 @@ import clone from "lodash/lang/clone";
import * as t from "../../../types";
export var metadata = {
group: "builtin-setup"
group: "builtin-pre"
};
function buildClone(bindingKey, refKey, check?) {

View File

@@ -1,7 +1,7 @@
import * as t from "../../../types";
export var metadata = {
group: "builtin-setup"
group: "builtin-pre"
};
export var BlockStatement = {

View File

@@ -1,19 +1,15 @@
import * as strict from "../../helpers/strict";
export var metadata = {
group: "builtin-modules"
};
export var Program = {
exit(program, parent, scope, file) {
strict.wrap(program, function () {
// ensure that these are at the top, just like normal imports
for (var node of (file.dynamicImports: Array)) {
node._blockHoist = 3;
}
// ensure that these are at the top, just like normal imports
for (var node of (file.dynamicImports: Array)) {
node._blockHoist = 3;
}
program.body = file.dynamicImports.concat(program.body);
});
program.body = file.dynamicImports.concat(program.body);
if (!file.transformers["es6.modules"].canTransform()) return;

View File

@@ -7,45 +7,43 @@
import clone from "lodash/lang/clone";
import * as t from "../../../types";
export var metadata = {
group: "builtin-setup"
};
export function ImportDeclaration(node, parent, scope, file) {
if (node.source) {
node.source.value = file.resolveModuleSource(node.source.value);
}
function getDeclar(node) {
var declar = node.declaration;
t.inheritsComments(declar, node);
t.removeComments(node);
declar._ignoreUserWhitespace = true;
return declar;
}
export { ImportDeclaration as ExportAllDeclaration };
export var metadata = {
group: "builtin-pre"
};
export function ExportDefaultDeclaration(node, parent, scope) {
ImportDeclaration.apply(this, arguments);
var declar = node.declaration;
var getDeclar = function () {
declar._ignoreUserWhitespace = true;
return declar;
};
if (t.isClassDeclaration(declar)) {
// export default class Foo {};
let nodes = [getDeclar(node), node];
node.declaration = declar.id;
return [getDeclar(), node];
return nodes;
} else if (t.isClassExpression(declar)) {
// export default class {};
var temp = scope.generateUidIdentifier("default");
declar = t.variableDeclaration("var", [
node.declaration = t.variableDeclaration("var", [
t.variableDeclarator(temp, declar)
]);
let nodes = [getDeclar(node), node];
node.declaration = temp;
return [getDeclar(), node];
return nodes;
} else if (t.isFunctionDeclaration(declar)) {
// export default function Foo() {}
node._blockHoist = 2;
let nodes = [getDeclar(node), node];
node.declaration = declar.id;
return [getDeclar(), node];
return nodes;
}
}
@@ -54,26 +52,23 @@ function buildExportSpecifier(id) {
}
export function ExportNamedDeclaration(node, parent, scope) {
ImportDeclaration.apply(this, arguments);
var declar = node.declaration;
var getDeclar = function () {
declar._ignoreUserWhitespace = true;
return declar;
};
if (t.isClassDeclaration(declar)) {
// export class Foo {}
node.specifiers = [buildExportSpecifier(declar.id)];
let nodes = [getDeclar(node), node];
node.declaration = null;
return [getDeclar(), node];
return nodes;
} else if (t.isFunctionDeclaration(declar)) {
// export function Foo() {}
node.specifiers = [buildExportSpecifier(declar.id)];
node.declaration = null;
node._blockHoist = 2;
return [getDeclar(), node];
let nodes = [getDeclar(node), node];
node.declaration = null;
return nodes;
} else if (t.isVariableDeclaration(declar)) {
// export var foo = "bar";
var specifiers = [];

View File

@@ -2,7 +2,7 @@ import * as messages from "../../../messages";
import * as t from "../../../types";
export var metadata = {
group: "builtin-setup"
group: "builtin-pre"
};
export function ForOfStatement(node, parent, scope, file) {

View File

@@ -0,0 +1,49 @@
import * as t from "../../../types";
export var metadata = {
optional: true,
group: "builtin-prepass",
experimental: true
};
export function AssignmentExpression() {
var left = this.get("left");
if (!left.isIdentifier()) return;
var binding = this.scope.getBinding(left.node.name);
if (!binding || binding.deoptValue) return;
var evaluated = this.get("right").evaluate();
if (evaluated.confident) {
binding.setValue(evaluated.value);
} else {
binding.deoptValue();
}
}
export function IfStatement() {
var evaluated = this.get("test").evaluate();
if (!evaluated.confident) return this.skip();
if (evaluated.value) {
this.skipKey("alternate");
} else {
this.skipKey("consequent");
}
}
export var Scopable = {
exit() {
for (var name in this.scope.bindings) {
var binding = this.scope.bindings[name];
binding.clearValue();
}
}
};
export var Expression = {
exit() {
var res = this.evaluate();
if (res.confident) return t.valueToNode(res.value);
}
};

View File

@@ -19,7 +19,8 @@ function toStatements(node) {
export var metadata = {
optional: true,
group: "builtin-setup"
group: "builtin-pre",
experimental: true
};
export function ReferencedIdentifier(node, parent, scope) {
@@ -33,27 +34,37 @@ export function ReferencedIdentifier(node, parent, scope) {
}
if (!replacement) return;
if (this.findParent((node) => replacement)) {
// ensure it's a "pure" type
if (!scope.isPure(replacement, true)) return;
if (t.isClass(replacement) || t.isFunction(replacement)) {
// don't change this if it's in a different scope, this can be bad
// for performance since it may be inside a loop or deeply nested in
// hot code
if (binding.path.scope.parent !== scope) return;
}
if (this.findParent((node) => node === replacement)) {
return;
}
t.toExpression(replacement);
scope.removeBinding(node.name);
binding.path.remove();
binding.path.dangerouslyRemove();
return replacement;
}
export function FunctionDeclaration(node, parent, scope) {
var bindingInfo = scope.getBinding(node.id.name);
if (bindingInfo && !bindingInfo.referenced) {
this.remove();
this.dangerouslyRemove();
}
}
export { FunctionDeclaration as ClassDeclaration };
export function VariableDeclarator(node, parent, scope) {
if (!t.isIdentifier(node.id) || !scope.isPure(node.init)) return;
if (!t.isIdentifier(node.id) || !scope.isPure(node.init, true)) return;
FunctionDeclaration.apply(this, arguments);
}
@@ -66,8 +77,27 @@ export function ConditionalExpression(node, parent, scope) {
}
}
export function BlockStatement(node) {
var paths = this.get("body");
var purge = false;
for (var i = 0; i < paths.length; i++) {
let path = paths[i];
if (!purge && path.isCompletionStatement()) {
purge = true;
continue;
}
if (purge && !path.isFunctionDeclaration()) {
path.dangerouslyRemove();
}
}
}
export var IfStatement = {
exit(node, parent, scope) {
exit(node) {
var consequent = node.consequent;
var alternate = node.alternate;
var test = node.test;
@@ -96,7 +126,7 @@ export var IfStatement = {
if (alternate) {
return toStatements(alternate);
} else {
return this.remove();
return this.dangerouslyRemove();
}
}

View File

@@ -1,17 +0,0 @@
import * as t from "../../../types";
export var metadata = {
optional: true,
group: "builtin-setup"
};
export var Expression = {
exit(node, parent, scope) {
var res = this.evaluate();
if (res.confident) return t.valueToNode(res.value);
}
};
export function Identifier() {
// override Expression
}

View File

@@ -2,15 +2,15 @@ import * as t from "../../../types";
export var metadata = {
optional: true,
group: "builtin-setup"
group: "builtin-pre"
};
export function CallExpression(node, parent) {
if (this.get("callee").matchesPattern("console", true)) {
if (t.isExpressionStatement(parent)) {
this.parentPath.remove();
this.parentPath.dangerouslyRemove();
} else {
this.remove();
this.dangerouslyRemove();
}
}
}

View File

@@ -1,12 +1,8 @@
import * as t from "../../../types";
export var metadata = {
optional: true,
group: "builtin-setup"
group: "builtin-pre"
};
export function ExpressionStatement(node) {
if (this.get("expression").isIdentifier({ name: "debugger" })) {
this.remove();
}
export function DebuggerStatement(node) {
this.dangerouslyRemove();
}

View File

@@ -1,12 +1,11 @@
import { _ForOfStatementArray } from "../es6/for-of";
import * as t from "../../../types";
export var metadata = {
optional: true
};
export function ForOfStatement(node, parent, scope, file) {
if (this.get("right").isTypeGeneric("Array")) {
if (this.get("right").isTypeAnnotationGeneric("Array")) {
return _ForOfStatementArray.call(this, node, scope, file);
}
}

View File

@@ -1,5 +1,3 @@
import * as react from "../../helpers/react";
export var metadata = {
optional: true
};

View File

@@ -0,0 +1,21 @@
import traverse from "../../../traversal";
import parse from "../../../helpers/parse";
export var metadata = {
group: "builtin-pre",
optional: true
};
export function CallExpression(node) {
if (this.get("callee").isIdentifier({ name: "eval" }) && node.arguments.length === 1) {
var evaluate = this.get("arguments")[0].evaluate();
if (!evaluate.confident) return;
var code = evaluate.value;
if (typeof code !== "string") return;
var ast = parse(code);
traverse.removeProperties(ast);
return ast.program;
}
}

View File

@@ -1,11 +1,14 @@
import * as t from "../../../types";
export var metadata = {
group: "builtin-trailing"
};
export function Flow(node) {
this.remove();
this.dangerouslyRemove();
}
export function ClassProperty(node) {
node.typeAnnotation = null;
if (!node.value) this.dangerouslyRemove();
}
export function Class(node) {
@@ -24,9 +27,9 @@ export function TypeCastExpression(node) {
}
export function ImportDeclaration(node) {
if (node.isType) this.remove();
if (node.isType) this.dangerouslyRemove();
}
export function ExportDeclaration(node) {
if (this.get("declaration").isTypeAlias()) this.remove();
if (this.get("declaration").isTypeAlias()) this.dangerouslyRemove();
}

View File

@@ -1,18 +1,21 @@
import * as t from "../../../types";
export var metadata = {
group: "builtin-trailing",
optional: true
};
export function FunctionExpression(node, print) {
if (!node.id) return;
node._ignoreUserWhitespace = true;
export var FunctionExpression = {
exit(node) {
if (!node.id) return;
node._ignoreUserWhitespace = true;
return t.callExpression(
t.functionExpression(null, [], t.blockStatement([
t.toStatement(node),
t.returnStatement(node.id)
])),
[]
);
}
return t.callExpression(
t.functionExpression(null, [], t.blockStatement([
t.toStatement(node),
t.returnStatement(node.id)
])),
[]
);
}
};

View File

@@ -3,27 +3,29 @@ import * as t from "../../../types";
import { NodePath } from "ast-types";
export var metadata = {
group: "regenerator"
group: "builtin-advanced"
};
export function Func/*tion*/(node) {
if (node.async || node.generator) {
// Although this code transforms only the subtree rooted at the given
// Function node, that node might contain other generator functions
// that will also be transformed. It might help performance to ignore
// nested functions, and rely on the traversal to visit them later,
// but that's a small optimization. Starting here instead of at the
// root of the AST is the key optimization, since huge async/generator
// functions are relatively rare.
regenerator.transform(convertTraversalPathToNodePath(this));
export var Func/*tion*/ = {
exit(node) {
if (node.async || node.generator) {
// Although this code transforms only the subtree rooted at the given
// Function node, that node might contain other generator functions
// that will also be transformed. It might help performance to ignore
// nested functions, and rely on the traversal to visit them later,
// but that's a small optimization. Starting here instead of at the
// root of the AST is the key optimization, since huge async/generator
// functions are relatively rare.
regenerator.transform(convertNodePath(this));
}
}
}
};
// Given a TraversalPath, return a NodePath that includes full ancestry
// information (up to and including the Program node). This is complicated
// by having to include intermediate objects like blockStatement.body
// Given a Babel NodePath, return an ast-types NodePath that includes full
// ancestry information (up to and including the Program node). This is
// complicated by having to include intermediate objects like blockStatement.body
// arrays, in addition to Node objects.
function convertTraversalPathToNodePath(path) {
function convertNodePath(path) {
var programNode;
var keysAlongPath = [];

View File

@@ -1,12 +1,7 @@
import includes from "lodash/collection/includes";
import traverse from "../../../../traversal";
import * as util from "../../../../util";
import has from "lodash/object/has";
import * as t from "../../../../types";
import definitions from "./definitions";
var isSymbolIterator = t.buildMatchMemberExpression("Symbol.iterator");
const RUNTIME_MODULE_NAME = "babel-runtime";
export var metadata = {

View File

@@ -1,14 +1,13 @@
import * as messages from "../../../messages";
import * as t from "../../../types";
export var metadata = {
group: "builtin-setup"
group: "builtin-pre"
};
const THIS_BREAK_KEYS = ["FunctionExpression", "FunctionDeclaration", "ClassExpression", "ClassDeclaration"];
export var Program = {
enter(program, parent, scope, file) {
enter(program) {
var first = program.body[0];
var directive;
@@ -24,7 +23,7 @@ export var Program = {
}
directive._blockHoist = Infinity;
}
}
};
export function ThisExpression() {
if (!this.findParent((node) => !node.shadow && THIS_BREAK_KEYS.indexOf(node.type) >= 0)) {

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