Compare commits

...

278 Commits

Author SHA1 Message Date
Sebastian McKenzie
27f039488e v5.5.8 2015-06-13 18:53:41 +01:00
Sebastian McKenzie
e3ce82e12f remove console.log 2015-06-13 18:50:51 +01:00
Sebastian McKenzie
4934ea56a0 change NodePath#inType to use arguments instead of types 2015-06-13 18:50:19 +01:00
Sebastian McKenzie
ce03457b19 add getOpposite path method 2015-06-13 18:50:05 +01:00
Sebastian McKenzie
1298c67949 rename getOwnBindingInfo to getOwnBinding 2015-06-13 18:49:59 +01:00
Sebastian McKenzie
668274edcb remove resolve-rc file 2015-06-13 18:49:37 +01:00
Sebastian McKenzie
0694a7dd06 5.5.7 2015-06-13 02:23:28 +01:00
Sebastian McKenzie
20d19735fc v5.5.7 2015-06-13 02:22:20 +01:00
Sebastian McKenzie
b5b6bf4ad5 add isDirective method, 2015-06-13 02:21:22 +01:00
Sebastian McKenzie
844c10cac0 fix reference to inferers 2015-06-13 02:20:04 +01:00
Sebastian McKenzie
43583e4e9d pick only current constant violation if it's of the same scope 2015-06-13 02:19:57 +01:00
Sebastian McKenzie
f5b921cda9 better errorWithNode that's consolidated across paths and files 2015-06-13 02:19:44 +01:00
Sebastian McKenzie
763892aa79 remove unused variable 2015-06-13 02:19:30 +01:00
Sebastian McKenzie
3e6eae4d1a Merge branch 'master' of github.com:babel/babel 2015-06-13 02:00:22 +01:00
Sebastian McKenzie
7c090c8580 Merge pull request #1740 from zertosh/cli-fixes
Really fix "--help"
2015-06-13 01:56:58 +01:00
Andres Suarez
a5f6c1c389 Really fix "--help" 2015-06-12 20:54:53 -04:00
Sebastian McKenzie
c159f2d982 Merge branch 'master' of github.com:babel/babel 2015-06-13 01:54:33 +01:00
Sebastian McKenzie
9205f10244 Merge pull request #1719 from jmm/internals-docs2
Internals documentation
2015-06-13 01:53:04 +01:00
Sebastian McKenzie
4cd7bcad59 Merge pull request #1727 from zertosh/cli-fixes
Fix "--help" distinguish optional transforms
2015-06-13 01:52:46 +01:00
Andres Suarez
7e9660efd3 Fix "--help" distinguish optional transforms 2015-06-12 20:51:52 -04:00
Sebastian McKenzie
2d66ce5224 Merge pull request #1724 from arthurvr/bool
Update `util.booleanify()` return type
2015-06-13 01:48:30 +01:00
Sebastian McKenzie
1257b2cf40 Merge pull request #1736 from grncdr/patch-1
Remove duplicate keys from alias-keys.json
2015-06-12 20:33:54 +01:00
Stephen Sugden
f21d935de5 Add aliases from JSX* tags to Expression 2015-06-12 12:24:24 -07:00
Stephen Sugden
2e20364793 Remove duplicate keys from alias-keys.json
Fixes #1734
2015-06-12 20:58:41 +02:00
Sebastian McKenzie
e47e8a187a Merge branch 'master' of github.com:babel/babel 2015-06-11 19:06:41 +01:00
Ingvar Stepanyan
26924d5944 Fix dependency reference of Symbol.hasInstance 2015-06-10 22:07:40 +03:00
Arthur Verschaeve
5eb1850a55 Update util.booleanify() return type
Ref 62f37c1e62
2015-06-10 16:54:43 +02:00
Sebastian McKenzie
333e287226 remove special minification.removeConsole ExpressionStatement handling 2015-06-10 13:14:44 +01:00
Sebastian McKenzie
80a77bd6a2 fix linting error 2015-06-10 03:16:07 +01:00
Sebastian McKenzie
c9286a1de1 rewrite option handling - fixes #1636 2015-06-10 03:07:06 +01:00
Sebastian McKenzie
52f614dcdf add better path execution status algo 2015-06-10 01:36:36 +01:00
Sebastian McKenzie
600367ae25 add t.COMPARISON_BINARY_OPERATORS 2015-06-10 01:34:51 +01:00
Sebastian McKenzie
b761cba135 split auxiliary comment option into before and after - fixes #1721 2015-06-10 01:34:44 +01:00
Sebastian McKenzie
947d3e262d push newline after decorator when doing code gen - fixes #1713 2015-06-10 01:19:58 +01:00
Sebastian McKenzie
4061bea528 change execution order of module metadata visitor to resolve module source before building up metadata tree - fixes #1720 2015-06-10 01:15:11 +01:00
Sebastian McKenzie
de195e5bfc Merge branch 'master' of github.com:babel/babel 2015-06-10 01:10:41 +01:00
Sebastian McKenzie
3bcef86973 Merge pull request #1720 from chadhietala/failing-metadata-test
Metadata object does not take in account resolveModuleSource()
2015-06-10 01:10:09 +01:00
Sebastian McKenzie
fa670ac71e visually split up inference inferer methods 2015-06-09 22:52:21 +01:00
Sebastian McKenzie
572261f9ce add support for typecasts in path static evaluation 2015-06-09 22:52:00 +01:00
Chad Hietala
8a320d53a5 Metadata object does not take in account resolveModuleSource()
This adds a failing test to illustrate the metadata object not reflecting what is returned from resolveModuleSource(). I might also not understand resolveModuleSource's purpose. However, this was the hook mentioned here https://github.com/babel/babel/issues/1602.
2015-06-09 14:26:33 -07:00
Jesse McCarthy
0650eedeb6 Add reference to doc dir to CONTRIBUTING. 2015-06-09 15:37:01 -04:00
Jesse McCarthy
2282d066a2 Start doc dir for internals documentation. 2015-06-09 15:37:01 -04:00
Sebastian McKenzie
f4d7cc55c1 split inference logic into separate folder 2015-06-09 14:02:57 +01:00
Sebastian McKenzie
eaaa279aa5 add let binding collision todo 2015-06-09 04:08:44 +01:00
Sebastian McKenzie
0595e06e29 5.5.6 2015-06-09 04:08:36 +01:00
Sebastian McKenzie
9b27a170ae v5.5.6 2015-06-09 04:07:15 +01:00
Sebastian McKenzie
1db232da9e add 5.5.6 changelog 2015-06-09 04:06:06 +01:00
Sebastian McKenzie
4cc844f410 take into consideration assignment expressions in loop heads when replacing let references - fixes #1707 2015-06-09 04:04:14 +01:00
Sebastian McKenzie
024ae670cb fix traceur test blacklist 2015-06-09 03:48:22 +01:00
Sebastian McKenzie
429edda9c0 ignore StringIterator traceur test 2015-06-09 03:40:08 +01:00
Sebastian McKenzie
05b13b9ea3 fix mistyped parameter name of t.createTypeAnnotationBasedOnTypeof 2015-06-09 03:26:40 +01:00
Sebastian McKenzie
b7320ce400 add t.createTypeAnnotationBasedOnTypeof method 2015-06-09 03:23:28 +01:00
Sebastian McKenzie
0c37b7b973 add typeof conditional inference 2015-06-09 03:20:32 +01:00
Sebastian McKenzie
bb36dbd8d9 update to latest traceur and enable now passing tests 2015-06-09 03:20:02 +01:00
Sebastian McKenzie
2dd8c40618 heavily simplify constants transformer 2015-06-09 00:31:18 +01:00
Sebastian McKenzie
33128b0ccf remove unused declaration 2015-06-08 23:59:53 +01:00
Sebastian McKenzie
cf25424295 fix duplicate declaration 2015-06-08 23:49:00 +01:00
Sebastian McKenzie
7492074794 infer types of bindings inside of conditionals based on usage 2015-06-08 23:43:46 +01:00
Sebastian McKenzie
c4a491123e disallow line terminator after async contextual keyword - fixes #1711 2015-06-08 21:25:16 +01:00
Sebastian McKenzie
55ad88fe4e don't override types parameter 2015-06-08 14:59:19 +01:00
Sebastian McKenzie
7170dbced8 Merge branch 'master' of github.com:babel/babel 2015-06-08 14:53:54 +01:00
Sebastian McKenzie
b0971412a2 add inference for null, remove any type parameter from inferred arrays, add todo comment 2015-06-08 14:52:35 +01:00
Sebastian McKenzie
a6b374a681 save union type in _getTypeAnnotationBindingConstantViolations to prevent infinite recursion 2015-06-08 14:52:13 +01:00
Sebastian McKenzie
2d0355b3b9 merge previous bindings constantViolations and path onto new bindings constantViolations 2015-06-08 14:49:09 +01:00
Sebastian McKenzie
7fade101be move down module TypeAlias check 2015-06-08 14:47:58 +01:00
Sebastian McKenzie
0918da8569 Merge pull request #1708 from hawkrives/patch-2
Update README.md for the Slack channel
2015-06-08 12:35:08 +01:00
Hawken Rives
917db622c4 Update README.md
Switch out the gitter link for slack.
2015-06-08 20:33:09 +09:00
Sebastian McKenzie
f7ee6fbd20 move travis notifications from gitter to slack 2015-06-08 12:20:38 +01:00
Sebastian McKenzie
5899e9a0be don't consider type aliases to be a default declaration - fixes #1705 2015-06-08 12:20:30 +01:00
Sebastian McKenzie
d41cb11545 fix registerDeclaration for FlowDeclarations 2015-06-08 01:46:05 +01:00
Sebastian McKenzie
3ad909a4ae add 5.5.5 changelog 2015-06-08 01:45:56 +01:00
Sebastian McKenzie
4bafdf733c 5.5.5 2015-06-08 01:29:54 +01:00
Sebastian McKenzie
b825998c63 v5.5.5 2015-06-08 01:27:46 +01:00
Sebastian McKenzie
6b02ca47c3 add missing semicolon 2015-06-08 01:27:02 +01:00
Sebastian McKenzie
ea1b85bffa fix bug where templates were getting polluted with old traversal paths 2015-06-08 01:25:51 +01:00
Sebastian McKenzie
3cffe47eea fix NodePath#isGenericType method name 2015-06-08 01:00:01 +01:00
Sebastian McKenzie
e5d5a9fb27 remove unused variable 2015-06-08 00:33:41 +01:00
Sebastian McKenzie
ca97fa63a9 Merge branch 'master' of github.com:babel/babel 2015-06-08 00:30:05 +01:00
Sebastian McKenzie
f4cc27bc0e remove unused variable 2015-06-08 00:29:52 +01:00
Sebastian McKenzie
8cea575e2e change NodePath#findParent to only call callback with path instead of node 2015-06-08 00:29:46 +01:00
Sebastian McKenzie
c91baee4d5 add support for flow declarations in scope tracking 2015-06-08 00:04:17 +01:00
Sebastian McKenzie
8055ce29f7 add support for flow declarations in scope tracking 2015-06-07 23:57:19 +01:00
Sebastian McKenzie
4596ae48b8 remove acorn jsx tests as the jsx parser is no longer embedded 2015-06-07 23:57:11 +01:00
Sebastian McKenzie
6c268cdf21 split out path comment methods into a separate file 2015-06-07 23:49:29 +01:00
Sebastian McKenzie
fce977f1d7 update TraversalContext#shouldVisit to check for existence of visitor keys 2015-06-07 23:38:39 +01:00
Sebastian McKenzie
a298075949 check for loc value on comments before attempting to adjust it 2015-06-07 23:37:47 +01:00
Sebastian McKenzie
66599c3779 use scope paths hub instead of manually passing the hub to the scope 2015-06-07 23:37:33 +01:00
Sebastian McKenzie
60340244b1 when constructing a NodePath, inherit parent paths hub if one wasn't passed to us 2015-06-07 23:36:32 +01:00
Sebastian McKenzie
eb72ea3e5a rename path verification methods to introspection and add NodePath#getSource method 2015-06-07 23:36:12 +01:00
Sebastian McKenzie
ede6237b6f add NodePath#addComment method 2015-06-07 23:35:46 +01:00
Sebastian McKenzie
e91e10aae6 add FlowStatement and FlowDeclaration alias keys 2015-06-07 23:35:35 +01:00
Sebastian McKenzie
9c3cca0d25 rename NodePath#isTypeAnnotationGeneric to isTypeAnnotation 2015-06-07 23:35:09 +01:00
Sebastian McKenzie
8eee5367f3 add Noop node 2015-06-07 23:34:35 +01:00
Sebastian McKenzie
40d55a3d44 update makefile browser build filename 2015-06-07 20:24:21 +01:00
Sebastian McKenzie
75330304dc fix linting errors 2015-06-07 20:04:30 +01:00
Sebastian McKenzie
776c508418 add node build to Makefile 2015-06-07 19:41:28 +01:00
Sebastian McKenzie
e804741632 add module metadata - closes #1601 2015-06-07 19:41:20 +01:00
Sebastian McKenzie
3d3cb4be4f completely rework type inferrence, support coercing to union types and be more reliable in the inferrence and always be cautious 2015-06-07 19:39:53 +01:00
Sebastian McKenzie
64f4209119 recurse into type casts when trying to get it's expression - fixes #facebook/react-native#1526 2015-06-07 02:45:06 +01:00
Sebastian McKenzie
2ede226ef9 remove unused variables 2015-06-06 16:35:28 +01:00
Sebastian McKenzie
f5cf641c0a add support for async generators to type inferrence 2015-06-06 16:17:55 +01:00
Sebastian McKenzie
1abd3419f6 simplify NodePath.getScope 2015-06-06 16:17:43 +01:00
Sebastian McKenzie
75699db716 clean up options normalisation and add more comments 2015-06-06 16:17:30 +01:00
Sebastian McKenzie
7c3572f08c fix linting errors 2015-06-06 03:38:12 +01:00
Sebastian McKenzie
9dacde6d07 further implement the concept of a "Hub" that all traversal paths get access to, also add in some assertions to confirm path state when performing manipulation 2015-06-06 03:34:08 +01:00
Sebastian McKenzie
8c3aab9a26 add support for async functions to type inferrence 2015-06-06 03:33:32 +01:00
Sebastian McKenzie
ba4550c953 switch some node-parent based stuff to path-based 2015-06-06 03:33:22 +01:00
Sebastian McKenzie
d0ac65a934 add _paths in t.inherits 2015-06-06 03:32:35 +01:00
Sebastian McKenzie
a4c70bb029 this commit makes the following changes to the way paths are handled:
- store paths on parents instead of containers
 - implement one central hub that all traversal paths and scopes get access to in order to abstract out access to common functions
2015-06-06 03:32:22 +01:00
Sebastian McKenzie
795cf0c0b1 add ignore/only tests to ensure #1693 never happens again 2015-06-05 23:11:10 +01:00
Sebastian McKenzie
e64b90e322 5.5.4 2015-06-05 23:07:27 +01:00
Sebastian McKenzie
d69b0973e1 v5.5.4 2015-06-05 23:03:55 +01:00
Sebastian McKenzie
6296f49653 update minification.constantFolding transformer to deopt bindings that are reassigned in a different function scope 2015-06-05 23:01:31 +01:00
Sebastian McKenzie
9f2b739046 improve Scope#dump to print binding info 2015-06-05 23:00:50 +01:00
Sebastian McKenzie
da1d5e5577 simplify unary resolution and move operators to types 2015-06-05 23:00:06 +01:00
Sebastian McKenzie
7333b4e392 move staticPropBody class concat to after className check in es6.classes transformer 2015-06-05 22:44:03 +01:00
Sebastian McKenzie
b0442d0784 add back shouldIgnore check that went missing around 32f19aff99 - closes #1696, fixes #1693 2015-06-05 22:43:32 +01:00
Sebastian McKenzie
295e69f8f8 fix auxiliaryComment option name for istanbul interop - fixes #1695 2015-06-05 22:40:28 +01:00
Sebastian McKenzie
cfe844fa39 add boolean type to experimental option 2015-06-05 22:36:16 +01:00
Sebastian McKenzie
0f4ea2d2a6 use file.log.deprecate instead of throwing an error - fixes #1694 2015-06-05 22:35:46 +01:00
Sebastian McKenzie
4b85b05839 use actual parameter reference for non-last default parameters - fixes #1690 2015-06-05 14:08:18 +01:00
Sebastian McKenzie
2539d08dce 5.5.3 2015-06-05 14:07:34 +01:00
Sebastian McKenzie
c26fd7a819 fix regenerator version 2015-06-05 14:07:27 +01:00
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
203 changed files with 4619 additions and 6248 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

@@ -11,9 +11,4 @@ before_script: "npm install -g codeclimate-test-reporter"
script: "make test-travis"
notifications:
webhooks:
urls:
- https://webhooks.gitter.im/e/acf1870e9d223c65e8d5
on_success: always
on_failure: always
on_start: false
slack: babeljs:5Wy4QX13KVkGy9CnU0rmvgeK

View File

@@ -13,6 +13,65 @@ _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.6
* **Bug Fix**
* Fix `let` binding collision in loop head not properly replacing `AssignmentExpression`s.
## 5.5.5
* **Bug Fix**
* Fix `file.opts` not being set before `file.log.deprecate` was called causing a `ReferenceError` as it was checking for a property on it.
## 5.5.4
* **Bug Fix**
* Add back missing `shouldIgnore` check.
* Log message on deprecated options rather than throw an error.
* Fix name of `auxiliaryComment` option when attempting Istanbul interop in `babel/register`.
## 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**

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>
|
@@ -8,6 +12,8 @@
<strong><a href="#dependencies">Dependencies</a></strong>
|
<strong><a href="#code-standards">Code Standards</a></strong>
|
<strong><a href="#internals">Internals</a></strong>
</p>
----
@@ -21,6 +27,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 +88,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.
@@ -167,3 +175,6 @@ your [`$PATH`](http://unix.stackexchange.com/questions/26047/how-to-correctly-ad
* **Declaration**
* No unused variables
* No pollution of global variables and prototypes
#### Internals
Please see [`/doc`](/doc) for internals documentation relevant to developing babel.

View File

@@ -5,6 +5,7 @@ UGLIFY_CMD = node_modules/uglify-js/bin/uglifyjs
#UGLIFY_CMD = node_modules/uglify-js/bin/uglifyjs --mangle sort
MOCHA_CMD = node_modules/mocha/bin/_mocha
BABEL_CMD = node_modules/babel/bin/babel
BROWSERIFY_IGNORE = -i esprima-fb
export NODE_ENV = test
@@ -22,6 +23,9 @@ watch-core: clean-core
clean-core:
rm -rf lib
lint:
eslint src/babel
build:
mkdir -p dist
make build-core
@@ -31,8 +35,10 @@ build:
node $(BROWSERIFY_CMD) -e lib/babel/polyfill.js >dist/polyfill.js
node $(UGLIFY_CMD) dist/polyfill.js >dist/polyfill.min.js
node $(BROWSERIFY_CMD) lib/babel/api/browser.js -s babel >dist/babel.js
node $(UGLIFY_CMD) dist/babel.js >dist/babel.min.js
node $(BROWSERIFY_CMD) lib/babel/api/browser.js -s babel $(BROWSERIFY_IGNORE) >dist/browser.js
node $(UGLIFY_CMD) dist/browser.js >dist/browser.min.js
node $(BROWSERIFY_CMD) lib/babel/api/node.js --node $(BROWSERIFY_IGNORE) >dist/node.js
node packages/babel-cli/bin/babel-external-helpers >dist/external-helpers.js
node $(UGLIFY_CMD) dist/external-helpers.js >dist/external-helpers.min.js
@@ -61,7 +67,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 +79,7 @@ test-browser:
test -n "`which open`" && open test/browser.html
publish:
publish: lint
git pull --rebase
make test
@@ -83,8 +89,8 @@ publish:
make build
cp dist/babel.js browser.js
cp dist/babel.min.js browser.min.js
cp dist/browser.js browser.js
cp dist/browser.min.js browser.min.js
cp dist/polyfill.js browser-polyfill.js
cp dist/polyfill.min.js browser-polyfill.min.js

View File

@@ -9,7 +9,11 @@
</p>
<p align="center">
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.
For questions and support please visit the <a href="https://babel-slack.herokuapp.com">slack channel</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">

4
doc/index.md Normal file
View File

@@ -0,0 +1,4 @@
This is a collection of documentation about babel internals, for use in development of babel.
# [Properties of nodes](/doc/node-props.md)
These are properties babel stores in AST node objects for internal use, as opposed to properties that are part of the AST spec (ESTree at the time of this writing).

11
doc/node-props.md Normal file
View File

@@ -0,0 +1,11 @@
# Properties of nodes
These are properties babel stores in AST node objects for internal use, as opposed to properties that are part of the AST spec (ESTree at the time of this writing).
## `_blockHoist`
`node._blockHoist != null` triggers the [block-hoist transformer](/src/babel/transformation/transformers/internal/block-hoist.js). Value should be `true` or an integer in the range `0..3`. `true` is equivalent to `2`. The value indicates whether the node should be hoisted and to what degree. See the source code for more detailed information.
## `_paths`
Stores a representation of a node's position in the tree and relationship to other nodes.
## `shadow`
A truthy value on a function node triggers the [shadow-functions transformer](/src/babel/transformation/transformers/internal/shadow-functions.js), which transforms the node so that it references (or inherits) `arguments` and `this` from the parent scope. It is invoked for arrow functions, for example.

View File

@@ -1,7 +1,7 @@
{
"name": "babel-core",
"description": "A compiler for writing next generation JavaScript",
"version": "5.4.7",
"version": "5.5.8",
"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

@@ -35,7 +35,7 @@ each(options, function (option, key) {
if (option.description) desc.push(option.description);
commander.option(arg, desc.join(" "));
})
});
commander.option("-x, --extensions [extensions]", "List of extensions to compile when a directory has been input [.es6,.js,.es,.jsx]");
commander.option("-w, --watch", "Recompile files on changes");
@@ -51,7 +51,7 @@ commander.on("--help", function () {
each(keys(obj).sort(), function (key) {
if (key[0] === "_") return;
if (obj[key].optional) key = "[" + key + "]";
if (obj[key].metadata && obj[key].metadata.optional) key = "[" + key + "]";
console.log(" - " + key);
});
@@ -118,11 +118,16 @@ if (errors.length) {
var opts = exports.opts = {};
each(options, function (opt, key) {
opts[key] = commander[key];
if (commander[key] !== undefined) {
opts[key] = commander[key];
}
});
opts.ignore = util.arrayify(opts.ignore, util.regexify);
opts.only = util.arrayify(opts.only, util.regexify);
if (opts.only) {
opts.only = util.arrayify(opts.only, util.regexify);
}
var fn;

View File

@@ -1,14 +1,14 @@
{
"name": "babel",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "5.4.6",
"version": "5.5.7",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "babel/babel",
"preferGlobal": true,
"dependencies": {
"babel-core": "^5.4.6",
"babel-core": "^5.5.7",
"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.6",
"version": "5.5.7",
"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")
}
@@ -286,7 +292,7 @@ pp.parseExprAtom = function(refShorthandDefaultPos) {
//
if (this.options.features["es7.asyncFunctions"]) {
// async functions!
if (id.name === "async") {
if (id.name === "async" && !this.canInsertSemicolon()) {
// arrow functions
if (this.type === tt.parenL) {
let expr = this.parseParenAndDistinguishExpression(start, true, true)
@@ -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

@@ -9,6 +9,7 @@ var STATE_KEYS = [
"lastTokEnd",
"lineStart",
"startLoc",
"curLine",
"endLoc",
"start",
"pos",

View File

@@ -83,10 +83,13 @@ pp.parseStatement = function(declaration, topLevel) {
return starttype === tt._import ? this.parseImport(node) : this.parseExport(node)
case tt.name:
if (this.options.features["es7.asyncFunctions"] && this.value === "async" && this.lookahead().type === tt._function) {
this.next();
this.expect(tt._function);
return this.parseFunction(node, true, false, true);
if (this.options.features["es7.asyncFunctions"] && this.value === "async") {
var lookahead = this.lookahead();
if (lookahead.type === tt._function && !this.canInsertSemicolon.call(lookahead)) {
this.next();
this.expect(tt._function);
return this.parseFunction(node, true, false, true);
}
}
// If the statement does not start with a statement keyword or a
@@ -168,12 +171,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 +571,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

@@ -8,7 +8,7 @@ export { util, acorn, transform };
export { pipeline } from "../transformation";
export { canCompile } from "../util";
export { default as options } from "../transformation/file/options";
export { default as options } from "../transformation/file/options/config";
export { default as Transformer } from "../transformation/transformer";
export { default as TransformerPipeline } from "../transformation/transformer-pipeline";
export { default as traverse } from "../traversal";

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

@@ -1,12 +1,12 @@
import sourceMapSupport from "source-map-support";
import * as registerCache from "./cache";
import resolveRc from "../../tools/resolve-rc";
import resolveRc from "../../transformation/file/options/resolve-rc";
import extend from "lodash/object/extend";
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,9 +88,9 @@ 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 || []);
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, {
auxiliaryComment: "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) {
@@ -17,3 +17,7 @@ export function BlockStatement(node, print) {
this.rightBrace();
}
}
export function Noop() {
}

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,11 +69,12 @@ export function Super() {
export function Decorator(node, print) {
this.push("@");
print(node.expression);
print.plain(node.expression);
this.newline();
}
export function CallExpression(node, print) {
print(node.callee);
print.plain(node.callee);
this.push("(");
@@ -109,7 +110,7 @@ var buildYieldAwait = function (keyword) {
if (node.argument) {
this.push(" ");
print(node.argument);
print.plain(node.argument);
}
};
};
@@ -122,23 +123,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 {
@@ -151,7 +152,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");
@@ -164,7 +165,7 @@ export function MemberExpression(node, print) {
if (computed) {
this.push("[");
print(node.property);
print.plain(node.property);
this.push("]");
} else {
// 5..toFixed(2);
@@ -173,12 +174,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,8 +343,8 @@ class CodeGenerator {
}
//
if (comment.type === "Block" && this.format.indent.adjustMultilineComment) {
var offset = comment.loc.start.column;
if (comment.type === "CommentBlock" && this.format.indent.adjustMultilineComment) {
var offset = comment.loc && comment.loc.start.column;
if (offset) {
var newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g");
val = val.replace(newlineRegex, "\n");
@@ -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

@@ -7,8 +7,6 @@ export const MESSAGES = {
classesIllegalSuperCall: "Direct super call is illegal in non-constructor, use super.$1() instead",
classesIllegalConstructorKind: "Illegal kind for constructor method",
scopeDuplicateDeclaration: "Duplicate declaration $1",
undeclaredVariable: "Reference to undeclared variable $1",
undeclaredVariableSuggestion: "Reference to undeclared variable $1 - did you mean $2?",
settersInvalidParamLength: "Setters must have exactly one parameter",
settersNoRest: "Setters aren't allowed to have a rest",
noAssignmentsInForHead: "No assignments allowed in for-in/of head",
@@ -24,6 +22,10 @@ export const MESSAGES = {
illegalMethodName: "Illegal method name $1",
lostTrackNodePath: "We lost track of this nodes position, likely because the AST was directly manipulated",
undeclaredVariable: "Reference to undeclared variable $1",
undeclaredVariableType: "Referencing a type alias outside of a type annotation",
undeclaredVariableSuggestion: "Reference to undeclared variable $1 - did you mean $2?",
traverseNeedsParent: "Must pass a scope and parentPath unless traversing a Program/File got a $1 node",
traverseVerifyRootFunction: "You passed `traverse()` a function when it expected a visitor object, are you sure you didn't mean `{ enter: Function }`?",
traverseVerifyVisitorProperty: "You passed `traverse()` a visitor object with the property $1 that has the invalid property $2",

View File

@@ -17,6 +17,8 @@ var or = types.Type.or;
// .build("program")
// .field("program", def("Program"));
def("Noop");
def("AssignmentPattern")
.bases("Pattern")
.build("left", "right")

View File

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

View File

@@ -1,29 +1,27 @@
import { validateOption, normaliseOptions, config as optionsConfig } from "./options";
import convertSourceMap from "convert-source-map";
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 resolveRc from "./options/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";
import includes from "lodash/collection/includes";
import traverse from "../../traversal";
import Hub from "../../traversal/hub";
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";
@@ -38,15 +36,27 @@ export default class File {
this.declarations = {};
this.usedHelpers = {};
this.dynamicData = {};
this.metadata = {};
this.data = {};
this.metadata = {
modules: {
imports: [],
exports: {
exported: [],
specifiers: []
}
}
};
this.pipeline = pipeline;
this.log = new Logger(this, opts.filename || "unknown");
this.opts = this.normalizeOptions(opts);
this.ast = {};
this.normaliseOptions(opts);
this.buildTransformers();
this.hub = new Hub(this);
}
static helpers = [
@@ -88,19 +98,19 @@ export default class File {
static soloHelpers = [];
static options = require("./options");
static options = optionsConfig;
normalizeOptions(opts: Object) {
opts = assign({}, opts);
normaliseOptions(opts: Object) {
opts = this.opts = normaliseOptions(assign({}, opts));
// resolve babelrc
if (opts.filename) {
var rcFilename = opts.filename;
if (!isAbsolute(rcFilename)) rcFilename = path.join(process.cwd(), rcFilename);
opts = resolveRc(rcFilename, opts);
}
//
// check for unknown options
for (let key in opts) {
if (key[0] === "_") continue;
@@ -108,26 +118,30 @@ export default class File {
if (!option) this.log.error(`Unknown option: ${key}`, ReferenceError);
}
// merge in environment options
var envKey = process.env.BABEL_ENV || process.env.NODE_ENV || "development";
if (opts.env) merge(opts, opts.env[envKey]);
if (opts.env) merge(opts, normaliseOptions(opts.env[envKey]));
// normalise options
for (let key in File.options) {
let option = File.options[key];
var val = opts[key];
var val = opts[key];
// optional
if (!val && option.optional) continue;
// deprecated
if (val && option.deprecated) {
throw new Error("Deprecated option " + key + ": " + option.deprecated);
this.log.deprecate("Deprecated option " + key + ": " + option.deprecated);
}
if (val == null) {
val = clone(option.default);
}
// default
if (val == null) val = clone(option.default);
var optionParser = optionParsers[option.type];
if (optionParser) val = optionParser(key, val, this.pipeline);
// validate
if (val) val = validateOption(key, val, this.pipeline);
// aaliases
if (option.alias) {
opts[option.alias] = opts[option.alias] || val;
} else {
@@ -152,7 +166,10 @@ export default class File {
opts.basename = path.basename(opts.filename, path.extname(opts.filename));
opts.ignore = util.arrayify(opts.ignore, util.regexify);
opts.only = util.arrayify(opts.only, util.regexify);
if (opts.only) {
opts.only = util.arrayify(opts.only, util.regexify);
}
defaults(opts, {
moduleRoot: opts.sourceRoot
@@ -195,7 +212,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 +245,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 +285,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));
}
@@ -330,14 +346,24 @@ export default class File {
}
attachAuxiliaryComment(node: Object): Object {
var comment = this.opts.auxiliaryComment;
if (comment) {
var beforeComment = this.opts.auxiliaryCommentBefore;
if (beforeComment) {
node.leadingComments = node.leadingComments || [];
node.leadingComments.push({
type: "Line",
value: " " + comment
type: "CommentLine",
value: " " + beforeComment
});
}
var afterComment = this.opts.auxiliaryCommentAfter;
if (afterComment) {
node.trailingComments = node.trailingComments || [];
node.trailingComments.push({
type: "CommentLine",
value: " " + afterComment
});
}
return node;
}
@@ -348,8 +374,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 +414,15 @@ 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 && node.loc) {
var loc = node.loc.start;
err = new Error(`Line ${loc.line}: ${msg}`);
err.loc = loc;
} else {
// todo: find errors with nodes inside to at least point to something
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 +440,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;
}
@@ -467,7 +497,13 @@ export default class File {
}
_addAst(ast) {
this.path = TraversalPath.get(null, ast, ast, "program", this).setContext(null, this);
this.path = NodePath.get({
hub: this.hub,
parentPath: null,
parent: ast,
container: ast,
key: "program"
}).setContext();
this.scope = this.path.scope;
this.ast = ast;
}
@@ -483,12 +519,16 @@ export default class File {
modFormatter.init();
}
this.log.debug("End module formatter init");
}
transform() {
this.call("pre");
for (var pass of (this.transformerStack: Array)) {
pass.transform();
}
this.call("post");
return this.generate();
}
wrap(code, callback) {
@@ -496,18 +536,10 @@ export default class File {
try {
if (this.shouldIgnore()) {
return {
metadata: this.metadata,
ignored: true,
code: code,
map: null,
ast: null
};
return this.makeResult({ code, ignored: true });
} else {
return callback();
}
callback();
return this.generate();
} catch (err) {
if (err._babel) {
throw err;
@@ -536,15 +568,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() {
@@ -581,28 +613,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");
@@ -629,6 +670,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

@@ -1,27 +0,0 @@
import * as util from "../../util";
export function transformerList(key, val, pipeline) {
val = util.arrayify(val);
if (val.indexOf("all") >= 0 || val.indexOf(true) >= 0) {
val = Object.keys(pipeline.transformers);
}
return pipeline._ensureTransformerNames(key, val);
}
export function number(key, val) {
return +val;
}
export function boolean(key, val) {
return !!val;
}
export function booleanString(key, val) {
return util.booleanify(val);
}
export function list(key, val) {
return util.list(val);
}

View File

@@ -47,7 +47,9 @@
},
"experimental": {
"deprecated": "use `--stage 0`/`{ stage: 0 }` instead"
"type": "boolean",
"description": "allow use of experimental transformers",
"default": false
},
"highlightCode": {
@@ -76,7 +78,8 @@
"blacklist": {
"type": "transformerList",
"description": "blacklist of transformers to NOT use",
"shorthand": "b"
"shorthand": "b",
"default": []
},
"whitelist": {
@@ -88,7 +91,8 @@
"optional": {
"type": "transformerList",
"description": "list of optional transformers to enable"
"description": "list of optional transformers to enable",
"default": []
},
"modules": {
@@ -120,12 +124,14 @@
"plugins": {
"type": "list",
"description": ""
"description": "",
"default": []
},
"ignore": {
"type": "list",
"description": "list of glob paths to **not** compile"
"description": "list of glob paths to **not** compile",
"default": []
},
"only": {
@@ -139,6 +145,12 @@
"type": "boolean"
},
"metadata": {
"hidden": true,
"default": true,
"type": "boolean"
},
"ast": {
"hidden": true,
"default": true,
@@ -165,12 +177,23 @@
},
"auxiliaryComment": {
"deprecated": "renamed to auxiliaryCommentBefore",
"shorthand": "a",
"alias": "auxiliaryCommentBefore"
},
"auxiliaryCommentBefore": {
"type": "string",
"default": "",
"shorthand": "a",
"description": "attach a comment before all helper declarations and auxiliary code"
},
"auxiliaryCommentAfter": {
"type": "string",
"default": "",
"description": "attach a comment after all helper declarations and auxiliary code"
},
"externalHelpers": {
"type": "boolean",
"default": false,
@@ -179,6 +202,7 @@
},
"metadataUsedHelpers": {
"deprecated": "Not required anymore as this is enabled by default",
"type": "boolean",
"default": false,
"hidden": true

View File

@@ -0,0 +1,31 @@
import * as parsers from "./parsers";
import config from "./config";
export { config };
export function validateOption(key, val, pipeline) {
var opt = config[key];
var parser = opt && parsers[opt.type];
if (parser && parser.validate) {
return parser.validate(key, val, pipeline);
} else {
return val;
}
}
export function normaliseOptions(options = {}) {
for (var key in options) {
var val = options[key];
if (val == null) continue;
var opt = config[key];
if (!opt) continue;
var parser = parsers[opt.type];
if (parser) val = parser(val);
options[key] = val;
}
return options;
}

View File

@@ -0,0 +1,29 @@
import * as util from "../../../util";
export function transformerList(val) {
return util.arrayify(val);
}
transformerList.validate = function (key, val, pipeline) {
if (val.indexOf("all") >= 0 || val.indexOf(true) >= 0) {
val = Object.keys(pipeline.transformers);
}
return pipeline._ensureTransformerNames(key, val);
};
export function number(val) {
return +val;
}
export function boolean(val) {
return !!val;
}
export function booleanString(val) {
return util.booleanify(val);
}
export function list(val) {
return util.list(val);
}

View File

@@ -1,5 +1,6 @@
import stripJsonComments from "strip-json-comments";
import merge from "../helpers/merge";
import { normaliseOptions } from "./index";
import merge from "../../../helpers/merge";
import path from "path";
import fs from "fs";
@@ -34,6 +35,7 @@ export default function (loc, opts = {}) {
try {
json = jsons[content] = jsons[content] || JSON.parse(stripJsonComments(content));
normaliseOptions(json);
} catch (err) {
err.message = `${file}: ${err.message}`;
throw err;
@@ -42,6 +44,7 @@ export default function (loc, opts = {}) {
opts.babelrc.push(file);
if (json.breakConfig) return;
merge(opts, json);
}
@@ -56,4 +59,4 @@ export default function (loc, opts = {}) {
}
return opts;
};
}

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

@@ -3,7 +3,10 @@ import * as t from "../../types";
export default function (node) {
var lastNonDefault = 0;
for (var i = 0; i < node.params.length; i++) {
if (!t.isAssignmentPattern(node.params[i])) lastNonDefault = i + 1;
var param = node.params[i];
if (!t.isAssignmentPattern(param) && !t.isRestElement(param)) {
lastNonDefault = i + 1;
}
}
return lastNonDefault;
};
}

View File

@@ -2,19 +2,29 @@ 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);
}
}
};
@@ -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) {
@@ -60,7 +71,7 @@ var visit = function (node, name, scope) {
// check to see if we have a local binding of the id we're setting inside of
// the function, this is important as there are caveats associated
var bindingInfo = scope.getOwnBindingInfo(name);
var bindingInfo = scope.getOwnBinding(name);
if (bindingInfo) {
if (bindingInfo.kind === "param") {

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,35 +1,37 @@
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);
}
}
};
export default function (node, callId, scope) {
export default function (path, callId) {
var node = path.node;
node.async = false;
node.generator = true;
scope.traverse(node, awaitVisitor, state);
path.traverse(awaitVisitor, state);
var call = t.callExpression(callId, [node]);
@@ -44,15 +46,15 @@ export default function (node, callId, scope) {
return declar;
} else {
if (id) {
var state = { id: id };
scope.traverse(node, referenceVisitor, state);
var state = { id };
path.traverse(referenceVisitor, state);
if (state.ref) {
scope.parent.push({ id: state.ref });
path.scope.parent.push({ id: state.ref });
return t.assignmentExpression("=", state.ref, call);
}
}
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,158 @@ var remapVisitor = {
}
};
var importsVisitor = {
var metadataVisitor = {
ModuleDeclaration: {
enter(node, parent, scope, formatter) {
if (node.source) {
node.source.value = formatter.file.resolveModuleSource(node.source.value);
}
}
},
ImportDeclaration: {
enter(node, parent, scope, formatter) {
exit(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
extend(formatter.localImports, this.getBindingIdentifiers());
}
}
};
var exportsVisitor = {
ExportDeclaration: {
enter(node, parent, scope, formatter) {
formatter.hasLocalExports = true;
var specifiers = [];
var imported = [];
formatter.metadata.imports.push({
source: node.source.value,
imported,
specifiers
});
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);
for (var specifier of (this.get("specifiers"): Array)) {
var ids = specifier.getBindingIdentifiers();
extend(formatter.localImports, ids);
var local = specifier.node.local.name;
if (specifier.isImportDefaultSpecifier()) {
imported.push("default");
specifiers.push({
kind: "named",
imported: "default",
local
});
}
}
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 (specifier.isImportSpecifier()) {
var importedName = specifier.node.imported.name;
imported.push(importedName);
specifiers.push({
kind: "named",
imported: importedName,
local
});
}
}
if (!t.isExportDefaultDeclaration(node)) {
var onlyDefault = node.specifiers && node.specifiers.length === 1 && t.isSpecifierDefault(node.specifiers[0]);
if (!onlyDefault) {
formatter.hasNonDefaultExports = true;
if (specifier.isImportNamespaceSpecifier()) {
imported.push("*");
specifiers.push({
kind: "namespace",
local
});
}
}
}
},
ExportDeclaration(node, parent, scope, formatter) {
formatter.hasLocalExports = true;
var source = node.source ? node.source.value : null;
var exports = formatter.metadata.exports;
// export function foo() {}
// export var foo = "bar";
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);
exports.exported.push(name);
exports.specifiers.push({
kind: "local",
local: name,
exported: this.isExportDefaultDeclaration() ? "default" : name
});
}
}
if (this.isExportNamedDeclaration() && node.specifiers) {
for (var specifier of (node.specifiers: Array)) {
var exported = specifier.exported.name;
exports.exported.push(exported);
// export foo from "bar";
if (t.isExportDefaultSpecifier(specifier)) {
exports.specifiers.push({
kind: "external",
local: exported,
exported,
source
});
}
// export * as foo from "bar";
if (t.isExportNamespaceSpecifier(specifier)) {
exports.specifiers.push({
kind: "external-namespace",
exported,
source
});
}
var local = specifier.local;
if (!local) continue;
formatter._addExport(local.name, specifier.exported);
// export { foo } from "bar";
// export { foo as bar } from "bar";
if (source) {
exports.specifiers.push({
kind: "external",
local: local.name,
exported,
source
});
}
// export { foo };
// export { foo as bar };
if (!source) {
exports.specifiers.push({
kind: "local",
local: local.name,
exported
});
}
}
}
// export * from "bar";
if (this.isExportAllDeclaration()) {
exports.specifiers.push({
kind: "external-all",
source
});
}
if (!t.isExportDefaultDeclaration(node) && !declar.isTypeAlias()) {
var onlyDefault = node.specifiers && node.specifiers.length === 1 && t.isSpecifierDefault(node.specifiers[0]);
if (!onlyDefault) {
formatter.hasNonDefaultExports = true;
}
}
},
Scope() {
this.skip();
}
};
@@ -128,8 +239,8 @@ export default class DefaultFormatter {
this.localExports = object();
this.localImports = object();
this.getLocalExports();
this.getLocalImports();
this.metadata = file.metadata.modules;
this.getMetadata();
}
isModuleType(node, type) {
@@ -145,12 +256,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

@@ -0,0 +1 @@
if (VARIABLE_NAME === undefined) VARIABLE_NAME = DEFAULT_VALUE;

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";
@@ -113,6 +116,13 @@ function traverseReplace(node, parent, scope, remaps) {
replace(node, parent, scope, remaps);
}
if (t.isAssignmentExpression(node)) {
var ids = t.getBindingIdentifiers(node);
for (var name in ids) {
replace(ids[name], parent, scope, remaps);
}
}
scope.traverse(node, replaceVisitor, remaps);
}
@@ -258,7 +268,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;
@@ -327,6 +337,7 @@ class BlockScoping {
// this is the defining identifier of a declaration
var ref = letRefs[key];
// todo: could skip this if the colliding binding is in another function
if (scope.parentHasBinding(key) || scope.hasGlobal(key)) {
var uid = scope.generateUidIdentifier(ref.name).name;
ref.name = uid;
@@ -597,7 +608,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;
@@ -219,6 +200,8 @@ class ClassTransformer {
}
}
body = body.concat(this.staticPropBody);
if (this.className) {
// named class with only a constructor
if (body.length === 1) return t.toExpression(body[0]);
@@ -233,8 +216,6 @@ class ClassTransformer {
t.inheritsComments(body[0], this.node);
}
body = body.concat(this.staticPropBody);
//
body.push(t.returnStatement(classRef));
@@ -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,31 +1,18 @@
import * as messages from "../../../messages";
import * as t from "../../../types";
export function AssignmentExpression(node, parent, scope, file) {
var ids = this.getBindingIdentifiers();
for (var name in ids) {
var id = ids[name];
var binding = scope.getBinding(name);
// no binding exists
if (!binding) continue;
export function Scope(node, parent, scope) {
for (var name in scope.bindings) {
var binding = scope.bindings[name];
// not a constant
if (binding.kind !== "const" && binding.kind !== "module") continue;
// check if the assignment id matches the constant declaration id
// if it does then it was the id used to initially declare the
// constant so we can just ignore it
if (binding.identifier === id) continue;
throw file.errorWithNode(id, messages.get("readOnly", name));
for (var violation of (binding.constantViolations: Array)) {
throw violation.errorWithNode(messages.get("readOnly", name));
}
}
}
export { AssignmentExpression as UpdateExpression };
export function VariableDeclaration(node) {
if (node.kind === "const") node.kind = "let";
}

View File

@@ -56,15 +56,22 @@ export function ForOfStatement(node, parent, scope, file) {
export { ForOfStatement as ForInStatement };
export function Func/*tion*/(node, parent, scope, file) {
var hasDestructuring = false;
for (let pattern of (node.params: Array)) {
if (t.isPattern(pattern)) {
hasDestructuring = true;
break;
}
}
if (!hasDestructuring) return;
var nodes = [];
var hasDestructuring = false;
for (var i = 0; i < node.params.length; i++) {
let pattern = node.params[i];
if (!t.isPattern(pattern)) continue;
node.params = node.params.map(function (pattern, i) {
if (!t.isPattern(pattern)) return pattern;
hasDestructuring = true;
var ref = scope.generateUidIdentifier("ref");
var ref = node.params[i] = scope.generateUidIdentifier("ref");
t.inherits(ref, pattern);
var destructuring = new DestructuringTransformer({
@@ -74,12 +81,9 @@ export function Func/*tion*/(node, parent, scope, file) {
file: file,
kind: "let"
});
destructuring.init(pattern, ref);
return ref;
});
if (!hasDestructuring) return;
}
t.ensureBlock(node);
@@ -107,30 +111,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 +123,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 +155,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 = [];
@@ -225,8 +220,8 @@ function hasRest(pattern) {
}
var arrayUnpackVisitor = {
enter(node, parent, scope, state) {
if (this.isReferencedIdentifier() && state.bindings[node.name]) {
ReferencedIdentifier(node, parent, scope, state) {
if (state.bindings[node.name]) {
state.deopt = true;
this.stop();
}
@@ -498,7 +493,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;
}
@@ -70,6 +70,10 @@ export function _ForOfStatementArray(node, scope, file) {
loop.body.body.unshift(t.expressionStatement(t.assignmentExpression("=", left, iterationValue)));
}
if (this.parentPath.isLabeledStatement()) {
loop = t.labeledStatement(this.parentPath.node.label, loop);
}
nodes.push(loop);
return nodes;

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,6 @@
import callDelegate from "../../helpers/call-delegate";
import getFunctionArity from "../../helpers/get-function-arity";
import * as util from "../../../util";
import traverse from "../../../traversal";
import * as t from "../../../types";
var hasDefaults = function (node) {
@@ -25,37 +25,54 @@ var iifeVisitor = {
export function Func/*tion*/(node, parent, scope, file) {
if (!hasDefaults(node)) return;
// ensure it's a block, useful for arrow functions
t.ensureBlock(node);
var state = {
iife: false,
scope: scope
};
var body = [];
//
var argsIdentifier = t.identifier("arguments");
argsIdentifier._shadowedFunctionLiteral = true;
var lastNonDefaultParam = 0;
var state = { iife: false, scope: scope };
var pushDefNode = function (left, right, i) {
var defNode = util.template("default-parameter", {
VARIABLE_NAME: left,
DEFAULT_VALUE: right,
ARGUMENT_KEY: t.literal(i),
ARGUMENTS: argsIdentifier
}, true);
// push a default parameter definition
function pushDefNode(left, right, i) {
var defNode;
if (exceedsLastNonDefault(i) || t.isPattern(left) || file.transformers["es6.spec.blockScoping"].canTransform()) {
defNode = util.template("default-parameter", {
VARIABLE_NAME: left,
DEFAULT_VALUE: right,
ARGUMENT_KEY: t.literal(i),
ARGUMENTS: argsIdentifier
}, true);
} else {
defNode = util.template("default-parameter-assign", {
VARIABLE_NAME: left,
DEFAULT_VALUE: right
}, true);
}
defNode._blockHoist = node.params.length - i;
body.push(defNode);
};
}
// check if an index exceeds the functions arity
function exceedsLastNonDefault(i) {
return i + 1 > lastNonDefaultParam;
}
//
var lastNonDefaultParam = getFunctionArity(node);
//
var params = this.get("params");
for (var i = 0; i < params.length; i++) {
var param = params[i];
if (!param.isAssignmentPattern()) {
if (!param.isRestElement()) {
lastNonDefaultParam = i + 1;
}
if (!param.isIdentifier()) {
param.traverse(iifeVisitor, state);
}
@@ -70,9 +87,13 @@ export function Func/*tion*/(node, parent, scope, file) {
var left = param.get("left");
var right = param.get("right");
var placeholder = scope.generateUidIdentifier("x");
placeholder._isDefaultPlaceholder = true;
node.params[i] = placeholder;
if (exceedsLastNonDefault(i) || left.isPattern()) {
var placeholder = scope.generateUidIdentifier("x");
placeholder._isDefaultPlaceholder = true;
node.params[i] = placeholder;
} else {
node.params[i] = left.node;
}
if (!state.iife) {
if (right.isIdentifier() && scope.hasOwnBinding(right.node.name)) {

View File

@@ -1,13 +1,21 @@
import isNumber from "lodash/lang/isNumber";
import * as util from "../../../util";
import * as t from "../../../types";
var memberExpressionOptimisationVisitor = {
enter(node, parent, scope, state) {
Scope(node, parent, scope, state) {
// check if this scope has a local binding that will shadow the rest parameter
if (this.isScope() && !scope.bindingIdentifierEquals(state.name, state.outerBinding)) {
return this.skip();
if (!scope.bindingIdentifierEquals(state.name, state.outerBinding)) {
this.skip();
}
},
enter(node, parent, scope, state) {
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
@@ -24,19 +32,20 @@ var memberExpressionOptimisationVisitor = {
if (!state.noOptimise && t.isMemberExpression(parent) && parent.computed) {
// if we know that this member expression is referencing a number then we can safely
// optimise it
var prop = parent.property;
if (isNumber(prop.value) || t.isUnaryExpression(prop) || t.isBinaryExpression(prop)) {
var prop = this.parentPath.get("property");
if (prop.isBaseType("number")) {
state.candidates.push(this);
return;
}
}
state.canOptimise = false;
this.stop();
stop();
}
};
function optimizeMemberExpression(parent, offset) {
if (offset === 0) return;
var newExpr;
var prop = parent.property;
@@ -90,8 +99,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,8 +1,7 @@
import includes from "lodash/collection/includes";
import * as t from "../../../types";
function getSpreadLiteral(spread, scope) {
if (scope.file.isLoose("es6.spread")) {
if (scope.hub.file.isLoose("es6.spread")) {
return spread.argument;
} else {
return scope.toArray(spread.argument, true);

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();
},
@@ -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,7 +202,7 @@ 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);
}
@@ -356,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.isBaseType("string") && !path.isBaseType("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

@@ -16,25 +16,15 @@ function getDeclar(node) {
}
export var metadata = {
group: "builtin-setup"
group: "builtin-pre"
};
export function ImportDeclaration(node, parent, scope, file) {
if (node.source) {
node.source.value = file.resolveModuleSource(node.source.value);
}
}
export { ImportDeclaration as ExportAllDeclaration };
export function ExportDefaultDeclaration(node, parent, scope) {
ImportDeclaration.apply(this, arguments);
var declar = node.declaration;
if (t.isClassDeclaration(declar)) {
// export default class Foo {};
var nodes = [getDeclar(node), node];
let nodes = [getDeclar(node), node];
node.declaration = declar.id;
return nodes;
} else if (t.isClassExpression(declar)) {
@@ -44,14 +34,14 @@ export function ExportDefaultDeclaration(node, parent, scope) {
t.variableDeclarator(temp, declar)
]);
var nodes = [getDeclar(node), node];
let nodes = [getDeclar(node), node];
node.declaration = temp;
return nodes;
} else if (t.isFunctionDeclaration(declar)) {
// export default function Foo() {}
node._blockHoist = 2;
var nodes = [getDeclar(node), node];
let nodes = [getDeclar(node), node];
node.declaration = declar.id;
return nodes;
}
@@ -62,14 +52,13 @@ function buildExportSpecifier(id) {
}
export function ExportNamedDeclaration(node, parent, scope) {
ImportDeclaration.apply(this, arguments);
var declar = node.declaration;
if (t.isClassDeclaration(declar)) {
// export class Foo {}
node.specifiers = [buildExportSpecifier(declar.id)];
var nodes = [getDeclar(node), node];
let nodes = [getDeclar(node), node];
node.declaration = null;
return nodes;
} else if (t.isFunctionDeclaration(declar)) {
@@ -77,7 +66,7 @@ export function ExportNamedDeclaration(node, parent, scope) {
node.specifiers = [buildExportSpecifier(declar.id)];
node._blockHoist = 2;
var nodes = [getDeclar(node), node];
let nodes = [getDeclar(node), node];
node.declaration = null;
return nodes;
} else if (t.isVariableDeclaration(declar)) {
@@ -94,7 +83,7 @@ export function ExportNamedDeclaration(node, parent, scope) {
export var Program = {
enter(node) {
var imports = [];
var rest = [];
var rest = [];
for (var i = 0; i < node.body.length; i++) {
var bodyNode = node.body[i];

View File

@@ -8,7 +8,7 @@ function remap(path, key, create) {
// ensure that we're shadowed
if (!path.inShadow()) return;
var fnPath = path.findParent((node, path) => !node.shadow && (path.isFunction() || path.isProgram()));
var fnPath = path.findParent((path) => !path.is("shadow") && (path.isFunction() || path.isProgram()));
var cached = fnPath.getData(key);
if (cached) return cached;

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,71 @@
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.hasDeoptValue) 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) {
// todo: deopt binding values for constant violations inside
return this.skip();
}
if (evaluated.value) {
this.skipKey("alternate");
} else {
this.skipKey("consequent");
}
}
export var Scopable = {
enter() {
var funcScope = this.scope.getFunctionParent();
for (var name in this.scope.bindings) {
var binding = this.scope.bindings[name];
var deopt = false;
for (var path of (binding.constantViolations: Array)) {
var funcViolationScope = path.scope.getFunctionParent();
if (funcViolationScope !== funcScope) {
deopt = true;
break;
}
}
if (deopt) binding.deoptValue();
}
},
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);
}
};

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