diff --git a/.babelignore b/.babelignore
deleted file mode 100644
index 6a9d08f7a6..0000000000
--- a/.babelignore
+++ /dev/null
@@ -1 +0,0 @@
-packages/babel-cli/src/babel-plugin/templates
diff --git a/.babelrc b/.babelrc
deleted file mode 100644
index 41671a95c3..0000000000
--- a/.babelrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "stage": 0,
- "loose": ["all"],
- "blacklist": ["es6.tailCall"],
- "optional": ["optimisation.flow.forOf", "bluebirdCoroutines"],
- "env": {
- "test": {
- "auxiliaryCommentBefore": "istanbul ignore next"
- }
- }
-}
diff --git a/.eslintignore b/.eslintignore
index 3c5446a100..5b21e5655b 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,2 +1,2 @@
-packages/babel/src/transformation/templates
+packages/babel-core/src/transformation/templates
scripts
diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index 8c566faa36..0000000000
--- a/.eslintrc
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "parser": "babel-eslint",
- "extends": "eslint:recommended",
- "rules": {
- "quotes": [2, "double", "avoid-escape"],
- "strict": 0,
- "no-underscore-dangle": 0,
- "curly": 0,
- "no-multi-spaces": 0,
- "key-spacing": 0,
- "no-return-assign": 0,
- "consistent-return": 0,
- "no-shadow": 0,
- "comma-dangle": 0,
- "no-use-before-define": 0,
- "no-empty": 0,
- "new-parens": 0,
- "no-cond-assign": 0,
- "no-fallthrough": 0,
- "new-cap": 0,
- "no-loop-func": 0,
- "no-unreachable": 0,
- "no-labels": 0,
- "no-process-exit": 0,
- "camelcase": 0,
- "no-console": 0
- },
- "env": {
- "node": true
- }
-}
diff --git a/.flowconfig b/.flowconfig
new file mode 100644
index 0000000000..f05ad7b95b
--- /dev/null
+++ b/.flowconfig
@@ -0,0 +1,14 @@
+[ignore]
+
+[include]
+
+[libs]
+lib/file.js
+lib/parser.js
+lib/types.js
+
+[options]
+strip_root=true
+
+[version]
+0.16.0
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index d5327c7e27..0000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "vendor/traceur"]
- path = vendor/traceur
- url = https://github.com/google/traceur-compiler
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e61b653434..06ecb69c8e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,12 +13,6 @@ _Note: Gaps between patch versions are faulty, broken or test releases._
See [CHANGELOG - 6to5](CHANGELOG-6to5.md) for the pre-4.0.0 version changelog.
-## 5.8.27
-
- * **Bug Fix**
- * Fix scope tracking of references before the declaration has been visited.
- * Correctly identify parameters as binding identifiers.
-
## 5.8.26
* **Internal**
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 93f933c7ac..65cb594656 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,4 +1,4 @@
-# NOTE: BEFORE OPENING AN ISSUE PLEASE SEE THE [README](https://github.com/babel/babel#readme).
+# NOTE: DO NOT OPEN ISSUES FOR QUESTIONS AND SUPPORT. SEE THE README FOR MORE INFO.
----
@@ -50,7 +50,7 @@ If you wish to build a copy of Babel for distribution then run:
$ make build-dist
```
-and access the files from `packages/babel/dist`.
+and access the files from `packages/babel-core/dist`.
#### Running tests
diff --git a/Makefile b/Makefile
index b966a86e5b..b8f022252d 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,9 @@ build: clean
./scripts/build.sh
build-dist: build
- cd packages/babel; \
+ cd packages/babel-core; \
+ scripts/build-dist.sh
+ cd packages/babel-polyfill; \
scripts/build-dist.sh
cd packages/babel-runtime; \
node scripts/build-dist.js
@@ -18,10 +20,10 @@ watch: clean
lint:
node node_modules/.bin/eslint packages/*/src
+ #flow check
clean: test-clean
rm -rf coverage
- rm -rf packages/*/lib packages/babel/templates.json
test-clean:
rm -rf packages/*/test/tmp
@@ -31,10 +33,6 @@ test: lint
./scripts/test.sh
make test-clean
-test-browser:
- ./scripts/test-browser.sh
- make test-clean
-
test-cov: clean
BABEL_ENV=test; \
make build
@@ -47,7 +45,7 @@ publish:
make test
node scripts/publish.js
make clean
- ./scripts/build-website.sh
+ #./scripts/build-website.sh
bootstrap:
npm install
diff --git a/README.md b/README.md
index f2017d87a5..edd97f9662 100644
--- a/README.md
+++ b/README.md
@@ -19,11 +19,13 @@
-----
+## Looking for support?
-
- For questions and support please visit the Slack community or StackOverflow . The Babel issue tracker is exclusively for bug reports and feature requests.
-
+For questions and support please visit the Slack community or StackOverflow .
+
+The Babel issue tracker is exclusively for bug reports and feature requests.
+
+## Want to report an issue with [babeljs.io](https://babeljs.io)?
For documentation and website issues please visit the babel.github.io repo.
diff --git a/VERSION b/VERSION
index 723ac17de3..cb372c07bf 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-5.8.33
\ No newline at end of file
+6.0.11
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/exports-default/untitled b/doc/api/node-path.md
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/exports-default/untitled
rename to doc/api/node-path.md
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/get-module-name-option/actual.js b/doc/api/scope.md
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/get-module-name-option/actual.js
rename to doc/api/scope.md
diff --git a/doc/design/compiler-assumptions.md b/doc/design/compiler-assumptions.md
new file mode 100644
index 0000000000..e4cf07e49d
--- /dev/null
+++ b/doc/design/compiler-assumptions.md
@@ -0,0 +1,9 @@
+# Compiler assumptions
+
+Babel and it's associated official transforms make some assumptions about your code. These
+assumptions are only made as they're either **impossible** to take into consideration or
+are extremely exotic.
+
+ - `undefined`, `NaN` and `Infinity` have not been externally redefined.
+ - Built-in objects such as `Object`, `Array`, `String`, `Number`, `Boolean` etc have not been redefined.
+ - Standard methods on built-ins have not been redefined in a way that breaks the original contract.
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/get-module-name-option/actual.js b/doc/design/compiler-guarantees.md
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/get-module-name-option/actual.js
rename to doc/design/compiler-guarantees.md
diff --git a/doc/design/monorepo.md b/doc/design/monorepo.md
new file mode 100644
index 0000000000..61c5de82e9
--- /dev/null
+++ b/doc/design/monorepo.md
@@ -0,0 +1,40 @@
+# Why is Babel a monorepo?
+
+Juggling a multimodule project over multiple repos is like trying to teach a newborn baby how to
+ride a bike.
+
+Babel follows a monorepo approach, all officially maintained modules are in the same repo.
+This is quite taboo but let's look at the pros and cons:
+
+**Pros:**
+
+ * Single lint, build, test and release process.
+ * Easy to coordinate changes across modules.
+ * Single place to report issues.
+ * Easier to setup a development environment.
+ * Tests across modules are ran together which finds bugs that touch multiple modules easier.
+
+**Cons:**
+
+ * Codebase looks more intimidating.
+ * Repo is bigger in size.
+ * ???
+
+## This is dumb! Nobody in open source does this!
+
+[React](https://github.com/facebook/react/tree/master/packages), [Meteor](https://github.com/meteor/meteor/tree/devel/packages), and [Ember](https://github.com/emberjs/ember.js/tree/master/packages), among others, do this.
+
+## Previous discussion
+
+- [Dan Luu](http://danluu.com/monorepo/)
+- [Gregory](http://gregoryszorc.com/blog/2014/09/09/on-monolithic-repositories/)
+- [Szorc](http://gregoryszorc.com/blog/2015/02/17/lost-productivity-due-to-non-unified-repositories/)
+- [Face](https://developers.facebooklive.com/videos/561/big-code-developer-infrastructure-at-facebook-s-scale)[book](https://code.facebook.com/posts/218678814984400/scaling-mercurial-at-facebook/)
+- [Benjamin Pollack](http://bitquabit.com/post/unorthodocs-abandon-your-dvcs-and-return-to-sanity/)
+- [Benjamin Eberlei](https://qafoo.com/resources/presentations/froscon_2015/monorepos.html)
+- [Simon Stewart](http://blog.rocketpoweredjetpants.com/2015/04/monorepo-one-source-code-repository-to.html)
+- [Digital Ocean](https://www.digitalocean.com/company/blog/taming-your-go-dependencies/)
+- [Google](http://www.infoq.com/presentations/Development-at-Google)
+- [Twitter](http://git-merge.com/videos/scaling-git-at-twitter-wilhelm-bierbaum.html)
+- [thedufer](http://www.reddit.com/r/programming/comments/1unehr/scaling_mercurial_at_facebook/cek9nkq)
+- [Paul Hammant](http://paulhammant.com/categories.html#trunk_based_development)
diff --git a/doc/design/versioning.md b/doc/design/versioning.md
new file mode 100644
index 0000000000..030fd87110
--- /dev/null
+++ b/doc/design/versioning.md
@@ -0,0 +1,5 @@
+# How does Babel versioning work?
+
+## Does Babel follow semver?
+
+Yes.
diff --git a/doc/index.md b/doc/index.md
deleted file mode 100644
index 5a87389d00..0000000000
--- a/doc/index.md
+++ /dev/null
@@ -1,4 +0,0 @@
-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).
diff --git a/doc/node-props.md b/doc/node-props.md
deleted file mode 100644
index 3fec49b615..0000000000
--- a/doc/node-props.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 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](https://github.com/estree/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 the `this` context from the parent scope. It is invoked for arrow functions, for example.
diff --git a/lib/file.js b/lib/file.js
new file mode 100644
index 0000000000..f3c6f32c8d
--- /dev/null
+++ b/lib/file.js
@@ -0,0 +1,27 @@
+type BabelFileModulesMetadata = {
+ imports: Array,
+ exports: {
+ exported: Array,
+ specifiers: Array
+ }
+};
+
+type BabelFileMetadata = {
+ usedHelpers: Array;
+
+ marked: Array<{
+ type: string;
+ message: string;
+ loc: Object;
+ }>;
+
+ modules: BabelFileModulesMetadata
+};
+
+type BabelFileResult = {
+ ast?: ?Object;
+ code?: ?string;
+ map?: ?Object;
+ ignored?: ?boolean;
+ metadata?: ?BabelFileMetadata;
+};
diff --git a/lib/parser.js b/lib/parser.js
new file mode 100644
index 0000000000..a7fbb53186
--- /dev/null
+++ b/lib/parser.js
@@ -0,0 +1,10 @@
+type BabelParserOptions = {
+ strictMode?: boolean;
+ looseModules?: boolean;
+ highlightCode?: boolean;
+ nonStandard?: boolean;
+ sourceType?: "module" | "script";
+ filename?: string;
+ features?: Object;
+ plugins?: Object;
+};
diff --git a/package.json b/package.json
index 5d11eeac6c..045fd66281 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,10 @@
{
"private": true,
+ "license": "MIT",
"devDependencies": {
- "babel": "5.8.19",
+ "babel": "5.8.21",
"babel-eslint": "^4.0.6",
+ "babel-plugin-flow-comments": "^1.0.9",
"browserify": "^11.2.0",
"bundle-collapser": "^1.2.1",
"chai": "^2.2.0",
@@ -14,7 +16,7 @@
"lodash": "^3.10.0",
"matcha": "^0.6.0",
"mocha": "2.2.0",
- "mocha-fixtures": "^1.0.5",
+ "mocha-fixtures": "^1.0.9",
"output-file-sync": "^1.1.1",
"path-exists": "^1.0.0",
"readline-sync": "^1.2.19",
@@ -23,7 +25,68 @@
"shelljs": "^0.5.1",
"uglify-js": "^2.4.16"
},
- "dependencies": {
- "mocha-fixtures": "^1.0.9"
+ "babel": {
+ "ignore": [
+ "packages/babel-cli/src/babel-plugin/templates"
+ ],
+ "stage": 0,
+ "loose": [
+ "all"
+ ],
+ "plugins": [
+ "flow-comments"
+ ],
+ "blacklist": [
+ "flow",
+ "es6.tailCall"
+ ],
+ "optional": [
+ "optimisation.flow.forOf",
+ "bluebirdCoroutines",
+ "runtime"
+ ],
+ "env": {
+ "test": {
+ "auxiliaryCommentBefore": "istanbul ignore next"
+ }
+ }
+ },
+ "eslintConfig": {
+ "parser": "babel-eslint",
+ "extends": "eslint:recommended",
+ "rules": {
+ "quotes": [
+ 2,
+ "double",
+ "avoid-escape"
+ ],
+ "no-var": 2,
+ "strict": 0,
+ "no-underscore-dangle": 0,
+ "curly": 0,
+ "no-multi-spaces": 0,
+ "key-spacing": 0,
+ "no-return-assign": 0,
+ "consistent-return": 0,
+ "no-shadow": 0,
+ "comma-dangle": 0,
+ "no-use-before-define": 0,
+ "no-empty": 0,
+ "new-parens": 0,
+ "no-cond-assign": 0,
+ "no-fallthrough": 0,
+ "new-cap": 0,
+ "no-loop-func": 0,
+ "no-unreachable": 0,
+ "no-labels": 0,
+ "no-process-exit": 0,
+ "camelcase": 0,
+ "no-console": 0,
+ "no-constant-condition": 0,
+ "no-inner-declarations": 0
+ },
+ "env": {
+ "node": true
+ }
}
}
diff --git a/packages/README.md b/packages/README.md
new file mode 100644
index 0000000000..47324dbd6d
--- /dev/null
+++ b/packages/README.md
@@ -0,0 +1,3 @@
+# Woah, what's going on here?
+
+A monorepo, muhahahahahaha. See the [monorepo design doc](/doc/design/monorepo.md) for reasoning.
diff --git a/packages/babel-cli/README.md b/packages/babel-cli/README.md
index 7af3d66051..0d36b69f45 100644
--- a/packages/babel-cli/README.md
+++ b/packages/babel-cli/README.md
@@ -1,5 +1 @@
# babel-cli
-
-Babel CLI
-
-For more information please look at [babel](https://github.com/babel/babel).
diff --git a/packages/babel-cli/index.js b/packages/babel-cli/index.js
index 4a0e83d072..090b3f0df5 100644
--- a/packages/babel-cli/index.js
+++ b/packages/babel-cli/index.js
@@ -1 +1 @@
-module.exports = require("babel-core");
+throw new Error("Use the `babel-core` package not `babel`.");
diff --git a/packages/babel-cli/package.json b/packages/babel-cli/package.json
index f8ae203863..4ac93ca177 100644
--- a/packages/babel-cli/package.json
+++ b/packages/babel-cli/package.json
@@ -1,6 +1,6 @@
{
- "name": "babel",
- "version": "5.8.29",
+ "name": "babel-cli",
+ "version": "6.0.2",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"author": "Sebastian McKenzie ",
"homepage": "https://babeljs.io/",
@@ -8,9 +8,10 @@
"repository": "babel/babel",
"preferGlobal": true,
"dependencies": {
- "babel-core": "^5.6.21",
+ "babel-core": "^6.0.2",
+ "babel-polyfill": "^6.0.2",
"chokidar": "^1.0.0",
- "commander": "^2.6.0",
+ "commander": "^2.8.1",
"convert-source-map": "^1.1.0",
"fs-readdir-recursive": "^0.1.0",
"glob": "^5.0.5",
@@ -18,13 +19,14 @@
"output-file-sync": "^1.1.0",
"path-exists": "^1.0.0",
"path-is-absolute": "^1.0.0",
+ "slash": "^1.0.0",
"source-map": "^0.5.0",
- "slash": "^1.0.0"
+ "v8flags": "^2.0.10",
+ "babel-runtime": "^6.0.2"
},
"bin": {
"babel": "./bin/babel.js",
"babel-node": "./bin/babel-node.js",
- "babel-external-helpers": "./bin/babel-external-helpers.js",
- "babel-plugin": "./bin/babel-plugin.js"
+ "babel-external-helpers": "./bin/babel-external-helpers.js"
}
}
\ No newline at end of file
diff --git a/packages/babel-cli/polyfill.js b/packages/babel-cli/polyfill.js
deleted file mode 100644
index 0e1a27b99c..0000000000
--- a/packages/babel-cli/polyfill.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("babel-core/polyfill");
diff --git a/packages/babel-cli/register-without-polyfill.js b/packages/babel-cli/register-without-polyfill.js
deleted file mode 100644
index c9ca24585e..0000000000
--- a/packages/babel-cli/register-without-polyfill.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("babel-core/register-without-polyfill");
diff --git a/packages/babel-cli/register.js b/packages/babel-cli/register.js
deleted file mode 100644
index 865d8ceb23..0000000000
--- a/packages/babel-cli/register.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("babel-core/register");
diff --git a/packages/babel-cli/src/_babel-node.js b/packages/babel-cli/src/_babel-node.js
index fe7d7fd76f..6fa82ac3f8 100644
--- a/packages/babel-cli/src/_babel-node.js
+++ b/packages/babel-cli/src/_babel-node.js
@@ -4,50 +4,64 @@ import Module from "module";
import { inspect } from "util";
import path from "path";
import repl from "repl";
+import register from "babel-core/register";
import { util } from "babel-core";
import * as babel from "babel-core";
import vm from "vm";
import _ from "lodash";
+import "babel-polyfill";
-var program = new commander.Command("babel-node");
+let program = new commander.Command("babel-node");
program.option("-e, --eval [script]", "Evaluate script");
program.option("-p, --print [code]", "Evaluate script and print result");
-program.option("-i, --ignore [regex]", "Ignore all files that match this regex when using the require hook");
+program.option("-o, --only [globs]", "");
+program.option("-i, --ignore [globs]", "");
program.option("-x, --extensions [extensions]", "List of extensions to hook into [.es6,.js,.es,.jsx]");
-program.option("-r, --stage [stage]", "Enable support for specific ECMAScript stages");
-program.option("-w, --whitelist [whitelist]", "Whitelist of transformers separated by comma to ONLY use", util.list);
-program.option("-b, --blacklist [blacklist]", "Blacklist of transformers separated by comma to NOT use", util.list);
-program.option("-o, --optional [optional]", "List of optional transformers separated by comma to enable", util.list);
+program.option("-w, --plugins [string]", "", util.list);
+program.option("-b, --presets [string]", "", util.list);
-var pkg = require("../package.json");
+let pkg = require("../package.json");
program.version(pkg.version);
program.usage("[options] [ -e script | script.js ] [arguments]");
program.parse(process.argv);
//
-babel.register({
- extensions: program.extensions,
- blacklist: program.blacklist,
- whitelist: program.whitelist,
- optional: program.optional,
- ignore: program.ignore,
- stage: program.stage,
+register({
+ extensions: program.extensions,
+ ignore: program.ignore,
+ only: program.only,
+ plugins: program.plugins,
+ presets: program.presets,
});
//
-var _eval = function (code, filename) {
+let replPlugin = () => ({
+ visitor: {
+ ModuleDeclaration(path) {
+ throw path.buildCodeFrameError("Modules aren't supported in the REPL");
+ },
+
+ VariableDeclaration(path) {
+ if (path.node.kind !== "var") {
+ throw path.buildCodeFrameError("Only `var` variables are supported in the REPL");
+ }
+ }
+ }
+});
+
+//
+
+let _eval = function (code, filename) {
code = code.trim();
if (!code) return undefined;
code = babel.transform(code, {
filename: filename,
- blacklist: program.blacklist,
- whitelist: program.whitelist,
- optional: program.optional,
- stage: program.stage
+ presets: program.presets,
+ plugins: (program.plugins || []).concat([replPlugin])
}).code;
return vm.runInThisContext(code, {
@@ -56,13 +70,13 @@ var _eval = function (code, filename) {
};
if (program.eval || program.print) {
- var code = program.eval;
+ let code = program.eval;
if (!code || code === true) code = program.print;
global.__filename = "[eval]";
global.__dirname = process.cwd();
- var module = new Module(global.__filename);
+ let module = new Module(global.__filename);
module.filename = global.__filename;
module.paths = Module._nodeModulePaths(global.__dirname);
@@ -70,18 +84,18 @@ if (program.eval || program.print) {
global.module = module;
global.require = module.require.bind(module);
- var result = _eval(code, global.__filename);
+ let result = _eval(code, global.__filename);
if (program.print) {
- var output = _.isString(result) ? result : inspect(result);
+ let output = _.isString(result) ? result : inspect(result);
process.stdout.write(output + "\n");
}
} else {
if (program.args.length) {
// slice all arguments up to the first filename since they're babel args that we handle
- var args = process.argv.slice(2);
+ let args = process.argv.slice(2);
- var i = 0;
- var ignoreNext = false;
+ let i = 0;
+ let ignoreNext = false;
_.each(args, function (arg, i2) {
if (ignoreNext) {
ignoreNext = false;
@@ -89,7 +103,7 @@ if (program.eval || program.print) {
}
if (arg[0] === "-") {
- var parsedArg = program[arg.slice(2)];
+ let parsedArg = program[arg.slice(2)];
if (parsedArg && parsedArg !== true) {
ignoreNext = true;
}
@@ -101,7 +115,7 @@ if (program.eval || program.print) {
args = args.slice(i);
// make the filename absolute
- var filename = args[0];
+ let filename = args[0];
if (!pathIsAbsolute(filename)) args[0] = path.join(process.cwd(), filename);
// add back on node and concat the sliced args
@@ -125,8 +139,8 @@ function replStart() {
}
function replEval(code, context, filename, callback) {
- var err;
- var result;
+ let err;
+ let result;
try {
if (code[0] === "(" && code[code.length - 1] === ")") {
diff --git a/packages/babel-cli/src/babel-node.js b/packages/babel-cli/src/babel-node.js
index 7e9aa639ff..4ff310d144 100755
--- a/packages/babel-cli/src/babel-node.js
+++ b/packages/babel-cli/src/babel-node.js
@@ -3,447 +3,72 @@
* when found, before invoking the "real" _babel-node(1) executable.
*/
-var path = require("path");
-var args = [path.join(__dirname, "_babel-node")];
+let getV8Flags = require("v8flags");
+let path = require("path");
-var babelArgs = process.argv.slice(2);
-var userArgs;
+let args = [path.join(__dirname, "_babel-node")];
+
+let babelArgs = process.argv.slice(2);
+let userArgs;
// separate node arguments from script arguments
-var argSeparator = babelArgs.indexOf("--");
+let argSeparator = babelArgs.indexOf("--");
if (argSeparator > -1) {
userArgs = babelArgs.slice(argSeparator); // including the --
babelArgs = babelArgs.slice(0, argSeparator);
}
-babelArgs.forEach(function(arg){
- var flag = arg.split("=")[0];
+getV8Flags(function (err, v8Flags) {
+ babelArgs.forEach(function(arg){
+ let flag = arg.split("=")[0];
- switch (flag) {
- case "-d":
- args.unshift("--debug");
- break;
+ switch (flag) {
+ case "-d":
+ args.unshift("--debug");
+ break;
- case "debug":
- case "--debug":
- case "--debug-brk":
- args.unshift(arg);
- break;
-
- case "-gc":
- case "--expose-gc":
- args.unshift("--expose-gc");
- break;
-
- case "--use_strict":
- case "--es_staging":
- case "--harmony":
- case "--harmony_shipping":
- case "--harmony_modules":
- case "--harmony_arrays":
- case "--harmony_array_includes":
- case "--harmony_regexps":
- case "--harmony_arrow_functions":
- case "--harmony_proxies":
- case "--harmony_sloppy":
- case "--harmony_unicode":
- case "--harmony_tostring":
- case "--harmony_numeric_literals":
- case "--harmony_strings":
- case "--harmony_scoping":
- case "--harmony_classes":
- case "--harmony_object_literals":
- case "--harmony_templates":
- case "--harmony_rest_parameters":
- case "--harmony_generators":
- case "--compiled_keyed_generic_loads":
- case "--pretenuring_call_new":
- case "--allocation_site_pretenuring":
- case "--trace_pretenuring":
- case "--trace_pretenuring_statistics":
- case "--track_fields":
- case "--track_double_fields":
- case "--track_heap_object_fields":
- case "--track_computed_fields":
- case "--track_field_types":
- case "--smi_binop":
- case "--vector_ics":
- case "--optimize_for_size":
- case "--unbox_double_arrays":
- case "--string_slices":
- case "--crankshaft":
- case "--hydrogen_filter":
- case "--use_gvn":
- case "--gvn_iterations":
- case "--use_canonicalizing":
- case "--use_inlining":
- case "--use_escape_analysis":
- case "--use_allocation_folding":
- case "--use_local_allocation_folding":
- case "--use_write_barrier_elimination":
- case "--max_inlining_levels":
- case "--max_inlined_source_size":
- case "--max_inlined_nodes":
- case "--max_inlined_nodes_cumulative":
- case "--loop_invariant_code_motion":
- case "--fast_math":
- case "--collect_megamorphic_maps_from_stub_cache":
- case "--hydrogen_stats":
- case "--trace_check_elimination":
- case "--trace_hydrogen":
- case "--trace_hydrogen_filter":
- case "--trace_hydrogen_stubs":
- case "--trace_hydrogen_file":
- case "--trace_phase":
- case "--trace_inlining":
- case "--trace_load_elimination":
- case "--trace_store_elimination":
- case "--trace_alloc":
- case "--trace_all_uses":
- case "--trace_range":
- case "--trace_gvn":
- case "--trace_representation":
- case "--trace_removable_simulates":
- case "--trace_escape_analysis":
- case "--trace_allocation_folding":
- case "--trace_track_allocation_sites":
- case "--trace_migration":
- case "--trace_generalization":
- case "--stress_pointer_maps":
- case "--stress_environments":
- case "--deopt_every_n_times":
- case "--deopt_every_n_garbage_collections":
- case "--print_deopt_stress":
- case "--trap_on_deopt":
- case "--trap_on_stub_deopt":
- case "--deoptimize_uncommon_cases":
- case "--polymorphic_inlining":
- case "--use_osr":
- case "--array_bounds_checks_elimination":
- case "--trace_bce":
- case "--array_bounds_checks_hoisting":
- case "--array_index_dehoisting":
- case "--analyze_environment_liveness":
- case "--load_elimination":
- case "--check_elimination":
- case "--store_elimination":
- case "--dead_code_elimination":
- case "--fold_constants":
- case "--trace_dead_code_elimination":
- case "--unreachable_code_elimination":
- case "--trace_osr":
- case "--stress_runs":
- case "--lookup_sample_by_shared":
- case "--cache_optimized_code":
- case "--flush_optimized_code_cache":
- case "--inline_construct":
- case "--inline_arguments":
- case "--inline_accessors":
- case "--escape_analysis_iterations":
- case "--optimize_for_in":
- case "--concurrent_recompilation":
- case "--job_based_recompilation":
- case "--trace_concurrent_recompilation":
- case "--concurrent_recompilation_queue_length":
- case "--concurrent_recompilation_delay":
- case "--block_concurrent_recompilation":
- case "--concurrent_osr":
- case "--omit_map_checks_for_leaf_maps":
- case "--turbo_filter":
- case "--trace_turbo":
- case "--trace_turbo_graph":
- case "--trace_turbo_cfg_file":
- case "--trace_turbo_types":
- case "--trace_turbo_scheduler":
- case "--trace_turbo_reduction":
- case "--trace_turbo_jt":
- case "--turbo_asm":
- case "--turbo_verify":
- case "--turbo_stats":
- case "--turbo_types":
- case "--turbo_source_positions":
- case "--context_specialization":
- case "--turbo_deoptimization":
- case "--turbo_inlining":
- case "--turbo_inlining_intrinsics":
- case "--trace_turbo_inlining":
- case "--loop_assignment_analysis":
- case "--turbo_profiling":
- case "--turbo_reuse_spill_slots":
- case "--turbo_delay_ssa_decon":
- case "--turbo_move_optimization":
- case "--turbo_jt":
- case "--typed_array_max_size_in_heap":
- case "--frame_count":
- case "--interrupt_budget":
- case "--type_info_threshold":
- case "--generic_ic_threshold":
- case "--self_opt_count":
- case "--trace_opt_verbose":
- case "--debug_code":
- case "--code_comments":
- case "--enable_sse3":
- case "--enable_sse4_1":
- case "--enable_sahf":
- case "--enable_avx":
- case "--enable_fma3":
- case "--enable_vfp3":
- case "--enable_armv7":
- case "--enable_armv8":
- case "--enable_neon":
- case "--enable_sudiv":
- case "--enable_mls":
- case "--enable_movw_movt":
- case "--enable_unaligned_accesses":
- case "--enable_32dregs":
- case "--enable_vldr_imm":
- case "--force_long_branches":
- case "--expose_natives_as":
- case "--expose_debug_as":
- case "--expose_free_buffer":
- case "--expose_gc":
- case "--expose_gc_as":
- case "--expose_externalize_string":
- case "--expose_trigger_failure":
- case "--stack_trace_limit":
- case "--builtins_in_stack_traces":
- case "--disable_native_files":
- case "--inline_new":
- case "--trace_codegen":
- case "--trace":
- case "--mask_constants_with_cookie":
- case "--lazy":
- case "--trace_opt":
- case "--trace_opt_stats":
- case "--opt":
- case "--always_opt":
- case "--always_osr":
- case "--prepare_always_opt":
- case "--trace_deopt":
- case "--trace_stub_failures":
- case "--serialize_toplevel":
- case "--serialize_inner":
- case "--trace_serializer":
- case "--min_preparse_length":
- case "--max_opt_count":
- case "--compilation_cache":
- case "--cache_prototype_transitions":
- case "--cpu_profiler_sampling_interval":
- case "--trace_debug_json":
- case "--trace_js_array_abuse":
- case "--trace_external_array_abuse":
- case "--trace_array_abuse":
- case "--enable_liveedit":
- case "--hard_abort":
- case "--stack_size":
- case "--max_stack_trace_source_length":
- case "--always_inline_smi_code":
- case "--min_semi_space_size":
- case "--target_semi_space_size":
- case "--max_semi_space_size":
- case "--semi_space_growth_factor":
- case "--experimental_new_space_growth_heuristic":
- case "--max_old_space_size":
- case "--initial_old_space_size":
- case "--max_executable_size":
- case "--gc_global":
- case "--gc_interval":
- case "--trace_gc":
- case "--trace_gc_nvp":
- case "--trace_gc_ignore_scavenger":
- case "--trace_idle_notification":
- case "--trace_idle_notification_verbose":
- case "--print_cumulative_gc_stat":
- case "--print_max_heap_committed":
- case "--trace_gc_verbose":
- case "--trace_fragmentation":
- case "--collect_maps":
- case "--weak_embedded_maps_in_optimized_code":
- case "--weak_embedded_objects_in_optimized_code":
- case "--flush_code":
- case "--flush_code_incrementally":
- case "--trace_code_flushing":
- case "--age_code":
- case "--incremental_marking":
- case "--incremental_marking_steps":
- case "--concurrent_sweeping":
- case "--trace_incremental_marking":
- case "--track_gc_object_stats":
- case "--heap_profiler_trace_objects":
- case "--use_idle_notification":
- case "--use_ic":
- case "--trace_ic":
- case "--native_code_counters":
- case "--always_compact":
- case "--never_compact":
- case "--compact_code_space":
- case "--incremental_code_compaction":
- case "--cleanup_code_caches_at_gc":
- case "--use_marking_progress_bar":
- case "--zap_code_space":
- case "--random_seed":
- case "--trace_weak_arrays":
- case "--track_prototype_users":
- case "--use_verbose_printer":
- case "--allow_natives_syntax":
- case "--trace_parse":
- case "--trace_sim":
- case "--debug_sim":
- case "--check_icache":
- case "--stop_sim_at":
- case "--sim_stack_alignment":
- case "--sim_stack_size":
- case "--log_regs_modified":
- case "--log_colour":
- case "--ignore_asm_unimplemented_break":
- case "--trace_sim_messages":
- case "--stack_trace_on_illegal":
- case "--abort_on_uncaught_exception":
- case "--randomize_hashes":
- case "--hash_seed":
- case "--profile_deserialization":
- case "--regexp_optimization":
- case "--testing_bool_flag":
- case "--testing_maybe_bool_flag":
- case "--testing_int_flag":
- case "--testing_float_flag":
- case "--testing_string_flag":
- case "--testing_prng_seed":
- case "--testing_serialization_file":
- case "--startup_blob":
- case "--profile_hydrogen_code_stub_compilation":
- case "--predictable":
- case "--help":
- case "--dump_counters":
- case "--debugger":
- case "--map_counters":
- case "--js_arguments":
- case "--gdbjit":
- case "--gdbjit_full":
- case "--gdbjit_dump":
- case "--gdbjit_dump_filter":
- case "--force_marking_deque_overflows":
- case "--stress_compaction":
- case "--log":
- case "--log_all":
- case "--log_api":
- case "--log_code":
- case "--log_gc":
- case "--log_handles":
- case "--log_snapshot_positions":
- case "--log_suspect":
- case "--prof":
- case "--prof_browser_mode":
- case "--log_regexp":
- case "--logfile":
- case "--logfile_per_isolate":
- case "--ll_prof":
- case "--perf_basic_prof":
- case "--perf_jit_prof":
- case "--gc_fake_mmap":
- case "--log_internal_timer_events":
- case "--log_timer_events":
- case "--log_instruction_stats":
- case "--log_instruction_file":
- case "--log_instruction_period":
- case "--redirect_code_traces":
- case "--redirect_code_traces_to":
- case "--hydrogen_track_positions":
- case "--trace_elements_transitions":
- case "--trace_creation_allocation_sites":
- case "--print_code_stubs":
- case "--test_secondary_stub_cache":
- case "--test_primary_stub_cache":
- case "--print_code":
- case "--print_opt_code":
- case "--print_unopt_code":
- case "--print_code_verbose":
- case "--print_builtin_code":
- case "--sodium":
- case "--print_all_code":
- case "--es5_readonly":
- case "--es52_globals":
- case "--harmony_typeof":
- case "--harmony_collections":
- case "--packed_arrays":
- case "--smi_only_arrays":
- case "--clever_optimizations":
- case "--use_range":
- case "--eliminate_dead_phis":
- case "--optimize_closures":
- case "--loop_weight":
- case "--opt_safe_uint32_operations":
- case "--parallel_recompilation":
- case "--trace_parallel_recompilation":
- case "--parallel_recompilation_queue_length":
- case "--experimental_profiler":
- case "--watch_ic_patching":
- case "--self_optimization":
- case "--direct_self_opt":
- case "--retry_self_opt":
- case "--count_based_interrupts":
- case "--interrupt_at_exit":
- case "--weighted_back_edges":
- case "--debug_code (generate extra code":
- case "--enable_sse2":
- case "--enable_cmov":
- case "--enable_rdtsc":
- case "--enable_vfp2":
- case "--enable_fpu":
- case "--stack_trace_on_abort":
- case "--always_full_compiler":
- case "--debugger_auto_break":
- case "--break_on_abort":
- case "--max_new_space_size":
- case "--trace_external_memory":
- case "--lazy_sweeping":
- case "--trace_exception":
- case "--preallocate_message_memory":
- case "--preemption":
- case "--extra_code":
- case "--remote_debugger":
- case "--debugger_agent":
- case "--debugger_port":
- case "--debug_compile_events":
- case "--debug_script_collected_events":
- case "--log_runtime":
- case "--prof_auto":
- case "--prof_lazy":
- case "--sliding_state_window":
- case "--nolazy":
- args.unshift(arg);
- break;
-
- default:
- if (arg.indexOf("--trace") === 0) {
+ case "debug":
+ case "--debug":
+ case "--debug-brk":
args.unshift(arg);
- } else {
- args.push(arg);
- }
- break;
+ break;
+
+ case "-gc":
+ case "--expose-gc":
+ args.unshift("--expose-gc");
+ break;
+
+ default:
+ if (v8Flags.indexOf(arg) >= 0 || arg.indexOf("--trace") === 0) {
+ args.unshift(arg);
+ } else {
+ args.push(arg);
+ }
+ break;
+ }
+ });
+
+ // append arguments passed after --
+ if (argSeparator > -1) {
+ args = args.concat(userArgs);
+ }
+
+ try {
+ let kexec = require("kexec");
+ kexec(process.argv[0], args);
+ } catch (err) {
+ if (err.code !== "MODULE_NOT_FOUND") throw err;
+
+ let child_process = require("child_process");
+ let proc = child_process.spawn(process.argv[0], args, { stdio: "inherit" });
+ proc.on("exit", function (code, signal) {
+ process.on("exit", function () {
+ if (signal) {
+ process.kill(process.pid, signal);
+ } else {
+ process.exit(code);
+ }
+ });
+ });
}
});
-
-// append arguments passed after --
-if (argSeparator > -1) {
- args = args.concat(userArgs);
-}
-
-try {
- var kexec = require("kexec");
- kexec(process.argv[0], args);
-} catch (err) {
- if (err.code !== "MODULE_NOT_FOUND") throw err;
-
- var child_process = require("child_process");
- var proc = child_process.spawn(process.argv[0], args, { stdio: "inherit" });
- proc.on("exit", function (code, signal) {
- process.on("exit", function () {
- if (signal) {
- process.kill(process.pid, signal);
- } else {
- process.exit(code);
- }
- });
- });
-}
diff --git a/packages/babel-cli/src/babel-plugin/index.js b/packages/babel-cli/src/babel-plugin/index.js
deleted file mode 100755
index 522d2e7f40..0000000000
--- a/packages/babel-cli/src/babel-plugin/index.js
+++ /dev/null
@@ -1,162 +0,0 @@
-import pathExists from "path-exists";
-import readline from "readline";
-import child from "child_process";
-import path from "path";
-import fs from "fs";
-
-function spawn(cmd, args, callback) {
- console.log(">", cmd, args);
-
- var spawn = child.spawn(cmd, args, { stdio: "inherit" });
-
- spawn.on("exit", function (code) {
- if (code === 0) {
- callback();
- } else {
- console.log("Killing...");
- process.exit(1);
- }
- });
-}
-
-function spawnMultiple(cmds) {
- function next() {
- var cmd = cmds.shift();
- if (cmd) {
- spawn(cmd.command, cmd.args, next);
- } else {
- process.exit();
- }
- }
-
- next();
-}
-
-function template(name, data = {}) {
- var source = fs.readFileSync(path.join(__dirname, "templates", name), "utf8");
- source = source.replace(/[A-Z_]+/g, function (key) {
- return data[key] === undefined ? key : data[key];
- });
- return source;
-}
-
-function write(filename, content) {
- console.log(filename);
- fs.writeFileSync(filename, content);
-}
-
-function execMaybe(cmd) {
- try {
- return child.execSync(cmd).toString();
- } catch (err) {
- return "";
- }
-}
-
-var rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout
-});
-
-var BABEL_PLUGIN_PREFIX = "babel-plugin-";
-
-var cmds = {
- init: function () {
- var name = path.basename(process.cwd());
-
- if (name.indexOf(BABEL_PLUGIN_PREFIX) === 0) {
- name = name.slice(BABEL_PLUGIN_PREFIX.length);
- }
-
- rl.question("Description (optional): ", function (description) {
- var remote = execMaybe("git config --get remote.origin.url").trim().match(/git@github.com:(.*?).git/);
- if (remote) {
- build(description, remote[1]);
- } else {
- rl.question("GitHub Repository (eg. sebmck/babel-plugin-foobar) (optional): ", function (repo) {
- build(description, repo);
- });
- }
- });
-
- function build(description, repo) {
- rl.close();
-
- var templateData = {
- DESCRIPTION: description,
- FULL_NAME: BABEL_PLUGIN_PREFIX + name,
- NAME: name
- };
-
- write("package.json", JSON.stringify({
- name: templateData.FULL_NAME,
- version: "1.0.0",
- description: templateData.DESCRIPTION,
- repository: repo || undefined,
- license: "MIT",
- main: "lib/index.js",
-
- devDependencies: {
- babel: "^5.6.0"
- },
-
- scripts: {
- build: "babel-plugin build",
- push: "babel-plugin publish",
- test: "babel-plugin test"
- },
-
- keywords: ["babel-plugin"]
- }, null, " ") + "\n");
-
- write(".npmignore", "node_modules\n*.log\nsrc\n");
-
- write(".gitignore", "node_modules\n*.log\nlib\n");
-
- write("README.md", template("README.md", templateData));
-
- write("LICENSE", template("LICENSE", {
- AUTHOR_EMAIL: execMaybe("git config --get user.email").trim(),
- AUTHOR_NAME: execMaybe("git config --get user.name").trim(),
- YEAR: new Date().getFullYear()
- }));
-
- if (!pathExists.sync("src")) {
- fs.mkdirSync("src");
- write("src/index.js", template("index.js", templateData));
- }
- }
- },
-
- build: function () {
- spawn("babel", ["src", "--out-dir", "lib", "--copy-files"], process.exit);
- },
-
- publish: function () {
- var pkg = require(process.cwd() + "/package.json");
- console.log("Current version:", pkg.version);
-
- rl.question("New version (enter nothing for patch): ", function (newVersion) {
- rl.close();
-
- newVersion = newVersion || "patch";
-
- spawnMultiple([
- { command: "git", args: ["pull"] },
- { command: "git", args: ["push"] },
- { command: "babel-plugin", args: ["build"] },
- { command: "npm", args: ["version", newVersion] },
- { command: "npm", args: ["publish"] },
- { command: "git", args: ["push", "--follow-tags"] }
- ]);
- });
- }
-};
-
-var cmd = cmds[process.argv[2]];
-if (cmd) {
- cmd();
-} else {
- console.error("Unknown command:", cmd);
- process.exit(1);
-}
diff --git a/packages/babel-cli/src/babel-plugin/templates/LICENSE b/packages/babel-cli/src/babel-plugin/templates/LICENSE
deleted file mode 100644
index 8f49de9415..0000000000
--- a/packages/babel-cli/src/babel-plugin/templates/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) YEAR AUTHOR_NAME
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/packages/babel-cli/src/babel-plugin/templates/README.md b/packages/babel-cli/src/babel-plugin/templates/README.md
deleted file mode 100644
index b8f71ad228..0000000000
--- a/packages/babel-cli/src/babel-plugin/templates/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# FULL_NAME
-
-DESCRIPTION
-
-## Installation
-
-```sh
-$ npm install FULL_NAME
-```
-
-## Usage
-
-### Via `.babelrc` (Recommended)
-
-**.babelrc**
-
-```json
-{
- "plugins": ["NAME"]
-}
-```
-
-### Via CLI
-
-```sh
-$ babel --plugins NAME script.js
-```
-
-### Via Node API
-
-```javascript
-require("babel-core").transform("code", {
- plugins: ["NAME"]
-});
-```
diff --git a/packages/babel-cli/src/babel-plugin/templates/index.js b/packages/babel-cli/src/babel-plugin/templates/index.js
deleted file mode 100644
index ca31cf0b24..0000000000
--- a/packages/babel-cli/src/babel-plugin/templates/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/* eslint no-unused-vars:0 */
-export default function ({ Plugin, types: t }) {
- return new Plugin("NAME", {
- visitor: {
- // your visitor methods go here
- }
- });
-}
diff --git a/packages/babel-cli/src/babel/dir.js b/packages/babel-cli/src/babel/dir.js
index f5010fa571..c2a34b7711 100644
--- a/packages/babel-cli/src/babel/dir.js
+++ b/packages/babel-cli/src/babel/dir.js
@@ -1,32 +1,34 @@
-var outputFileSync = require("output-file-sync");
-var pathExists = require("path-exists");
-var chokidar = require("chokidar");
-var slash = require("slash");
-var path = require("path");
-var util = require("./util");
-var fs = require("fs");
-var _ = require("lodash");
+let outputFileSync = require("output-file-sync");
+let pathExists = require("path-exists");
+let chokidar = require("chokidar");
+let slash = require("slash");
+let path = require("path");
+let util = require("./util");
+let fs = require("fs");
+let _ = require("lodash");
module.exports = function (commander, filenames) {
function write(src, relative) {
// remove extension and then append back on .js
relative = relative.replace(/\.(\w*?)$/, "") + ".js";
- var dest = path.join(commander.outDir, relative);
+ let dest = path.join(commander.outDir, relative);
- var data = util.compile(src, {
+ let data = util.compile(src, {
sourceFileName: slash(path.relative(dest + "/..", src)),
sourceMapTarget: path.basename(relative)
});
if (!commander.copyFiles && data.ignored) return;
+ // we've requested explicit sourcemaps to be written to disk
if (data.map && commander.sourceMaps && commander.sourceMaps !== "inline") {
- var mapLoc = dest + ".map";
+ let mapLoc = dest + ".map";
data.code = util.addSourceMappingUrl(data.code, mapLoc);
outputFileSync(mapLoc, JSON.stringify(data.map));
}
outputFileSync(dest, data.code);
+ util.chmod(src, dest);
util.log(src + " -> " + dest);
}
@@ -37,20 +39,22 @@ module.exports = function (commander, filenames) {
if (util.canCompile(filename, commander.extensions)) {
write(src, filename);
} else if (commander.copyFiles) {
- outputFileSync(path.join(commander.outDir, filename), fs.readFileSync(src));
+ let dest = path.join(commander.outDir, filename);
+ outputFileSync(dest, fs.readFileSync(src));
+ util.chmod(src, dest);
}
}
function handle(filename) {
if (!pathExists.sync(filename)) return;
- var stat = fs.statSync(filename);
+ let stat = fs.statSync(filename);
if (stat.isDirectory(filename)) {
- var dirname = filename;
+ let dirname = filename;
_.each(util.readdir(dirname), function (filename) {
- var src = path.join(dirname, filename);
+ let src = path.join(dirname, filename);
handleFile(src, filename);
});
} else {
@@ -62,14 +66,14 @@ module.exports = function (commander, filenames) {
if (commander.watch) {
_.each(filenames, function (dirname) {
- var watcher = chokidar.watch(dirname, {
+ let watcher = chokidar.watch(dirname, {
persistent: true,
ignoreInitial: true
});
_.each(["add", "change"], function (type) {
watcher.on(type, function (filename) {
- var relative = path.relative(dirname, filename) || filename;
+ let relative = path.relative(dirname, filename) || filename;
try {
handleFile(filename, relative);
} catch (err) {
diff --git a/packages/babel-cli/src/babel/file.js b/packages/babel-cli/src/babel/file.js
index 9b2f9db4a5..b8e03b526f 100644
--- a/packages/babel-cli/src/babel/file.js
+++ b/packages/babel-cli/src/babel/file.js
@@ -1,37 +1,37 @@
-var convertSourceMap = require("convert-source-map");
-var pathExists = require("path-exists");
-var sourceMap = require("source-map");
-var chokidar = require("chokidar");
-var slash = require("slash");
-var path = require("path");
-var util = require("./util");
-var fs = require("fs");
-var _ = require("lodash");
+let convertSourceMap = require("convert-source-map");
+let pathExists = require("path-exists");
+let sourceMap = require("source-map");
+let chokidar = require("chokidar");
+let slash = require("slash");
+let path = require("path");
+let util = require("./util");
+let fs = require("fs");
+let _ = require("lodash");
module.exports = function (commander, filenames, opts) {
if (commander.sourceMaps === "inline") {
opts.sourceMaps = true;
}
- var results = [];
+ let results = [];
- var buildResult = function () {
- var map = new sourceMap.SourceMapGenerator({
+ let buildResult = function () {
+ let map = new sourceMap.SourceMapGenerator({
file: path.basename(commander.outFile) || "stdout",
sourceRoot: opts.sourceRoot
});
- var code = "";
- var offset = 0;
+ let code = "";
+ let offset = 0;
_.each(results, function (result) {
- var filename = result.filename;
+ let filename = result.filename;
code += result.code + "\n";
if (result.map) {
- var consumer = new sourceMap.SourceMapConsumer(result.map);
+ let consumer = new sourceMap.SourceMapConsumer(result.map);
- var sourceFilename = filename;
+ let sourceFilename = filename;
if (commander.outFile) {
sourceFilename = path.relative(path.dirname(commander.outFile), sourceFilename);
}
@@ -54,6 +54,8 @@ module.exports = function (commander, filenames, opts) {
}
});
+ // add the inline sourcemap comment if we've either explicitly asked for inline source
+ // maps, or we've requested them without any output file
if (commander.sourceMaps === "inline" || (!commander.outFile && commander.sourceMaps)) {
code += "\n" + convertSourceMap.fromObject(map).toComment();
}
@@ -64,12 +66,13 @@ module.exports = function (commander, filenames, opts) {
};
};
- var output = function () {
- var result = buildResult();
+ let output = function () {
+ let result = buildResult();
if (commander.outFile) {
+ // we've requested for a sorucemap to be written to disk
if (commander.sourceMaps && commander.sourceMaps !== "inline") {
- var mapLoc = commander.outFile + ".map";
+ let mapLoc = commander.outFile + ".map";
result.code = util.addSourceMappingUrl(result.code, mapLoc);
fs.writeFileSync(mapLoc, JSON.stringify(result.map));
}
@@ -80,13 +83,13 @@ module.exports = function (commander, filenames, opts) {
}
};
- var stdin = function () {
- var code = "";
+ let stdin = function () {
+ let code = "";
process.stdin.setEncoding("utf8");
process.stdin.on("readable", function () {
- var chunk = process.stdin.read();
+ let chunk = process.stdin.read();
if (chunk !== null) code += chunk;
});
@@ -96,16 +99,16 @@ module.exports = function (commander, filenames, opts) {
});
};
- var walk = function () {
- var _filenames = [];
+ let walk = function () {
+ let _filenames = [];
results = [];
_.each(filenames, function (filename) {
if (!pathExists.sync(filename)) return;
- var stat = fs.statSync(filename);
+ let stat = fs.statSync(filename);
if (stat.isDirectory()) {
- var dirname = filename;
+ let dirname = filename;
_.each(util.readdirFilter(filename), function (filename) {
_filenames.push(path.join(dirname, filename));
@@ -118,7 +121,7 @@ module.exports = function (commander, filenames, opts) {
_.each(_filenames, function (filename) {
if (util.shouldIgnore(filename)) return;
- var data = util.compile(filename);
+ let data = util.compile(filename);
if (data.ignored) return;
results.push(data);
});
@@ -126,7 +129,7 @@ module.exports = function (commander, filenames, opts) {
output();
};
- var files = function () {
+ let files = function () {
walk();
if (commander.watch) {
diff --git a/packages/babel-cli/src/babel/index.js b/packages/babel-cli/src/babel/index.js
index 93faa1e85e..ac5c856164 100755
--- a/packages/babel-cli/src/babel/index.js
+++ b/packages/babel-cli/src/babel/index.js
@@ -2,22 +2,19 @@
require("babel-core");
-var moduleFormatters = require("babel-core/lib/transformation/modules");
-var pathExists = require("path-exists");
-var commander = require("commander");
-var transform = require("babel-core").transform;
-var kebabCase = require("lodash/string/kebabCase");
-var options = require("babel-core").options;
-var util = require("babel-core").util;
-var uniq = require("lodash/array/uniq");
-var each = require("lodash/collection/each");
-var keys = require("lodash/object/keys");
-var glob = require("glob");
+let pathExists = require("path-exists");
+let commander = require("commander");
+let kebabCase = require("lodash/string/kebabCase");
+let options = require("babel-core").options;
+let util = require("babel-core").util;
+let uniq = require("lodash/array/uniq");
+let each = require("lodash/collection/each");
+let glob = require("glob");
each(options, function (option, key) {
if (option.hidden) return;
- var arg = kebabCase(key);
+ let arg = kebabCase(key);
if (option.type !== "boolean") {
arg += " [" + (option.type || "string") + "]";
@@ -33,7 +30,7 @@ each(options, function (option, key) {
arg = "-" + option.shorthand + ", " + arg;
}
- var desc = [];
+ let desc = [];
if (option.deprecated) desc.push("[DEPRECATED] " + option.deprecated);
if (option.description) desc.push(option.description);
@@ -47,27 +44,7 @@ commander.option("-d, --out-dir [out]", "Compile an input directory of modules i
commander.option("-D, --copy-files", "When compiling a directory copy over non-compilable files");
commander.option("-q, --quiet", "Don't log anything");
-commander.on("--help", function () {
- var outKeys = function (title, obj) {
- console.log(" " + title + ":");
- console.log();
-
- each(keys(obj).sort(), function (key) {
- if (key[0] === "_") return;
-
- if (obj[key].metadata && obj[key].metadata.optional) key = "[" + key + "]";
-
- console.log(" - " + key);
- });
-
- console.log();
- };
-
- outKeys("Transformers", transform.pipeline.transformers);
- outKeys("Module formatters", moduleFormatters);
-});
-
-var pkg = require("../../package.json");
+let pkg = require("../../package.json");
commander.version(pkg.version + " (babel-core " + require("babel-core").version + ")");
commander.usage("[options] ");
commander.parse(process.argv);
@@ -80,10 +57,10 @@ if (commander.extensions) {
//
-var errors = [];
+let errors = [];
-var filenames = commander.args.reduce(function (globbed, input) {
- var files = glob.sync(input);
+let filenames = commander.args.reduce(function (globbed, input) {
+ let files = glob.sync(input);
if (!files.length) files = [input];
return globbed.concat(files);
}, []);
@@ -121,7 +98,7 @@ if (errors.length) {
//
-var opts = exports.opts = {};
+let opts = exports.opts = {};
each(options, function (opt, key) {
if (commander[key] !== undefined) {
@@ -135,7 +112,7 @@ if (opts.only) {
opts.only = util.arrayify(opts.only, util.regexify);
}
-var fn;
+let fn;
if (commander.outDir) {
fn = require("./dir");
diff --git a/packages/babel-cli/src/babel/util.js b/packages/babel-cli/src/babel/util.js
index 52c0801109..720705001a 100644
--- a/packages/babel-cli/src/babel/util.js
+++ b/packages/babel-cli/src/babel/util.js
@@ -1,50 +1,54 @@
-var commander = require("commander");
-var readdir = require("fs-readdir-recursive");
-var index = require("./index");
-var babel = require("babel-core");
-var util = require("babel-core").util;
-var path = require("path");
-var fs = require("fs");
-var _ = require("lodash");
+let commander = require("commander");
+let readdir = require("fs-readdir-recursive");
+let index = require("./index");
+let babel = require("babel-core");
+let util = require("babel-core").util;
+let path = require("path");
+let fs = require("fs");
+let _ = require("lodash");
-exports.readdirFilter = function (filename) {
+export function chmod(src, dest) {
+ fs.chmodSync(dest, fs.statSync(src).mode);
+}
+
+export function readdirFilter(filename) {
return readdir(filename).filter(function (filename) {
return util.canCompile(filename);
});
-};
+}
-exports.readdir = readdir;
+export { readdir };
-exports.canCompile = util.canCompile;
+export let canCompile = util.canCompile;
-exports.shouldIgnore = function (loc) {
+export function shouldIgnore(loc) {
return util.shouldIgnore(loc, index.opts.ignore, index.opts.only);
-};
+}
-exports.addSourceMappingUrl = function (code, loc) {
+export function addSourceMappingUrl(code, loc) {
return code + "\n//# sourceMappingURL=" + path.basename(loc);
-};
+}
-exports.log = function (msg) {
+export function log(msg) {
if (!commander.quiet) console.log(msg);
-};
+}
-exports.transform = function (filename, code, opts) {
+export function transform(filename, code, opts) {
opts = _.defaults(opts || {}, index.opts);
opts.filename = filename;
opts.ignore = null;
opts.only = null;
- var result = babel.transform(code, opts);
+ let result = babel.transform(code, opts);
result.filename = filename;
result.actual = code;
return result;
-};
+}
-exports.compile = function (filename, opts) {
+export function compile(filename, opts) {
try {
- var code = fs.readFileSync(filename, "utf8");
- return exports.transform(filename, code, opts);
+ let code = fs.readFileSync(filename, "utf8");
+ return transform(filename, code, opts);
} catch (err) {
if (commander.watch) {
console.error(toErrorStack(err));
@@ -53,7 +57,7 @@ exports.compile = function (filename, opts) {
throw err;
}
}
-};
+}
function toErrorStack(err) {
if (err._babel && err instanceof SyntaxError) {
diff --git a/packages/babel-cli/test/.babelrc b/packages/babel-cli/test/.babelrc
index 3a8f8eb911..0967ef424b 100644
--- a/packages/babel-cli/test/.babelrc
+++ b/packages/babel-cli/test/.babelrc
@@ -1,3 +1 @@
-{
- "breakConfig": true
-}
+{}
diff --git a/packages/babel-cli/test/fixtures/babel-external-helpers/--output-type umd/stdout.txt b/packages/babel-cli/test/fixtures/babel-external-helpers/--output-type umd/stdout.txt
index 7720acd669..5ad4dd07cd 100644
--- a/packages/babel-cli/test/fixtures/babel-external-helpers/--output-type umd/stdout.txt
+++ b/packages/babel-cli/test/fixtures/babel-external-helpers/--output-type umd/stdout.txt
@@ -8,4 +8,4 @@
}
})(this, function (global) {
var babelHelpers = global;
-})
+});
diff --git a/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/options.json b/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/options.json
index 51b6c8f4ec..2d7659493d 100644
--- a/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/options.json
+++ b/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/options.json
@@ -1,3 +1,3 @@
{
- "args": ["--whitelist", "slice,has-own"]
+ "args": ["--whitelist", "createClass"]
}
diff --git a/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt b/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt
index f07c16c3fe..88c4bd2b2f 100644
--- a/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt
+++ b/packages/babel-cli/test/fixtures/babel-external-helpers/--whitelist/stdout.txt
@@ -1,5 +1,21 @@
(function (global) {
var babelHelpers = global.babelHelpers = {};
- babelHelpers.hasOwn = Object.prototype.hasOwnProperty;
- babelHelpers.slice = Array.prototype.slice;
+
+ babelHelpers.createClass = (function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ })();
})(typeof global === "undefined" ? self : global);
diff --git a/packages/babel-cli/test/fixtures/babel/--blacklist/options.json b/packages/babel-cli/test/fixtures/babel/--blacklist/options.json
deleted file mode 100644
index 504eb17f7e..0000000000
--- a/packages/babel-cli/test/fixtures/babel/--blacklist/options.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "args": ["--blacklist", "es6.arrowFunctions"]
-}
diff --git a/packages/babel-cli/test/fixtures/babel/--blacklist/stdin.txt b/packages/babel-cli/test/fixtures/babel/--blacklist/stdin.txt
deleted file mode 100644
index 4bc9539528..0000000000
--- a/packages/babel-cli/test/fixtures/babel/--blacklist/stdin.txt
+++ /dev/null
@@ -1 +0,0 @@
-arr.map(x => x * MULTIPLIER);
diff --git a/packages/babel-cli/test/fixtures/babel/--blacklist/stdout.txt b/packages/babel-cli/test/fixtures/babel/--blacklist/stdout.txt
deleted file mode 100644
index 420f2b900e..0000000000
--- a/packages/babel-cli/test/fixtures/babel/--blacklist/stdout.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-
-arr.map(x => x * MULTIPLIER);
diff --git a/packages/babel-cli/test/fixtures/babel/--whitelist/options.json b/packages/babel-cli/test/fixtures/babel/--whitelist/options.json
deleted file mode 100644
index a8ea889a1c..0000000000
--- a/packages/babel-cli/test/fixtures/babel/--whitelist/options.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "args": ["--whitelist", "es6.arrowFunctions"]
-}
diff --git a/packages/babel-cli/test/fixtures/babel/--whitelist/stdin.txt b/packages/babel-cli/test/fixtures/babel/--whitelist/stdin.txt
deleted file mode 100644
index 030f13f9fa..0000000000
--- a/packages/babel-cli/test/fixtures/babel/--whitelist/stdin.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-let MULTIPLER = 5;
-arr.map(x => x * MULTIPLIER);
diff --git a/packages/babel-cli/test/fixtures/babel/--whitelist/stdout.txt b/packages/babel-cli/test/fixtures/babel/--whitelist/stdout.txt
deleted file mode 100644
index 4181a0bd94..0000000000
--- a/packages/babel-cli/test/fixtures/babel/--whitelist/stdout.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-let MULTIPLER = 5;
-arr.map(function (x) {
- return x * MULTIPLIER;
-});
diff --git a/packages/babel-cli/test/index.js b/packages/babel-cli/test/index.js
index 3e229d87b9..938fb6db6a 100644
--- a/packages/babel-cli/test/index.js
+++ b/packages/babel-cli/test/index.js
@@ -15,6 +15,16 @@ var _ = require("lodash");
var fixtureLoc = __dirname + "/fixtures";
var tmpLoc = __dirname + "/tmp";
+var presetLocs = [
+ __dirname + "/../../babel-preset-es2015",
+ __dirname + "/../../babel-preset-react"
+].join(",");
+
+var pluginLocs = [
+ __dirname + "/../../babel-plugin-transform-strict-mode",
+ __dirname + "/../../babel-plugin-transform-es2015-modules-commonjs",
+].join(",");
+
var readDir = function (loc) {
var files = {};
if (pathExists.sync(loc)) {
@@ -43,7 +53,7 @@ var assertTest = function (stdout, stderr, opts) {
chai.expect(stderr).to.equal(expectStderr, "stderr didn't match");
}
} else if (stderr) {
- throw new Error("stderr: " + JSON.stringify(stderr));
+ throw new Error("stderr:\n" + stderr);
}
var expectStdout = opts.stdout.trim();
@@ -57,7 +67,7 @@ var assertTest = function (stdout, stderr, opts) {
chai.expect(stdout).to.equal(expectStdout, "stdout didn't match");
}
} else if (stdout) {
- throw new Error("stdout: " + JSON.stringify(stdout));
+ throw new Error("stdout:\n" + stdout);
}
_.each(opts.outFiles, function (expect, filename) {
@@ -74,7 +84,18 @@ var buildTest = function (binName, testName, opts) {
clear();
saveInFiles(opts.inFiles);
- var args = [binLoc].concat(opts.args);
+ var args = [binLoc];
+
+ if (binName !== "babel-external-helpers") {
+ args.push("--presets", presetLocs, "--plugins", pluginLocs);
+ }
+
+ if (binName === "babel-node") {
+ args.push("--only", "packages/*/test");
+ }
+
+ args = args.concat(opts.args);
+
var spawn = child.spawn(process.execPath, args);
var stderr = "";
diff --git a/packages/babel-code-frame/.npmignore b/packages/babel-code-frame/.npmignore
new file mode 100644
index 0000000000..a57582cc39
--- /dev/null
+++ b/packages/babel-code-frame/.npmignore
@@ -0,0 +1 @@
+/src
diff --git a/packages/babel-code-frame/README.md b/packages/babel-code-frame/README.md
new file mode 100644
index 0000000000..35f7c2ebf7
--- /dev/null
+++ b/packages/babel-code-frame/README.md
@@ -0,0 +1 @@
+# babel-code-frame
diff --git a/packages/babel-code-frame/package.json b/packages/babel-code-frame/package.json
new file mode 100644
index 0000000000..dc53d2044d
--- /dev/null
+++ b/packages/babel-code-frame/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "babel-code-frame",
+ "version": "6.0.2",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "lib/index.js",
+ "dependencies": {
+ "babel-runtime": "^6.0.2",
+ "chalk": "^1.1.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^1.0.1",
+ "line-numbers": "^0.2.0",
+ "repeating": "^1.1.3"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-code-frame/src/index.js b/packages/babel-code-frame/src/index.js
new file mode 100644
index 0000000000..972eb0ff7d
--- /dev/null
+++ b/packages/babel-code-frame/src/index.js
@@ -0,0 +1,121 @@
+/* @flow */
+
+import lineNumbers from "line-numbers";
+import repeating from "repeating";
+import jsTokens from "js-tokens";
+import esutils from "esutils";
+import chalk from "chalk";
+
+/**
+ * Chalk styles for token types.
+ */
+
+let defs = {
+ string: chalk.red,
+ punctuator: chalk.bold,
+ curly: chalk.green,
+ parens: chalk.blue.bold,
+ square: chalk.yellow,
+ keyword: chalk.cyan,
+ number: chalk.magenta,
+ regex: chalk.magenta,
+ comment: chalk.grey,
+ invalid: chalk.inverse
+};
+
+/**
+ * RegExp to test for newlines in terminal.
+ */
+
+const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
+
+/**
+ * Get the type of token, specifying punctuator type.
+ */
+
+function getTokenType(match) {
+ let token = jsTokens.matchToToken(match);
+ if (token.type === "name" && esutils.keyword.isReservedWordES6(token.value)) {
+ return "keyword";
+ }
+
+ if (token.type === "punctuator") {
+ switch (token.value) {
+ case "{":
+ case "}":
+ return "curly";
+ case "(":
+ case ")":
+ return "parens";
+ case "[":
+ case "]":
+ return "square";
+ }
+ }
+
+ return token.type;
+}
+
+/**
+ * Highlight `text`.
+ */
+
+function highlight(text: string) {
+ return text.replace(jsTokens, function (...args) {
+ let type = getTokenType(args);
+ let colorize = defs[type];
+ if (colorize) {
+ return args[0].split(NEWLINE).map(str => colorize(str)).join("\n");
+ } else {
+ return args[0];
+ }
+ });
+}
+
+/**
+ * Create a code frame, adding line numbers, code highlighting, and pointing to a given position.
+ */
+
+export default function (
+ rawLines: string,
+ lineNumber: number,
+ colNumber: number,
+ opts: Object = {},
+): string {
+ colNumber = Math.max(colNumber, 0);
+
+ let highlighted = opts.highlightCode && chalk.supportsColor;
+ if (highlighted) rawLines = highlight(rawLines);
+
+ let lines = rawLines.split(NEWLINE);
+ let start = Math.max(lineNumber - 3, 0);
+ let end = Math.min(lines.length, lineNumber + 3);
+
+ if (!lineNumber && !colNumber) {
+ start = 0;
+ end = lines.length;
+ }
+
+ let frame = lineNumbers(lines.slice(start, end), {
+ start: start + 1,
+ before: " ",
+ after: " | ",
+ transform(params) {
+ if (params.number !== lineNumber) {
+ return;
+ }
+
+ if (colNumber) {
+ params.line += `\n${params.before}${repeating(" ", params.width)}${params.after}${repeating(" ", colNumber - 1)}^`;
+ }
+
+ params.before = params.before.replace(/^./, ">");
+ }
+ }).join("\n");
+
+ if (highlighted) {
+ return chalk.reset(frame);
+ } else {
+ return frame;
+ }
+}
diff --git a/packages/babel/.npmignore b/packages/babel-core/.npmignore
similarity index 100%
rename from packages/babel/.npmignore
rename to packages/babel-core/.npmignore
diff --git a/packages/babel-core/README.md b/packages/babel-core/README.md
new file mode 100644
index 0000000000..beb313b67f
--- /dev/null
+++ b/packages/babel-core/README.md
@@ -0,0 +1 @@
+# babel-core
diff --git a/packages/babel-core/index.js b/packages/babel-core/index.js
new file mode 100644
index 0000000000..e8f04775a2
--- /dev/null
+++ b/packages/babel-core/index.js
@@ -0,0 +1 @@
+module.exports = require("./lib/api/node.js");
diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json
new file mode 100644
index 0000000000..b0fd264dc5
--- /dev/null
+++ b/packages/babel-core/package.json
@@ -0,0 +1,59 @@
+{
+ "name": "babel-core",
+ "version": "6.0.2",
+ "description": "A compiler for writing next generation JavaScript",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "browser": {
+ "./lib/api/register/node.js": "./lib/api/register/browser.js",
+ "esprima-fb": false
+ },
+ "keywords": [
+ "6to5",
+ "babel",
+ "classes",
+ "const",
+ "es6",
+ "harmony",
+ "let",
+ "modules",
+ "transpile",
+ "transpiler",
+ "var"
+ ],
+ "scripts": {
+ "bench": "make bench",
+ "test": "make test"
+ },
+ "dependencies": {
+ "babel-code-frame": "^6.0.2",
+ "babel-generator": "^6.0.2",
+ "babel-helpers": "^6.0.2",
+ "babel-messages": "^6.0.2",
+ "babel-template": "^6.0.2",
+ "babel-runtime": "^6.0.2",
+ "babel-traverse": "^6.0.2",
+ "babel-types": "^6.0.2",
+ "babylon": "^6.0.2",
+ "convert-source-map": "^1.1.0",
+ "debug": "^2.1.1",
+ "esutils": "^2.0.0",
+ "home-or-tmp": "^1.0.0",
+ "json5": "^0.4.0",
+ "lodash": "^3.10.0",
+ "minimatch": "^2.0.3",
+ "path-exists": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "private": "^0.1.6",
+ "regenerator": "0.8.35",
+ "shebang-regex": "^1.0.0",
+ "slash": "^1.0.0",
+ "source-map": "^0.4.0",
+ "source-map-support": "^0.2.10"
+ },
+ "devDependencies": {
+ "babel-polyfill": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel/register-without-polyfill.js b/packages/babel-core/register.js
similarity index 100%
rename from packages/babel/register-without-polyfill.js
rename to packages/babel-core/register.js
diff --git a/packages/babel-core/scripts/build-dist.sh b/packages/babel-core/scripts/build-dist.sh
new file mode 100755
index 0000000000..2f8f2089c0
--- /dev/null
+++ b/packages/babel-core/scripts/build-dist.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+set -ex
+
+BROWSERIFY_CMD="../../node_modules/browserify/bin/cmd.js"
+UGLIFY_CMD="../../node_modules/uglify-js/bin/uglifyjs"
+BROWSERIFY_IGNORE="-i esprima-fb -i through"
+
+mkdir -p dist
+
+# Add a Unicode BOM so browsers will interpret the file as UTF-8
+node -p '"\uFEFF"' > dist/browser.js
+node $BROWSERIFY_CMD lib/api/browser.js \
+ --standalone babel \
+ --plugin bundle-collapser/plugin \
+ --plugin derequire/plugin \
+ $BROWSERIFY_IGNORE \
+ >>dist/browser.j
+node -p '"\uFEFF"' > dist/browser.min.js
+node $UGLIFY_CMD dist/browser.js \
+ --compress warnings=false \
+ --mangle \
+ >>dist/browser.min.js
diff --git a/packages/babel-core/scripts/postpublish.js b/packages/babel-core/scripts/postpublish.js
new file mode 100755
index 0000000000..4e817f4529
--- /dev/null
+++ b/packages/babel-core/scripts/postpublish.js
@@ -0,0 +1,6 @@
+function rmRelative(loc) {
+ rm(__dirname + "/../" + loc);
+}
+
+rmRelative("browser.js");
+rmRelative("browser.min.js");
diff --git a/packages/babel-core/scripts/prepublish.js b/packages/babel-core/scripts/prepublish.js
new file mode 100755
index 0000000000..1b04267e9d
--- /dev/null
+++ b/packages/babel-core/scripts/prepublish.js
@@ -0,0 +1,6 @@
+function relative(loc) {
+ return __dirname + "/../" + loc;
+}
+
+cp(relative("dist/browser.js"), relative("browser.js"));
+cp(relative("dist/browser.min.js"), relative("browser.min.js"));
diff --git a/packages/babel-core/src/api/browser.js b/packages/babel-core/src/api/browser.js
new file mode 100644
index 0000000000..f166494c60
--- /dev/null
+++ b/packages/babel-core/src/api/browser.js
@@ -0,0 +1,95 @@
+/* @flow */
+
+/* eslint no-new-func: 0 */
+
+import { transform } from "./node";
+export * from "./node";
+
+export function run(code: string, opts: Object = {}): any {
+ return new Function(transform(code, opts).code)();
+}
+
+export function load(url: string, callback: Function, opts: Object = {}, hold?: boolean) {
+ opts.filename = opts.filename || url;
+
+ let xhr = global.ActiveXObject ? new global.ActiveXObject("Microsoft.XMLHTTP") : new global.XMLHttpRequest();
+ xhr.open("GET", url, true);
+ if ("overrideMimeType" in xhr) xhr.overrideMimeType("text/plain");
+
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState !== 4) return;
+
+ let status = xhr.status;
+ if (status === 0 || status === 200) {
+ let param = [xhr.responseText, opts];
+ if (!hold) run(param);
+ if (callback) callback(param);
+ } else {
+ throw new Error(`Could not load ${url}`);
+ }
+ };
+
+ xhr.send(null);
+}
+
+function runScripts() {
+ let scripts: Array | Object> = [];
+ let types = ["text/ecmascript-6", "text/6to5", "text/babel", "module"];
+ let index = 0;
+
+ /**
+ * Transform and execute script. Ensures correct load order.
+ */
+
+ function exec() {
+ let param = scripts[index];
+ if (param instanceof Array) {
+ run(param, index);
+ index++;
+ exec();
+ }
+ }
+
+ /**
+ * Load, transform, and execute all scripts.
+ */
+
+ function run(script: Object, i: number) {
+ let opts = {};
+
+ if (script.src) {
+ load(script.src, function (param) {
+ scripts[i] = param;
+ exec();
+ }, opts, true);
+ } else {
+ opts.filename = "embedded";
+ scripts[i] = [script.innerHTML, opts];
+ }
+ }
+
+ // Collect scripts with Babel `types`.
+
+ let _scripts = global.document.getElementsByTagName("script");
+
+ for (let i = 0; i < _scripts.length; ++i) {
+ let _script = _scripts[i];
+ if (types.indexOf(_script.type) >= 0) scripts.push(_script);
+ }
+
+ for (let i = 0; i < scripts.length; i++) {
+ run(scripts[i], i);
+ }
+
+ exec();
+}
+
+/**
+ * Register load event to transform and execute scripts.
+ */
+
+if (global.addEventListener) {
+ global.addEventListener("DOMContentLoaded", runScripts, false);
+} else if (global.attachEvent) {
+ global.attachEvent("onload", runScripts);
+}
diff --git a/packages/babel-core/src/api/node.js b/packages/babel-core/src/api/node.js
new file mode 100644
index 0000000000..dcb666ecc2
--- /dev/null
+++ b/packages/babel-core/src/api/node.js
@@ -0,0 +1,65 @@
+/* @flow */
+
+import isFunction from "lodash/lang/isFunction";
+import fs from "fs";
+
+
+export { default as File } from "../transformation/file";
+export { default as options } from "../transformation/file/options/config";
+export { default as buildExternalHelpers } from "../tools/build-external-helpers";
+export { default as template } from "babel-template";
+export { version } from "../../package";
+
+//
+
+import * as util from "../util";
+export { util };
+
+import * as messages from "babel-messages";
+export { messages };
+
+import * as t from "babel-types";
+export { t as types };
+
+//
+
+import Pipeline from "../transformation/pipeline";
+export { Pipeline };
+
+let pipeline = new Pipeline;
+export let transform = pipeline.transform.bind(pipeline);
+export let transformFromAst = pipeline.transformFromAst.bind(pipeline);
+
+//
+
+export function transformFile(filename: string, opts?: Object, callback: Function) {
+ if (isFunction(opts)) {
+ callback = opts;
+ opts = {};
+ }
+
+ opts.filename = filename;
+
+ fs.readFile(filename, function (err, code) {
+ let result;
+
+ if (!err) {
+ try {
+ result = transform(code, opts);
+ } catch (_err) {
+ err = _err;
+ }
+ }
+
+ if (err) {
+ callback(err);
+ } else {
+ callback(null, result);
+ }
+ });
+}
+
+export function transformFileSync(filename: string, opts?: Object = {}): string {
+ opts.filename = filename;
+ return transform(fs.readFileSync(filename, "utf8"), opts);
+}
diff --git a/packages/babel-core/src/api/register/browser.js b/packages/babel-core/src/api/register/browser.js
new file mode 100644
index 0000000000..cd9e975861
--- /dev/null
+++ b/packages/babel-core/src/api/register/browser.js
@@ -0,0 +1,3 @@
+// required to safely use babel/register within a browserify codebase
+
+export default function () {}
diff --git a/packages/babel/src/api/register/cache.js b/packages/babel-core/src/api/register/cache.js
similarity index 96%
rename from packages/babel/src/api/register/cache.js
rename to packages/babel-core/src/api/register/cache.js
index 73ab94b175..d02b8694e1 100644
--- a/packages/babel/src/api/register/cache.js
+++ b/packages/babel-core/src/api/register/cache.js
@@ -1,10 +1,12 @@
+/* @flow */
+
import path from "path";
import fs from "fs";
import homeOrTmp from "home-or-tmp";
import pathExists from "path-exists";
const FILENAME = process.env.BABEL_CACHE_PATH || path.join(homeOrTmp, ".babel.json");
-var data = {};
+let data = {};
/**
* Write stringified cache to disk.
diff --git a/packages/babel-core/src/api/register/node.js b/packages/babel-core/src/api/register/node.js
new file mode 100644
index 0000000000..8f2878ef82
--- /dev/null
+++ b/packages/babel-core/src/api/register/node.js
@@ -0,0 +1,145 @@
+/* @flow */
+
+import deepClone from "lodash/lang/cloneDeep";
+import sourceMapSupport from "source-map-support";
+import * as registerCache from "./cache";
+import OptionManager from "../../transformation/file/options/option-manager";
+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 path from "path";
+
+sourceMapSupport.install({
+ handleUncaughtExceptions: false,
+ retrieveSourceMap(source) {
+ let map = maps && maps[source];
+ if (map) {
+ return {
+ url: null,
+ map: map
+ };
+ } else {
+ return null;
+ }
+ }
+});
+
+registerCache.load();
+let cache = registerCache.get();
+
+let transformOpts = {};
+
+let ignore;
+let only;
+
+let oldHandlers = {};
+let maps = {};
+
+let cwd = process.cwd();
+
+function getRelativePath(filename){
+ return path.relative(cwd, filename);
+}
+
+function mtime(filename) {
+ return +fs.statSync(filename).mtime;
+}
+
+function compile(filename, opts = {}) {
+ let result;
+
+ opts.filename = filename;
+
+ let optsManager = new OptionManager;
+ optsManager.mergeOptions(deepClone(transformOpts));
+ opts = optsManager.init(opts);
+
+ let cacheKey = `${JSON.stringify(opts)}:${babel.version}`;
+
+ let env = process.env.BABEL_ENV || process.env.NODE_ENV;
+ if (env) cacheKey += `:${env}`;
+
+ if (cache) {
+ let cached = cache[cacheKey];
+ if (cached && cached.mtime === mtime(filename)) {
+ result = cached;
+ }
+ }
+
+ if (!result) {
+ result = babel.transformFileSync(filename, extend(opts, {
+ sourceMap: "both",
+ ast: false
+ }));
+ }
+
+ if (cache) {
+ cache[cacheKey] = result;
+ result.mtime = mtime(filename);
+ }
+
+ maps[filename] = result.map;
+
+ return result.code;
+}
+
+function shouldIgnore(filename) {
+ if (!ignore && !only) {
+ return getRelativePath(filename).split(path.sep).indexOf("node_modules") >= 0;
+ } else {
+ return util.shouldIgnore(filename, ignore || [], only);
+ }
+}
+
+function loader(m, filename) {
+ m._compile(compile(filename), filename);
+}
+
+function registerExtension(ext) {
+ let old = oldHandlers[ext] || oldHandlers[".js"] || require.extensions[".js"];
+
+ require.extensions[ext] = function (m, filename) {
+ if (shouldIgnore(filename)) {
+ old(m, filename);
+ } else {
+ loader(m, filename, old);
+ }
+ };
+}
+
+function hookExtensions(_exts) {
+ each(oldHandlers, function (old, ext) {
+ if (old === undefined) {
+ delete require.extensions[ext];
+ } else {
+ require.extensions[ext] = old;
+ }
+ });
+
+ oldHandlers = {};
+
+ each(_exts, function (ext) {
+ oldHandlers[ext] = require.extensions[ext];
+ registerExtension(ext);
+ });
+}
+
+hookExtensions(util.canCompile.EXTENSIONS);
+
+export default function (opts?: Object = {}) {
+ if (opts.only != null) only = util.arrayify(opts.only, util.regexify);
+ if (opts.ignore != null) ignore = util.arrayify(opts.ignore, util.regexify);
+
+ if (opts.extensions) hookExtensions(util.arrayify(opts.extensions));
+
+ if (opts.cache === false) cache = null;
+
+ delete opts.extensions;
+ delete opts.ignore;
+ delete opts.cache;
+ delete opts.only;
+
+ extend(transformOpts, opts);
+}
diff --git a/packages/babel-core/src/helpers/merge.js b/packages/babel-core/src/helpers/merge.js
new file mode 100644
index 0000000000..71eacdbf2c
--- /dev/null
+++ b/packages/babel-core/src/helpers/merge.js
@@ -0,0 +1,19 @@
+/* @flow */
+
+import merge from "lodash/object/merge";
+
+export default function (dest?: Object, src?: Object): ?Object {
+ if (!dest || !src) return;
+
+ return merge(dest, src, function (a, b) {
+ if (b && Array.isArray(a)) {
+ let c = a.slice(0);
+ for (let v of b) {
+ if (a.indexOf(v) < 0) {
+ c.push(v);
+ }
+ }
+ return c;
+ }
+ });
+}
diff --git a/packages/babel-core/src/helpers/normalize-ast.js b/packages/babel-core/src/helpers/normalize-ast.js
new file mode 100644
index 0000000000..cd8881a9fd
--- /dev/null
+++ b/packages/babel-core/src/helpers/normalize-ast.js
@@ -0,0 +1,25 @@
+/* @flow */
+
+import * as t from "babel-types";
+
+/**
+ * Normalize an AST.
+ *
+ * - Wrap `Program` node with a `File` node.
+ */
+
+export default function (
+ ast: Object,
+ comments?: Array,
+ tokens?: Array,
+) {
+ if (ast) {
+ if (ast.type === "Program") {
+ return t.file(ast, comments || [], tokens || []);
+ } else if (ast.type === "File") {
+ return ast;
+ }
+ }
+
+ throw new Error("Not a valid ast?");
+}
diff --git a/packages/babel-core/src/helpers/resolve.js b/packages/babel-core/src/helpers/resolve.js
new file mode 100644
index 0000000000..369fc718d4
--- /dev/null
+++ b/packages/babel-core/src/helpers/resolve.js
@@ -0,0 +1,24 @@
+/* @flow */
+
+import Module from "module";
+
+let relativeModules = {};
+
+export default function (loc: string, relative: string = process.cwd()): ?string {
+ // we're in the browser, probably
+ if (typeof Module === "object") return null;
+
+ let relativeMod = relativeModules[relative];
+
+ if (!relativeMod) {
+ relativeMod = new Module;
+ relativeMod.paths = Module._nodeModulePaths(relative);
+ relativeModules[relative] = relativeMod;
+ }
+
+ try {
+ return Module._resolveFilename(loc, relativeMod);
+ } catch (err) {
+ return null;
+ }
+}
diff --git a/packages/babel-core/src/store.js b/packages/babel-core/src/store.js
new file mode 100644
index 0000000000..5783fc82f7
--- /dev/null
+++ b/packages/babel-core/src/store.js
@@ -0,0 +1,26 @@
+/* @flow */
+
+export default class Store extends Map {
+ constructor() {
+ super();
+ this.dynamicData = {};
+ }
+
+ dynamicData: Object;
+
+ setDynamic(key, fn) {
+ this.dynamicData[key] = fn;
+ }
+
+ get(key: string): any {
+ if (this.has(key)) {
+ return super.get(key);
+ } else {
+ if (Object.prototype.hasOwnProperty.call(this.dynamicData, key)) {
+ let val = this.dynamicData[key]();
+ this.set(key, val);
+ return val;
+ }
+ }
+ }
+}
diff --git a/packages/babel-core/src/tools/build-external-helpers.js b/packages/babel-core/src/tools/build-external-helpers.js
new file mode 100644
index 0000000000..bf70bb2da2
--- /dev/null
+++ b/packages/babel-core/src/tools/build-external-helpers.js
@@ -0,0 +1,110 @@
+/* @flow */
+
+import * as helpers from "babel-helpers";
+import generator from "babel-generator";
+import * as messages from "babel-messages";
+import template from "babel-template";
+import each from "lodash/collection/each";
+import * as t from "babel-types";
+
+let buildUmdWrapper = template(`
+ (function (root, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(AMD_ARGUMENTS, factory);
+ } else if (typeof exports === "object") {
+ factory(COMMON_ARGUMENTS);
+ } else {
+ factory(BROWSER_ARGUMENTS);
+ }
+ })(UMD_ROOT, function (FACTORY_PARAMETERS) {
+ FACTORY_BODY
+ });
+`);
+
+function buildGlobal(namespace, builder) {
+ let body = [];
+ let container = t.functionExpression(null, [t.identifier("global")], t.blockStatement(body));
+ let tree = t.program([t.expressionStatement(t.callExpression(container, [helpers.get("selfGlobal")]))]);
+
+ body.push(t.variableDeclaration("var", [
+ t.variableDeclarator(
+ namespace,
+ t.assignmentExpression("=", t.memberExpression(t.identifier("global"), namespace), t.objectExpression([]))
+ )
+ ]));
+
+ builder(body);
+
+ return tree;
+}
+
+function buildUmd(namespace, builder) {
+ let body = [];
+ body.push(t.variableDeclaration("var", [
+ t.variableDeclarator(namespace, t.identifier("global"))
+ ]));
+
+ builder(body);
+
+ return t.program([
+ buildUmdWrapper({
+ FACTORY_PARAMETERS: t.identifier("global"),
+ BROWSER_ARGUMENTS: t.assignmentExpression(
+ "=",
+ t.memberExpression(t.identifier("root"), namespace),
+ t.objectExpression([])
+ ),
+ COMMON_ARGUMENTS: t.identifier("exports"),
+ AMD_ARGUMENTS: t.arrayExpression([t.stringLiteral("exports")]),
+ FACTORY_BODY: body,
+ UMD_ROOT: t.identifier("this")
+ })
+ ]);
+}
+
+function buildVar(namespace, builder) {
+ let body = [];
+ body.push(t.variableDeclaration("var", [
+ t.variableDeclarator(namespace, t.objectExpression([]))
+ ]));
+ builder(body);
+ return t.program(body);
+}
+
+function buildHelpers(body, namespace, whitelist) {
+ each(helpers.list, function (name) {
+ if (whitelist && whitelist.indexOf(name) === -1) return;
+
+ let key = t.identifier(t.toIdentifier(name));
+ body.push(t.expressionStatement(
+ t.assignmentExpression("=", t.memberExpression(namespace, key), helpers.get(name))
+ ));
+ });
+}
+
+export default function (
+ whitelist?: Array,
+ outputType: "global" | "umd" | "var" = "global",
+) {
+ let namespace = t.identifier("babelHelpers");
+
+ let builder = function (body) {
+ return buildHelpers(body, namespace, whitelist);
+ };
+
+ let tree;
+
+ let build = {
+ global: buildGlobal,
+ umd: buildUmd,
+ var: buildVar
+ }[outputType];
+
+ if (build) {
+ tree = build(namespace, builder);
+ } else {
+ throw new Error(messages.get("unsupportedOutputType", outputType));
+ }
+
+ return generator(tree).code;
+}
diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js
new file mode 100644
index 0000000000..02034369ea
--- /dev/null
+++ b/packages/babel-core/src/transformation/file/index.js
@@ -0,0 +1,555 @@
+/* @flow */
+/* global BabelParserOptions */
+/* global BabelFileMetadata */
+/* global BabelFileResult */
+
+import getHelper from "babel-helpers";
+import * as metadataVisitor from "./metadata";
+import convertSourceMap from "convert-source-map";
+import OptionManager from "./options/option-manager";
+import type Pipeline from "../pipeline";
+import type Plugin from "../plugin";
+import PluginPass from "../plugin-pass";
+import shebangRegex from "shebang-regex";
+import { NodePath, Hub, Scope } from "babel-traverse";
+import sourceMap from "source-map";
+import generate from "babel-generator";
+import codeFrame from "babel-code-frame";
+import defaults from "lodash/object/defaults";
+import traverse from "babel-traverse";
+import Logger from "./logger";
+import Store from "../../store";
+import { parse } from "babylon";
+import * as util from "../../util";
+import path from "path";
+import * as t from "babel-types";
+
+import blockHoistPlugin from "../internal-plugins/block-hoist";
+import shadowFunctionsPlugin from "../internal-plugins/shadow-functions";
+
+const INTERNAL_PLUGINS = [
+ [blockHoistPlugin],
+ [shadowFunctionsPlugin]
+];
+
+let errorVisitor = {
+ enter(path, state) {
+ let loc = path.node.loc;
+ if (loc) {
+ state.loc = loc;
+ path.stop();
+ }
+ }
+};
+
+export default class File extends Store {
+ constructor(opts: Object = {}, pipeline: Pipeline) {
+ super();
+
+ this.pipeline = pipeline;
+
+ this.log = new Logger(this, opts.filename || "unknown");
+ this.opts = this.initOptions(opts);
+
+ this.parserOpts = {
+ highlightCode: this.opts.highlightCode,
+ nonStandard: this.opts.nonStandard,
+ sourceType: this.opts.sourceType,
+ filename: this.opts.filename,
+ plugins: []
+ };
+
+ this.pluginVisitors = [];
+ this.pluginPasses = [];
+ this.pluginStack = [];
+ this.buildPlugins();
+
+ this.metadata = {
+ usedHelpers: [],
+ marked: [],
+ modules: {
+ imports: [],
+ exports: {
+ exported: [],
+ specifiers: []
+ }
+ }
+ };
+
+ this.dynamicImportTypes = {};
+ this.dynamicImportIds = {};
+ this.dynamicImports = [];
+ this.declarations = {};
+ this.usedHelpers = {};
+
+ this.path = null;
+ this.ast = {};
+
+ this.code = "";
+ this.shebang = "";
+
+ this.hub = new Hub(this);
+ }
+
+ static helpers: Array;
+
+ pluginVisitors: Array;
+ pluginPasses: Array;
+ pluginStack: Array;
+ pipeline: Pipeline;
+ parserOpts: BabelParserOptions;
+ log: Logger;
+ opts: Object;
+ dynamicImportTypes: Object;
+ dynamicImportIds: Object;
+ dynamicImports: Array;
+ declarations: Object;
+ usedHelpers: Object;
+ path: NodePath;
+ ast: Object;
+ scope: Scope;
+ metadata: BabelFileMetadata;
+ hub: Hub;
+ code: string;
+ shebang: string;
+
+ getMetadata() {
+ let has = false;
+ for (let node of (this.ast.program.body: Array)) {
+ if (t.isModuleDeclaration(node)) {
+ has = true;
+ break;
+ }
+ }
+ if (has) {
+ this.path.traverse(metadataVisitor, this);
+ }
+ }
+
+ initOptions(opts) {
+ opts = new OptionManager(this.log, this.pipeline).init(opts);
+
+ if (opts.inputSourceMap) {
+ opts.sourceMaps = true;
+ }
+
+ if (opts.moduleId) {
+ opts.moduleIds = true;
+ }
+
+ opts.basename = path.basename(opts.filename, path.extname(opts.filename));
+
+ opts.ignore = util.arrayify(opts.ignore, util.regexify);
+
+ if (opts.only) opts.only = util.arrayify(opts.only, util.regexify);
+
+ defaults(opts, {
+ moduleRoot: opts.sourceRoot
+ });
+
+ defaults(opts, {
+ sourceRoot: opts.moduleRoot
+ });
+
+ defaults(opts, {
+ filenameRelative: opts.filename
+ });
+
+ let basenameRelative = path.basename(opts.filenameRelative);
+
+ defaults(opts, {
+ sourceFileName: basenameRelative,
+ sourceMapTarget: basenameRelative
+ });
+
+ return opts;
+ }
+
+ buildPlugins() {
+ let plugins: Array<[PluginPass, Object]> = this.opts.plugins.concat(INTERNAL_PLUGINS);
+
+ // init plugins!
+ for (let ref of plugins) {
+ let [plugin, pluginOpts] = ref; // todo: fix - can't embed in loop head because of flow bug
+
+ this.pluginStack.push(plugin);
+ this.pluginVisitors.push(plugin.visitor);
+ this.pluginPasses.push(new PluginPass(this, plugin, pluginOpts));
+
+ if (plugin.manipulateOptions) {
+ plugin.manipulateOptions(this.opts, this.parserOpts, this);
+ }
+ }
+ }
+
+ getModuleName(): ?string {
+ let opts = this.opts;
+ if (!opts.moduleIds) {
+ return null;
+ }
+
+ // moduleId is n/a if a `getModuleId()` is provided
+ if (opts.moduleId != null && !opts.getModuleId) {
+ return opts.moduleId;
+ }
+
+ let filenameRelative = opts.filenameRelative;
+ let moduleName = "";
+
+ if (opts.moduleRoot != null) {
+ moduleName = opts.moduleRoot + "/";
+ }
+
+ if (!opts.filenameRelative) {
+ return moduleName + opts.filename.replace(/^\//, "");
+ }
+
+ if (opts.sourceRoot != null) {
+ // remove sourceRoot from filename
+ let sourceRootRegEx = new RegExp("^" + opts.sourceRoot + "\/?");
+ filenameRelative = filenameRelative.replace(sourceRootRegEx, "");
+ }
+
+ // remove extension
+ filenameRelative = filenameRelative.replace(/\.(\w*?)$/, "");
+
+ moduleName += filenameRelative;
+
+ // normalize path separators
+ moduleName = moduleName.replace(/\\/g, "/");
+
+ if (opts.getModuleId) {
+ // If return is falsy, assume they want us to use our generated default name
+ return opts.getModuleId(moduleName) || moduleName;
+ } else {
+ return moduleName;
+ }
+ }
+
+ resolveModuleSource(source: string): string {
+ let resolveModuleSource = this.opts.resolveModuleSource;
+ if (resolveModuleSource) source = resolveModuleSource(source, this.opts.filename);
+ return source;
+ }
+
+ addImport(source: string, imported: string, name?: string = imported): Object {
+ let alias = `${source}:${imported}`;
+ let id = this.dynamicImportIds[alias];
+
+ if (!id) {
+ source = this.resolveModuleSource(source);
+ id = this.dynamicImportIds[alias] = this.scope.generateUidIdentifier(name);
+
+ let specifiers = [];
+
+ if (imported === "*") {
+ specifiers.push(t.importNamespaceSpecifier(id));
+ } else if (imported === "default") {
+ specifiers.push(t.importDefaultSpecifier(id));
+ } else {
+ specifiers.push(t.importSpecifier(id, t.identifier(imported)));
+ }
+
+ let declar = t.importDeclaration(specifiers, t.stringLiteral(source));
+ declar._blockHoist = 3;
+
+ this.path.unshiftContainer("body", declar);
+ }
+
+ return id;
+ }
+
+ addHelper(name: string): Object {
+ let declar = this.declarations[name];
+ if (declar) return declar;
+
+ if (!this.usedHelpers[name]) {
+ this.metadata.usedHelpers.push(name);
+ this.usedHelpers[name] = true;
+ }
+
+ let generator = this.get("helperGenerator");
+ let runtime = this.get("helpersNamespace");
+ if (generator) {
+ return generator(name);
+ } else if (runtime) {
+ let id = t.identifier(t.toIdentifier(name));
+ return t.memberExpression(runtime, id);
+ }
+
+ let ref = getHelper(name);
+ let uid = this.declarations[name] = this.scope.generateUidIdentifier(name);
+
+ if (t.isFunctionExpression(ref) && !ref.id) {
+ ref.body._compact = true;
+ ref._generated = true;
+ ref.id = uid;
+ ref.type = "FunctionDeclaration";
+ this.path.unshiftContainer("body", ref);
+ } else {
+ ref._compact = true;
+ this.scope.push({
+ id: uid,
+ init: ref,
+ unique: true
+ });
+ }
+
+ return uid;
+ }
+
+ addTemplateObject(
+ helperName: string,
+ strings: Array,
+ raw: Object,
+ ): Object {
+ // Generate a unique name based on the string literals so we dedupe
+ // identical strings used in the program.
+ let stringIds = raw.elements.map(function(string) {
+ return string.value;
+ });
+ let name = `${helperName}_${raw.elements.length}_${stringIds.join(",")}`;
+
+ let declar = this.declarations[name];
+ if (declar) return declar;
+
+ let uid = this.declarations[name] = this.scope.generateUidIdentifier("templateObject");
+
+ let helperId = this.addHelper(helperName);
+ let init = t.callExpression(helperId, [strings, raw]);
+ init._compact = true;
+ this.scope.push({
+ id: uid,
+ init: init,
+ _blockHoist: 1.9 // This ensures that we don't fail if not using function expression helpers
+ });
+ return uid;
+ }
+
+ buildCodeFrameError(node: Object, msg: string, Error: typeof Error = SyntaxError): Error {
+ let loc = node && (node.loc || node._loc);
+
+ let err = new Error(msg);
+
+ if (loc) {
+ err.loc = loc.start;
+ } else {
+ traverse(node, errorVisitor, this.scope, err);
+
+ err.message += " (This is an error on an internal node. Probably an internal error";
+
+ if (err.loc) {
+ err.message += ". Location has been estimated.";
+ }
+
+ err.message += ")";
+ }
+
+ return err
+ }
+
+ mergeSourceMap(map: Object) {
+ let inputMap = this.opts.inputSourceMap;
+
+ if (inputMap) {
+ let inputMapConsumer = new sourceMap.SourceMapConsumer(inputMap);
+ let outputMapConsumer = new sourceMap.SourceMapConsumer(map);
+ let outputMapGenerator = sourceMap.SourceMapGenerator.fromSourceMap(outputMapConsumer);
+ outputMapGenerator.applySourceMap(inputMapConsumer);
+
+ let mergedMap = outputMapGenerator.toJSON();
+ mergedMap.sources = inputMap.sources;
+ mergedMap.file = inputMap.file;
+ return mergedMap;
+ } else {
+ return map;
+ }
+ }
+
+ parse(code: string) {
+ this.log.debug("Parse start");
+ let ast = parse(code, this.parserOpts);
+ this.log.debug("Parse stop");
+ return ast;
+ }
+
+ _addAst(ast) {
+ this.path = NodePath.get({
+ hub: this.hub,
+ parentPath: null,
+ parent: ast,
+ container: ast,
+ key: "program"
+ }).setContext();
+ this.scope = this.path.scope;
+ this.ast = ast;
+ this.getMetadata();
+ }
+
+ addAst(ast) {
+ this.log.debug("Start set AST");
+ this._addAst(ast);
+ this.log.debug("End set AST");
+ }
+
+ transform(): BabelFileResult {
+ this.call("pre");
+ this.log.debug(`Start transform traverse`);
+ traverse(this.ast, traverse.visitors.merge(this.pluginVisitors, this.pluginPasses), this.scope);
+ this.log.debug(`End transform traverse`);
+ this.call("post");
+ return this.generate();
+ }
+
+ wrap(code: string, callback: Function): BabelFileResult {
+ code = code + "";
+
+ try {
+ if (this.shouldIgnore()) {
+ return this.makeResult({ code, ignored: true });
+ } else {
+ return callback();
+ }
+ } catch (err) {
+ if (err._babel) {
+ throw err;
+ } else {
+ err._babel = true;
+ }
+
+ let message = err.message = `${this.opts.filename}: ${err.message}`;
+
+ let loc = err.loc;
+ if (loc) {
+ err.codeFrame = codeFrame(code, loc.line, loc.column + 1, this.opts);
+ message += "\n" + err.codeFrame;
+ }
+
+ if (process.browser) {
+ // chrome has it's own pretty stringifier which doesn't use the stack property
+ // https://github.com/babel/babel/issues/2175
+ err.message = message;
+ }
+
+ if (err.stack) {
+ let newStack = err.stack.replace(err.message, message);
+ try {
+ err.stack = newStack;
+ } catch (e) {
+ // `err.stack` may be a readonly property in some environments
+ }
+ }
+
+ throw err;
+ }
+ }
+
+ addCode(code: string) {
+ code = (code || "") + "";
+ code = this.parseInputSourceMap(code);
+ this.code = code;
+ }
+
+ parseCode() {
+ this.parseShebang();
+ let ast = this.parse(this.code);
+ this.addAst(ast);
+ }
+
+ shouldIgnore() {
+ let opts = this.opts;
+ return util.shouldIgnore(opts.filename, opts.ignore, opts.only);
+ }
+
+ call(key: "pre" | "post") {
+ for (let pass of (this.pluginPasses: Array)) {
+ let plugin = pass.plugin;
+ let fn = plugin[key];
+ if (fn) fn.call(pass, this, pass);
+ }
+ }
+
+ parseInputSourceMap(code: string): string {
+ let opts = this.opts;
+
+ if (opts.inputSourceMap !== false) {
+ let inputMap = convertSourceMap.fromSource(code);
+ if (inputMap) {
+ opts.inputSourceMap = inputMap.toObject();
+ code = convertSourceMap.removeComments(code);
+ }
+ }
+
+ return code;
+ }
+
+ parseShebang() {
+ let shebangMatch = shebangRegex.exec(this.code);
+ if (shebangMatch) {
+ this.shebang = shebangMatch[0];
+ this.code = this.code.replace(shebangRegex, "");
+ }
+ }
+
+ makeResult({ code, map, ast, ignored }: BabelFileResult): BabelFileResult {
+ let result = {
+ metadata: null,
+ options: this.opts,
+ ignored: !!ignored,
+ code: null,
+ ast: null,
+ map: map || null
+ };
+
+ if (this.opts.code) {
+ result.code = code;
+ }
+
+ if (this.opts.ast) {
+ result.ast = ast;
+ }
+
+ if (this.opts.metadata) {
+ result.metadata = this.metadata;
+ }
+
+ return result;
+ }
+
+ generate(): BabelFileResult {
+ let opts = this.opts;
+ let ast = this.ast;
+
+ let result: BabelFileResult = { ast };
+ if (!opts.code) return this.makeResult(result);
+
+ this.log.debug("Generation start");
+
+ let _result = generate(ast, opts, this.code);
+ result.code = _result.code;
+ result.map = _result.map;
+
+ this.log.debug("Generation end");
+
+ if (this.shebang) {
+ // add back shebang
+ result.code = `${this.shebang}${result.code}`;
+ }
+
+ if (result.map) {
+ result.map = this.mergeSourceMap(result.map);
+ }
+
+ if (opts.sourceMaps === "inline" || opts.sourceMaps === "both") {
+ result.code += "\n" + convertSourceMap.fromObject(result.map).toComment();
+ }
+
+ if (opts.sourceMaps === "inline") {
+ result.map = null;
+ }
+
+ return this.makeResult(result);
+ }
+}
+
+export { File };
diff --git a/packages/babel-core/src/transformation/file/logger.js b/packages/babel-core/src/transformation/file/logger.js
new file mode 100644
index 0000000000..5655f67ca0
--- /dev/null
+++ b/packages/babel-core/src/transformation/file/logger.js
@@ -0,0 +1,59 @@
+/* @flow */
+
+import type File from "./index";
+import buildDebug from "debug/node";
+
+let verboseDebug = buildDebug("babel:verbose");
+let generalDebug = buildDebug("babel");
+
+let seenDeprecatedMessages = [];
+
+export default class Logger {
+ constructor(file: File, filename: string) {
+ this.filename = filename;
+ this.file = file;
+ }
+
+ filename: string;
+ file: File;
+
+ _buildMessage(msg: string): string {
+ let parts = `[BABEL] ${this.filename}`;
+ if (msg) parts += `: ${msg}`;
+ return parts;
+ }
+
+ warn(msg: string) {
+ console.warn(this._buildMessage(msg));
+ }
+
+ error(msg: string, Constructor: typeof Error = Error): Error {
+ throw new Constructor(this._buildMessage(msg));
+ }
+
+ deprecate(msg: string) {
+ if (this.file.opts && this.file.opts.suppressDeprecationMessages) return;
+
+ msg = this._buildMessage(msg);
+
+ // already seen this message
+ if (seenDeprecatedMessages.indexOf(msg) >= 0) return;
+
+ // make sure we don't see it again
+ seenDeprecatedMessages.push(msg);
+
+ console.error(msg);
+ }
+
+ verbose(msg: string) {
+ if (verboseDebug.enabled) verboseDebug(this._buildMessage(msg));
+ }
+
+ debug(msg: string) {
+ if (generalDebug.enabled) generalDebug(this._buildMessage(msg));
+ }
+
+ deopt(node: Object, msg: string) {
+ this.debug(msg);
+ }
+}
diff --git a/packages/babel-core/src/transformation/file/metadata.js b/packages/babel-core/src/transformation/file/metadata.js
new file mode 100644
index 0000000000..35744f971e
--- /dev/null
+++ b/packages/babel-core/src/transformation/file/metadata.js
@@ -0,0 +1,142 @@
+/* @flow */
+
+import * as t from "babel-types";
+
+export let ModuleDeclaration = {
+ enter(path, file) {
+ let { node } = path;
+ if (node.source) {
+ node.source.value = file.resolveModuleSource(node.source.value);
+ }
+ }
+};
+
+export let ImportDeclaration = {
+ exit(path, file) {
+ let { node } = path;
+
+ let specifiers = [];
+ let imported = [];
+ file.metadata.modules.imports.push({
+ source: node.source.value,
+ imported,
+ specifiers
+ });
+
+ for (let specifier of (path.get("specifiers"): Array)) {
+ let local = specifier.node.local.name;
+
+ if (specifier.isImportDefaultSpecifier()) {
+ imported.push("default");
+ specifiers.push({
+ kind: "named",
+ imported: "default",
+ local
+ });
+ }
+
+ if (specifier.isImportSpecifier()) {
+ let importedName = specifier.node.imported.name;
+ imported.push(importedName);
+ specifiers.push({
+ kind: "named",
+ imported: importedName,
+ local
+ });
+ }
+
+ if (specifier.isImportNamespaceSpecifier()) {
+ imported.push("*");
+ specifiers.push({
+ kind: "namespace",
+ local
+ });
+ }
+ }
+ }
+};
+
+export function ExportDeclaration(path, file) {
+ let { node } = path;
+
+ let source = node.source ? node.source.value : null;
+ let exports = file.metadata.modules.exports;
+
+ // export function foo() {}
+ // export let foo = "bar";
+ let declar = path.get("declaration");
+ if (declar.isStatement()) {
+ let bindings = declar.getBindingIdentifiers();
+
+ for (let name in bindings) {
+ exports.exported.push(name);
+ exports.specifiers.push({
+ kind: "local",
+ local: name,
+ exported: path.isExportDefaultDeclaration() ? "default" : name
+ });
+ }
+ }
+
+ if (path.isExportNamedDeclaration() && node.specifiers) {
+ for (let specifier of (node.specifiers: Array)) {
+ let 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
+ });
+ }
+
+ let local = specifier.local;
+ if (!local) continue;
+
+ // 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 (path.isExportAllDeclaration()) {
+ exports.specifiers.push({
+ kind: "external-all",
+ source
+ });
+ }
+}
+
+export function Scope(path) {
+ path.skip();
+}
diff --git a/packages/babel-core/src/transformation/file/options/config.json b/packages/babel-core/src/transformation/file/options/config.json
new file mode 100644
index 0000000000..3810e0d1ee
--- /dev/null
+++ b/packages/babel-core/src/transformation/file/options/config.json
@@ -0,0 +1,171 @@
+{
+ "filename": {
+ "type": "filename",
+ "description": "filename to use when reading from stdin - this will be used in source-maps, errors etc",
+ "default": "unknown",
+ "shorthand": "f"
+ },
+
+ "filenameRelative": {
+ "hidden": true,
+ "type": "string"
+ },
+
+ "inputSourceMap": {
+ "hidden": true
+ },
+
+ "env": {
+ "hidden": true,
+ "default": {}
+ },
+
+ "mode": {
+ "description": "",
+ "hidden": true
+ },
+
+ "retainLines": {
+ "type": "boolean",
+ "default": false,
+ "description": "retain line numbers - will result in really ugly code"
+ },
+
+ "highlightCode": {
+ "description": "enable/disable ANSI syntax highlighting of code frames (on by default)",
+ "type": "boolean",
+ "default": true
+ },
+
+ "suppressDeprecationMessages": {
+ "type": "boolean",
+ "default": false,
+ "hidden": true
+ },
+
+ "presets": {
+ "type": "list",
+ "description": "",
+ "default": []
+ },
+
+ "plugins": {
+ "type": "list",
+ "default": [],
+ "description": ""
+ },
+
+ "ignore": {
+ "type": "list",
+ "description": "list of glob paths to **not** compile",
+ "default": []
+ },
+
+ "only": {
+ "type": "list",
+ "description": "list of glob paths to **only** compile"
+ },
+
+ "code": {
+ "hidden": true,
+ "default": true,
+ "type": "boolean"
+ },
+
+ "metadata": {
+ "hidden": true,
+ "default": true,
+ "type": "boolean"
+ },
+
+ "ast": {
+ "hidden": true,
+ "default": true,
+ "type": "boolean"
+ },
+
+ "comments": {
+ "type": "boolean",
+ "default": true,
+ "description": "strip/output comments in generated output (on by default)"
+ },
+
+ "shouldPrintComment": {
+ "hidden": true,
+ "description": "optional callback to control whether a comment should be inserted, when this is used the comments option is ignored"
+ },
+
+ "compact": {
+ "type": "booleanString",
+ "default": "auto",
+ "description": "do not include superfluous whitespace characters and line terminators [true|false|auto]"
+ },
+
+ "sourceMap": {
+ "alias": "sourceMaps",
+ "hidden": true
+ },
+
+ "sourceMaps": {
+ "type": "booleanString",
+ "description": "[true|false|inline]",
+ "default": false,
+ "shorthand": "s"
+ },
+
+ "sourceMapTarget": {
+ "type": "string",
+ "description": "set `file` on returned source map"
+ },
+
+ "sourceFileName": {
+ "type": "string",
+ "description": "set `sources[0]` on returned source map"
+ },
+
+ "sourceRoot": {
+ "type": "filename",
+ "description": "the root from which all sources are relative"
+ },
+
+ "babelrc": {
+ "description": "Whether or not to look up .babelrc and .babelignore files",
+ "type": "boolean",
+ "default": true
+ },
+
+ "sourceType": {
+ "description": "",
+ "default": "module"
+ },
+
+ "auxiliaryComment": {
+ "description": "",
+ "type": "string"
+ },
+
+ "resolveModuleSource": {
+ "hidden": true
+ },
+
+ "getModuleId": {
+ "hidden": true
+ },
+
+ "moduleRoot": {
+ "type": "filename",
+ "description": "optional prefix for the AMD module formatter that will be prepend to the filename on module definitions"
+ },
+
+ "moduleIds": {
+ "type": "boolean",
+ "default": false,
+ "shorthand": "M",
+ "description": "insert an explicit id for modules"
+ },
+
+ "moduleId": {
+ "description": "specify a custom name for module ids",
+ "type": "string"
+ }
+}
diff --git a/packages/babel-core/src/transformation/file/options/index.js b/packages/babel-core/src/transformation/file/options/index.js
new file mode 100644
index 0000000000..521f8193e9
--- /dev/null
+++ b/packages/babel-core/src/transformation/file/options/index.js
@@ -0,0 +1,24 @@
+/* @flow */
+
+import * as parsers from "./parsers";
+import config from "./config";
+
+export { config };
+
+export function normaliseOptions(options: Object = {}): Object {
+ for (let key in options) {
+ let val = options[key];
+ if (val == null) continue;
+
+ let opt = config[key];
+ if (opt && opt.alias) opt = config[opt.alias];
+ if (!opt) continue;
+
+ let parser = parsers[opt.type];
+ if (parser) val = parser(val);
+
+ options[key] = val;
+ }
+
+ return options;
+}
diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/transformation/file/options/option-manager.js
new file mode 100644
index 0000000000..cdb577ac5d
--- /dev/null
+++ b/packages/babel-core/src/transformation/file/options/option-manager.js
@@ -0,0 +1,321 @@
+/* @flow */
+
+import * as context from "../../../api/node";
+import type Logger from "../logger";
+import Plugin from "../../plugin";
+import * as messages from "babel-messages";
+import { normaliseOptions } from "./index";
+import resolve from "../../../helpers/resolve";
+import json5 from "json5";
+import isAbsolute from "path-is-absolute";
+import pathExists from "path-exists";
+import cloneDeep from "lodash/lang/cloneDeep";
+import clone from "lodash/lang/clone";
+import merge from "../../../helpers/merge";
+import config from "./config";
+import path from "path";
+import fs from "fs";
+
+let existsCache = {};
+let jsonCache = {};
+
+const BABELIGNORE_FILENAME = ".babelignore";
+const BABELRC_FILENAME = ".babelrc";
+const PACKAGE_FILENAME = "package.json";
+
+function exists(filename) {
+ let cached = existsCache[filename];
+ if (cached == null) {
+ return existsCache[filename] = pathExists.sync(filename);
+ } else {
+ return cached;
+ }
+}
+
+export default class OptionManager {
+ constructor(log?: Logger) {
+ this.resolvedConfigs = [];
+ this.options = OptionManager.createBareOptions();
+ this.log = log;
+ }
+
+ resolvedConfigs: Array;
+ options: Object;
+ log: ?Logger;
+
+ static memoisedPlugins: Array<{
+ container: Function;
+ plugin: Plugin;
+ }>;
+
+ static memoisePluginContainer(fn, loc, i) {
+ for (let cache of (OptionManager.memoisedPlugins: Array)) {
+ if (cache.container === fn) return cache.plugin;
+ }
+
+ let obj;
+
+ if (typeof fn === "function") {
+ obj = fn(context);
+ } else {
+ obj = fn;
+ }
+
+ if (typeof obj === "object") {
+ let plugin = new Plugin(obj);
+ OptionManager.memoisedPlugins.push({
+ container: fn,
+ plugin: plugin
+ });
+ return plugin;
+ } else {
+ throw new TypeError(messages.get("pluginNotObject", loc, i, typeof obj) + loc + i);
+ }
+ }
+
+ static createBareOptions() {
+ let opts = {};
+
+ for (let key in config) {
+ let opt = config[key];
+ opts[key] = clone(opt.default);
+ }
+
+ return opts;
+ }
+
+ static normalisePlugin(plugin, loc, i) {
+ if (!(plugin instanceof Plugin)) {
+ // allow plugin containers to be specified so they don't have to manually require
+ if (typeof plugin === "function" || typeof plugin === "object") {
+ plugin = OptionManager.memoisePluginContainer(plugin, loc, i);
+ } else {
+ throw new TypeError(messages.get("pluginNotFunction", loc, i, typeof plugin));
+ }
+ }
+
+ plugin.init(loc, i);
+
+ return plugin;
+ }
+
+ static normalisePlugins(loc, dirname, plugins) {
+ return plugins.map(function (val, i) {
+ let plugin, options;
+
+ // destructure plugins
+ if (Array.isArray(val)) {
+ [plugin, options] = val;
+ } else {
+ plugin = val;
+ }
+
+ // allow plugins to be specified as strings
+ if (typeof plugin === "string") {
+ let pluginLoc = resolve(`babel-plugin-${plugin}`, dirname) || resolve(plugin, dirname);
+ if (pluginLoc) {
+ plugin = require(pluginLoc);
+ } else {
+ throw new ReferenceError(messages.get("pluginUnknown", plugin, loc, i));
+ }
+ }
+
+ plugin = OptionManager.normalisePlugin(plugin, loc, i);
+
+ return [plugin, options];
+ });
+ }
+
+ addConfig(loc: string, key?: string, json = json5) {
+ if (this.resolvedConfigs.indexOf(loc) >= 0) return;
+
+ let content = fs.readFileSync(loc, "utf8");
+ let opts;
+
+ try {
+ opts = jsonCache[content] = jsonCache[content] || json.parse(content);
+ if (key) opts = opts[key];
+ } catch (err) {
+ err.message = `${loc}: Error while parsing JSON - ${err.message}`;
+ throw err;
+ }
+
+ this.mergeOptions(opts, loc);
+ this.resolvedConfigs.push(loc);
+ }
+
+ /**
+ * This is called when we want to merge the input `opts` into our
+ * base options.
+ *
+ * - `alias` is used to output pretty traces back to the original source.
+ * - `loc` is used to point to the original config.
+ * - `dirname` is used to resolve plugins relative to it.
+ */
+
+ mergeOptions(rawOpts?: Object, alias: string = "foreign", loc?: string, dirname?: string) {
+ if (!rawOpts) return;
+
+ //
+ if (typeof rawOpts !== "object" || Array.isArray(rawOpts)) {
+ this.log.error(`Invalid options type for ${alias}`, TypeError);
+ }
+
+ //
+ let opts = cloneDeep(rawOpts, val => val);
+
+ //
+ dirname = dirname || process.cwd();
+ loc = loc || alias;
+
+ for (let key in opts) {
+ let option = config[key];
+
+ // check for an unknown option
+ if (!option && this.log) {
+ this.log.error(`Unknown option: ${alias}.${key}`, ReferenceError);
+ }
+ }
+
+ // normalise options
+ normaliseOptions(opts);
+
+ // resolve plugins
+ if (opts.plugins) {
+ opts.plugins = OptionManager.normalisePlugins(loc, dirname, opts.plugins);
+ }
+
+ // add extends clause
+ if (opts.extends) {
+ let extendsLoc = resolve(opts.extends, dirname);
+ if (extendsLoc) {
+ this.addConfig(extendsLoc);
+ } else {
+ if (this.log) this.log.error(`Couldn't resolve extends clause of ${opts.extends} in ${alias}`);
+ }
+ delete opts.extends;
+ }
+
+ // resolve presets
+ if (opts.presets) {
+ this.mergePresets(opts.presets, dirname);
+ delete opts.presets;
+ }
+
+ // env
+ let envOpts;
+ let envKey = process.env.BABEL_ENV || process.env.NODE_ENV || "development";
+ if (opts.env) {
+ envOpts = opts.env[envKey];
+ delete opts.env;
+ }
+
+ // merge them into this current files options
+ merge(this.options, opts);
+
+ // merge in env options
+ this.mergeOptions(envOpts, `${alias}.env.${envKey}`);
+ }
+
+ mergePresets(presets: Array, dirname: string) {
+ for (let val of presets) {
+ if (typeof val === "string") {
+ let presetLoc = resolve(`babel-preset-${val}`, dirname) || resolve(val, dirname);
+ if (presetLoc) {
+ let presetOpts = require(presetLoc);
+ this.mergeOptions(presetOpts, presetLoc, presetLoc, path.dirname(presetLoc));
+ } else {
+ throw new Error("Couldn't find preset");
+ }
+ } else if (typeof val === "object") {
+ this.mergeOptions(val);
+ } else {
+ throw new Error("todo");
+ }
+ }
+ }
+
+ addIgnoreConfig(loc) {
+ let file = fs.readFileSync(loc, "utf8");
+ let lines = file.split("\n");
+
+ lines = lines
+ .map((line) => line.replace(/#(.*?)$/, "").trim())
+ .filter((line) => !!line);
+
+ this.mergeOptions({ ignore: lines }, loc);
+ }
+
+ findConfigs(loc) {
+ if (!loc) return;
+
+ if (!isAbsolute(loc)) {
+ loc = path.join(process.cwd(), loc);
+ }
+
+ let foundConfig = false;
+ let foundIgnore = false;
+
+ while (loc !== (loc = path.dirname(loc))) {
+ if (!foundConfig) {
+ let configLoc = path.join(loc, BABELRC_FILENAME);
+ if (exists(configLoc)) {
+ this.addConfig(configLoc);
+ foundConfig = true;
+ }
+
+ let pkgLoc = path.join(loc, PACKAGE_FILENAME);
+ if (exists(pkgLoc)) {
+ this.addConfig(pkgLoc, "babel", JSON);
+ foundConfig = true;
+ }
+ }
+
+ if (!foundIgnore) {
+ let ignoreLoc = path.join(loc, BABELIGNORE_FILENAME);
+ if (exists(ignoreLoc)) {
+ this.addIgnoreConfig(ignoreLoc);
+ foundIgnore = true;
+ }
+ }
+
+ if (foundIgnore && foundConfig) return;
+ }
+ }
+
+ normaliseOptions() {
+ let opts = this.options;
+
+ for (let key in config) {
+ let option = config[key];
+ let val = opts[key];
+
+ // optional
+ if (!val && option.optional) continue;
+
+ // aliases
+ if (option.alias) {
+ opts[option.alias] = opts[option.alias] || val;
+ } else {
+ opts[key] = val;
+ }
+ }
+ }
+
+ init(opts: Object): Object {
+ // resolve all .babelrc files
+ if (opts.babelrc !== false) {
+ this.findConfigs(opts.filename);
+ }
+
+ // merge in base options
+ this.mergeOptions(opts, "base");
+
+ // normalise
+ this.normaliseOptions(opts);
+
+ return this.options;
+ }
+}
+
+OptionManager.memoisedPlugins = [];
diff --git a/packages/babel-core/src/transformation/file/options/parsers.js b/packages/babel-core/src/transformation/file/options/parsers.js
new file mode 100644
index 0000000000..5b5c57faaa
--- /dev/null
+++ b/packages/babel-core/src/transformation/file/options/parsers.js
@@ -0,0 +1,22 @@
+/* @flow */
+
+import slash from "slash";
+import * as util from "../../../util";
+
+export function number(val: any): number {
+ return +val;
+}
+
+export let filename = slash;
+
+export function boolean(val: any): boolean {
+ return !!val;
+}
+
+export function booleanString(val: any): boolean | any {
+ return util.booleanify(val);
+}
+
+export function list(val: any): Array {
+ return util.list(val);
+}
diff --git a/packages/babel-core/src/transformation/internal-plugins/block-hoist.js b/packages/babel-core/src/transformation/internal-plugins/block-hoist.js
new file mode 100644
index 0000000000..a0b5fab150
--- /dev/null
+++ b/packages/babel-core/src/transformation/internal-plugins/block-hoist.js
@@ -0,0 +1,42 @@
+/* @flow */
+
+import Plugin from "../plugin";
+import sortBy from "lodash/collection/sortBy";
+
+export default new Plugin({
+ /**
+ * [Please add a description.]
+ *
+ * Priority:
+ *
+ * - 0 We want this to be at the **very** bottom
+ * - 1 Default node position
+ * - 2 Priority over normal nodes
+ * - 3 We want this to be at the **very** top
+ */
+
+ visitor: {
+ Block: {
+ exit({ node }) {
+ let hasChange = false;
+ for (let i = 0; i < node.body.length; i++) {
+ let bodyNode = node.body[i];
+ if (bodyNode && bodyNode._blockHoist != null) {
+ hasChange = true;
+ break;
+ }
+ }
+ if (!hasChange) return;
+
+ node.body = sortBy(node.body, function(bodyNode){
+ let priority = bodyNode && bodyNode._blockHoist;
+ if (priority == null) priority = 1;
+ if (priority === true) priority = 2;
+
+ // Higher priorities should move toward the top.
+ return -1 * priority;
+ });
+ }
+ }
+ }
+});
diff --git a/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js b/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js
new file mode 100644
index 0000000000..c37525dc37
--- /dev/null
+++ b/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js
@@ -0,0 +1,68 @@
+/* @flow */
+
+import Plugin from "../plugin";
+import * as t from "babel-types";
+
+export default new Plugin({
+ visitor: {
+ ThisExpression(path) {
+ remap(path, "this", () => t.thisExpression());
+ },
+
+ ReferencedIdentifier(path) {
+ if (path.node.name === "arguments") {
+ remap(path, "arguments", () => t.identifier("arguments"));
+ }
+ }
+ }
+});
+
+function shouldShadow(path, shadowPath) {
+ if (path.is("_forceShadow")) {
+ return true;
+ } else {
+ return shadowPath && !shadowPath.isArrowFunctionExpression();
+ }
+}
+
+function remap(path, key, create) {
+ // ensure that we're shadowed
+ let shadowPath = path.inShadow(key);
+ if (!shouldShadow(path, shadowPath)) return;
+
+ let shadowFunction = path.node._shadowedFunctionLiteral;
+ let currentFunction;
+
+ let fnPath = path.findParent(function (path) {
+ if (path.isProgram() || path.isFunction()) {
+ // catch current function in case this is the shadowed one and we can ignore it
+ currentFunction = currentFunction || path;
+ }
+
+ if (path.isProgram()) {
+ return true;
+ } else if (path.isFunction()) {
+ if (shadowFunction) {
+ return path === shadowFunction || path.node === shadowFunction.node;
+ } else {
+ return !path.is("shadow");
+ }
+ }
+
+ return false;
+ });
+
+ // no point in realiasing if we're in this function
+ if (fnPath === currentFunction) return;
+
+ let cached = fnPath.getData(key);
+ if (cached) return path.replaceWith(cached);
+
+ let init = create();
+ let id = path.scope.generateUidIdentifier(key);
+
+ fnPath.setData(key, id);
+ fnPath.scope.push({ id, init });
+
+ return path.replaceWith(id);
+}
diff --git a/packages/babel-core/src/transformation/pipeline.js b/packages/babel-core/src/transformation/pipeline.js
new file mode 100644
index 0000000000..ea62e1b0a2
--- /dev/null
+++ b/packages/babel-core/src/transformation/pipeline.js
@@ -0,0 +1,41 @@
+/* @flow */
+
+import normalizeAst from "../helpers/normalize-ast";
+import File from "./file";
+
+export default class Pipeline {
+ lint(code: string, opts?: Object = {}) {
+ opts.code = false;
+ opts.mode = "lint";
+ return this.transform(code, opts);
+ }
+
+ pretransform(code: string, opts?: Object) {
+ let file = new File(opts, this);
+ return file.wrap(code, function () {
+ file.addCode(code);
+ file.parseCode(code);
+ return file;
+ });
+ }
+
+ transform(code: string, opts?: Object) {
+ let file = new File(opts, this);
+ return file.wrap(code, function () {
+ file.addCode(code);
+ file.parseCode(code);
+ return file.transform();
+ });
+ }
+
+ transformFromAst(ast, code: string, opts: Object) {
+ ast = normalizeAst(ast);
+
+ let file = new File(opts, this);
+ return file.wrap(code, function () {
+ file.addCode(code);
+ file.addAst(ast);
+ return file.transform();
+ });
+ }
+}
diff --git a/packages/babel-core/src/transformation/plugin-pass.js b/packages/babel-core/src/transformation/plugin-pass.js
new file mode 100644
index 0000000000..1fe9385941
--- /dev/null
+++ b/packages/babel-core/src/transformation/plugin-pass.js
@@ -0,0 +1,42 @@
+/* @flow */
+
+import type Plugin from "./plugin";
+import Store from "../store";
+import traverse from "babel-traverse";
+import File from "./file";
+
+export default class PluginPass extends Store {
+ constructor(file: File, plugin: Plugin, options: Object = {}) {
+ super();
+ this.plugin = plugin;
+ this.file = file;
+ this.opts = options;
+ }
+
+ plugin: Plugin;
+ file: File;
+ opts: Object;
+
+ transform() {
+ let file = this.file;
+ file.log.debug(`Start transformer ${this.key}`);
+ traverse(file.ast, this.plugin.visitor, file.scope, file);
+ file.log.debug(`Finish transformer ${this.key}`);
+ }
+
+ addHelper(...args) {
+ return this.file.addHelper(...args);
+ }
+
+ addImport(...args) {
+ return this.file.addImport(...args);
+ }
+
+ getModuleName(...args) {
+ return this.file.getModuleName(...args);
+ }
+
+ buildCodeFrameError(...args) {
+ return this.file.buildCodeFrameError(...args);
+ }
+}
diff --git a/packages/babel-core/src/transformation/plugin.js b/packages/babel-core/src/transformation/plugin.js
new file mode 100644
index 0000000000..31c7bcbb5e
--- /dev/null
+++ b/packages/babel-core/src/transformation/plugin.js
@@ -0,0 +1,86 @@
+/* @flow */
+
+import OptionManager from "./file/options/option-manager"
+import * as messages from "babel-messages";
+import Store from "../store";
+import traverse from "babel-traverse";
+import assign from "lodash/object/assign";
+import clone from "lodash/lang/clone";
+
+export default class Plugin extends Store {
+ constructor(plugin: Object) {
+ super();
+
+ this.initialized = false;
+ this.raw = assign({}, plugin);
+
+ this.manipulateOptions = this.take("manipulateOptions");
+ this.post = this.take("post");
+ this.pre = this.take("pre");
+ this.visitor = this.normalize(clone(this.take("visitor")) || {});
+ }
+
+ initialized: boolean;
+ raw: Object;
+ manipulateOptions: ?Function;
+ post: ?Function;
+ pre: ?Function;
+ visitor: Object;
+
+ take(key) {
+ let val = this.raw[key];
+ delete this.raw[key];
+ return val;
+ }
+
+ chain(target, key) {
+ if (!target[key]) return this[key];
+ if (!this[key]) return target[key];
+
+ let fns: Array = [target[key], this[key]];
+
+ return function (...args) {
+ let val;
+ for (let fn of fns) {
+ if (fn) {
+ let ret = fn.apply(this, args);
+ if (ret != null) val = ret;
+ }
+ }
+ return val;
+ };
+ }
+
+ maybeInherit(loc: string) {
+ let inherits = this.take("inherits");
+ if (!inherits) return;
+
+ inherits = OptionManager.normalisePlugin(inherits, loc, "inherits");
+
+ this.manipulateOptions = this.chain(inherits, "manipulateOptions");
+ this.post = this.chain(inherits, "post");
+ this.pre = this.chain(inherits, "pre");
+ this.visitor = traverse.visitors.merge([inherits.visitor, this.visitor]);
+ }
+
+ /**
+ * We lazy initialise parts of a plugin that rely on contextual information such as
+ * position on disk and how it was specified.
+ */
+
+ init(loc: string, i: number) {
+ if (this.initialized) return;
+ this.initialized = true;
+
+ this.maybeInherit(loc);
+
+ for (let key in this.raw) {
+ throw new Error(messages.get("pluginInvalidProperty", loc, i, key));
+ }
+ }
+
+ normalize(visitor: Object): Object {
+ traverse.explode(visitor);
+ return visitor;
+ }
+}
diff --git a/packages/babel-core/src/util.js b/packages/babel-core/src/util.js
new file mode 100644
index 0000000000..d76cb5d45e
--- /dev/null
+++ b/packages/babel-core/src/util.js
@@ -0,0 +1,148 @@
+/* @flow */
+
+import escapeRegExp from "lodash/string/escapeRegExp";
+import startsWith from "lodash/string/startsWith";
+import isBoolean from "lodash/lang/isBoolean";
+import minimatch from "minimatch";
+import contains from "lodash/collection/contains";
+import isString from "lodash/lang/isString";
+import isRegExp from "lodash/lang/isRegExp";
+import path from "path";
+import slash from "slash";
+
+export { inherits, inspect } from "util";
+
+/**
+ * Test if a filename ends with a compilable extension.
+ */
+
+export function canCompile(filename: string, altExts?: Array) {
+ let exts = altExts || canCompile.EXTENSIONS;
+ let ext = path.extname(filename);
+ return contains(exts, ext);
+}
+
+/**
+ * Default set of compilable extensions.
+ */
+
+canCompile.EXTENSIONS = [".js", ".jsx", ".es6", ".es"];
+
+/**
+ * Create an array from any value, splitting strings by ",".
+ */
+
+export function list(val?: string): Array {
+ if (!val) {
+ return [];
+ } else if (Array.isArray(val)) {
+ return val;
+ } else if (typeof val === "string") {
+ return val.split(",");
+ } else {
+ return [val];
+ }
+}
+
+/**
+ * Create a RegExp from a string, array, or regexp.
+ */
+
+export function regexify(val: any): RegExp {
+ if (!val) {
+ return new RegExp(/.^/);
+ }
+
+ if (Array.isArray(val)) {
+ val = new RegExp(val.map(escapeRegExp).join("|"), "i");
+ }
+
+ if (typeof val === "string") {
+ // normalise path separators
+ val = slash(val);
+
+ // remove starting wildcards or relative separator if present
+ if (startsWith(val, "./") || startsWith(val, "*/")) val = val.slice(2);
+ if (startsWith(val, "**/")) val = val.slice(3);
+
+ let regex = minimatch.makeRe(val, { nocase: true });
+ return new RegExp(regex.source.slice(1, -1), "i");
+ }
+
+ if (isRegExp(val)) {
+ return val;
+ }
+
+ throw new TypeError("illegal type for regexify");
+}
+
+/**
+ * Create an array from a boolean, string, or array, mapped by and optional function.
+ */
+
+export function arrayify(val: any, mapFn?: Function): Array {
+ if (!val) return [];
+ if (isBoolean(val)) return arrayify([val], mapFn);
+ if (isString(val)) return arrayify(list(val), mapFn);
+
+ if (Array.isArray(val)) {
+ if (mapFn) val = val.map(mapFn);
+ return val;
+ }
+
+ return [val];
+}
+
+/**
+ * Makes boolean-like strings into booleans.
+ */
+
+export function booleanify(val: any): boolean | any {
+ if (val === "true" || val == 1) {
+ return true;
+ }
+
+ if (val === "false" || val == 0 || !val) {
+ return false;
+ }
+
+ return val;
+}
+
+/**
+ * Tests if a filename should be ignored based on "ignore" and "only" options.
+ */
+
+export function shouldIgnore(
+ filename: string,
+ ignore: Array = [],
+ only?: Array,
+): boolean {
+ filename = slash(filename);
+
+ if (only) {
+ for (let pattern of only) {
+ if (_shouldIgnore(pattern, filename)) return false;
+ }
+ return true;
+ } else if (ignore.length) {
+ for (let pattern of ignore) {
+ if (_shouldIgnore(pattern, filename)) return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Returns result of calling function with filename if pattern is a function.
+ * Otherwise returns result of matching pattern Regex with filename.
+ */
+
+function _shouldIgnore(pattern: Function | RegExp, filename: string) {
+ if (typeof pattern === "function") {
+ return pattern(filename);
+ } else {
+ return pattern.test(filename);
+ }
+}
diff --git a/packages/babel-core/test/.babelrc b/packages/babel-core/test/.babelrc
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/packages/babel-core/test/.babelrc
@@ -0,0 +1 @@
+{}
diff --git a/packages/babel/test/_browser.js b/packages/babel-core/test/_browser.js
similarity index 100%
rename from packages/babel/test/_browser.js
rename to packages/babel-core/test/_browser.js
diff --git a/packages/babel/test/_transformation-helper.js b/packages/babel-core/test/_transformation-helper.js
similarity index 85%
rename from packages/babel/test/_transformation-helper.js
rename to packages/babel-core/test/_transformation-helper.js
index dd61dd4a65..9962050068 100644
--- a/packages/babel/test/_transformation-helper.js
+++ b/packages/babel-core/test/_transformation-helper.js
@@ -1,8 +1,11 @@
+require("../lib/api/node");
+
var buildExernalHelpers = require("../lib/tools/build-external-helpers");
var getFixtures = require("mocha-fixtures");
var transform = require("../lib/transformation");
var sourceMap = require("source-map");
-var codeFrame = require("../lib/helpers/code-frame");
+var codeFrame = require("babel-code-frame");
+var register = require("../register");
var Module = require("module");
var assert = require("assert");
var chai = require("chai");
@@ -14,7 +17,14 @@ exports.fixtures = getFixtures(__dirname + "/fixtures", function () {
return require("../test-fixtures.json");
});
-require("../lib/polyfill");
+require("babel-polyfill");
+
+register({
+ ignore: [
+ path.resolve(__dirname + "/../.."),
+ "node_modules"
+ ]
+});
eval(buildExernalHelpers());
@@ -49,25 +59,41 @@ chai.assert.throw = function (fn, msg) {
return chai.assert._throw(fn, msg);
};
-var run = function (task, done) {
+function wrapPackagesArray(type, names) {
+ return (names || []).map(function (val) {
+ if (typeof val === "string") val = [val];
+ val[0] = __dirname + "/../../babel-" + type + "-" + val[0];
+ return val;
+ });
+}
+
+function run(task, done) {
var actual = task.actual;
var expect = task.expect;
var exec = task.exec;
var opts = task.options;
- var getOpts = function (self) {
- return _.merge({
+ function getOpts(self) {
+ var newOpts = _.merge({
suppressDeprecationMessages: true,
filename: self.loc,
sourceMap: !!(task.sourceMappings || task.sourceMap)
}, opts);
- };
+
+ newOpts.plugins = wrapPackagesArray("plugin", newOpts.plugins);
+ newOpts.presets = wrapPackagesArray("preset", newOpts.presets).map(function (val) {
+ return val[0];
+ });
+
+ return newOpts;
+ }
var execCode = exec.code;
var result;
if (execCode) {
- result = transform(execCode, getOpts(exec));
+ var execOpts = getOpts(exec);
+ result = transform(execCode, execOpts);
execCode = result.code;
try {
@@ -118,7 +144,7 @@ var run = function (task, done) {
chai.expect({ line: expect.line, column: expect.column }).to.deep.equal(actual);
});
}
-};
+}
exports.run = function (name, suiteOpts, taskOpts, dynamicOpts) {
suiteOpts = suiteOpts || {};
diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js
new file mode 100644
index 0000000000..c04185e1ec
--- /dev/null
+++ b/packages/babel-core/test/api.js
@@ -0,0 +1,342 @@
+require("../lib/api/node");
+
+var buildExternalHelpers = require("../lib/tools/build-external-helpers");
+var transform = require("../lib/transformation");
+var Pipeline = require("../lib/transformation/pipeline");
+var assert = require("assert");
+var File = require("../lib/transformation/file").default;
+
+function assertIgnored(result) {
+ assert.ok(result.ignored);
+}
+
+function assertNotIgnored(result) {
+ assert.ok(!result.ignored);
+}
+
+// shim
+function transformAsync(code, opts) {
+ return {
+ then: function (resolve) {
+ resolve(transform(code, opts));
+ }
+ };
+}
+
+suite("api", function () {
+ test("code option false", function () {
+ return transformAsync("foo('bar');", { code: false }).then(function (result) {
+ assert.ok(!result.code);
+ });
+ });
+
+ test("ast option false", function () {
+ return transformAsync("foo('bar');", { ast: false }).then(function (result) {
+ assert.ok(!result.ast);
+ });
+ });
+
+ test("auxiliaryComment option", function () {
+ return transformAsync("class Foo {}", {
+ auxiliaryComment: "yo bro",
+ plugins: [function (babel) {
+ var t = babel.types;
+ return {
+ visitor: {
+ Program: function (path) {
+ path.unshiftContainer("body", t.expressionStatement(t.identifier("start")));
+ path.pushContainer("body", t.expressionStatement(t.identifier("end")));
+ }
+ }
+ };
+ }]
+ }).then(function (result) {
+ assert.equal(result.code, "/*yo bro*/start;\nclass Foo {}\n/*yo bro*/end;");
+ });
+ });
+
+ test("modules metadata", function () {
+ return Promise.all([
+ transformAsync('import { externalName as localName } from "external";').then(function (result) {
+ assert.deepEqual(result.metadata.modules.imports[0], {
+ source: "external",
+ imported: ["externalName"],
+ specifiers: [{
+ kind: "named",
+ imported: "externalName",
+ local: "localName"
+ }]
+ });
+ }),
+
+ transformAsync('import * as localName2 from "external";').then(function (result) {
+ assert.deepEqual(result.metadata.modules.imports[0], {
+ source: "external",
+ imported: ["*"],
+ specifiers: [{
+ kind: "namespace",
+ local: "localName2"
+ }]
+ });
+ }),
+
+ transformAsync('import localName3 from "external";').then(function (result) {
+ assert.deepEqual(result.metadata.modules.imports[0], {
+ source: "external",
+ imported: ["default"],
+ specifiers: [{
+ kind: "named",
+ imported: "default",
+ local: "localName3"
+ }]
+ });
+ }),
+
+ transformAsync('import localName from "./array";', {
+ resolveModuleSource: function() {
+ return "override-source";
+ }
+ }).then(function (result) {
+ assert.deepEqual(result.metadata.modules.imports, [
+ {
+ source: "override-source",
+ imported: ["default"],
+ specifiers: [
+ {
+ "kind": "named",
+ "imported": "default",
+ "local": "localName"
+ }
+ ]
+ }
+ ]);
+ }),
+
+ transformAsync('export * as externalName1 from "external";', {
+ plugins: [require("../../babel-plugin-syntax-export-extensions")]
+ }).then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ exported: ['externalName1'],
+ specifiers: [{
+ kind: "external-namespace",
+ exported: "externalName1",
+ source: "external",
+ }]
+ });
+ }),
+
+ transformAsync('export externalName2 from "external";', {
+ plugins: [require("../../babel-plugin-syntax-export-extensions")]
+ }).then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ exported: ["externalName2"],
+ specifiers: [{
+ kind: "external",
+ local: "externalName2",
+ exported: "externalName2",
+ source: "external"
+ }]
+ });
+ }),
+
+ transformAsync('export function namedFunction() {}').then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ exported: ["namedFunction"],
+ specifiers: [{
+ kind: "local",
+ local: "namedFunction",
+ exported: "namedFunction"
+ }]
+ });
+ }),
+
+ transformAsync('export var foo = "bar";').then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ "exported": ["foo"],
+ specifiers: [{
+ kind: "local",
+ local: "foo",
+ exported: "foo"
+ }]
+ });
+ }),
+
+ transformAsync("export { localName as externalName3 };").then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ exported: ["externalName3"],
+ specifiers: [{
+ kind: "local",
+ local: "localName",
+ exported: "externalName3"
+ }]
+ });
+ }),
+
+ transformAsync('export { externalName4 } from "external";').then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ exported: ["externalName4"],
+ specifiers: [{
+ kind: "external",
+ local: "externalName4",
+ exported: "externalName4",
+ source: "external"
+ }]
+ });
+ }),
+
+ transformAsync('export * from "external";').then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ exported: [],
+ specifiers: [{
+ kind: "external-all",
+ source: "external"
+ }]
+ });
+ }),
+
+ transformAsync("export default function defaultFunction() {}").then(function (result) {
+ assert.deepEqual(result.metadata.modules.exports, {
+ exported: ["defaultFunction"],
+ specifiers: [{
+ kind: "local",
+ local: "defaultFunction",
+ exported: "default"
+ }]
+ });
+ })
+ ]);
+ });
+
+ test("ignore option", function () {
+ return Promise.all([
+ transformAsync("", {
+ ignore: "node_modules",
+ filename: "/foo/node_modules/bar"
+ }).then(assertIgnored),
+
+ transformAsync("", {
+ ignore: "foo/node_modules",
+ filename: "/foo/node_modules/bar"
+ }).then(assertIgnored),
+
+ transformAsync("", {
+ ignore: "foo/node_modules/*.bar",
+ filename: "/foo/node_modules/foo.bar"
+ }).then(assertIgnored)
+ ]);
+ });
+
+ test("only option", function () {
+ return Promise.all([
+ transformAsync("", {
+ only: "node_modules",
+ filename: "/foo/node_modules/bar"
+ }).then(assertNotIgnored),
+
+ transformAsync("", {
+ only: "foo/node_modules",
+ filename: "/foo/node_modules/bar"
+ }).then(assertNotIgnored),
+
+ transformAsync("", {
+ only: "foo/node_modules/*.bar",
+ filename: "/foo/node_modules/foo.bar"
+ }).then(assertNotIgnored),
+
+ transformAsync("", {
+ only: "node_modules",
+ filename: "/foo/node_module/bar"
+ }).then(assertIgnored),
+
+ transformAsync("", {
+ only: "foo/node_modules",
+ filename: "/bar/node_modules/foo"
+ }).then(assertIgnored),
+
+ transformAsync("", {
+ only: "foo/node_modules/*.bar",
+ filename: "/foo/node_modules/bar.foo"
+ }).then(assertIgnored)
+ ])
+ });
+
+ suite("env option", function () {
+ var oldBabelEnv = process.env.BABEL_ENV;
+ var oldNodeEnv = process.env.NODE_ENV;
+
+ before(function () {
+ delete process.env.BABEL_ENV;
+ delete process.env.NODE_ENV;
+ });
+
+ after(function () {
+ process.env.BABEL_ENV = oldBabelEnv;
+ process.env.NODE_ENV = oldNodeEnv;
+ });
+
+ test("default", function () {
+ return transformAsync("foo;", {
+ env: {
+ development: { code: false }
+ }
+ }).then(function (result) {
+ assert.equal(result.code, undefined);
+ });
+ });
+
+ test("BABEL_ENV", function () {
+ process.env.BABEL_ENV = "foo";
+ return transformAsync("foo;", {
+ env: {
+ foo: { code: false }
+ }
+ }).then(function (result) {
+ assert.equal(result.code, undefined);
+ });
+ });
+
+ test("NODE_ENV", function () {
+ process.env.NODE_ENV = "foo";
+ return transformAsync("foo;", {
+ env: {
+ foo: { code: false }
+ }
+ }).then(function (result) {
+ assert.equal(result.code, undefined);
+ });
+ });
+ });
+
+ test("resolveModuleSource option", function () {
+ var actual = 'import foo from "foo-import-default";\nimport "foo-import-bare";\nexport { foo } from "foo-export-named";';
+ var expected = 'import foo from "resolved/foo-import-default";\nimport "resolved/foo-import-bare";\nexport { foo } from "resolved/foo-export-named";';
+
+ return transformAsync(actual, {
+ resolveModuleSource: function (originalSource) {
+ return "resolved/" + originalSource;
+ }
+ }).then(function (result) {
+ assert.equal(result.code.trim(), expected);
+ });
+ });
+
+ suite("buildExternalHelpers", function () {
+ test("all", function () {
+ var script = buildExternalHelpers();
+ assert.ok(script.indexOf("classCallCheck") >= -1);
+ assert.ok(script.indexOf("inherits") >= 0);
+ });
+
+ test("whitelist", function () {
+ var script = buildExternalHelpers(["inherits"]);
+ assert.ok(script.indexOf("classCallCheck") === -1);
+ assert.ok(script.indexOf("inherits") >= 0);
+ });
+
+ test("empty whitelist", function () {
+ var script = buildExternalHelpers([]);
+ assert.ok(script.indexOf("classCallCheck") === -1);
+ assert.ok(script.indexOf("inherits") === -1);
+ });
+ });
+});
diff --git a/packages/babel/test/browserify.js b/packages/babel-core/test/browserify.js
similarity index 100%
rename from packages/babel/test/browserify.js
rename to packages/babel-core/test/browserify.js
diff --git a/packages/babel/test/esnext.js b/packages/babel-core/test/esnext.js
similarity index 100%
rename from packages/babel/test/esnext.js
rename to packages/babel-core/test/esnext.js
diff --git a/packages/babel-core/test/evaluation.js b/packages/babel-core/test/evaluation.js
new file mode 100644
index 0000000000..6d8b4dfbd3
--- /dev/null
+++ b/packages/babel-core/test/evaluation.js
@@ -0,0 +1,66 @@
+var traverse = require("babel-traverse").default;
+var assert = require("assert");
+var parse = require("babylon").parse;
+
+suite("evaluation", function () {
+ function addTest(code, type, value, notConfident) {
+ test(type + ": " + code, function () {
+ var visitor = {};
+
+ visitor[type] = function (path) {
+ var evaluate = path.evaluate();
+ assert.equal(evaluate.confident, !notConfident);
+ assert.equal(evaluate.value, value);
+ };
+
+ traverse(parse(code, {
+ plugins: ["*"]
+ }), visitor);
+ });
+ }
+
+ addTest("void 0", "UnaryExpression", undefined);
+ addTest("!true", "UnaryExpression", false);
+ addTest("+'2'", "UnaryExpression", 2);
+ addTest("-'2'", "UnaryExpression", -2);
+ addTest("~1", "UnaryExpression", -2);
+ addTest("3 - 1", "BinaryExpression", 2);
+ addTest("5 + 5", "BinaryExpression", 10);
+ addTest("10 / 2", "BinaryExpression", 5);
+ addTest("2 * 3", "BinaryExpression", 6);
+ addTest("4 % 2", "BinaryExpression", 0);
+ addTest("2 ** 3", "BinaryExpression", 8);
+ addTest("1 < 2", "BinaryExpression", true);
+ addTest("1 > 2", "BinaryExpression", false);
+ addTest("1 <= 2", "BinaryExpression", true);
+ addTest("1 >= 2", "BinaryExpression", false);
+ addTest("1 == '1'", "BinaryExpression", true);
+ addTest("1 != 2", "BinaryExpression", true);
+ addTest("'str' === 'str'", "BinaryExpression", true);
+ addTest("'four' === 4", "BinaryExpression", false);
+ addTest("'four' !== '4'", "BinaryExpression", true);
+ addTest("'str' !== 'str'", "BinaryExpression", false);
+ addTest("1 | 0", "BinaryExpression", 1);
+ addTest("1 & 1", "BinaryExpression", 1);
+ addTest("1 ^ 0", "BinaryExpression", 1);
+ addTest("1 << 2", "BinaryExpression", 4);
+ addTest("1 >> 2", "BinaryExpression", 0);
+ addTest("1 in [1]", "BinaryExpression", undefined, true);
+ addTest("A instanceof B", "BinaryExpression", undefined, true);
+ addTest("'abc' === 'abc' && 1 === 1", "LogicalExpression", true);
+ addTest("'abc' === 'abc' && 1 === 10", "LogicalExpression", false);
+ addTest("'abc' === 'xyz' && 1 === 1", "LogicalExpression", false);
+ addTest("'abc' === 'xyz' && 1 === 10", "LogicalExpression", false);
+ addTest("'abc' === 'abc' || 1 === 1", "LogicalExpression", true);
+ addTest("'abc' === 'abc' || 1 === 10", "LogicalExpression", true);
+ addTest("'abc' === 'xyz' || 1 === 1", "LogicalExpression", true);
+ addTest("'abc' === 'xyz' || 1 === 10", "LogicalExpression", false);
+ addTest("'abc' === 'abc' || config.flag === 1", "LogicalExpression", true);
+ addTest("obj.a === 'abc' || config.flag === 1", "LogicalExpression", undefined, true);
+ addTest("'abc' !== 'abc' && config.flag === 1", "LogicalExpression", false);
+ addTest("obj.a === 'abc' && 1 === 1", "LogicalExpression", undefined, true);
+ addTest("'abc' === 'abc' && (1 === 1 || config.flag)", "LogicalExpression", true);
+ addTest("'abc' === 'xyz' || (1 === 1 && config.flag)", "LogicalExpression", undefined, true);
+ addTest("'abc' === 'xyz' || (1 === 1 && 'four' === 'four')", "LogicalExpression", true);
+ addTest("'abc' === 'abc' && (1 === 1 && 'four' === 'four')", "LogicalExpression", true);
+});
diff --git a/packages/babel/test/fixtures/browserify/register.js b/packages/babel-core/test/fixtures/browserify/register.js
similarity index 100%
rename from packages/babel/test/fixtures/browserify/register.js
rename to packages/babel-core/test/fixtures/browserify/register.js
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/arguments-refers-to-parent-function.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/arguments-refers-to-parent-function.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/arguments-refers-to-parent-function.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/arguments-refers-to-parent-function.js
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/empty-arrow-function.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/empty-arrow-function.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/empty-arrow-function.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/empty-arrow-function.js
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/handles-nested-context-bindings.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/handles-nested-context-bindings.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/handles-nested-context-bindings.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/handles-nested-context-bindings.js
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/no-parens-for-low-precedence-expression-body.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/no-parens-for-low-precedence-expression-body.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/no-parens-for-low-precedence-expression-body.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/no-parens-for-low-precedence-expression-body.js
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/object-literal-needs-parens.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/object-literal-needs-parens.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/object-literal-needs-parens.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/object-literal-needs-parens.js
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/only-lexical-this-not-dynamic-this.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/only-lexical-this-not-dynamic-this.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/only-lexical-this-not-dynamic-this.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/only-lexical-this-not-dynamic-this.js
diff --git a/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/options.json b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/options.json
new file mode 100644
index 0000000000..fc3d742263
--- /dev/null
+++ b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-arrow-functions"]
+}
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/passed-to-function.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/passed-to-function.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/passed-to-function.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/passed-to-function.js
diff --git a/packages/babel/test/fixtures/esnext/es6-arrow-functions/single-param-does-not-need-parens.js b/packages/babel-core/test/fixtures/esnext/es6-arrow-functions/single-param-does-not-need-parens.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-arrow-functions/single-param-does-not-need-parens.js
rename to packages/babel-core/test/fixtures/esnext/es6-arrow-functions/single-param-does-not-need-parens.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/anonymous-class.js b/packages/babel-core/test/fixtures/esnext/es6-classes/anonymous-class.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/anonymous-class.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/anonymous-class.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/call-super-function.js b/packages/babel-core/test/fixtures/esnext/es6-classes/call-super-function.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/call-super-function.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/call-super-function.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/class-expressions.js b/packages/babel-core/test/fixtures/esnext/es6-classes/class-expressions.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/class-expressions.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/class-expressions.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/class-extend.js b/packages/babel-core/test/fixtures/esnext/es6-classes/class-extend.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/class-extend.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/class-extend.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/class-with-constructor.js b/packages/babel-core/test/fixtures/esnext/es6-classes/class-with-constructor.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/class-with-constructor.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/class-with-constructor.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/class-with-method-declaration.js b/packages/babel-core/test/fixtures/esnext/es6-classes/class-with-method-declaration.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/class-with-method-declaration.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/class-with-method-declaration.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/empty-named-class.js b/packages/babel-core/test/fixtures/esnext/es6-classes/empty-named-class.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/empty-named-class.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/empty-named-class.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/enumerable.js b/packages/babel-core/test/fixtures/esnext/es6-classes/enumerable.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/enumerable.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/enumerable.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/explicit-super-in-constructor.js b/packages/babel-core/test/fixtures/esnext/es6-classes/explicit-super-in-constructor.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/explicit-super-in-constructor.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/explicit-super-in-constructor.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/extends-null.js b/packages/babel-core/test/fixtures/esnext/es6-classes/extends-null.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/extends-null.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/extends-null.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/getter-setter-super.js b/packages/babel-core/test/fixtures/esnext/es6-classes/getter-setter-super.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/getter-setter-super.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/getter-setter-super.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/getter-setter.js b/packages/babel-core/test/fixtures/esnext/es6-classes/getter-setter.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/getter-setter.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/getter-setter.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/method-declaration-with-arguments.js b/packages/babel-core/test/fixtures/esnext/es6-classes/method-declaration-with-arguments.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/method-declaration-with-arguments.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/method-declaration-with-arguments.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/methods-are-writable.js b/packages/babel-core/test/fixtures/esnext/es6-classes/methods-are-writable.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/methods-are-writable.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/methods-are-writable.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/methods-with-rest-params.js b/packages/babel-core/test/fixtures/esnext/es6-classes/methods-with-rest-params.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/methods-with-rest-params.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/methods-with-rest-params.js
diff --git a/packages/babel-core/test/fixtures/esnext/es6-classes/options.json b/packages/babel-core/test/fixtures/esnext/es6-classes/options.json
new file mode 100644
index 0000000000..1a0fd02964
--- /dev/null
+++ b/packages/babel-core/test/fixtures/esnext/es6-classes/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-classes", "transform-es2015-block-scoping", "transform-es2015-parameters"]
+}
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/static-getter.js b/packages/babel-core/test/fixtures/esnext/es6-classes/static-getter.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/static-getter.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/static-getter.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/static-method.js b/packages/babel-core/test/fixtures/esnext/es6-classes/static-method.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/static-method.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/static-method.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/static-setter.js b/packages/babel-core/test/fixtures/esnext/es6-classes/static-setter.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/static-setter.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/static-setter.js
diff --git a/packages/babel/test/fixtures/esnext/es6-classes/super-change-proto.js b/packages/babel-core/test/fixtures/esnext/es6-classes/super-change-proto.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-classes/super-change-proto.js
rename to packages/babel-core/test/fixtures/esnext/es6-classes/super-change-proto.js
diff --git a/packages/babel/test/fixtures/esnext/es6-computed-properties/accessor.js b/packages/babel-core/test/fixtures/esnext/es6-computed-properties/accessor.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-computed-properties/accessor.js
rename to packages/babel-core/test/fixtures/esnext/es6-computed-properties/accessor.js
diff --git a/packages/babel/test/fixtures/esnext/es6-computed-properties/method.js b/packages/babel-core/test/fixtures/esnext/es6-computed-properties/method.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-computed-properties/method.js
rename to packages/babel-core/test/fixtures/esnext/es6-computed-properties/method.js
diff --git a/packages/babel/test/fixtures/esnext/es6-computed-properties/nested.js b/packages/babel-core/test/fixtures/esnext/es6-computed-properties/nested.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-computed-properties/nested.js
rename to packages/babel-core/test/fixtures/esnext/es6-computed-properties/nested.js
diff --git a/packages/babel-core/test/fixtures/esnext/es6-computed-properties/options.json b/packages/babel-core/test/fixtures/esnext/es6-computed-properties/options.json
new file mode 100644
index 0000000000..ed96b856f3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/esnext/es6-computed-properties/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-computed-properties"]
+}
diff --git a/packages/babel/test/fixtures/esnext/es6-computed-properties/simple.js b/packages/babel-core/test/fixtures/esnext/es6-computed-properties/simple.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-computed-properties/simple.js
rename to packages/babel-core/test/fixtures/esnext/es6-computed-properties/simple.js
diff --git a/packages/babel/test/fixtures/esnext/es6-default-parameters/arity.js b/packages/babel-core/test/fixtures/esnext/es6-default-parameters/arity.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-default-parameters/arity.js
rename to packages/babel-core/test/fixtures/esnext/es6-default-parameters/arity.js
diff --git a/packages/babel/test/fixtures/esnext/es6-default-parameters/arrow-function.js b/packages/babel-core/test/fixtures/esnext/es6-default-parameters/arrow-function.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-default-parameters/arrow-function.js
rename to packages/babel-core/test/fixtures/esnext/es6-default-parameters/arrow-function.js
diff --git a/packages/babel/test/fixtures/esnext/es6-default-parameters/null-vs-undefined.js b/packages/babel-core/test/fixtures/esnext/es6-default-parameters/null-vs-undefined.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-default-parameters/null-vs-undefined.js
rename to packages/babel-core/test/fixtures/esnext/es6-default-parameters/null-vs-undefined.js
diff --git a/packages/babel-core/test/fixtures/esnext/es6-default-parameters/options.json b/packages/babel-core/test/fixtures/esnext/es6-default-parameters/options.json
new file mode 100644
index 0000000000..0a6d11eb27
--- /dev/null
+++ b/packages/babel-core/test/fixtures/esnext/es6-default-parameters/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-parameters", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/esnext/es6-default-parameters/scope.js b/packages/babel-core/test/fixtures/esnext/es6-default-parameters/scope.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-default-parameters/scope.js
rename to packages/babel-core/test/fixtures/esnext/es6-default-parameters/scope.js
diff --git a/packages/babel/test/fixtures/esnext/es6-default-parameters/simple-function.js b/packages/babel-core/test/fixtures/esnext/es6-default-parameters/simple-function.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-default-parameters/simple-function.js
rename to packages/babel-core/test/fixtures/esnext/es6-default-parameters/simple-function.js
diff --git a/packages/babel/test/fixtures/esnext/es6-object-concise/method-arguments.js b/packages/babel-core/test/fixtures/esnext/es6-object-concise/method-arguments.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-object-concise/method-arguments.js
rename to packages/babel-core/test/fixtures/esnext/es6-object-concise/method-arguments.js
diff --git a/packages/babel/test/fixtures/esnext/es6-object-concise/method-context.js b/packages/babel-core/test/fixtures/esnext/es6-object-concise/method-context.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-object-concise/method-context.js
rename to packages/babel-core/test/fixtures/esnext/es6-object-concise/method-context.js
diff --git a/packages/babel/test/fixtures/esnext/es6-object-concise/method-has-name.js b/packages/babel-core/test/fixtures/esnext/es6-object-concise/method-has-name.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-object-concise/method-has-name.js
rename to packages/babel-core/test/fixtures/esnext/es6-object-concise/method-has-name.js
diff --git a/packages/babel/test/fixtures/esnext/es6-object-concise/method-is-not-in-scope-inside.js b/packages/babel-core/test/fixtures/esnext/es6-object-concise/method-is-not-in-scope-inside.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-object-concise/method-is-not-in-scope-inside.js
rename to packages/babel-core/test/fixtures/esnext/es6-object-concise/method-is-not-in-scope-inside.js
diff --git a/packages/babel/test/fixtures/esnext/es6-object-concise/method.js b/packages/babel-core/test/fixtures/esnext/es6-object-concise/method.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-object-concise/method.js
rename to packages/babel-core/test/fixtures/esnext/es6-object-concise/method.js
diff --git a/packages/babel/test/fixtures/esnext/es6-rest-parameters/arrow-fn.js b/packages/babel-core/test/fixtures/esnext/es6-rest-parameters/arrow-fn.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-rest-parameters/arrow-fn.js
rename to packages/babel-core/test/fixtures/esnext/es6-rest-parameters/arrow-fn.js
diff --git a/packages/babel/test/fixtures/esnext/es6-rest-parameters/declaration.js b/packages/babel-core/test/fixtures/esnext/es6-rest-parameters/declaration.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-rest-parameters/declaration.js
rename to packages/babel-core/test/fixtures/esnext/es6-rest-parameters/declaration.js
diff --git a/packages/babel-core/test/fixtures/esnext/es6-rest-parameters/options.json b/packages/babel-core/test/fixtures/esnext/es6-rest-parameters/options.json
new file mode 100644
index 0000000000..82bc9b4032
--- /dev/null
+++ b/packages/babel-core/test/fixtures/esnext/es6-rest-parameters/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-parameters"]
+}
diff --git a/packages/babel/test/fixtures/esnext/es6-rest-parameters/rest.js b/packages/babel-core/test/fixtures/esnext/es6-rest-parameters/rest.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-rest-parameters/rest.js
rename to packages/babel-core/test/fixtures/esnext/es6-rest-parameters/rest.js
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/arguments-as-array.js b/packages/babel-core/test/fixtures/esnext/es6-spread/arguments-as-array.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/arguments-as-array.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/arguments-as-array.js
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/array-literal.js b/packages/babel-core/test/fixtures/esnext/es6-spread/array-literal.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/array-literal.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/array-literal.js
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/call-with-array-literal.js b/packages/babel-core/test/fixtures/esnext/es6-spread/call-with-array-literal.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/call-with-array-literal.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/call-with-array-literal.js
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/inside-function-expression.js b/packages/babel-core/test/fixtures/esnext/es6-spread/inside-function-expression.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/inside-function-expression.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/inside-function-expression.js
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/iterator.js b/packages/babel-core/test/fixtures/esnext/es6-spread/iterator.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/iterator.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/iterator.js
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/new-object.js b/packages/babel-core/test/fixtures/esnext/es6-spread/new-object.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/new-object.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/new-object.js
diff --git a/packages/babel-core/test/fixtures/esnext/es6-spread/options.json b/packages/babel-core/test/fixtures/esnext/es6-spread/options.json
new file mode 100644
index 0000000000..f812157ad7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/esnext/es6-spread/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-spread", "transform-es2015-parameters"]
+}
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/preserve-context.js b/packages/babel-core/test/fixtures/esnext/es6-spread/preserve-context.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/preserve-context.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/preserve-context.js
diff --git a/packages/babel/test/fixtures/esnext/es6-spread/simple-function-call.js b/packages/babel-core/test/fixtures/esnext/es6-spread/simple-function-call.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-spread/simple-function-call.js
rename to packages/babel-core/test/fixtures/esnext/es6-spread/simple-function-call.js
diff --git a/packages/babel/test/fixtures/esnext/es6-templates/multi-line.js b/packages/babel-core/test/fixtures/esnext/es6-templates/multi-line.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-templates/multi-line.js
rename to packages/babel-core/test/fixtures/esnext/es6-templates/multi-line.js
diff --git a/packages/babel/test/fixtures/esnext/es6-templates/nested-interpolation.js b/packages/babel-core/test/fixtures/esnext/es6-templates/nested-interpolation.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-templates/nested-interpolation.js
rename to packages/babel-core/test/fixtures/esnext/es6-templates/nested-interpolation.js
diff --git a/packages/babel/test/fixtures/esnext/es6-templates/no-interpolation.js b/packages/babel-core/test/fixtures/esnext/es6-templates/no-interpolation.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-templates/no-interpolation.js
rename to packages/babel-core/test/fixtures/esnext/es6-templates/no-interpolation.js
diff --git a/packages/babel-core/test/fixtures/esnext/es6-templates/options.json b/packages/babel-core/test/fixtures/esnext/es6-templates/options.json
new file mode 100644
index 0000000000..341222f184
--- /dev/null
+++ b/packages/babel-core/test/fixtures/esnext/es6-templates/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-template-literals"]
+}
diff --git a/packages/babel/test/fixtures/esnext/es6-templates/raw-tagged-template-expression.js b/packages/babel-core/test/fixtures/esnext/es6-templates/raw-tagged-template-expression.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-templates/raw-tagged-template-expression.js
rename to packages/babel-core/test/fixtures/esnext/es6-templates/raw-tagged-template-expression.js
diff --git a/packages/babel/test/fixtures/esnext/es6-templates/simple-interpolation.js b/packages/babel-core/test/fixtures/esnext/es6-templates/simple-interpolation.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-templates/simple-interpolation.js
rename to packages/babel-core/test/fixtures/esnext/es6-templates/simple-interpolation.js
diff --git a/packages/babel/test/fixtures/esnext/es6-templates/tagged-template-expression.js b/packages/babel-core/test/fixtures/esnext/es6-templates/tagged-template-expression.js
similarity index 100%
rename from packages/babel/test/fixtures/esnext/es6-templates/tagged-template-expression.js
rename to packages/babel-core/test/fixtures/esnext/es6-templates/tagged-template-expression.js
diff --git a/packages/babel-core/test/fixtures/traceur/ArrayExtras/Fill.js b/packages/babel-core/test/fixtures/traceur/ArrayExtras/Fill.js
new file mode 100644
index 0000000000..986711f478
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrayExtras/Fill.js
@@ -0,0 +1,47 @@
+// should have a length of 1
+assert.equal(Array.prototype.fill.length, 1);
+
+// should fill from basic case
+assert.deepEqual([1, 2, 3].fill(5), [5, 5, 5]);
+
+// should fill from start
+assert.deepEqual([1, 2, 3].fill(5, 1), [1, 5, 5]);
+
+// should fill from start to end
+assert.deepEqual([1, 2, 3].fill(5, 1, 2), [1, 5, 3]);
+
+// should fill from negative start
+assert.deepEqual([1, 2, 3].fill(5, -1), [1, 2, 5]);
+
+// should fill from negative start to positive end
+assert.deepEqual([1, 2, 3].fill(5, -2, 3), [1, 5, 5]);
+
+// should fill from negative start to negative end
+assert.deepEqual([1, 2, 3].fill(5, -3, -1), [5, 5, 3]);
+
+// should fill from positive start to negative end
+assert.deepEqual([1, 2, 3].fill(5, 1, -1), [1, 5, 3]);
+
+// should fill custom object
+assert.deepEqual(Array.prototype.fill.call({'0': 1, 'length': 3}, 5), {'0': 5, '1': 5, '2': 5, 'length': 3});
+
+// should handle custom object with negative length
+//assert.deepEqual(Array.prototype.fill.call({'0': 2, 'length': -1}, 5), {'0': 2, 'length': -1});
+
+// should handle no elements
+assert.deepEqual([].fill(5), []);
+
+// should handle bad start
+assert.deepEqual([1, 2, 3].fill(5, 'hello'), [5, 5, 5]);
+
+// should handle bad end
+assert.deepEqual([1, 2, 3].fill(5, 1, {}), [1, 2, 3]);
+
+// should handle bad start and end
+assert.deepEqual([1, 2, 3].fill(5, 'hello', {}), [1, 2, 3]);
+
+
+// should handle bad this
+assert.throws(function() {
+ Array.prototype.fill.call(null, 5)
+}, TypeError);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrayExtras/Find.js b/packages/babel-core/test/fixtures/traceur/ArrayExtras/Find.js
new file mode 100644
index 0000000000..123da41810
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrayExtras/Find.js
@@ -0,0 +1,88 @@
+// should have a length of 1
+assert.equal(Array.prototype.find.length, 1);
+
+// should handle basic case
+assert.equal([1, 2, 3].find(function(v) {
+ return v * v === 4;
+}), 2);
+
+// should handle arrow functions
+assert.equal([1, 2, 3].find(v => v * v === 4), 2);
+
+// should return undefined when not found
+assert.equal([1, 2, 3].find(v => v > 10), undefined);
+
+// should return first match
+assert.equal([2, 2, 3].find(v => v * v === 4), 2);
+
+// should handle custom objects
+assert.equal(Array.prototype.find.call({
+ 'length': 2,
+ '0': false,
+ '1': true
+}, v => v), true);
+
+// should handle bad predicate
+assert.throws(function() {
+ [1, 2, 3].find(1)
+}, TypeError);
+
+// should handle bad this
+assert.throws(function() {
+ Array.prototype.find.call(null, function() {})
+}, TypeError);
+
+// should correctly handle this
+var global = this;
+({
+ assert: function() {
+ var self = this;
+
+ // should be global this
+ [1, 2, 3].find(function() {
+ assert.notEqual(this, self);
+ assert.equal(this, global);
+ });
+
+ // should be the same this
+ [1, 2, 3].find(function() {
+ assert.equal(this, self);
+ }, self);
+
+ // should not have an effect on arrow functions
+ [1, 2, 3].find(() => assert.equal(this, self));
+ [1, 2, 3].find(() => assert.equal(this, self), self);
+
+ // should call with correct args
+ var arr = [5];
+ arr.find(function(value, i, object) {
+ assert.equal(value, 5);
+ assert.equal(i, 0);
+ assert.equal(arr, object);
+ });
+ }
+}).assert();
+
+var lengthCalls = 0;
+var itemCalls = 0;
+var callbackCalls = 0;
+var object = {
+ length: {
+ valueOf() {
+ lengthCalls++;
+ return 3;
+ }
+ },
+ get 2() {
+ itemCalls++;
+ return 'a';
+ }
+};
+
+assert.equal(Array.prototype.find.call(object, (v) => {
+ callbackCalls++;
+ return v === 'a';
+}), 'a');
+assert.equal(lengthCalls, 1);
+assert.equal(itemCalls, 1);
+assert.equal(callbackCalls, 3);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrayExtras/FindIndex.js b/packages/babel-core/test/fixtures/traceur/ArrayExtras/FindIndex.js
new file mode 100644
index 0000000000..f572f7b1e9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrayExtras/FindIndex.js
@@ -0,0 +1,47 @@
+// should have a length of 1
+assert.equal(Array.prototype.findIndex.length, 1);
+
+// should handle basic case
+assert.equal([1, 2, 3].findIndex(function(v) {
+ return v * v === 4;
+}), 1);
+
+// should handle arrow functions
+assert.equal([1, 2, 3].findIndex(v => v * v === 4), 1);
+
+// should return -1 when not found
+assert.equal([1, 2, 3].findIndex(v => v > 10), -1);
+
+// should return first match
+assert.equal([2, 2, 3].findIndex(v => v * v === 4), 0);
+
+// should handle custom objects
+assert.equal(Array.prototype.findIndex.call({
+ 'length': 2,
+ '0': false,
+ '1': true
+}, v => v), 1);
+
+var lengthCalls = 0;
+var itemCalls = 0;
+var callbackCalls = 0;
+var object = {
+ length: {
+ valueOf() {
+ lengthCalls++;
+ return 3;
+ }
+ },
+ get 2() {
+ itemCalls++;
+ return 'a';
+ }
+};
+
+assert.equal(Array.prototype.findIndex.call(object, (v) => {
+ callbackCalls++;
+ return v === 'a';
+}), 2);
+assert.equal(lengthCalls, 1);
+assert.equal(itemCalls, 1);
+assert.equal(callbackCalls, 3);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrayExtras/From.js b/packages/babel-core/test/fixtures/traceur/ArrayExtras/From.js
new file mode 100644
index 0000000000..590f14261c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrayExtras/From.js
@@ -0,0 +1,158 @@
+// should have a length of 1
+assert.equal(Array.from.length, 1);
+var arr;
+var obj;
+
+// should make an array from arguments
+function arrayFromArgs() {
+ return Array.from(arguments);
+}
+arr = arrayFromArgs('a', 1);
+
+assert.equal(arr.length, 2);
+assert.deepEqual(arr, ['a', 1]);
+assert.isTrue(Array.isArray(arr));
+
+// should handle undefined values
+var arrayLike = {0: 'a', 2: 'c', length: 3};
+arr = Array.from(arrayLike);
+
+assert.equal(arr.length, 3);
+assert.deepEqual(arr, ['a', undefined, 'c']);
+assert.isTrue(Array.isArray(arr));
+
+// should use a mapFn
+arr = Array.from([{'a': 1}, {'a': 2}], function(item, i) {
+ return item.a + i;
+});
+
+assert.deepEqual(arr, [1, 3]);
+
+// should set this in mapFn
+var thisObj = {a: 10};
+arr = Array.from([{'a': 1}, {'a': 2}], function(item, i) {
+ return this.a + item.a + i;
+}, thisObj);
+
+assert.deepEqual(arr, [11, 13]);
+
+// should map on array-like object
+arr = Array.from({0: {'a': 5}, length: 1}, function(item, i) {
+ return item.a + i;
+});
+
+assert.deepEqual(arr, [5]);
+
+// should throw on bad map fn
+assert.throws(function() {
+ Array.from([], null)
+}, TypeError);
+
+// should make from an array-like object
+var arrayLikeObj = function(len) {
+ this.length = len;
+};
+arrayLikeObj.from = Array.from;
+obj = arrayLikeObj.from(['a', 'b', 'c']);
+
+assert.equal(obj.length, 3);
+assert.deepEqual(obj, {0: 'a', 1: 'b', 2: 'c', length: 3});
+
+// should make from a non-array iterable
+var calledIterator = 0;
+var Iterable = function(len) {
+ var self = this;
+
+ self.length = len;
+ self[Symbol.iterator] = function*() {
+ for (var i = 0; i < self.length; i++) {
+ calledIterator++;
+ yield self[i];
+ }
+ };
+};
+var it = new Iterable(3);
+it[0] = 'a';
+it[1] = 'b';
+it[2] = 'c';
+obj = Array.from(it);
+
+assert.equal(obj.length, 3);
+assert.equal(obj[0], 'a');
+assert.equal(obj[1], 'b');
+assert.equal(obj[2], 'c');
+assert.equal(calledIterator, 3);
+
+// should make from a sub-classed array
+var length = 0;
+var constructorCounter = 0;
+var lengthSetCounter = 0;
+var lengthGetCounter = 0;
+
+class MyArray extends Array {
+ constructor(v) {
+ super();
+ constructorCounter++;
+ assert.isUndefined(v);
+ }
+
+ set length(v) {
+ lengthSetCounter++;
+ length = v;
+ }
+
+ get length() {
+ lengthGetCounter++;
+ return length;
+ }
+}
+
+var ma = MyArray.from(['a', 'b']);
+assert.instanceOf(ma, MyArray);
+assert.equal(constructorCounter, 1);
+assert.equal(lengthSetCounter, 1);
+assert.equal(lengthGetCounter, 0);
+assert.isTrue(ma.hasOwnProperty('0'));
+assert.isTrue(ma.hasOwnProperty('1'));
+assert.isFalse(ma.hasOwnProperty('length'));
+assert.equal(ma[0], 'a');
+assert.equal(ma[1], 'b');
+assert.equal(ma.length, 2);
+
+// should make from a sub-classed array without iterable
+length = 0;
+constructorCounter = 0;
+lengthSetCounter = 0;
+lengthGetCounter = 0;
+
+class MyArray2 extends MyArray {
+ constructor(v) {
+ super();
+ constructorCounter++;
+ assert.equal(v, 2);
+ }
+};
+MyArray2.prototype[Symbol.iterator] = undefined;
+
+class MyArray3 extends Array {
+ constructor(v) {
+ super();
+ this.length = v;
+ }
+}
+MyArray3.prototype[Symbol.iterator] = undefined;
+
+var ma3 = new MyArray3(2);
+ma3[0] = 'a';
+ma3[1] = 'b';
+ma = MyArray2.from(ma3);
+assert.instanceOf(ma, MyArray2);
+assert.equal(constructorCounter, 2);
+assert.equal(lengthSetCounter, 1);
+assert.equal(lengthGetCounter, 0);
+assert.isTrue(ma.hasOwnProperty('0'));
+assert.isTrue(ma.hasOwnProperty('1'));
+assert.isFalse(ma.hasOwnProperty('length'));
+assert.equal(ma[0], 'a');
+assert.equal(ma[1], 'b');
+assert.equal(ma.length, 2);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrayExtras/Of.js b/packages/babel-core/test/fixtures/traceur/ArrayExtras/Of.js
new file mode 100644
index 0000000000..931c5fc5a9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrayExtras/Of.js
@@ -0,0 +1,37 @@
+var arr;
+
+// should have a length of 0
+assert.equal(Array.of.length, 0);
+
+//should return an array from arguments
+arr = Array.of(1, 'a', 3);
+assert.deepEqual(arr, [1, 'a', 3]);
+//assert.isTrue(arr instanceof Array);
+
+//should work with no arguments
+arr = Array.of();
+assert.deepEqual(arr, []);
+//assert.isTrue(arr instanceof Array);
+
+//should work with sub-classed array
+class MyArray extends Array {}
+
+arr = MyArray.of(4, 'b');
+assert.equal(arr[0], 4);
+assert.equal(arr[1], 'b');
+assert.equal(arr.length, 2);
+//assert.isTrue(arr instanceof MyArray);
+
+//should call with exotic array
+class ExoticArray {
+ constructor(len) {
+ this.length = len;
+ }
+}
+arr = Array.of.call(ExoticArray, 5, 'c', 6, 'd');
+assert.equal(arr[0], 5);
+assert.equal(arr[1], 'c');
+assert.equal(arr[2], 6);
+assert.equal(arr[3], 'd');
+assert.equal(arr.length, 4);
+//assert.isTrue(arr instanceof ExoticArray);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrayIterator.js b/packages/babel-core/test/fixtures/traceur/ArrayIterator.js
new file mode 100644
index 0000000000..f9cc9d2ae4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrayIterator.js
@@ -0,0 +1,27 @@
+var a = ['a', 'b', 'c'];
+
+var res = [];
+for (var x of a) {
+ res.push(x);
+}
+assert.deepEqual(res, ['a', 'b', 'c']);
+
+assert.equal(a[Symbol.iterator], a.values);
+
+res = [];
+for (var x of a.values()) {
+ res.push(x);
+}
+assert.deepEqual(res, ['a', 'b', 'c']);
+
+res = [];
+for (var x of a.keys()) {
+ res.push(x);
+}
+assert.deepEqual(res, [0, 1, 2]);
+
+res = [];
+for (var x of a.entries()) {
+ res.push(x);
+}
+assert.deepEqual(res, [[0, 'a'], [1, 'b'], [2, 'c']]);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/AlphaRename.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/AlphaRename.js
new file mode 100644
index 0000000000..1c181f684e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/AlphaRename.js
@@ -0,0 +1,22 @@
+var global = this;
+var self = {};
+
+function outer() {
+ var f = () => {
+ assert.equal(this, self);
+
+ var g = () => {
+ assert.equal(this, self);
+ };
+ g();
+
+ var h = function() {
+ assert.equal(this, global);
+ };
+ h();
+ };
+
+ f();
+}
+
+outer.call(self);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/AlphaRenameThisArguments.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/AlphaRenameThisArguments.js
new file mode 100644
index 0000000000..11d03c767f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/AlphaRenameThisArguments.js
@@ -0,0 +1,42 @@
+
+var self = {};
+
+function f() {
+ (() => {
+ assert.equal(self, this);
+ assert.equal(1, arguments.length);
+ assert.equal(42, arguments[0]);
+
+ var THIS = 0;
+ var ARGUMENTS = 1;
+
+ var object = {
+ function: function() {
+ return [this, arguments];
+ },
+ method() {
+ return [this, arguments];
+ },
+ arrow: () => {
+ return [this, arguments];
+ }
+ };
+
+ assert.equal(object, object.function()[THIS]);
+ assert.equal(2, object.function('a', 'b')[ARGUMENTS].length);
+ assert.equal('a', object.function('a', 'b')[ARGUMENTS][0]);
+ assert.equal('b', object.function('a', 'b')[ARGUMENTS][1]);
+
+ assert.equal(object, object.method()[THIS]);
+ assert.equal(3, object.method('c', 'd', 'e')[ARGUMENTS].length);
+ assert.equal('c', object.method('c', 'd', 'e')[ARGUMENTS][0]);
+ assert.equal('d', object.method('c', 'd', 'e')[ARGUMENTS][1]);
+ assert.equal('e', object.method('c', 'd', 'e')[ARGUMENTS][2]);
+
+ assert.equal(self, object.arrow()[THIS]);
+ assert.equal(1, object.arrow('f', 'g')[ARGUMENTS].length);
+ assert.equal(42, object.arrow('f', 'g')[ARGUMENTS][0]);
+ })();
+}
+
+f.call(self, 42);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Arguments.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Arguments.js
new file mode 100644
index 0000000000..ad94aa2b4f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Arguments.js
@@ -0,0 +1,6 @@
+function f() {
+ var args = (() => arguments)();
+ assert.equal(args, arguments);
+}
+
+f();
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ArrowFunctions.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ArrowFunctions.js
new file mode 100644
index 0000000000..2aa3255ccd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ArrowFunctions.js
@@ -0,0 +1,52 @@
+// Options: --block-binding
+
+// These tests are from:
+// http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax
+
+let empty = () => undefined;
+assert.equal(empty(), undefined);
+
+// Expression bodies needs no parentheses or braces
+let identity = (x) => x;
+assert.equal(identity(empty), empty);
+
+// Object literals needs to be wrapped in parens.
+let keyMaker = (val) => ({key: val});
+assert.equal(keyMaker(empty).key, empty);
+
+// => { starts a block.
+let emptyBlock = () => {a: 42};
+assert.equal(emptyBlock(), undefined);
+
+// Nullary arrow function starts with arrow (cannot begin statement)
+const preamble = 'hello';
+const body = 'world';
+let nullary = () => preamble + ': ' + body;
+assert.equal('hello: world', nullary());
+
+// No need for parens even for lower-precedence expression body
+let square = x => x * x;
+assert.equal(81, square(9));
+
+let oddArray = [];
+let array = [2, 3, 4, 5, 6, 7];
+array.forEach((v, i) => { if (i & 1) oddArray[i >>> 1] = v; });
+assert.equal('3,5,7', oddArray.toString());
+
+var f = (x = 42) => x;
+assert.equal(42, f());
+
+{
+ let g = (...xs) => xs;
+ assertArrayEquals([0, 1, true], g(0, 1, true));
+}
+
+var h = (x, ...xs) => xs;
+assertArrayEquals([0, 1, true], h(-1, 0, 1, true));
+
+assert.equal(typeof (() => {}), 'function');
+assert.equal(Object.getPrototypeOf(() => {}), Function.prototype);
+
+var i = ({a = 1}) => a;
+assert.equal(i({}), 1);
+assert.equal(i({a: 2}), 2);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/CoverInitializer.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/CoverInitializer.js
new file mode 100644
index 0000000000..f461959aaa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/CoverInitializer.js
@@ -0,0 +1,5 @@
+// https://github.com/google/traceur-compiler/issues/478
+
+function f() {
+ (1 ? ({a=0}) => {} : 1);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer.js
new file mode 100644
index 0000000000..b342823845
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer.js
@@ -0,0 +1,5 @@
+// Error: :4:16: Unexpected token =
+
+function f() {
+ ({a = (0, {a = 0})} = {})
+}
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer2.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer2.js
new file mode 100644
index 0000000000..6252ef4fcc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer2.js
@@ -0,0 +1,3 @@
+// Error: :3:5: Unexpected token =
+
+({a = 0});
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer3.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer3.js
new file mode 100644
index 0000000000..a5d260c392
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_CoverInitializer3.js
@@ -0,0 +1,3 @@
+// Error: :3:18: Unexpected token =
+
+var f = ({x = {y = 1}) => 2;
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Disabled.js
new file mode 100644
index 0000000000..a0c05a6f30
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Disabled.js
@@ -0,0 +1,4 @@
+// Options: --arrow-functions=false
+// Error: :4:21: Unexpected token >
+
+var identity = (x) => x;
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_FreeVariableChecker.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_FreeVariableChecker.js
new file mode 100644
index 0000000000..4db02378a2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_FreeVariableChecker.js
@@ -0,0 +1,3 @@
+// Options: --arrow-functions --free-variable-checker
+// Error: :3:35: missingIdentifier is not defined
+var identity = (identityParam) => missingIdentifier;
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_InvalidFormalParameters.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_InvalidFormalParameters.js
new file mode 100644
index 0000000000..b0b6078c15
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_InvalidFormalParameters.js
@@ -0,0 +1,3 @@
+// Error: :3:15: Unexpected token +
+
+var f = (a, b + 5) => a + b;
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_LineTerminator.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_LineTerminator.js
new file mode 100644
index 0000000000..f6f2497767
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_LineTerminator.js
@@ -0,0 +1,4 @@
+// Error: :4:1: Unexpected token =>
+
+x
+=>1
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence.js
new file mode 100644
index 0000000000..932532c4b3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence.js
@@ -0,0 +1,3 @@
+// Error: :3:26: Semi-colon expected
+
+var identity = (x) => {x}.bind({});
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence2.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence2.js
new file mode 100644
index 0000000000..b064f6d29d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence2.js
@@ -0,0 +1,4 @@
+// Error: :4:11: Semi-colon expected
+// Error: :4:11: Unexpected token =>
+
+(x) + (y) => y;
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence3.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence3.js
new file mode 100644
index 0000000000..c3e1bb2b8c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_Precedence3.js
@@ -0,0 +1,4 @@
+// Error: :4:9: Semi-colon expected
+// Error: :4:9: Unexpected token =>
+
+(x) + y => y;
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_SpreadNotLast.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_SpreadNotLast.js
new file mode 100644
index 0000000000..7276b3b180
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_SpreadNotLast.js
@@ -0,0 +1,6 @@
+// Error: :5:17: Unexpected token ,
+// Error: :5:12: Unexpected token ...
+
+{
+ let f = (...xs, x) => xs;
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_SpreadOutsideFormals.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_SpreadOutsideFormals.js
new file mode 100644
index 0000000000..7884adf087
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Error_SpreadOutsideFormals.js
@@ -0,0 +1,3 @@
+// Error: :3:13: Unexpected token ...
+
+var f = (x, ...xs);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/FreeVariableChecker.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/FreeVariableChecker.js
new file mode 100644
index 0000000000..d3681bd6b9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/FreeVariableChecker.js
@@ -0,0 +1,2 @@
+var identity = (identityParam) => identityParam;
+assert.equal(1234, identity(1234));
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Parens.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Parens.js
new file mode 100644
index 0000000000..1eae88e41e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Parens.js
@@ -0,0 +1,19 @@
+class C {
+ constructor() {
+ }
+}
+
+class D extends C {
+ constructor() {
+ super();
+ this.x = {
+ y: () => {
+ return this;
+ }
+ };
+ }
+}
+
+var o = new D();
+assert.equal(typeof o.x.y, 'function');
+assert.equal(o.x.y(), o);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_Frozen.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_Frozen.js
new file mode 100644
index 0000000000..de7f381055
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_Frozen.js
@@ -0,0 +1,39 @@
+// Skip. Not implemented.
+
+// TODO: needs # prefix implemented for freezing
+// Use # to freeze and join to nearest relevant closure
+function return_pure() {
+ return #(a) -> a * a;
+}
+
+let p = return_pure(),
+ q = return_pure();
+assert(p === q);
+
+function check_frozen(o) {
+ try {
+ o.x = "expando";
+ assert(! "reached");
+ } catch (e) {
+ // e is something like "TypeError: o is not extensible"
+ assert(e.name == "TypeError");
+ }
+}
+
+check_frozen(p);
+
+function partial_mul(a) {
+ return #(b) -> a * b;
+}
+
+let x = partial_mul(3),
+ y = partial_mul(4),
+ z = partial_mul(3);
+
+assert(x !== y);
+assert(x !== z);
+assert(y !== z);
+
+check_frozen(x);
+check_frozen(y);
+check_frozen(z);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_InitializerShorthand.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_InitializerShorthand.js
new file mode 100644
index 0000000000..27548d0d58
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_InitializerShorthand.js
@@ -0,0 +1,19 @@
+// Skip. Not implemented.
+
+// TODO: needs the intializer shorthand implemented for arrow functions
+
+// Object intializer shorthand: "method" = function-valued property with dynamic ''this''
+const obj = {
+ method() -> {
+ return => this;
+ }
+};
+
+assert(obj.method() === obj);
+assert(obj.method.call(u) === u);
+
+// Name binding forms hoist to body (var) or block (let, const) top
+var warmer(a) -> { return a; };
+let warm(b) -> { return b; };
+const colder(c) -> { return c; };
+const #coldest(d) -> {...};
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_SoftBind.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_SoftBind.js
new file mode 100644
index 0000000000..0ef4fd6835
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/Skip_SoftBind.js
@@ -0,0 +1,14 @@
+// Skip. Not implemented.
+
+// TODO: needs soft bind and ??= implemented
+
+// A special form based on the default operator proposal
+const self_default_bound = (this ??= self, a, b) -> {
+ this.c = a * b;
+}
+self_default_bound(6, 7);
+assert(self.c === 42);
+
+self_default_bound.call(other, 8, 9);
+assert(other.c === 72);
+assert(self.c === 42);
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/SloppyArguments.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/SloppyArguments.js
new file mode 100644
index 0000000000..a00746bc7e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/SloppyArguments.js
@@ -0,0 +1,15 @@
+
+var f1 = implements => implements;
+var f2 = implements => { return implements; };
+var f3 = (implements) => { return implements; };
+assert.equal(1, f1(1));
+assert.equal(2, f2(2));
+assert.equal(3, f1(3));
+
+var g = ({static}) => static;
+assert.equal(4, g({static: 4}));
+
+var h1 = ([protected]) => protected;
+var h2 = ([...protected]) => protected[0];
+assert.equal(5, h1([5]));
+assert.equal(6, h2([6]));
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ThisBindingInPropertyName.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ThisBindingInPropertyName.js
new file mode 100644
index 0000000000..4d2751ec7e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ThisBindingInPropertyName.js
@@ -0,0 +1,15 @@
+var obj = {
+ name: 'x',
+ method() {
+ var f = (x) => ({[this.name]: x});
+
+ var o = f(1);
+ assert.equal(1, o.x);
+
+ this.name = 2;
+ o = f(3);
+ assert.equal(3, o[2]);
+ }
+};
+
+obj.method();
diff --git a/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ThisBindings.js b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ThisBindings.js
new file mode 100644
index 0000000000..c3aee86629
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ArrowFunctions/ThisBindings.js
@@ -0,0 +1,18 @@
+// Options: --block-binding
+
+// These tests are from:
+// http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax
+
+const obj = {
+ method: function () {
+ return () => this;
+ }
+};
+assert.equal(obj.method()(), obj);
+
+let fake = {steal: obj.method()};
+assert.equal(fake.steal(), obj);
+
+let real = {borrow: obj.method};
+assert.equal(real.borrow()(), real);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AlphaRenaming.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AlphaRenaming.js
new file mode 100644
index 0000000000..6525b1cc98
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AlphaRenaming.js
@@ -0,0 +1,21 @@
+// Options: --async-functions
+// Async.
+
+function asyncComplete(self, arg) {
+ return new Promise((resolve) => {
+ resolve([self, arg]);
+ });
+}
+
+var self = {};
+var obj = {};
+var value;
+
+async function A() {
+ assert.equal(this, self);
+ var value = await asyncComplete(this, arguments[0]);
+ assert.deepEqual([self, obj], value);
+ done();
+}
+
+A.call(self, obj);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrow.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrow.js
new file mode 100644
index 0000000000..c02247d217
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrow.js
@@ -0,0 +1,9 @@
+// Options: --async-functions
+// Async.
+
+var f = async () => 1;
+
+f().then((result) => {
+ assert.equal(result, 1);
+ done();
+}).catch(done);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrow2.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrow2.js
new file mode 100644
index 0000000000..289ba80d60
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrow2.js
@@ -0,0 +1,9 @@
+// Options: --async-functions
+// Async.
+
+var f = async x => x;
+
+f(1).then((result) => {
+ assert.equal(result, 1);
+ done();
+}).catch(done);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrowArguments.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrowArguments.js
new file mode 100644
index 0000000000..42e3f472b4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrowArguments.js
@@ -0,0 +1,16 @@
+// Options: --async-functions
+// Async.
+
+function g() {
+ var f = async (x = arguments) => [x, arguments];
+
+ f().then((result) => {
+ assert.equal(result[0][0], 1);
+ assert.equal(result[1][0], 1);
+ assert.equal(result[0][1], 2);
+ assert.equal(result[1][1], 2);
+ done();
+ }).catch(done);
+}
+
+g(1, 2);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrowThis.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrowThis.js
new file mode 100644
index 0000000000..d4d0f64028
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncArrowThis.js
@@ -0,0 +1,15 @@
+// Options: --async-functions
+// Async.
+
+function g() {
+ var f = async (x = this) => [x, this];
+ var p = {};
+ f.call(p).then((result) => {
+ assert.equal(result[0], o);
+ assert.equal(result[1], o);
+ done();
+ }).catch(done);
+}
+
+var o = {};
+g.call(o);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncMethod.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncMethod.js
new file mode 100644
index 0000000000..4c9444da90
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncMethod.js
@@ -0,0 +1,31 @@
+// Options: --async-functions
+// Async.
+
+function asyncTimeout(ms) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, ms);
+ });
+}
+
+class C {
+ async test() {
+ var x = 0;
+ await asyncTimeout(1);
+ assert.equal(1, ++x);
+ await asyncTimeout(1);
+ assert.equal(2, ++x);
+ C.test();
+ }
+
+ static async test() {
+ var x = 0;
+ await asyncTimeout(1);
+ assert.equal(1, ++x);
+ await asyncTimeout(1);
+ assert.equal(2, ++x);
+
+ done();
+ }
+}
+
+new C().test();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncMethodObjectLiteral.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncMethodObjectLiteral.js
new file mode 100644
index 0000000000..7020a6978d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncMethodObjectLiteral.js
@@ -0,0 +1,21 @@
+// Options: --async-functions
+// Async.
+
+function asyncTimeout(ms) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, ms);
+ });
+}
+
+var object = {
+ async test() {
+ var x = 0;
+ await asyncTimeout(1);
+ assert.equal(1, ++x);
+ await asyncTimeout(1);
+ assert.equal(2, ++x);
+ done();
+ }
+}
+
+object.test();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncSyntax.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncSyntax.js
new file mode 100644
index 0000000000..75be014bc0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/AsyncSyntax.js
@@ -0,0 +1,18 @@
+// Options: --async-functions
+
+var async;
+async
+function f() {
+ return async + async;
+}
+
+async = 1;
+assert.equal(async, 1);
+assert.equal(f(), 2);
+
+async = async
+function g() {
+
+}
+
+assert.equal(async, 1);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Basics.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Basics.js
new file mode 100644
index 0000000000..9592812858
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Basics.js
@@ -0,0 +1,46 @@
+// Options: --async-functions --generators=false
+// Async.
+//
+// The --generators=false part is to test #1231
+
+var f = (x, y) => ({x, y});
+
+(async function() {
+ var x = await 1;
+ assert.equal(1, x);
+ x = await (await 2);
+ assert.equal(2, x);
+ x = (await 3, await 4);
+ assert.equal(4, x);
+
+ x = f(await 5, await 6);
+ assert.deepEqual({x: 5, y: 6}, x);
+ x = await f(await 7, await 8);
+ assert.deepEqual({x: 7, y: 8}, x);
+
+ if (await true) {
+ x = 9;
+ } else {
+ x = 10;
+ }
+ assert.equal(9, x);
+ if (await false) {
+ x = 11;
+ } else {
+ x = 12;
+ }
+ assert.equal(12, x);
+
+ var j = 0;
+ for (var i = await 0; (await i) < (await 3); await i++) {
+ assert.equal(i, j++);
+ }
+ assert.equal(3, j);
+
+ var g = (x) => x;
+ var h = () => 13;
+ x = await g({z: await h()});
+ assert.deepEqual({z: 13}, x);
+
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Complete.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Complete.js
new file mode 100644
index 0000000000..948e11142a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Complete.js
@@ -0,0 +1,16 @@
+// Options: --async-functions
+// Async.
+
+function asyncComplete() {
+ return new Promise((resolve) => {
+ resolve('complete');
+ });
+}
+
+// ----------------------------------------------------------------------------
+
+(async function() {
+ var value = await asyncComplete();
+ assert.equal('complete', value);
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Empty.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Empty.js
new file mode 100644
index 0000000000..4cd44b74c9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Empty.js
@@ -0,0 +1,10 @@
+// Options: --async-functions
+// Async.
+
+async function empty() {
+}
+
+empty().then((v) => {
+ assert.isUndefined(v);
+ done();
+});
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_AsyncArrow.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_AsyncArrow.js
new file mode 100644
index 0000000000..3973c62fc5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_AsyncArrow.js
@@ -0,0 +1,7 @@
+// Options: --async-functions
+// Error: :7:5: Semi-colon expected
+// Error: :7:5: Unexpected token =>
+
+var async = () => 1;
+var x = async
+(y) => y;
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_AsyncArrow2.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_AsyncArrow2.js
new file mode 100644
index 0000000000..b48847aa1d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_AsyncArrow2.js
@@ -0,0 +1,6 @@
+// Options: --async-functions
+// Error: :6:1: Unexpected token =>
+
+var async = () => 1;
+var x = async (y)
+=> y;
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_Disabled.js
new file mode 100644
index 0000000000..ccfde7dd72
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Error_Disabled.js
@@ -0,0 +1,15 @@
+// Disabled by default.
+// Error: :13:21: Semi-colon expected
+
+function asyncComplete() {
+ return new Promise((resolve) => {
+ resolve('complete');
+ });
+}
+
+// ----------------------------------------------------------------------------
+
+(async function() {
+ var value = async asyncComplete();
+ assert.equal('complete', value);
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Export.module.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Export.module.js
new file mode 100644
index 0000000000..cd23d5a62b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Export.module.js
@@ -0,0 +1,18 @@
+// Options: --async-functions
+// Async.
+
+import {asyncFunction} from './resources/async-function.js';
+import asyncFunctionDefault from './resources/async-function.js';
+
+assert.instanceOf(asyncFunction(), Promise);
+assert.instanceOf(asyncFunctionDefault(), Promise);
+
+(async function() {
+ var x = await asyncFunction();
+ assert.equal(x, 1);
+
+ var y = await asyncFunctionDefault();
+ assert.equal(y, 2);
+
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Finally.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Finally.js
new file mode 100644
index 0000000000..4e9f603625
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Finally.js
@@ -0,0 +1,25 @@
+// Options: --async-functions
+// Async.
+
+var finallyVisited = false;
+
+var resolve;
+var p = new Promise((r) => {
+ resolve = r;
+});
+var v;
+
+async function test() {
+ try {
+ v = await p;
+ } finally {
+ finallyVisited = true;
+ }
+ assert.equal(42, v);
+ assert.isTrue(finallyVisited);
+ done();
+}
+
+test();
+assert.isFalse(finallyVisited);
+resolve(42);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Finally2.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Finally2.js
new file mode 100644
index 0000000000..63cf8e1240
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Finally2.js
@@ -0,0 +1,21 @@
+// Options: --async-functions
+// Async.
+
+var finallyVisited = false;
+var resolve;
+
+async function test() {
+ try {
+ await new Promise((r) => {
+ resolve = r;
+ });
+ } finally {
+ finallyVisited = true;
+ }
+ assert.isTrue(finallyVisited);
+ done();
+}
+
+test();
+assert.isFalse(finallyVisited);
+resolve();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/PromiseCast.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/PromiseCast.js
new file mode 100644
index 0000000000..aabac1d0bb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/PromiseCast.js
@@ -0,0 +1,12 @@
+// Options: --async-functions
+// Async.
+
+async function f() {
+ var x = await 1;
+ assert.equal(x, 1);
+ x = await undefined;
+ assert.equal(x, undefined);
+ done();
+}
+
+f();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Prototype.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Prototype.js
new file mode 100644
index 0000000000..cbdc07aeaa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Prototype.js
@@ -0,0 +1,7 @@
+// Options: --async-functions
+
+async function f() {
+}
+
+assert.equal(Object.getPrototypeOf(f), Function.prototype);
+assert.instanceOf(f(), Promise);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Rethrow.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Rethrow.js
new file mode 100644
index 0000000000..253b9ddfdf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Rethrow.js
@@ -0,0 +1,13 @@
+// Options: --async-functions
+// Async.
+
+async function rethrow(x) {
+ 1;
+ throw x;
+ 2;
+}
+
+rethrow(2).catch((err) => {
+ assert.equal(err, 2)
+ done();
+});
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Return.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Return.js
new file mode 100644
index 0000000000..fa98200106
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Return.js
@@ -0,0 +1,16 @@
+// Options: --async-functions
+// Async.
+
+async function ret(x) {
+ if (x > 1)
+ return x - 2;
+ return x + 3;
+}
+
+(async function() {
+ var v = await ret(4);
+ assert.equal(v, 2);
+ v = await ret(0);
+ assert.equal(v, 3);
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Throw.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Throw.js
new file mode 100644
index 0000000000..452312fae9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Throw.js
@@ -0,0 +1,30 @@
+// Options: --async-functions
+// Async.
+
+async function asyncThrow(e) {
+ if (true)
+ throw e;
+ await asyncYield();
+}
+
+function asyncYield() {
+ return asyncTimeout(0);
+}
+
+function asyncTimeout(ms) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, ms);
+ });
+}
+
+(async function() {
+ var value;
+ try {
+ value = await asyncThrow(1);
+ fail("shouldn't get here");
+ } catch (e) {
+ assert.equal(1, e);
+ }
+
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Timeout.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Timeout.js
new file mode 100644
index 0000000000..a0803b1716
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Timeout.js
@@ -0,0 +1,21 @@
+// Options: --async-functions
+// Async.
+
+function asyncTimeout(ms) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, ms);
+ });
+}
+
+(async function() {
+ var x = 0;
+ await asyncTimeout(1);
+ assert.equal(1, ++x);
+ await asyncTimeout(1);
+ assert.equal(2, ++x);
+ await asyncTimeout(1);
+ assert.equal(3, ++x);
+ await asyncTimeout(1);
+ assert.equal(4, ++x);
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Value.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Value.js
new file mode 100644
index 0000000000..1a1aaf5f8c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Value.js
@@ -0,0 +1,24 @@
+// Options: --async-functions
+// Async.
+
+async function asyncValue(value) {
+ if (true)
+ return value;
+ await asyncYield();
+}
+
+function asyncYield() {
+ return asyncTimeout(0);
+}
+
+function asyncTimeout(ms) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, ms);
+ });
+}
+
+(async function() {
+ var value = await asyncValue(42);
+ assert.equal(42, value);
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Yield.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Yield.js
new file mode 100644
index 0000000000..dfb4bba86a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/Yield.js
@@ -0,0 +1,17 @@
+// Options: --async-functions
+// Async.
+
+function asyncYield() {
+ return asyncTimeout(0);
+}
+
+function asyncTimeout(ms) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, ms);
+ });
+}
+
+(async function() {
+ await asyncYield();
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncFunctions/resources/async-function.js b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/resources/async-function.js
new file mode 100644
index 0000000000..3431ca98d4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncFunctions/resources/async-function.js
@@ -0,0 +1,7 @@
+export async function asyncFunction() {
+ return 1;
+}
+
+export default async function() {
+ return 2;
+};
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Array.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Array.js
new file mode 100644
index 0000000000..e3c2359302
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Array.js
@@ -0,0 +1,14 @@
+// Options: --for-on --async-functions
+// Async.
+
+(async function() {
+ const list = [];
+ const g = [1, 2, 3];
+ for (var i on g) {
+ list.push(i);
+ }
+ assert.deepEqual(list, [1, 2, 3]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/AsyncGenerator.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/AsyncGenerator.js
new file mode 100644
index 0000000000..a04d7239b9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/AsyncGenerator.js
@@ -0,0 +1,18 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* f() {
+ yield 1;
+}
+
+(async function() {
+ var list = [];
+ var g = f();
+ for (var i on g) {
+ list.push(i);
+ }
+ assert.deepEqual(list, [1]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/AsyncObservable.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/AsyncObservable.js
new file mode 100644
index 0000000000..cb31ec9a54
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/AsyncObservable.js
@@ -0,0 +1,21 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* f() {
+ await yield 1;
+ await yield 2;
+ await yield 3;
+}
+
+(async function() {
+ var list = [];
+ var g = f();
+ for (var i on g) {
+ list.push(i);
+ await Promise.resolve().then(() => list.push(i + 3));
+ }
+ assert.deepEqual(list, [1, 4, 2, 5, 3, 6]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Demo.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Demo.js
new file mode 100644
index 0000000000..a9a854ce70
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Demo.js
@@ -0,0 +1,29 @@
+// Options: --async-functions --async-generators --for-on
+// Async.
+
+function timeout(ms) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, ms);
+ });
+}
+
+async function* asyncStream() {
+ var i = 0;
+ while (true) {
+ await timeout(5);
+ yield i;
+ ++i;
+ }
+}
+
+(async function() {
+ var count = 0;
+ for (value on asyncStream()) {
+ count += value;
+ if (value === 3) {
+ break; // stops the async generator as well
+ }
+ }
+ assert.equal(count, 6); // 6 = 1 + 2 + 3
+ done();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ForOn.module.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ForOn.module.js
new file mode 100644
index 0000000000..6ba98faaf5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ForOn.module.js
@@ -0,0 +1,75 @@
+// Async.
+// Options: --async-functions --for-on
+
+import {AsyncGeneratorFunction} from './resources/observable.js';
+
+var o1 = new AsyncGeneratorFunction(function* () {
+ // TODO(mnieper): As soon as proper async generators are implemented, they
+ // should be used here.
+ yield 1;
+ yield 2;
+ yield 3;
+ return 4;
+});
+
+(async function () {
+
+ // test for on
+ var squares = [];
+ for (var i on o1) {
+ squares.push(i * i);
+ }
+ assert.deepEqual(squares, [1, 4, 9]);
+
+ // test break
+ var cubes = [];
+ for (var i on o1) {
+ if (i > 2) {
+ break;
+ }
+ cubes.push(i * i * i);
+ }
+ assert.deepEqual(cubes, [1, 8]);
+
+ // test continue
+ var list = [];
+ for (var i on o1) {
+ if (i === 2) {
+ continue;
+ }
+ list.push(i);
+ }
+ assert.deepEqual(list, [1, 3]);
+
+ // test outer continue
+ var almostEmpty = [];
+ label: do {
+ for (var i on o1) {
+ if (i === 2) {
+ continue label;
+ }
+ almostEmpty.push(i);
+ }
+ } while (false);
+ assert.deepEqual(almostEmpty, [1]);
+
+ // test return
+ var value = await (async function () {
+ for (var i on o1) {
+ if (i === 1) {
+ return 42;
+ }
+ }
+ })();
+ assert.equal(value, 42);
+
+ // test asynchronous loop body
+ var sum = 0;
+ for (var i on o1) {
+ sum += i;
+ await Promise.resolve();
+ }
+ assert.equal(sum, 6);
+
+ done();
+}()).catch(done);
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ForOnBody.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ForOnBody.js
new file mode 100644
index 0000000000..2d90d1fd8e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ForOnBody.js
@@ -0,0 +1,14 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* x() {
+}
+
+async function y() {
+ for (let a on x())
+ break;
+}
+
+y()
+
+done();
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Method.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Method.js
new file mode 100644
index 0000000000..de739c2d4d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Method.js
@@ -0,0 +1,20 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+class C {
+ static async* f() {
+ yield 1;
+ }
+}
+
+(async function() {
+ var list = [];
+ var g = C.f();
+ for (var i on g) {
+ list.push(i);
+ }
+ assert.deepEqual(list, [1]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Property.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Property.js
new file mode 100644
index 0000000000..53e926ac3a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/Property.js
@@ -0,0 +1,20 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+var C = {
+ async* f() {
+ yield 1;
+ }
+};
+
+(async function() {
+ var list = [];
+ var g = C.f();
+ for (var i on g) {
+ list.push(i);
+ }
+ assert.deepEqual(list, [1]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ReturnAsyncGenerator.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ReturnAsyncGenerator.js
new file mode 100644
index 0000000000..08e40ca5ab
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ReturnAsyncGenerator.js
@@ -0,0 +1,24 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* f() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+
+(async function() {
+ var list = [];
+ var g = f();
+ for (var i on g) {
+ if (i === 2) {
+ break;
+ }
+ list.push(i);
+ }
+ assert.deepEqual(list, [1]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ThisAndArguments.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ThisAndArguments.js
new file mode 100644
index 0000000000..346ddcf9c8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ThisAndArguments.js
@@ -0,0 +1,19 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* f(a) {
+ yield this[0];
+ yield arguments[0];
+}
+
+(async function() {
+ var list = [];
+ var g = f.call([1], 2);
+ for (var i on g) {
+ list.push(i);
+ }
+ assert.deepEqual(list, [1, 2]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ThrowInAsyncGenerator.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ThrowInAsyncGenerator.js
new file mode 100644
index 0000000000..633baf4a62
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/ThrowInAsyncGenerator.js
@@ -0,0 +1,28 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* f() {
+ for (var i = 1; i < 4; ++i) {
+ yield i;
+ }
+}
+
+
+(async function() {
+ var list = [];
+ var g = f();
+ try {
+ for (var i on g) {
+ if (i == 2) {
+ throw 'ex';
+ }
+ list.push(i);
+ }
+ } catch (ex) {
+ assert.equal(ex, 'ex');
+ }
+ assert.deepEqual(list, [1]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/YieldFor.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/YieldFor.js
new file mode 100644
index 0000000000..497b4e9fec
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/YieldFor.js
@@ -0,0 +1,25 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* f1() {
+ yield 1;
+ yield* f2();
+ yield 4;
+}
+
+async function* f2() {
+ yield 2;
+ yield 3;
+}
+
+(async function() {
+ var list = [];
+ var g = f1();
+ for (var i on g) {
+ list.push(i);
+ }
+ assert.deepEqual(list, [1, 2, 3, 4]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/YieldForOn.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/YieldForOn.js
new file mode 100644
index 0000000000..4f25f39719
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/YieldForOn.js
@@ -0,0 +1,24 @@
+// Options: --async-generators --for-on --async-functions
+// Async.
+
+async function* f() {
+ yield 1;
+ yield 2;
+}
+
+async function* g() {
+ for (i on f()) {
+ yield 2 * i;
+ }
+}
+
+(async function() {
+ var list = [];
+ for (var i on g()) {
+ list.push(i);
+ }
+ assert.deepEqual(list, [2, 4]);
+
+ done();
+})().catch(done);
+
diff --git a/packages/babel-core/test/fixtures/traceur/AsyncGenerators/resources/observable.js b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/resources/observable.js
new file mode 100644
index 0000000000..bc401dd208
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/AsyncGenerators/resources/observable.js
@@ -0,0 +1,71 @@
+const generator = Symbol();
+const onDone = Symbol();
+const generatorFunction = Symbol();
+
+function schedule(asyncF) {
+ return Promise.resolve().then(asyncF);
+}
+
+class DecoratedGenerator {
+ constructor(_generator, _onDone) {
+ this[generator] = _generator;
+ this[onDone] = _onDone;
+ }
+
+ next(value) {
+ var result = this[generator].next();
+ if (result.done) {
+ this[onDone].call(this);
+ }
+ return result;
+ }
+
+ throw(error) {
+ this[onDone].call(this);
+ return this[generator].throw(error);
+ }
+
+ return(value) {
+ this[onDone].call(this);
+ return this[generator].return(value);
+ }
+}
+
+
+export class AsyncGeneratorFunction {
+ constructor(_generatorFunction) {
+ this[generatorFunction] = _generatorFunction;
+ }
+
+ [Symbol.observer](observer) {
+ var generator = this[generatorFunction].call(this);
+ var done = false;
+ schedule(async function () {
+ var result;
+ while (!done) {
+ try {
+ result = generator.next();
+ } catch (e) {
+ observer.throw(e);
+ return;
+ }
+ if (result.done) {
+ observer.return(result.value);
+ return;
+ }
+ try {
+ result = observer.next(result.value);
+ } catch (e) {
+ generator.throw(e);
+ }
+ if (result.done) {
+ generator.return();
+ return;
+ }
+ await result.value;
+ }
+ generator.return();
+ });
+ return new DecoratedGenerator(observer, () => { done = true });
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/.SuperNestedClass.js b/packages/babel-core/test/fixtures/traceur/Classes/.SuperNestedClass.js
new file mode 100644
index 0000000000..61c4632799
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/.SuperNestedClass.js
@@ -0,0 +1,21 @@
+class Animal {
+ constructor(name) {
+ this.name = name;
+ }
+}
+
+class Roo extends Animal {
+ constructor() {
+ class Koala extends (super('R'), Animal) {
+ constructor() {
+ super('K');
+ }
+ }
+ this.a = new Koala;
+ }
+}
+
+
+var r = new Roo();
+assert.equal('R', r.name);
+assert.equal('K', r.a.name);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ClassMethodInheritance.js b/packages/babel-core/test/fixtures/traceur/Classes/ClassMethodInheritance.js
new file mode 100644
index 0000000000..c957d1188e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ClassMethodInheritance.js
@@ -0,0 +1,23 @@
+function B() {}
+B.b = function() {
+ return 'B.b';
+};
+
+class C extends B {}
+
+assert.equal(Object.getPrototypeOf(C), B);
+assert.equal(Object.getPrototypeOf(C.prototype), B.prototype);
+
+assert.equal(C.b(), 'B.b');
+
+class D extends Object {}
+
+assert.equal(Object.getPrototypeOf(D), Object);
+assert.equal(Object.getPrototypeOf(D.prototype), Object.prototype);
+assert.equal(D.keys, Object.keys);
+
+class E {}
+
+assert.equal(Object.getPrototypeOf(E), Function.prototype);
+assert.equal(Object.getPrototypeOf(E.prototype), Object.prototype);
+assert.isFalse('keys' in E);
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ClassNameBinding.js b/packages/babel-core/test/fixtures/traceur/Classes/ClassNameBinding.js
new file mode 100644
index 0000000000..de7df429f9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ClassNameBinding.js
@@ -0,0 +1,41 @@
+
+var ClassExpr = class {
+ m() {
+ return ClassExpr;
+ }
+}
+
+var TempClass = ClassExpr;
+ClassExpr = 42;
+
+assert.equal(42, new TempClass().m());
+assert.equal(TempClass.name, '');
+
+//////////////////////////////////////////////////////////////////////////////
+
+var ClassExpr2 = class ClassExprInner {
+ m() {
+ return ClassExprInner;
+ }
+}
+
+TempClass = ClassExpr2;
+ClassExpr2 = 42;
+
+assert.equal(TempClass, new TempClass().m());
+assert.equal(TempClass.name, 'ClassExprInner');
+
+//////////////////////////////////////////////////////////////////////////////
+
+class ClassDef {
+ m() {
+ return ClassDef;
+ }
+}
+
+var TempClass = ClassDef;
+ClassDef = 42;
+
+assert.equal(TempClass, new TempClass().m());
+// IE does not have a name property on functions.
+assert.isTrue(TempClass.name === 'ClassDef' || TempClass.name === undefined);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ClassNameInStack.js b/packages/babel-core/test/fixtures/traceur/Classes/ClassNameInStack.js
new file mode 100644
index 0000000000..41d1fe4a3f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ClassNameInStack.js
@@ -0,0 +1,29 @@
+class MyClassName {
+ m() {
+ throw new Error();
+ }
+}
+
+try {
+ new MyClassName().m();
+ fail('Should have thrown');
+} catch (ex) {
+ if (ex.stack)
+ assert.isTrue(String(ex.stack).indexOf('MyClassName') >= 0);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+class MySecondClass extends MyClassName{
+ m() {
+ throw new Error();
+ }
+}
+
+try {
+ new MySecondClass().m();
+ fail('Should have thrown');
+} catch (ex) {
+ if (ex.stack)
+ assert.isTrue(String(ex.stack).indexOf('MySecondClass') >= 0);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Constructor.js b/packages/babel-core/test/fixtures/traceur/Classes/Constructor.js
new file mode 100644
index 0000000000..ce76af6bef
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Constructor.js
@@ -0,0 +1,34 @@
+class Point {
+ constructor(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+}
+
+class A {
+ classRef() {
+ return A;
+ }
+};
+
+var p = new Point(1, 2);
+assert.equal(1, p.x);
+assert.equal(2, p.y);
+
+var p2 = new Point(3, 4);
+assert.equal(3, p2.x);
+assert.equal(4, p2.y);
+assert.equal(1, p.x);
+assert.equal(2, p.y);
+
+for (var element in Point) {
+ fail('Point contains static member : ' + element);
+}
+
+// Tests to ensure that we're not binding function identifier per class
+var a = new A();
+var tmpA = A;
+A = 42;
+assert.equal(tmpA, a.classRef());
+// IE does not have a name property on functions.
+assert.isTrue(tmpA.name === 'A' || tmpA.name === undefined);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ConstructorChaining.js b/packages/babel-core/test/fixtures/traceur/Classes/ConstructorChaining.js
new file mode 100644
index 0000000000..7d2a4bd936
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ConstructorChaining.js
@@ -0,0 +1,22 @@
+class ConstructorA {
+ constructor(x) {
+ this.x = x;
+ }
+}
+
+class ConstructorB extends ConstructorA {
+ constructor(x, y) {
+ super(x);
+ this.y = y;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var a = new ConstructorA('ax');
+assert.equal('ax', a.x);
+assert.isFalse(a.hasOwnProperty('y'));
+
+var b = new ConstructorB('bx', 'by');
+assert.equal('bx', b.x);
+assert.equal('by', b.y);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ConstructorMember.js b/packages/babel-core/test/fixtures/traceur/Classes/ConstructorMember.js
new file mode 100644
index 0000000000..d437456e1e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ConstructorMember.js
@@ -0,0 +1,27 @@
+class ConstructorMember {
+ constructor() {}
+}
+
+class DerivedConstructorMember extends ConstructorMember {
+ constructor() {
+ super();
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var cm = new ConstructorMember;
+assert.equal(cm.constructor, ConstructorMember.prototype.constructor);
+assert.isTrue(ConstructorMember.prototype.hasOwnProperty('constructor'));
+
+for (var key in ConstructorMember) {
+ assert.notEqual('constructor should not be enumerable', 'constructor', key);
+}
+
+var dcm = new DerivedConstructorMember;
+assert.equal(dcm.constructor, DerivedConstructorMember.prototype.constructor);
+assert.isTrue(DerivedConstructorMember.prototype.hasOwnProperty('constructor'));
+
+for (var key in DerivedConstructorMember) {
+ assert.notEqual('constructor should not be enumerable', 'constructor', key);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/DefaultConstructor.js b/packages/babel-core/test/fixtures/traceur/Classes/DefaultConstructor.js
new file mode 100644
index 0000000000..057d30e24e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/DefaultConstructor.js
@@ -0,0 +1,31 @@
+class B {
+ constructor(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+}
+
+class C extends B {
+ // No constructor
+}
+
+var c = new B(1, 2);
+assert.equal(1, c.x);
+assert.equal(2, c.y);
+
+assert.isFalse(
+ Object.getOwnPropertyDescriptor(B.prototype, 'constructor').enumerable);
+assert.isFalse(
+ Object.getOwnPropertyDescriptor(C.prototype, 'constructor').enumerable);
+
+// Ensure that we don't try to call super() in the default constructor.
+class D extends null {}
+var d = new D();
+
+
+class E extends function(x) {
+ this.x = x;
+} {}
+
+var e = new E(42)
+assert.equal(42, e.x);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/DeriveFromObject.js b/packages/babel-core/test/fixtures/traceur/Classes/DeriveFromObject.js
new file mode 100644
index 0000000000..852ca2b0fc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/DeriveFromObject.js
@@ -0,0 +1,6 @@
+class DerivedFromObject extends Object {
+}
+
+// ----------------------------------------------------------------------------
+
+// TODO(rnystrom): No tests for this?
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/EmptyClass.js b/packages/babel-core/test/fixtures/traceur/Classes/EmptyClass.js
new file mode 100644
index 0000000000..733584a99b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/EmptyClass.js
@@ -0,0 +1,29 @@
+class Empty {}
+
+class EmptyB extends Empty {
+}
+
+// ----------------------------------------------------------------------------
+
+var e = new Empty();
+assert.isNotNull(e);
+
+for (var element in e) {
+ assert.equal('constructor', element);
+}
+
+for (var element in Empty) {
+ fail('Empty contains static member : ' + element);
+}
+
+// Instances should be different.
+var e2 = new Empty();
+assert.notEqual(e, e2);
+
+assert.isTrue(e instanceof Empty);
+assert.isFalse(e instanceof EmptyB);
+
+var b = new EmptyB();
+
+assert.isTrue(b instanceof Empty);
+assert.isTrue(b instanceof EmptyB);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_Disabled.js
new file mode 100644
index 0000000000..8735ad59c0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_Disabled.js
@@ -0,0 +1,4 @@
+// Options: --classes=false
+// Error: :4:1: Unexpected reserved word
+
+class C {}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_GH1556.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_GH1556.js
new file mode 100644
index 0000000000..88f0c96893
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_GH1556.js
@@ -0,0 +1,5 @@
+// Error: :5:19: Unexpected token =
+
+// extends LeftHandSideExpression
+// see https://github.com/google/traceur-compiler/issues/1556
+class A extends B = C {}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_NestedFunctionSuper.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_NestedFunctionSuper.js
new file mode 100644
index 0000000000..4171a7daa5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_NestedFunctionSuper.js
@@ -0,0 +1,22 @@
+// Error: :8:14: super is only allowed in methods
+// Error: :14:16: super is only allowed in methods
+// Error: :19:19: super is only allowed in methods
+
+class C {
+ superM() {
+ return (function() {
+ return super.m();
+ })();
+ }
+ superX2() {
+ return (function() {
+ return (function() {
+ return super.x;
+ })();
+ })();
+ }
+ constructor() {
+ (function() { super(); })();
+ }
+}
+
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_NewSuper.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_NewSuper.js
new file mode 100644
index 0000000000..abbfa06a88
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_NewSuper.js
@@ -0,0 +1,7 @@
+// Error: :5:14: Unexpected token (
+
+class C {
+ m() {
+ new super();
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_NewSuper2.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_NewSuper2.js
new file mode 100644
index 0000000000..40622d3632
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_NewSuper2.js
@@ -0,0 +1,7 @@
+// Error: :6:3: Unexpected token }
+
+class C {
+ m() {
+ new super
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_NoSuperInDerivedClass.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_NoSuperInDerivedClass.js
new file mode 100644
index 0000000000..184a79a41d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_NoSuperInDerivedClass.js
@@ -0,0 +1,9 @@
+// Error: :6:3: Derived constructor must call super()
+
+class B {}
+
+class C extends B {
+ constructor() {
+ // no super call
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_Super.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_Super.js
new file mode 100644
index 0000000000..9855970fb1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_Super.js
@@ -0,0 +1,10 @@
+// Error: :7:17: Unexpected token ;
+
+class A {}
+
+class ImproperSuper extends A {
+ method() {
+ return super;
+ }
+}
+
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperAsTemplateTag.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperAsTemplateTag.js
new file mode 100644
index 0000000000..0947e2ad35
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperAsTemplateTag.js
@@ -0,0 +1,10 @@
+// Error: :7:18: Unexpected token `
+
+class A {}
+
+class ImproperSuper extends A {
+ method() {
+ return super ``;
+ }
+}
+
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperCallInNonDerived.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperCallInNonDerived.js
new file mode 100644
index 0000000000..1c936ac286
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperCallInNonDerived.js
@@ -0,0 +1,7 @@
+// Error: :5:5: super call is only allowed in derived constructor
+
+class C {
+ constructor() {
+ super();
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperNestedClass.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperNestedClass.js
new file mode 100644
index 0000000000..2ad46de00a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperNestedClass.js
@@ -0,0 +1,15 @@
+// Error: :12:5: 'this' is not allowed before super()
+
+class Animal {}
+
+class Roo extends Animal {
+ constructor() {
+ class Koala extends Animal {
+ constructor() {
+ super();
+ }
+ }
+ this.a = new Koala;
+ super();
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperPropertyOutsideMethod.js b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperPropertyOutsideMethod.js
new file mode 100644
index 0000000000..923804325c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Error_SuperPropertyOutsideMethod.js
@@ -0,0 +1,10 @@
+// Error: :6:3: super is only allowed in methods
+// Error: :9:15: super is only allowed in methods
+// Error: :10:17: super is only allowed in methods
+
+function f() {
+ super.x;
+}
+
+var g = () => super.y;
+var h = () => { super.z; }
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ExtendCoverFormals.js b/packages/babel-core/test/fixtures/traceur/Classes/ExtendCoverFormals.js
new file mode 100644
index 0000000000..bebe84c82c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ExtendCoverFormals.js
@@ -0,0 +1,10 @@
+class C {}
+
+var x = 1;
+var y = C;
+class D extends (x, y) {
+
+}
+
+assert.instanceOf(new D(), C);
+assert.instanceOf(new D(), D);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ExtendNonConstructableFunction.js b/packages/babel-core/test/fixtures/traceur/Classes/ExtendNonConstructableFunction.js
new file mode 100644
index 0000000000..8093c9534a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ExtendNonConstructableFunction.js
@@ -0,0 +1,11 @@
+
+assert.throw(function() {
+ class C extends Math {}
+}, 'Super expression must either be null or a function');
+
+assert.throw(function() {
+ function f() {}
+ // prototype needs to be an Object or null.
+ f.prototype = 42;
+ class C extends f {}
+}, 'super prototype must be an Object or null');
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ExtendObject.js b/packages/babel-core/test/fixtures/traceur/Classes/ExtendObject.js
new file mode 100644
index 0000000000..e5b11ffe2d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ExtendObject.js
@@ -0,0 +1,4 @@
+// Can no longer extend objects.
+assert.throw(function() {
+ class C extends {} {}
+}, TypeError);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/ExtendStrange.js b/packages/babel-core/test/fixtures/traceur/Classes/ExtendStrange.js
new file mode 100644
index 0000000000..3911d03ddb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/ExtendStrange.js
@@ -0,0 +1,54 @@
+class C extends null {}
+
+var c = new C;
+assert.isTrue(c instanceof C);
+assert.isFalse(c instanceof Object);
+
+// Closure testing framework tries to toString the object and fails.
+assert.isTrue(Object.getPrototypeOf(c) === C.prototype);
+assert.isTrue(Object.getPrototypeOf(Object.getPrototypeOf(c)) === null);
+
+assert.equal(c.toString, undefined);
+
+class D extends null {
+ constructor(...args) {
+ super(...args);
+ }
+}
+
+// super() does not depend on the [HomeObject]. It just calls the [Prototype]
+// of the function.
+new D();
+
+class E extends function() { return null }() {
+ constructor(...args) {
+ super(...args);
+ }
+}
+
+// super() does not depend on the [HomeObject]. It just calls the [Prototype]
+// of the function.
+new E();
+
+function f() {};
+f.prototype = null;
+
+class F extends f {
+ get x() {
+ return 1;
+ }
+}
+
+assert.equal(1, new F().x);
+
+
+function g() {}
+function h() {}
+g.prototype = h;
+class G extends g {
+ get x() {
+ return 2;
+ }
+}
+
+assert.equal(2, new G().x);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/FieldInheritance.js b/packages/babel-core/test/fixtures/traceur/Classes/FieldInheritance.js
new file mode 100644
index 0000000000..c9b863aaee
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/FieldInheritance.js
@@ -0,0 +1,26 @@
+class Point2D {
+ constructor() {
+ this.x = 1;
+ this.y = 2;
+ }
+}
+
+class Point3D extends Point2D {
+ constructor() {
+ super();
+ this.z = 3;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var a = new Point2D();
+assert.isTrue(a.hasOwnProperty('x'));
+assert.isTrue(a.hasOwnProperty('y'));
+assert.isFalse(a.hasOwnProperty('z'));
+assert.isUndefined(a.z);
+
+var b = new Point3D();
+assert.isTrue(b.hasOwnProperty('x'));
+assert.isTrue(b.hasOwnProperty('y'));
+assert.isTrue(b.hasOwnProperty('z'));
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/FieldInitializers.js b/packages/babel-core/test/fixtures/traceur/Classes/FieldInitializers.js
new file mode 100644
index 0000000000..dcd938fc00
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/FieldInitializers.js
@@ -0,0 +1,23 @@
+class Point {
+ constructor() {
+ this.x = 0;
+ this.y = 0;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var p = new Point();
+assert.equal(0, p.x);
+assert.equal(0, p.y);
+p.x = 1;
+assert.equal(1, p.x);
+
+var p2 = new Point();
+assert.equal(0, p2.x);
+assert.equal(0, p2.y);
+assert.equal(1, p.x);
+
+for (var element in Point) {
+ fail('Point contains static member : ' + element);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/FieldLookup.js b/packages/babel-core/test/fixtures/traceur/Classes/FieldLookup.js
new file mode 100644
index 0000000000..6afad51a9e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/FieldLookup.js
@@ -0,0 +1,47 @@
+// This requires manually constructed classes.
+
+function fieldLookupA() { }
+fieldLookupA.prototype = {
+ foo : "A.value",
+ get bar() {
+ return "A.get.bar";
+ },
+ set bar(value) { },
+ boo : "A.boo.value",
+ baz : undefined
+}
+
+function fieldLookupB() { }
+fieldLookupB.prototype = {
+ __proto__ : fieldLookupA.prototype,
+ get foo() {
+ return "B.get.foo";
+ },
+ set foo(value) { },
+ bar: "B.value",
+ boo: undefined,
+ baz: "B.baz.value",
+}
+
+class FieldLookupC extends fieldLookupB {
+ x() {
+ return super.foo;
+ }
+ y() {
+ return super.bar;
+ }
+ z() {
+ return super.boo;
+ }
+ w() {
+ return super.baz;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var c = new FieldLookupC();
+assert.equal("B.get.foo", c.x());
+assert.equal("B.value", c.y());
+assert.isUndefined(c.z());
+assert.equal("B.baz.value", c.w());
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Fields.js b/packages/babel-core/test/fixtures/traceur/Classes/Fields.js
new file mode 100644
index 0000000000..70848ed8fe
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Fields.js
@@ -0,0 +1,19 @@
+class Point {
+ constructor() {
+ this.x = 0;
+ this.y = 0;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var p = new Point();
+
+var keys = [];
+for (var key in p) {
+ keys.push(key);
+}
+
+assert.isTrue(keys.indexOf('x') !== -1);
+assert.isTrue(keys.indexOf('y') !== -1);
+assert.isTrue(keys.indexOf('constructor') === -1);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Getters.js b/packages/babel-core/test/fixtures/traceur/Classes/Getters.js
new file mode 100644
index 0000000000..06bd252815
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Getters.js
@@ -0,0 +1,20 @@
+class GetterA {
+ get x() { return 'getter x'; }
+ get y() { return 'getter y'; }
+}
+
+class GetterB extends GetterA {
+ get x() { return super.x; }
+}
+
+class GetterC extends GetterB {
+ get y() { return super.y; }
+}
+
+// ----------------------------------------------------------------------------
+
+var b = new GetterB();
+var c = new GetterC();
+
+assert.equal('getter x', b.x);
+assert.equal('getter y', c.y);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Inheritance.js b/packages/babel-core/test/fixtures/traceur/Classes/Inheritance.js
new file mode 100644
index 0000000000..562e12dadb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Inheritance.js
@@ -0,0 +1,9 @@
+class SimpleBase {}
+class SimpleDerived extends SimpleBase {}
+
+// ----------------------------------------------------------------------------
+
+var derived = new SimpleDerived();
+assert.isTrue(derived instanceof SimpleDerived);
+assert.isTrue(derived instanceof SimpleBase);
+assert.isTrue(derived instanceof Object);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/InheritanceFromMemberExpression.js b/packages/babel-core/test/fixtures/traceur/Classes/InheritanceFromMemberExpression.js
new file mode 100644
index 0000000000..4b8722655d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/InheritanceFromMemberExpression.js
@@ -0,0 +1,31 @@
+var baseContainer = {
+ base: function() {
+ this.yyy = 'base constructor';
+ }
+};
+
+baseContainer.base.prototype = {
+ x: 'proto x',
+ constructor: function() {
+ this.y = 'base y';
+ }
+}
+
+class MemberExprBase extends baseContainer.base {
+ constructor(w) {
+ super();
+ this.z = 'var z';
+ this.w = w;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var a = new MemberExprBase('w value');
+var pa = Object.getPrototypeOf(a);
+var ppa = Object.getPrototypeOf(pa);
+
+assertHasOwnProperty(a, 'yyy', 'w', 'z');
+assertLacksOwnProperty(a, 'x');
+assertHasOwnProperty(pa, 'constructor');
+assertHasOwnProperty(ppa, 'x', 'constructor');
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/InheritanceFromNonclass.js b/packages/babel-core/test/fixtures/traceur/Classes/InheritanceFromNonclass.js
new file mode 100644
index 0000000000..67b767156f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/InheritanceFromNonclass.js
@@ -0,0 +1,17 @@
+function noClassA() {}
+noClassA.prototype = {
+ ma: function() { return 'ma'; }
+}
+
+class NoClassB extends noClassA {
+ mb() {
+ return 'mb ' + super.ma();
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var b = new NoClassB;
+assert.isTrue(b instanceof noClassA);
+assert.equal('ma', b.ma());
+assert.equal('mb ma', b.mb());
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/InheritanceNameBinding.js b/packages/babel-core/test/fixtures/traceur/Classes/InheritanceNameBinding.js
new file mode 100644
index 0000000000..d39468d855
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/InheritanceNameBinding.js
@@ -0,0 +1,11 @@
+class NameBindingBase {}
+
+class NameBindingDerived extends NameBindingBase {
+ getX() { return this.x; }
+}
+
+// ----------------------------------------------------------------------------
+
+var derived = new NameBindingDerived();
+derived.x = 12;
+assert.equal(12, derived.getX());
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Method.js b/packages/babel-core/test/fixtures/traceur/Classes/Method.js
new file mode 100644
index 0000000000..a73c3fc4ac
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Method.js
@@ -0,0 +1,21 @@
+class Universe {
+ answer() {
+ return 42;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var universe = new Universe();
+assert.equal(42, universe.answer());
+
+var keys = [];
+for (var key in universe) {
+ keys.push(key);
+}
+assert.equal(keys.indexOf('answer'), -1);
+assert.equal(keys.indexOf('constructor'), -1);
+
+for (var key in Universe) {
+ fail('Universe contains static member : ' + key);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/MethodInheritance.js b/packages/babel-core/test/fixtures/traceur/Classes/MethodInheritance.js
new file mode 100644
index 0000000000..c9e0f63baa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/MethodInheritance.js
@@ -0,0 +1,32 @@
+class MethodsA {
+ ma() {}
+}
+
+class MethodsB extends MethodsA {
+ mb() {}
+}
+
+class MethodsC extends MethodsB {
+ mc() {}
+}
+
+// ----------------------------------------------------------------------------
+
+var a = new MethodsA();
+var b = new MethodsB();
+var c = new MethodsC();
+
+var pa = Object.getPrototypeOf(a);
+var pb = Object.getPrototypeOf(b);
+var pc = Object.getPrototypeOf(c);
+
+assertNoOwnProperties(a);
+assertNoOwnProperties(b);
+assertNoOwnProperties(c);
+
+assertHasOwnProperty(pa, 'ma');
+assertLacksOwnProperty(pa, 'mb', 'mc');
+assertHasOwnProperty(pb, 'mb');
+assertLacksOwnProperty(pb, 'ma', 'mc');
+assertHasOwnProperty(pc, 'mc');
+assertLacksOwnProperty(pc, 'ma', 'mb');
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/MethodLookup.js b/packages/babel-core/test/fixtures/traceur/Classes/MethodLookup.js
new file mode 100644
index 0000000000..2a11cc3be3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/MethodLookup.js
@@ -0,0 +1,34 @@
+class MethodLookupA {
+ foo() {
+ return 'A.foo()';
+ }
+ get bar() {
+ return 'A.get.bar';
+ }
+ set bar(value) { }
+}
+
+class MethodLookupB extends MethodLookupA {
+ get foo() {
+ return 'B.foo.get';
+ }
+ set foo(value) { }
+ bar() {
+ return 'B.bar()';
+ }
+}
+
+class MethodLookupC extends MethodLookupB {
+ x() {
+ return super.foo;
+ }
+ y() {
+ return super.bar();
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var c = new MethodLookupC();
+assert.equal('B.foo.get', c.x());
+assert.equal('B.bar()', c.y());
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/NameBinding.js b/packages/babel-core/test/fixtures/traceur/Classes/NameBinding.js
new file mode 100644
index 0000000000..38a6be7c4d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/NameBinding.js
@@ -0,0 +1,36 @@
+class ElementHolder {
+ getElement() { return this.element; }
+
+ makeFilterCapturedThis() {
+ var capturedThis = this;
+ return function (x) {
+ return x == capturedThis.element;
+ }
+ }
+
+ makeFilterLostThis() {
+ return function () { return this; }
+ }
+
+ makeFilterHidden(element) {
+ return function (x) { return x == element; }
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var obj = new ElementHolder();
+
+obj.element = 40;
+assert.equal(40, obj.getElement());
+assert.isTrue(obj.makeFilterCapturedThis()(40));
+
+// http://code.google.com/p/v8/issues/detail?id=1381
+// assert.isUndefined(obj.makeFilterLostThis()());
+
+obj.element = 39;
+assert.isFalse(obj.makeFilterCapturedThis()(40));
+assert.isTrue(obj.makeFilterCapturedThis()(39));
+
+assert.isFalse(obj.makeFilterHidden(41)(40));
+assert.isTrue(obj.makeFilterHidden(41)(41));
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/NestedClassSuper.js b/packages/babel-core/test/fixtures/traceur/Classes/NestedClassSuper.js
new file mode 100644
index 0000000000..9efce298ce
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/NestedClassSuper.js
@@ -0,0 +1,104 @@
+class One {
+ constructor(o) { o.r = 'c1'; }
+ m() { return 'm1'; }
+ get g() { return 'g1'; }
+ set x(v) { this.x_ = v+1; }
+ get x() { return this.x_; }
+}
+
+// All OneExt class decls are identical.
+//
+// Just testing identical behavior in the different contexts:
+// constructor, method, method with inner func, getter, setter.
+class OneExtWrapper {
+ constructor() {
+ class OneExt extends One {
+ constructor() {
+ var o = {};
+ super(o);
+ assert.equal('c1', o.r);
+ }
+ m() { return super.m(); }
+ get g() { return super.g; }
+ set x(v) { super.x = v; }
+ get x() { return super.x; }
+ }
+ this.Cconstr = OneExt;
+ }
+ m() {
+ class OneExt extends One {
+ constructor() {
+ var o = {};
+ super(o);
+ assert.equal('c1', o.r);
+ }
+ m() { return super.m(); }
+ get g() { return super.g; }
+ set x(v) { super.x = v; }
+ get x() { return super.x; }
+ }
+ return OneExt;
+ }
+ mf() {
+ return (function(){
+ class OneExt extends One {
+ constructor() {
+ var o = {};
+ super(o);
+ assert.equal('c1', o.r);
+ }
+ m() { return super.m(); }
+ get g() { return super.g; }
+ set x(v) { super.x = v; }
+ get x() { return super.x; }
+ }
+ return OneExt;
+ })();
+ }
+ get g() {
+ class OneExt extends One {
+ constructor() {
+ var o = {};
+ super(o);
+ assert.equal('c1', o.r);
+ }
+ m() { return super.m(); }
+ get g() { return super.g; }
+ set x(v) { super.x = v; }
+ get x() { return super.x; }
+ }
+ return OneExt;
+ }
+ set Cprop(v) {
+ class OneExt extends One {
+ constructor() {
+ var o = {};
+ super(o);
+ assert.equal('c1', o.r);
+ }
+ m() { return super.m(); }
+ get g() { return super.g; }
+ set x(v) { super.x = v; }
+ get x() { return super.x; }
+ }
+ this.C = OneExt;
+ }
+ get Cprop() {
+ return this.C;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+function checkClass(C) {
+ var o = new C();
+ assert.equal('m1', o.m());
+ assert.equal('g1', o.g);
+ o.x = 'x';
+ assert.equal('x1', o.x);
+}
+
+var o = new OneExtWrapper();
+o.Cprop = 'dummy value';
+
+[o.Cconstr, o.m(), o.mf(), o.g, o.Cprop].forEach(checkClass);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/NestedClassSuperAnimal.js b/packages/babel-core/test/fixtures/traceur/Classes/NestedClassSuperAnimal.js
new file mode 100644
index 0000000000..f96787256b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/NestedClassSuperAnimal.js
@@ -0,0 +1,45 @@
+// a = animal, n = name, sn = super name, fn = full name, wn = with name
+
+class Animal {
+ constructor(n) {
+ this.n1 = n + ' Animal';
+ }
+ get n() { return this.n1; }
+}
+
+class Roo extends Animal {
+ constructor(n) {
+ class Koala extends Animal {
+ constructor(n) {
+ super(n);
+ this.n2 = n + ' Koala';
+ }
+ get n() { return this.n2; }
+ get sn() { return super.n; }
+ get fn() { return this.n + ' aka ' + this.sn; }
+ }
+
+ super(n);
+ this.a = new Koala(n + ' II');
+ this.n2 = n + ' Roo';
+ }
+ wn(n) {
+ return ' (with ' + n + ')';
+ }
+ get n() { return this.n2 + this.wn(this.a.n); }
+ get sn() { return super.n + this.wn(this.a.sn); }
+ get fn() { return this.n + ' aka ' + this.sn + this.wn(this.a.fn); }
+}
+
+// ----------------------------------------------------------------------------
+
+var o = new Roo('Kanga');
+assert.equal('Kanga II Koala', o.a.n);
+assert.equal('Kanga II Animal', o.a.sn);
+assert.equal('Kanga II Koala aka Kanga II Animal', o.a.fn);
+
+assert.equal('Kanga Roo (with Kanga II Koala)', o.n);
+assert.equal('Kanga Animal (with Kanga II Animal)', o.sn);
+assert.equal('Kanga Roo (with Kanga II Koala) aka ' +
+ 'Kanga Animal (with Kanga II Animal) ' +
+ '(with Kanga II Koala aka Kanga II Animal)', o.fn);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/NewClassExpression.js b/packages/babel-core/test/fixtures/traceur/Classes/NewClassExpression.js
new file mode 100644
index 0000000000..a08d0ff8eb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/NewClassExpression.js
@@ -0,0 +1,18 @@
+
+assert.equal((new class {
+ get x() {
+ return 'x';
+ }
+ getX() {
+ return this.x;
+ }
+}).getX(), 'x');
+
+assert.equal(new class {
+ get y() {
+ return 'y';
+ }
+ getY() {
+ return this.y;
+ }
+}().getY(), 'y');
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/NonEnum.js b/packages/babel-core/test/fixtures/traceur/Classes/NonEnum.js
new file mode 100644
index 0000000000..243bb30bbf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/NonEnum.js
@@ -0,0 +1,23 @@
+class B {
+ a() {}
+ get b() {}
+ set c(v) {}
+ static d() {}
+ static get e() {}
+ static set f(v) {}
+}
+
+class D extends B {
+ g() {}
+ get h() {}
+ set i(v) {}
+ static j() {}
+ static get k() {}
+ static set l(v) {}
+}
+
+assert.equal(0, Object.keys(B).length);
+assert.equal(0, Object.keys(B.prototype).length);
+
+assert.equal(0, Object.keys(D).length);
+assert.equal(0, Object.keys(D.prototype).length);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/OptionalParams.js b/packages/babel-core/test/fixtures/traceur/Classes/OptionalParams.js
new file mode 100644
index 0000000000..4040e25bf9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/OptionalParams.js
@@ -0,0 +1,18 @@
+class OptionalParams {
+ constructor(opt = 1) {
+ this.opt = opt;
+ }
+ instanceMethod(opt = 2) {
+ return opt;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var obj = new OptionalParams();
+assert.equal(1, obj.opt);
+assert.equal(2, obj.instanceMethod());
+assert.equal(3, obj.instanceMethod(3));
+
+var obj2 = new OptionalParams(2);
+assert.equal(2, obj2.opt);
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/PropertyAccessors.js b/packages/babel-core/test/fixtures/traceur/Classes/PropertyAccessors.js
new file mode 100644
index 0000000000..94f0028504
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/PropertyAccessors.js
@@ -0,0 +1,59 @@
+class ImmutablePoint {
+ get x () { return this.x_; }
+ get y () { return this.y_; }
+}
+
+class MutablePoint {
+ get x () { return this.x_; }
+ set x (x) { this.x_ = x; }
+ get y () { return this.y_; }
+ set y (y) { this.y_ = y; }
+}
+
+// ----------------------------------------------------------------------------
+
+var immutable = new ImmutablePoint();
+assert.equal(undefined, immutable.x);
+assert.equal(undefined, immutable.y);
+immutable.x_ = 10;
+immutable.y_ = 20;
+assert.equal(10, immutable.x);
+assert.equal(20, immutable.y);
+assert.equal(10, immutable.x_);
+assert.equal(20, immutable.y_);
+
+try {
+ immutable.x = 11;
+ fail('should not be able to set a get only property');
+} catch (except) {
+}
+try {
+ immutable.y = 11;
+ fail('should not be able to set a get only property');
+} catch (except) {
+}
+assert.equal(10, immutable.x);
+assert.equal(20, immutable.y);
+
+var mutable = new MutablePoint();
+assert.equal(undefined, mutable.x);
+assert.equal(undefined, mutable.y);
+mutable.x_ = 10;
+mutable.y_ = 20;
+assert.equal(10, mutable.x);
+assert.equal(20, mutable.y);
+assert.equal(10, mutable.x_);
+assert.equal(20, mutable.y_);
+
+try {
+ mutable.x = 11;
+} catch (except) {
+ fail('should be able to set a read/write property');
+}
+try {
+ mutable.y = 12;
+} catch (except) {
+ fail('should be able to set a read/write property');
+}
+assert.equal(11, mutable.x);
+assert.equal(12, mutable.y);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/PrototypeDescriptor.js b/packages/babel-core/test/fixtures/traceur/Classes/PrototypeDescriptor.js
new file mode 100644
index 0000000000..1be4d32b2a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/PrototypeDescriptor.js
@@ -0,0 +1,7 @@
+class C {}
+
+var descr = Object.getOwnPropertyDescriptor(C, 'prototype');
+assert.isFalse(descr.enumerable);
+assert.isFalse(descr.configurable);
+assert.isFalse(descr.writable);
+assert.equal(descr.value, C.prototype);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/RestParams.js b/packages/babel-core/test/fixtures/traceur/Classes/RestParams.js
new file mode 100644
index 0000000000..4720e962b1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/RestParams.js
@@ -0,0 +1,15 @@
+class RestParams {
+ constructor(...rest) {
+ this.rest = rest;
+ }
+ instanceMethod(...rest) {
+ return rest;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var obj = new RestParams(0, 1, 2);
+assertArrayEquals([0, 1, 2], obj.rest);
+assertArrayEquals([3, 4, 5], obj.instanceMethod(3, 4, 5));
+
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SemiColon.js b/packages/babel-core/test/fixtures/traceur/Classes/SemiColon.js
new file mode 100644
index 0000000000..64c076d705
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SemiColon.js
@@ -0,0 +1,3 @@
+class SemiColon {
+ ;
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SimpleSuper.js b/packages/babel-core/test/fixtures/traceur/Classes/SimpleSuper.js
new file mode 100644
index 0000000000..dd5e0a243e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SimpleSuper.js
@@ -0,0 +1,31 @@
+class SuperBase {
+ m() { return 40; }
+ get x () { return this.baseX; }
+ set x (value) { this.baseX = value; }
+ constructor() {
+ this.baseC = 2;
+ this.baseX = 4;
+ }
+}
+
+class SuperDerived extends SuperBase {
+ m() { return 41; }
+ superM() { return super.m(); }
+ superX() { return super.x; }
+ constructor() {
+ super();
+ this.x = 10;
+ this.derC = 3;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var obj = new SuperDerived();
+assert.equal(41, obj.m());
+assert.equal(40, obj.superM());
+assert.equal(10, obj.baseX);
+assert.equal(10, obj.x);
+assert.equal(10, obj.superX());
+assert.equal(2, obj.baseC);
+assert.equal(3, obj.derC);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Skip_DerivedButton.js b/packages/babel-core/test/fixtures/traceur/Classes/Skip_DerivedButton.js
new file mode 100644
index 0000000000..15f63caf26
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Skip_DerivedButton.js
@@ -0,0 +1,39 @@
+// Skip. Not implemented.
+// Only in browser.
+
+class CustomButton extends HTMLButtonElement {
+ constructor() {
+ this.value = 'Custom Button';
+ }
+}
+
+class CustomSelect extends HTMLSelectElement {}
+class CustomInput extends HTMLInputElement {}
+class CustomDiv extends HTMLDivElement {}
+class CustomUIEvent extends UIEvent {}
+// class CustomSpan extends HTMLSpanElement {}
+class CustomTableRow extends HTMLTableRowElement {}
+class CustomHeading extends HTMLHeadingElement {}
+class CustomElement extends HTMLElement {}
+class CustomUList extends HTMLUListElement {}
+class CustomLI extends HTMLLIElement {}
+class CustomMenu extends HTMLMenuElement {}
+class CustomTextArea extends HTMLTextAreaElement {}
+
+// ----------------------------------------------------------------------------
+
+var button = new CustomButton();
+document.body.appendChild(button);
+document.body.appendChild(new CustomSelect());
+document.body.appendChild(new CustomInput());
+document.body.appendChild(new CustomDiv());
+// document.body.appendChild(new CustomSpan());
+document.body.appendChild(new CustomTableRow());
+document.body.appendChild(new CustomHeading());
+document.body.appendChild(new CustomElement());
+document.body.appendChild(new CustomUList());
+document.body.appendChild(new CustomLI());
+document.body.appendChild(new CustomMenu());
+document.body.appendChild(new CustomTextArea());
+
+// TODO(rnystrom): Test these.
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Skip_HTMLBlockquoteElement.js b/packages/babel-core/test/fixtures/traceur/Classes/Skip_HTMLBlockquoteElement.js
new file mode 100644
index 0000000000..8841875d64
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Skip_HTMLBlockquoteElement.js
@@ -0,0 +1,16 @@
+// Skip. Not implemented.
+// Only in browser.
+
+class CustomBlockquote extends HTMLBlockquoteElement {
+ constructor() {
+ this.custom = 42;
+ }
+}
+
+var customBlockquote = new CustomBlockquote;
+assert.equal(42, customBlockquote.custom);
+assert.equal('BLOCKQUOTE', customBlockquote.tagName);
+assert.isTrue(customBlockquote instanceof CustomBlockquote);
+assert.isTrue(customBlockquote instanceof HTMLBlockquoteElement);
+assert.isTrue(customBlockquote instanceof HTMLQuoteElement);
+assert.isTrue(customBlockquote instanceof HTMLElement);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Static.js b/packages/babel-core/test/fixtures/traceur/Classes/Static.js
new file mode 100644
index 0000000000..08e9228253
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Static.js
@@ -0,0 +1,70 @@
+var x = 42;
+
+class B {
+ static m() {
+ return this;
+ }
+
+ static get x() {
+ return x;
+ }
+
+ static set x(value) {
+ x = value;
+ }
+}
+
+assert.equal(B, B.m());
+assert.equal(42, B.x);
+B.x = 1;
+assert.equal(1, x);
+
+class StaticMethod {
+ static static() {
+ return 'static method';
+ }
+}
+
+assert.equal('static method', StaticMethod.static());
+
+class StaticGetter {
+ static get static() {
+ return 'static getter';
+ }
+}
+
+assert.equal('static getter', StaticGetter.static);
+
+class StaticSetter {
+ static set static(value) {
+ x = value;
+ }
+}
+
+StaticSetter.static = 'static setter';
+assert.equal('static setter', x);
+
+class MethodNamedStatic {
+ static() {
+ return this;
+ }
+}
+
+var c = new MethodNamedStatic();
+assert.equal(c, c.static());
+
+class AccessorNamedStatic {
+ get static() {
+ return [this, x];
+ }
+
+ set static(value) {
+ x = [this, value];
+ }
+}
+
+x = 2;
+c = new AccessorNamedStatic();
+assertArrayEquals([c, 2], c.static);
+c.static = 3;
+assertArrayEquals([c, 3], x);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/StaticSuper.js b/packages/babel-core/test/fixtures/traceur/Classes/StaticSuper.js
new file mode 100644
index 0000000000..558c5bb334
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/StaticSuper.js
@@ -0,0 +1,35 @@
+var x = 'B.getter';
+
+class B {
+ static method() {
+ return [this, 'B.method'];
+ }
+
+ static get getter() {
+ return [this, x];
+ }
+
+ static set setter(value) {
+ x = [this, value];
+ }
+}
+
+class C extends B {
+ static method() {
+ return super.method();
+ }
+
+ static get getter() {
+ return super.getter;
+ }
+
+ static set setter(value) {
+ super.setter = value;
+ }
+}
+
+assertArrayEquals([C, 'B.method'], C.method());
+assertArrayEquals([C, 'B.getter'], C.getter);
+
+C.setter = 'B.setter';
+assertArrayEquals([C, 'B.setter'], x);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/StaticSuperNoExtends.js b/packages/babel-core/test/fixtures/traceur/Classes/StaticSuperNoExtends.js
new file mode 100644
index 0000000000..58c369a789
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/StaticSuperNoExtends.js
@@ -0,0 +1,47 @@
+var x = 42;
+
+Function.prototype.testFunction = function() {
+ return [this, 42, this.call];
+};
+
+Object.defineProperty(Function.prototype, 'testGetter', {
+ get: function() {
+ return [this, x, this.call];
+ },
+ configurable: true
+});
+
+
+Object.defineProperty(Function.prototype, 'testSetter', {
+ set: function(value) {
+ x = [this, value, this.call];
+ },
+ configurable: true
+});
+
+
+class NoExtends {
+ static method() {
+ return super.testFunction();
+ }
+
+ static get getter() {
+ return super.testGetter;
+ }
+
+ static set setter(value) {
+ super.testSetter = value;
+ }
+}
+
+var call = Function.prototype.call;
+assertArrayEquals([NoExtends, 42, call], NoExtends.method());
+
+assertArrayEquals([NoExtends, 42, call], NoExtends.getter);
+
+NoExtends.setter = 1;
+assertArrayEquals([NoExtends, 1, call], x);
+
+delete Function.prototype.testFunction;
+delete Function.prototype.testGetter;
+delete Function.prototype.testSetter;
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/StaticSymbol.js b/packages/babel-core/test/fixtures/traceur/Classes/StaticSymbol.js
new file mode 100644
index 0000000000..22214d8b37
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/StaticSymbol.js
@@ -0,0 +1,7 @@
+var sym = Symbol();
+class C {
+ static [sym]() {
+ return 42;
+ }
+}
+assert.equal(C[sym](), 42);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/Strict.js b/packages/babel-core/test/fixtures/traceur/Classes/Strict.js
new file mode 100644
index 0000000000..27e3f43757
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/Strict.js
@@ -0,0 +1,36 @@
+class C1 {
+ m() {
+ return function() {
+ return this;
+ }();
+ }
+}
+
+class C2 extends C1 {
+ m() {
+ return function() {
+ return this;
+ }();
+ }
+}
+
+var C3 = class {
+ m() {
+ return function() {
+ return this;
+ }();
+ }
+};
+
+var C4 = class extends C3 {
+ m() {
+ return function() {
+ return this;
+ }();
+ }
+};
+
+assert.isUndefined(new C1().m());
+assert.isUndefined(new C2().m());
+assert.isUndefined(new C3().m());
+assert.isUndefined(new C4().m());
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperChaining.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperChaining.js
new file mode 100644
index 0000000000..5688aa62fd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperChaining.js
@@ -0,0 +1,28 @@
+class ChainA {
+ foo() {
+ return 'A';
+ }
+}
+
+class ChainB extends ChainA {
+ foo() {
+ return super.foo() + ' B';
+ }
+}
+
+class ChainC extends ChainB {
+ foo() {
+ return super.foo() + ' C';
+ }
+}
+
+class ChainD extends ChainC {
+ foo() {
+ return super.foo() + ' D';
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var d = new ChainD();
+assert.equal('A B C D', d.foo());
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperChangeProto.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperChangeProto.js
new file mode 100644
index 0000000000..6bf02b2620
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperChangeProto.js
@@ -0,0 +1,20 @@
+var log = '';
+
+class Base {
+ p() { log += '[Base]'; }
+}
+
+class OtherBase {
+ p() { log += '[OtherBase]'; }
+}
+class Derived extends Base {
+ p() {
+ log += '[Derived]';
+ super.p();
+ Derived.prototype.__proto__ = OtherBase.prototype;
+ super.p();
+ }
+}
+
+new Derived().p();
+assert.equal(log, '[Derived][Base][OtherBase]');
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperInArrow.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperInArrow.js
new file mode 100644
index 0000000000..4b0b62fff8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperInArrow.js
@@ -0,0 +1,19 @@
+var x;
+
+class B {
+ m(v) {
+ x = v;
+ }
+}
+
+class D extends B {
+ n(x) {
+ var f = (x) => {
+ super.m(x);
+ };
+ f(x);
+ }
+}
+
+new D().n(42);
+assert.equal(x, 42);
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperMissing.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperMissing.js
new file mode 100644
index 0000000000..6eb4f8679f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperMissing.js
@@ -0,0 +1,40 @@
+class MissingSuperA {}
+
+class MissingSuperB extends MissingSuperA {
+ method() {
+ return super.foo();
+ }
+ field() {
+ return super.foo;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+// Collect the expected values.
+var expectedF;
+var expectedM;
+var actualF;
+var actualM;
+
+expectedF = ({}).x;
+try {
+ ({}).method();
+} catch (e) {
+ expectedM = e;
+}
+
+// Test against those.
+var b = new MissingSuperB();
+var actualF = b.field();
+var actualM;
+try {
+ b.method();
+} catch (e) {
+ actualM = e;
+}
+
+assert.equal(actualF, expectedF);
+assert.instanceOf(expectedM, TypeError);
+assert.instanceOf(actualM, TypeError);
+assert.equal(Object.getPrototypeOf(actualM), Object.getPrototypeOf(expectedM));
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperPostfix.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperPostfix.js
new file mode 100644
index 0000000000..843c26891e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperPostfix.js
@@ -0,0 +1,23 @@
+class B {
+ constructor() {
+ this._x = 0;
+ }
+ get x() {
+ return this._x;
+ }
+ set x(x) {
+ this._x = x;
+ }
+}
+
+class C extends B {
+ m() {
+ assert.equal(this.x, 0);
+ assert.equal(super.x++, 0);
+ assert.equal(this.x, 1);
+ assert.equal(super.x--, 1);
+ assert.equal(this.x, 0);
+ }
+}
+
+new C().m();
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperSet.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperSet.js
new file mode 100644
index 0000000000..cb612b9fe0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperSet.js
@@ -0,0 +1,56 @@
+class B {
+ constructor() {
+ this._y = {v: 321};
+ this._z = 1;
+ }
+ set x(value) {
+ this._x = value;
+ }
+ get x() {
+ return this._y;
+ }
+ getX() {
+ return this._x;
+ }
+ getV() {
+ return this._y.v
+ }
+
+ set z(v) {
+ this._z = v;
+ }
+ get z() {
+ return this._z;
+ }
+}
+
+class C extends B {
+ constructor() {
+ super();
+ }
+ set x(value) {
+ assert.equal(super.x = value, value);
+ }
+ set v(value) {
+ return super.x.v = value;
+ }
+ inc(val) {
+ assert.equal(super.z += val, 4);
+ }
+ incLookup(val) {
+ assert.equal(super['z'] += val, 9);
+ }
+}
+
+var c = new C;
+c.x = 42;
+assert.equal(42, c.getX());
+
+c.v = 123;
+assert.equal(123, c.getV());
+
+c.inc(3);
+assert.equal(4, c.z);
+
+c.incLookup(5);
+assert.equal(9, c.z);
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperUnary.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperUnary.js
new file mode 100644
index 0000000000..310041e220
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperUnary.js
@@ -0,0 +1,26 @@
+class B {
+ constructor() {
+ this._x = 0;
+ }
+ get x() {
+ return this._x;
+ }
+ set x(x) {
+ this._x = x;
+ }
+}
+
+class C extends B {
+ m() {
+ assert.equal(this.x, 0);
+ assert.equal(++super.x, 1);
+ assert.equal(this.x, 1);
+ assert.equal(--super.x, 0);
+ assert.equal(this.x, 0);
+
+ // Don't use assert.typeOf since we are testing typeof.
+ assert.equal(typeof super.x, 'number');
+ }
+}
+
+new C().m();
diff --git a/packages/babel-core/test/fixtures/traceur/Classes/SuperWithoutExtends.js b/packages/babel-core/test/fixtures/traceur/Classes/SuperWithoutExtends.js
new file mode 100644
index 0000000000..5b2546b084
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Classes/SuperWithoutExtends.js
@@ -0,0 +1,15 @@
+class C {
+ constructor() {
+ this.x = true;
+ }
+ static m() {
+ return super.hasOwnProperty('m');
+ }
+
+ m() {
+ return super.hasOwnProperty('x');
+ }
+}
+
+assert.isTrue(new C().m());
+assert.isTrue(C.m());
diff --git a/packages/babel-core/test/fixtures/traceur/Collections/Map.js b/packages/babel-core/test/fixtures/traceur/Collections/Map.js
new file mode 100644
index 0000000000..8dd3004e0c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Collections/Map.js
@@ -0,0 +1,240 @@
+var t = new Map();
+
+var objectKey = {};
+var stringKey = 'keykeykey';
+var numberKey = 42.24;
+var booleanKey = true;
+var undefinedKey = undefined;
+var nullKey = null;
+var nanKey = NaN;
+var zeroKey = 0;
+
+
+assert.equal(t.size, 0);
+
+t.set(undefinedKey, 'value8');
+t.set(nullKey, 'value9');
+t.set(stringKey, 'value5');
+t.set(numberKey, 'value6');
+t.set(booleanKey, 'value7');
+t.set(objectKey, 'value1');
+t.set(nanKey, 'value10');
+t.set(zeroKey, 'value11');
+
+assert.equal(t.size, 8);
+
+assert.equal(t.get(objectKey), 'value1');
+assert.equal(t.get(stringKey), 'value5');
+assert.equal(t.get(numberKey), 'value6');
+assert.equal(t.get(booleanKey), 'value7');
+assert.equal(t.get(undefinedKey), 'value8');
+assert.equal(t.get(nullKey), 'value9');
+assert.equal(t.get(nanKey), 'value10');
+assert.equal(t.get(zeroKey), 'value11');
+
+assert.equal(t.get({}), undefined);
+assert.equal(t.get('keykeykey'), 'value5');
+assert.equal(t.get(42.24), 'value6');
+assert.equal(t.get(true), 'value7');
+assert.equal(t.get(undefined), 'value8');
+assert.equal(t.get(null), 'value9');
+assert.equal(t.get(NaN), 'value10');
+assert.equal(t.get(0), 'value11');
+assert.equal(t.get(1 / Infinity), 'value11');
+
+// V8 is broken for -0
+// https://code.google.com/p/v8/issues/detail?id=3906
+// assert.equal(t.get(-1 / Infinity), 'value11');
+
+assert.isTrue(!t.has({}));
+
+assert.isTrue(t.has(objectKey));
+assert.isTrue(t.has(stringKey));
+assert.isTrue(t.has(numberKey));
+assert.isTrue(t.has(booleanKey));
+assert.isTrue(t.has(undefinedKey));
+assert.isTrue(t.has(nullKey));
+assert.isTrue(t.has(nanKey));
+assert.isTrue(t.has(zeroKey));
+
+assert.isTrue(t.has('keykeykey'));
+assert.isTrue(t.has(42.24));
+assert.isTrue(t.has(true));
+assert.isTrue(t.has(undefined));
+assert.isTrue(t.has(null));
+assert.isTrue(t.has(NaN));
+assert.isTrue(t.has(0));
+
+// V8 is broken for -0
+// https://code.google.com/p/v8/issues/detail?id=3906
+// assert.isTrue(t.has(-0));
+
+
+// forEach
+var arrKeys = [];
+var arr = [];
+var cnt = 0;
+t.forEach(function (value, key, map) {
+ if (cnt === 0) {
+ t.set('foo', 42);
+ }
+ assert.equal(map, t);
+ arrKeys.push(key);
+ arr.push(value);
+ cnt++;
+});
+assert.equal(cnt, 9);
+t.delete('foo');
+
+assertArrayEquals(arrKeys, [
+ undefinedKey,
+ nullKey,
+ stringKey,
+ numberKey,
+ booleanKey,
+ objectKey,
+ nanKey,
+ zeroKey,
+ 'foo'
+]);
+assertArrayEquals(arr, [
+ 'value8',
+ 'value9',
+ 'value5',
+ 'value6',
+ 'value7',
+ 'value1',
+ 'value10',
+ 'value11',
+ 42
+]);
+
+// iterator
+arrKeys = [];
+arr = [];
+cnt = 0;
+
+for (var mapIterItem of t) {
+ if (cnt === 0) {
+ t.set('foo', 42);
+ }
+ var [mapIterItemKey, mapIterItemVal] = mapIterItem;
+ arrKeys.push(mapIterItemKey);
+ arr.push(mapIterItemVal);
+ cnt++;
+}
+assert.equal(cnt, 9);
+t.delete('foo');
+
+assertArrayEquals(arrKeys, [ undefinedKey, nullKey, stringKey,
+ numberKey, booleanKey, objectKey,
+ nanKey, zeroKey, 'foo' ]);
+assertArrayEquals(arr, [
+ 'value8',
+ 'value9',
+ 'value5',
+ 'value6',
+ 'value7',
+ 'value1',
+ 'value10',
+ 'value11',
+ 42
+]);
+
+
+// .entries()
+arrKeys = [];
+arr = [];
+cnt = 0;
+
+for (var mapIterItem of t.entries()) {
+ var [mapIterItemKey, mapIterItemVal] = mapIterItem;
+ arrKeys.push(mapIterItemKey);
+ arr.push(mapIterItemVal);
+ cnt++;
+}
+assert.equal(cnt, 8);
+
+assertArrayEquals(arrKeys, [
+ undefinedKey,
+ nullKey,
+ stringKey,
+ numberKey,
+ booleanKey,
+ objectKey,
+ nanKey,
+ zeroKey
+]);
+assertArrayEquals(arr, [
+ 'value8',
+ 'value9',
+ 'value5',
+ 'value6',
+ 'value7',
+ 'value1',
+ 'value10',
+ 'value11'
+]);
+
+
+// .keys()
+arrKeys = [];
+cnt = 0;
+
+for (var mapIterKey of t.keys()) {
+ arrKeys.push(mapIterKey);
+ cnt++;
+}
+assert.equal(cnt, 8);
+
+assertArrayEquals(arrKeys, [
+ undefinedKey,
+ nullKey,
+ stringKey,
+ numberKey,
+ booleanKey,
+ objectKey,
+ nanKey,
+ zeroKey
+]);
+
+
+// .values()
+arr = [];
+cnt = 0;
+
+for (var mapIterVal of t.values()) {
+ arr.push(mapIterVal);
+ cnt++;
+}
+assert.equal(cnt, 8);
+
+assertArrayEquals(arr, [
+ 'value8',
+ 'value9',
+ 'value5',
+ 'value6',
+ 'value7',
+ 'value1',
+ 'value10',
+ 'value11'
+]);
+
+
+var t3 = new Map([ [[],[]], [{},{}], [NaN,NaN] ]);
+var deleteReturnValue;
+
+assert.equal(t3.size, 3);
+assert.isTrue(t3.has(NaN));
+assert.isTrue(isNaN(t3.get(NaN)));
+assert.equal(t3.set(NaN, NaN), t3); // test of 23.1.3.9.11
+deleteReturnValue = t3.delete(NaN);
+assert.equal(t3.size, 2);
+assert.isTrue(deleteReturnValue);
+deleteReturnValue = t3.delete(NaN);
+assert.equal(t3.size, 2);
+assert.isFalse(deleteReturnValue);
+t3.clear();
+assert.equal(t3.size, 0);
+
+assert.equal(Map.prototype[Symbol.iterator], Map.prototype.entries);
diff --git a/packages/babel-core/test/fixtures/traceur/Collections/Set.js b/packages/babel-core/test/fixtures/traceur/Collections/Set.js
new file mode 100644
index 0000000000..460253a857
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Collections/Set.js
@@ -0,0 +1,145 @@
+var t = new Set();
+
+var objectKey = {};
+var stringKey = 'keykeykey';
+var numberKey = 42.24;
+var booleanKey = true;
+var undefinedKey = undefined;
+var nullKey = null;
+var nanKey = NaN;
+var zeroKey = 0;
+var addReturnValue;
+
+t.add(objectKey);
+t.add(stringKey);
+t.add(numberKey);
+t.add(booleanKey);
+t.add(undefinedKey);
+t.add(nullKey);
+t.add(nanKey);
+addReturnValue = t.add(zeroKey);
+
+assert.equal(t.size, 8);
+assert.equal(t, addReturnValue);
+
+assert.isTrue(!t.has({}));
+
+assert.isTrue(t.has(objectKey));
+assert.isTrue(t.has(stringKey));
+assert.isTrue(t.has(numberKey));
+assert.isTrue(t.has(booleanKey));
+assert.isTrue(t.has(undefinedKey));
+assert.isTrue(t.has(nullKey));
+assert.isTrue(t.has(nanKey));
+assert.isTrue(t.has(zeroKey));
+
+assert.isTrue(t.has('keykeykey'));
+assert.isTrue(t.has(42.24));
+assert.isTrue(t.has(true));
+assert.isTrue(t.has(undefined));
+assert.isTrue(t.has(null));
+assert.isTrue(t.has(NaN));
+assert.isTrue(t.has(0));
+
+// V8 is broken for -0
+// https://code.google.com/p/v8/issues/detail?id=3906
+// assert.isTrue(t.has(-0));
+
+var expected = [
+ undefinedKey,
+ nullKey,
+ stringKey,
+ numberKey,
+ booleanKey,
+ objectKey,
+ nanKey,
+ zeroKey
+];
+expected.sort();
+
+
+// forEach
+var arr = [];
+var cnt = 0;
+var context = {};
+
+t.forEach(function(val, val2, obj) {
+ if (isNaN(val)) {
+ assert.isTrue(isNaN(val2));
+ } else {
+ assert.equal(val, val2);
+ }
+ assert.equal(obj, t);
+ assert.equal(this, context)
+ arr.push(val);
+ cnt++;
+}, context);
+
+assert.equal(cnt, 8);
+
+arr.sort();
+assertArrayEquals(arr, expected);
+
+// iterator
+arr = [];
+cnt = 0;
+
+for (var setIterVal of t) {
+ arr.push(setIterVal);
+ cnt++;
+}
+assert.equal(cnt, 8);
+
+
+arr.sort();
+assertArrayEquals(arr, expected);
+
+// .values()
+arr = [];
+cnt = 0;
+
+for (var setIterVal of t.values()) {
+ arr.push(setIterVal);
+ cnt++;
+}
+assert.equal(cnt, 8);
+
+
+arr.sort();
+assertArrayEquals(arr, expected);
+
+var t3 = new Set([[], {}, NaN]);
+assert.equal(t3.size, 3);
+assert.isTrue(t3.has(NaN));
+t3.delete(NaN);
+assert.equal(t3.size, 2);
+t3.delete(NaN);
+assert.equal(t3.size, 2);
+t3.clear();
+assert.equal(t3.size, 0);
+
+// .keys()
+var t4 = new Set();
+var iter = t4.keys();
+t4.add(objectKey);
+t4.add(stringKey);
+t4.add(nanKey);
+assert.deepEqual(iter.next(), {value: objectKey, done: false});
+assert.deepEqual(iter.next(), {value: stringKey, done: false});
+t4.delete(nanKey);
+assert.deepEqual(iter.next(), {value: undefined, done: true});
+
+assert.equal(Set.prototype.keys, Set.prototype.values);
+
+// .entries()
+var t5 = new Set();
+var iter = t5.entries();
+t5.add(objectKey);
+t5.add(stringKey);
+t5.add(nanKey);
+assert.deepEqual(iter.next(), {value: [objectKey, objectKey], done: false});
+assert.deepEqual(iter.next(), {value: [stringKey, stringKey], done: false});
+t5.delete(nanKey);
+assert.deepEqual(iter.next(), {value: undefined, done: true});
+
+assert.equal(Set.prototype[Symbol.iterator], Set.prototype.values);
diff --git a/packages/babel-core/test/fixtures/traceur/Collections/SetWithSymbols.js b/packages/babel-core/test/fixtures/traceur/Collections/SetWithSymbols.js
new file mode 100644
index 0000000000..a454bf6bf7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Collections/SetWithSymbols.js
@@ -0,0 +1,2 @@
+var s = new Set(['Banana', 'Orange', 'Apple', 'Mango', 'Apple', 'Apple']);
+assert.equal(s.size, 4);
diff --git a/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Class.js b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Class.js
new file mode 100644
index 0000000000..c9900c48ca
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Class.js
@@ -0,0 +1,48 @@
+var x = '0';
+var y;
+
+class C {
+ [x]() {
+ return 0;
+ }
+ get [1]() {
+ return 1;
+ }
+ set [2](v) {
+ y = v;
+ }
+ *[3]() {
+ yield 3;
+ }
+
+ static [4]() {
+ return 4;
+ }
+ static get [5]() {
+ return 5;
+ }
+ static set [6](v) {
+ y = v;
+ }
+ static *[7]() {
+ yield 7;
+ }
+}
+
+var object = new C;
+assert.equal(object[0](), 0);
+assert.equal(object[1], 1);
+object[2] = 2;
+assert.equal(y, 2);
+var g = object[3]();
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+
+
+assert.equal(C[4](), 4);
+assert.equal(C[5], 5);
+C[6] = 6;
+assert.equal(y, 6);
+var g = C[7]();
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/ComputedPropertyNames.js b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/ComputedPropertyNames.js
new file mode 100644
index 0000000000..722c0fc180
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/ComputedPropertyNames.js
@@ -0,0 +1,35 @@
+var x = '0';
+var y;
+var object = {
+ [x]: 0,
+ [1]: 1,
+ [2]() {
+ return 2;
+ },
+ get [3]() {
+ return 3;
+ },
+ set [4](v) {
+ y = v;
+ },
+ *[5]() {
+ yield 5;
+ }
+};
+
+assert.equal(object[0], 0);
+assert.equal(object[1], 1);
+assert.equal(object[2](), 2);
+object[4] = 4;
+assert.equal(y, 4);
+var g = object[5]();
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+
+var object2 = {
+ __proto__: object,
+ [6]: 6
+};
+
+assert.equal(object2[6], 6);
+assert.equal(object2[0], 0);
diff --git a/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Error_Disabled.js
new file mode 100644
index 0000000000..099c8907e3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Error_Disabled.js
@@ -0,0 +1,6 @@
+// Options: --computed-property-names=false
+// Error: :5:3: Unexpected token [
+
+var object = {
+ [1]: 2
+};
diff --git a/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Symbol.js b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Symbol.js
new file mode 100644
index 0000000000..9f4aad203c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ComputedPropertyNames/Symbol.js
@@ -0,0 +1,7 @@
+var s = Symbol();
+
+var object = {
+ [s]: 42
+};
+
+assert.equal(object[s], 42);
diff --git a/packages/babel-core/test/fixtures/traceur/DefaultParameters/Error_SetAccessor.js b/packages/babel-core/test/fixtures/traceur/DefaultParameters/Error_SetAccessor.js
new file mode 100644
index 0000000000..039a0fc438
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/DefaultParameters/Error_SetAccessor.js
@@ -0,0 +1,6 @@
+// Error: :5:15: Unexpected token =
+
+var object = {
+ // Default parameters are not allowed on setters.
+ set x(value = 42) {}
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/DefaultParameters/Simple.js b/packages/babel-core/test/fixtures/traceur/DefaultParameters/Simple.js
new file mode 100644
index 0000000000..0f2b26b2c6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/DefaultParameters/Simple.js
@@ -0,0 +1,45 @@
+function f(a = 1, b = 2) {
+ return a + b;
+}
+
+assert.equal(0, f.length);
+assert.equal(3, f());
+assert.equal(6, f(4));
+assert.equal(24, f(8, 16));
+
+assert.equal(3, f(undefined, undefined));
+assert.equal(33, f(undefined, 32));
+
+function g(a, b = a) {
+ return a + b;
+}
+
+assert.equal(1, g.length);
+assert.equal(4, g(2));
+assert.equal(4, g(2, undefined));
+assert.equal(5, g(2, 3));
+
+function C(obj = this) {
+ this.obj = obj;
+}
+
+assert.equal(0, C.length);
+
+var c = new C;
+assert.equal(c, c.obj);
+
+var c2 = new C(undefined);
+assert.equal(c2, c2.obj);
+
+var c3 = new C(42);
+assert.equal(42, c3.obj);
+
+function h(a = 1, b) {
+ return {a: a, b: b};
+}
+
+assert.equal(1, h().a);
+assert.equal(2, h(2).a);
+assert.isUndefined(h().b);
+assert.isUndefined(h(2).b);
+assert.equal(4, h(3, 4).b);
diff --git a/packages/babel-core/test/fixtures/traceur/DefaultParameters/Strict.js b/packages/babel-core/test/fixtures/traceur/DefaultParameters/Strict.js
new file mode 100644
index 0000000000..f35bad3590
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/DefaultParameters/Strict.js
@@ -0,0 +1,6 @@
+function f(a = 1) {
+ 'use strict';
+ return this;
+}
+
+assert.isUndefined(f());
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Arguments.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Arguments.js
new file mode 100644
index 0000000000..7046316663
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Arguments.js
@@ -0,0 +1,8 @@
+function destructureArguments(x, y) {
+ [arguments[0], [arguments[1]]] = [1, [2]]
+ return x + y;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal(3, destructureArguments(1, 2));
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Array.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Array.js
new file mode 100644
index 0000000000..6f6d979e59
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Array.js
@@ -0,0 +1,25 @@
+function destructArray() {
+ var a, b, c, d;
+ [a, [b], c, d] = ['hello', [',', 'junk'], ['world']];
+ return {
+ a: a,
+ b: b,
+ c: c,
+ d: d
+ };
+}
+
+// ----------------------------------------------------------------------------
+
+var result = destructArray();
+assert.equal('hello', result.a);
+assert.equal(',', result.b);
+assertArrayEquals(['world'], result.c);
+assert.isUndefined(result.d);
+
+function testNested() {
+ var a;
+ [[a] = ['b']] = [];
+ return a;
+}
+assert.equal(testNested(), 'b');
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternTrailingComma.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternTrailingComma.js
new file mode 100644
index 0000000000..26dcf17f1b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternTrailingComma.js
@@ -0,0 +1,8 @@
+var [a, b, , ] = [0, 1, , ];
+assert.equal(a, 0);
+assert.equal(b, 1);
+
+var c, d;
+[c, d, , ] = [0, 1, , ];
+assert.equal(c, 0);
+assert.equal(d, 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternWithCoverInitializedName.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternWithCoverInitializedName.js
new file mode 100644
index 0000000000..89269b0000
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternWithCoverInitializedName.js
@@ -0,0 +1,5 @@
+var x, y;
+[x, {y = 1}] = [0, {}];
+
+assert.equal(x, 0);
+assert.equal(y, 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternWithInitializer.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternWithInitializer.js
new file mode 100644
index 0000000000..6a97645aae
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrayPatternWithInitializer.js
@@ -0,0 +1,5 @@
+// https://github.com/google/traceur-compiler/issues/969
+
+var x;
+[x = 1] = [];
+assert.equal(x, 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ArrowFunction.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrowFunction.js
new file mode 100644
index 0000000000..bbc7a75b66
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ArrowFunction.js
@@ -0,0 +1,17 @@
+var f = ({x}) => x;
+assert.equal(42, f({x: 42}));
+
+var g = ({x: y, z: [a, b, ...c]}) => [y, a, b, c];
+assertArrayEquals([1, 2, 3, [4, 5]], g({x: 1, z: [2, 3, 4, 5]}));
+
+var h = ([a, {b: c, d}]) => [a, c, d];
+assertArrayEquals([1, 2, 3], h([1, {b: 2, d: 3}]));
+
+var i = ([, a]) => a;
+assert.equal(i([0, 1]), 1);
+
+var j = ([, [, a]]) => a;
+assert.equal(j([0, [1, 2]]), 2);
+
+var k = ([a] = new String('b')) => a;
+assert.equal(k(), 'b');
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Catch.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Catch.js
new file mode 100644
index 0000000000..6b110c025f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Catch.js
@@ -0,0 +1,30 @@
+var head = 'head';
+var tail = 'tail';
+var name = 'name';
+
+function MyError(s) {
+ this.message = new String(s);
+ this.name = 'Error';
+}
+
+try {
+ throw new MyError('abc');
+} catch ({message: [head, ...tail], name}) {
+ assert.equal('a', head);
+ assertArrayEquals(['b', 'c'], tail);
+ assert.equal('Error', name);
+}
+
+assert.equal('head', head);
+assert.equal('tail', tail);
+assert.equal('name', name);
+
+assert.throws(() => {
+ try {
+ throw [0];
+ } catch ([innerX]) {
+
+ }
+
+ innerX;
+}, ReferenceError);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Class.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Class.js
new file mode 100644
index 0000000000..c699d39c4c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Class.js
@@ -0,0 +1,28 @@
+function MyError(s) {
+ this.message = new String(s);
+ this.name = 'Error';
+}
+
+class C {
+ constructor({message: [head, ...tail], name}) {
+ assert.equal('a', head);
+ assertArrayEquals(['b', 'c'], tail);
+ assert.equal('Error', name);
+ }
+
+ method({message: [head, ...tail], name}) {
+ assert.equal('a', head);
+ assertArrayEquals(['b', 'c'], tail);
+ assert.equal('Error', name);
+ }
+
+ set x({message: [head, ...tail], name}) {
+ assert.equal('a', head);
+ assertArrayEquals(['b', 'c'], tail);
+ assert.equal('Error', name);
+ }
+}
+
+var c = new C(new MyError('abc'));
+c.method(new MyError('abc'));
+c.x = new MyError('abc');
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializedName.js b/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializedName.js
new file mode 100644
index 0000000000..1b91bd3a8d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializedName.js
@@ -0,0 +1,4 @@
+// https://github.com/google/traceur-compiler/issues/183
+
+var f = ({x = 42}) => x;
+assert.equal(f({}), 42);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializer.js b/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializer.js
new file mode 100644
index 0000000000..ed37f7257d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializer.js
@@ -0,0 +1,9 @@
+// https://github.com/google/traceur-compiler/issues/1015
+
+var x, y;
+({x = 1, y = 2} = {});
+assert.equal(x, 1);
+assert.equal(y, 2);
+
+({x: {x = 3}} = {x: {}});
+assert.equal(x, 3);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializerInForOf.js b/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializerInForOf.js
new file mode 100644
index 0000000000..eb0a9781d3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/CoverInitializerInForOf.js
@@ -0,0 +1,9 @@
+// https://github.com/google/traceur-compiler/issues/836
+
+var count = 0;
+for ({a = 0} of [{}]) {
+ count++;
+ assert.equal(a, 0);
+}
+
+assert.equal(count, 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/DefaultParams.js b/packages/babel-core/test/fixtures/traceur/Destructuring/DefaultParams.js
new file mode 100644
index 0000000000..e6a1670b75
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/DefaultParams.js
@@ -0,0 +1,5 @@
+function f([x] = [1], {y} = {y: 2}) {
+ return x + y;
+}
+
+assert.equal(3, f());
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Empty.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Empty.js
new file mode 100644
index 0000000000..275534362b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Empty.js
@@ -0,0 +1,32 @@
+var calls = 0;
+
+var {} = Object(calls++);
+assert.equal(calls, 1);
+
+assert.throw(function() {
+ var [] = Object(calls++);
+}, TypeError);
+assert.equal(calls, 2);
+
+assert.throw(function() {
+ var {} = Object(calls++), [] = Object(calls++);
+});
+assert.equal(calls, 4);
+
+
+///////////////////////
+
+calls = 0;
+
+({} = Object(calls++));
+assert.equal(calls, 1);
+
+assert.throw(function() {
+ [] = Object(calls++);
+}, TypeError);
+assert.equal(calls, 2);
+
+assert.throw(function() {
+ ({} = Object(calls++), [] = Object(calls++));
+}, TypeError);
+assert.equal(calls, 4);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_Disabled.js
new file mode 100644
index 0000000000..f177fe43b3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_Disabled.js
@@ -0,0 +1,4 @@
+// Options: --destructuring=false
+// Error: 4:5: Unexpected token [
+
+var [x, y] = [0, 1];
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Error_ForInWithInitializer.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_ForInWithInitializer.js
new file mode 100644
index 0000000000..ea9c29c5f7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_ForInWithInitializer.js
@@ -0,0 +1,4 @@
+// Error: :3:19: Unexpected token in
+
+for (var {k} = {} in {}) {
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Error_ForOfWithInitializer.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_ForOfWithInitializer.js
new file mode 100644
index 0000000000..6a15645310
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_ForOfWithInitializer.js
@@ -0,0 +1,4 @@
+// Error: :3:19: Unexpected token of
+
+for (var {k} = {} of []) {
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Error_InvalidArrowRest.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_InvalidArrowRest.js
new file mode 100644
index 0000000000..c7eca5a9d6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_InvalidArrowRest.js
@@ -0,0 +1,3 @@
+// Error: :3:16: Unexpected token ,
+
+var f = ([...xs, ys]) => xs;
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Error_InvalidCoverInitializedName.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_InvalidCoverInitializedName.js
new file mode 100644
index 0000000000..441d53c8d1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Error_InvalidCoverInitializedName.js
@@ -0,0 +1,3 @@
+// Error: :3:5: Unexpected token =
+
+({x = 42});
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/EvaluatesToRvalue.js b/packages/babel-core/test/fixtures/traceur/Destructuring/EvaluatesToRvalue.js
new file mode 100644
index 0000000000..9027f27207
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/EvaluatesToRvalue.js
@@ -0,0 +1,9 @@
+function destructEvaluatesToRvalue() {
+ var a;
+ return [a] = [1, 2, 3];
+}
+
+// ----------------------------------------------------------------------------
+
+var result = destructEvaluatesToRvalue();
+assertArrayEquals([1, 2, 3], result);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/EvaluationOrder.js b/packages/babel-core/test/fixtures/traceur/Destructuring/EvaluationOrder.js
new file mode 100644
index 0000000000..50df75e13e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/EvaluationOrder.js
@@ -0,0 +1,10 @@
+function destructEvaluationOrder() {
+ var a;
+ [a, a, a] = [1, 2, 3, 4];
+ return a;
+}
+
+// ----------------------------------------------------------------------------
+
+var result = destructEvaluationOrder();
+assert.equal(3, result);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ForInLoop.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ForInLoop.js
new file mode 100644
index 0000000000..42aadf4239
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ForInLoop.js
@@ -0,0 +1,28 @@
+// Options: --block-binding
+
+var object = {
+ abc: 0, // Keep all the keys at length 3.
+ def: 1
+};
+
+var expectedHeads = ['a', 'd'];
+var expectedTails = [['b', 'c'], ['e','f']];
+var i = 0;
+for (var [head, ...tail] in object) {
+ assert.equal(expectedHeads[i], head);
+ assertArrayEquals(expectedTails[i], tail);
+ i++;
+}
+assert.equal(2, i);
+
+{
+ let x = 42;
+ for (let {length: x} in object) {
+ assert.equal(3, x);
+ }
+ assert.equal(42, x);
+}
+
+var k;
+for ({length: k} in {abc: 3}) // No block
+ assert.equal(3, k);
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ForOfLoop.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ForOfLoop.js
new file mode 100644
index 0000000000..cc9260c166
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ForOfLoop.js
@@ -0,0 +1,28 @@
+// Options: --block-binding
+
+function* gen() {
+ yield new String('abc');
+ yield new String('def');
+}
+
+var expectedHeads = ['a', 'd'];
+var expectedTails = [['b', 'c'], ['e','f']];
+var i = 0;
+for (var [head, ...tail] of gen()) {
+ assert.equal(expectedHeads[i], head);
+ assertArrayEquals(expectedTails[i], tail);
+ i++;
+}
+assert.equal(2, i);
+
+{
+ let x = 42;
+ for (let {length: x} of gen()) {
+ assert.equal(3, x);
+ }
+ assert.equal(42, x);
+}
+
+var k;
+for ({length: k} of [new String('abc')]) // No block
+ assert.equal(3, k);
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/FunctionArrayPattern.js b/packages/babel-core/test/fixtures/traceur/Destructuring/FunctionArrayPattern.js
new file mode 100644
index 0000000000..9af424c550
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/FunctionArrayPattern.js
@@ -0,0 +1,14 @@
+function f([a, b, ...c], d) {
+ return [a, b, c, d];
+}
+assertArrayEquals([1, 2, [3, 4], 5], f([1, 2, 3, 4], 5));
+
+function g([, a]) {
+ return a;
+}
+assert.equal(g([0, 1]), 1);
+
+function h([, [, a]]) {
+ return a;
+}
+assert.equal(h([0, [1, 2]]), 2);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/FunctionObjectPattern.js b/packages/babel-core/test/fixtures/traceur/Destructuring/FunctionObjectPattern.js
new file mode 100644
index 0000000000..612ae47dd2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/FunctionObjectPattern.js
@@ -0,0 +1,5 @@
+function f({a, b: {c}}, d) {
+ return [a, c, d];
+}
+
+assertArrayEquals([1, 2, 3], f({a: 1, b: {c: 2}}, 3));
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Initializer.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Initializer.js
new file mode 100644
index 0000000000..ce8a9caa97
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Initializer.js
@@ -0,0 +1,74 @@
+var [a = 0] = [];
+assert.equal(0, a);
+
+var {b = 1} = {};
+assert.equal(1, b);
+
+var {c = 2} = {c: 3};
+assert.equal(3, c);
+
+var {d = 4} = Object.create({d: 5});
+assert.equal(5, d);
+
+var {e: f = 6} = {};
+assert.equal(6, f);
+
+var {g: h = 7} = {h: 8};
+assert.equal(7, h);
+
+var [, , , i = 9] = [10, 11, 12];
+assert.equal(9, i);
+
+function j({x = 42}, expected) {
+ assert.equal(expected, x);
+}
+
+j({}, 42);
+j({x: 43}, 43);
+
+var count = 0;
+var [k = 42] = (count++, [21]);
+assert.equal(21, k);
+assert.equal(1, count);
+
+var {x = 1} = {x: undefined};
+assert.equal(x, 1);
+
+var {'x': x = 2} = {x: undefined};
+assert.equal(x, 2);
+
+var {['x']: x = 3} = {x: undefined};
+assert.equal(x, 3);
+
+var [y = 4] = [undefined];
+assert.equal(y, 4);
+
+
+var xCount = 0;
+var yCount = 0;
+var zCount = 0;
+
+var object = {
+ get x() {
+ xCount++;
+ return {
+ get y() {
+ yCount++;
+ return {
+ get z() {
+ zCount++;
+ return undefined;
+ }
+ };
+ }
+ };
+ }
+};
+
+var {y: {z = 5, w = 6}, v = 7} = object.x;
+assert.equal(z, 5);
+assert.equal(w, 6);
+assert.equal(v, 7);
+assert.equal(xCount, 1);
+assert.equal(yCount, 1);
+assert.equal(zCount, 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/InitializerObject.js b/packages/babel-core/test/fixtures/traceur/Destructuring/InitializerObject.js
new file mode 100644
index 0000000000..946b0e2a2d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/InitializerObject.js
@@ -0,0 +1,12 @@
+var x, z;
+
+({x = {y: 1}} = {});
+assert.deepEqual(x, {y: 1});
+
+({x = {y: {z = 2} = {}}} = {});
+assert.equal(z, 2);
+assert.deepEqual(x, {y: {}});
+
+({x = {y: {z = 3} = {z: 4}}} = {});
+assert.equal(z, 4);
+assert.deepEqual(x, {y: {z: 4}});
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Method.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Method.js
new file mode 100644
index 0000000000..604bdc09fb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Method.js
@@ -0,0 +1,14 @@
+function MyError(s) {
+ this.message = new String(s);
+ this.name = 'Error';
+}
+
+var object = {
+ method({message: [head, ...tail], name}) {
+ assert.equal('a', head);
+ assertArrayEquals(['b', 'c'], tail);
+ assert.equal('Error', name);
+ }
+};
+
+object.method(new MyError('abc'));
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/MultipleCoverInitializersInArrowFunction.js b/packages/babel-core/test/fixtures/traceur/Destructuring/MultipleCoverInitializersInArrowFunction.js
new file mode 100644
index 0000000000..f980a8fbd8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/MultipleCoverInitializersInArrowFunction.js
@@ -0,0 +1,4 @@
+// https://github.com/google/traceur-compiler/issues/838
+
+var f = ({a = 0}, {b = 1}) => ({a, b});
+assert.deepEqual(f({}, {}), {a: 0, b: 1});
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/NestedScopeArguments.js b/packages/babel-core/test/fixtures/traceur/Destructuring/NestedScopeArguments.js
new file mode 100644
index 0000000000..692a1bcfd4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/NestedScopeArguments.js
@@ -0,0 +1,11 @@
+// Destructuring bind alpha-renames 'arguments'; this ensures that
+// renaming doesn't rename in nested scopes.
+function destructNestedScopeArguments(x) {
+ [(function () { return arguments[1]; })(null, x)[0]] = [42];
+}
+
+// ----------------------------------------------------------------------------
+
+var result = [];
+destructNestedScopeArguments(result);
+assert.equal(42, result[0]);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Object.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Object.js
new file mode 100644
index 0000000000..562f24d4e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Object.js
@@ -0,0 +1,42 @@
+function destructObject() {
+ var a, b, c, d;
+ ({a, x: b, y: {c, z: [,d]}} = {
+ a: 7, // field with shorthand a => a: a syntax
+ x: 8, // typical syntax
+ y: { // nested object destructuring
+ // missing binding 'c'
+ z: [10, 11, 12] // nested array destructuring
+ }
+ });
+ return {
+ a: a,
+ b: b,
+ c: c,
+ d: d
+ };
+}
+
+// ----------------------------------------------------------------------------
+
+var result = destructObject();
+assert.equal(7, result.a);
+assert.equal(8, result.b);
+assert.isUndefined(result.c);
+assert.equal(11, result.d);
+
+var {0: x, '1': y, length: z} = [0, 1, 2, 3];
+assert.equal(0, x);
+assert.equal(1, y);
+assert.equal(4, z);
+
+var {x: y,} = {x: 5};
+assert.equal(5, y);
+
+var x;
+({x = 6} = {});
+assert.equal(x, 6);
+
+var z;
+({x: {y = 7}, z = 8} = {x: {}});
+assert.equal(y, 7);
+assert.equal(z, 8);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Rest.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Rest.js
new file mode 100644
index 0000000000..6000165cf4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Rest.js
@@ -0,0 +1,19 @@
+function destructRest() {
+ var a, b, c, d;
+ [...a] = [1, 2, 3];
+ [b, ...c] = [1, 2, 3];
+ [,,, ...d] = [1, 2, 3];
+ return {a: a, b: b, c: c, d: d};
+}
+
+var result = destructRest();
+assertArrayEquals([1, 2, 3], result.a);
+assert.equal(1, result.b);
+assertArrayEquals([2, 3], result.c);
+assertArrayEquals([], result.d);
+
+assert.throw(function() {
+ var e;
+ // No iterator.
+ [...e] = {x: 'boom'};
+}, TypeError);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/RestIterator.js b/packages/babel-core/test/fixtures/traceur/Destructuring/RestIterator.js
new file mode 100644
index 0000000000..2963e51ed2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/RestIterator.js
@@ -0,0 +1,45 @@
+(function() {
+ var i;
+
+ function* f() {
+ for (i = 0; i < 8; i++) {
+ yield i;
+ }
+ }
+ var x, x2, xs;
+ [, x, , x2, , ...xs] = f();
+ assert.equal(1, x);
+ assert.equal(3, x2);
+ assertArrayEquals([5, 6, 7], xs);
+
+ [] = f();
+ assert.equal(8, i); // Since we never call next().
+
+ x = -1;
+ [x] = f();
+ assert.equal(0, x);
+ assert.equal(0, i); // Since we called next once.
+})();
+
+// Same but with VariableDeclarations instead of AssignmenExpressions.
+(function() {
+ var i;
+
+ function* f() {
+ for (i = 0; i < 8; i++) {
+ yield i;
+ }
+ }
+
+ var [, x, , x2, , ...xs] = f();
+ assert.equal(1, x);
+ assert.equal(3, x2);
+ assertArrayEquals([5, 6, 7], xs);
+
+ var [] = f();
+ assert.equal(8, i); // Since we never call next().
+
+ var [y] = f();
+ assert.equal(0, y);
+ assert.equal(0, i); // Since we called next once.
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ScopeThis.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ScopeThis.js
new file mode 100644
index 0000000000..c2f8c80087
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ScopeThis.js
@@ -0,0 +1,19 @@
+function destructScopeThis() {
+ var x;
+ var o = {
+ f: function() {
+ [this.x] = [1];
+ }
+ };
+ o.f();
+ return {
+ x: x,
+ o_x: o.x
+ };
+}
+
+// ----------------------------------------------------------------------------
+
+var result = destructScopeThis();
+assert.isUndefined(result.x);
+assert.equal(1, result.o_x);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/SetAccessor.js b/packages/babel-core/test/fixtures/traceur/Destructuring/SetAccessor.js
new file mode 100644
index 0000000000..2273925139
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/SetAccessor.js
@@ -0,0 +1,14 @@
+function MyError(s) {
+ this.message = new String(s);
+ this.name = 'Error';
+}
+
+var object = {
+ set x({message: [head, ...tail], name}) {
+ assert.equal('a', head);
+ assertArrayEquals(['b', 'c'], tail);
+ assert.equal('Error', name);
+ }
+};
+
+object.x = new MyError('abc');
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Simplify.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Simplify.js
new file mode 100644
index 0000000000..0a78850324
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Simplify.js
@@ -0,0 +1,167 @@
+// It probably doesn't make a difference to the results, but the private name
+// transformation turns array lookup and member access into function calls, and
+// I'd like to keep that from being a confounding factor.
+
+'use strict';
+
+var a, b, c, x, y, z;
+a = b = c = x = y = z = undefined;
+
+// ----------------------------------------------------------------------------
+
+function checkA() {
+ assert.equal(1, a);
+ assert.isUndefined(b);
+ assert.isUndefined(c);
+ a = b = c = undefined;
+}
+
+function checkAb() {
+ assert.equal(1, a);
+ assert.equal(2, b);
+ assert.isUndefined(c);
+ a = b = c = undefined;
+}
+
+function checkAbc() {
+ assert.equal(1, a);
+ assert.equal(2, b);
+ assert.equal(3, c);
+ a = b = c = undefined;
+}
+
+// ----------------------------------------------------------------------------
+
+// misc single assignment
+var [a] = 42 === 42 ? [1] : [42];
+checkA();
+[a] = 42 === 42 ? [1] : [42];
+checkA();
+
+var [a] = null || [1];
+checkA();
+[a] = null || [1];
+checkA();
+
+// ParseTreeType.MEMBER_EXPRESSION
+x = {x: {a: 1, b: 2, c: 3}};
+var {a, b, c} = x.x;
+checkAbc();
+
+var {a} = x.x;
+checkA();
+
+x = {x: [1, 2, 3]};
+var [a] = x.x;
+checkA();
+[a] = x.x;
+checkA();
+
+// ParseTreeType.MEMBER_LOOKUP_EXPRESSION
+x = [[1,2,3]];
+var [a] = x[0];
+checkA();
+[a] = x[0];
+checkA();
+var [a, b, c] = x[0];
+checkAbc();
+[a, b, c] = x[0];
+checkAbc();
+
+
+// ParseTreeType.PAREN_EXPRESSION
+var [a] = 42 === 42 ? [1] : [42];
+checkA();
+[a] = 42 === 42 ? [1] : [42];
+checkA();
+
+var [a] = null || [1];
+checkA();
+[a] = null || [1];
+checkA();
+
+// ParseTreeType.ARRAY_LITERAL
+var [a] = [1, 2, 3];
+checkA();
+[a] = [1, 2, 3];
+checkA();
+var [[a]] = [[1], 2, 3];
+checkA();
+[[a]] = [[1], 2, 3];
+checkA();
+
+// ParseTreeType.OBJECT_LITERAL
+var {a} = {a: 1, b: 2, c: 3};
+checkA();
+var {x: {a}} = {x: {a: 1, b: 2}, c: 3};
+checkA();
+
+// ParseTreeType.CALL_EXPRESSION
+x = function() {
+ return [1, 2, 3];
+};
+var [a, b, c] = x();
+checkAbc();
+[a, b, c] = x();
+checkAbc();
+
+x = function() {
+ return {a: 1, b: 2, c: 3};
+};
+var {a, b, c} = x();
+checkAbc();
+// ParseTreeType.IDENTIFIER_EXPRESSION
+
+// arrays
+x = [1, 2, 3];
+var [a] = x;
+checkA();
+[a] = x;
+checkA();
+
+x = [[1], 2, 3];
+var [[a]] = x;
+checkA();
+[[a]] = x;
+checkA();
+
+x = [[1, 2, 3]];
+var [[a, b, c]] = x;
+checkAbc();
+[[a, b, c]] = x;
+checkAbc();
+
+x = [1, [2, 3]];
+var [ a, [b, c] ] = x;
+checkAbc();
+[ a, [b, c] ] = x;
+checkAbc();
+
+x = [[1, 2], 3];
+var [[a, b], c] = x;
+checkAbc();
+[[a, b], c] = x;
+checkAbc();
+
+x = [[1], 2, [3]];
+var [[a], b, [c]] = x;
+checkAbc();
+[[a], b, [c]] = x;
+checkAbc();
+
+// objects
+x = {a: 1, b: 2, c: 3};
+var {a, b, c} = x;
+checkAbc();
+
+x = {a: 1, b: 2, c: 3};
+var {a} = x;
+checkA();
+
+x = {a: 1, b: 2, c: 3};
+var {a, b, c} = x;
+checkAbc();
+
+x = {x: {a: 1, b: 2}, c: 3};
+var {x: {a}} = x;
+checkA();
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/StrangeProperties.js b/packages/babel-core/test/fixtures/traceur/Destructuring/StrangeProperties.js
new file mode 100644
index 0000000000..487cbd055d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/StrangeProperties.js
@@ -0,0 +1,17 @@
+var x, y;
+
+({if: x = 1, else: y} = {else: 2});
+assert.equal(x, 1);
+assert.equal(y, 2);
+
+({'': x = 3, ' ': y} = {' ': 4});
+assert.equal(x, 3);
+assert.equal(y, 4);
+
+({true: x = 5, false: y} = {false: 6});
+assert.equal(x, 5);
+assert.equal(y, 6);
+
+({0: x = 7, 1: y} = {1: 8});
+assert.equal(x, 7);
+assert.equal(y, 8);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/Strict.js b/packages/babel-core/test/fixtures/traceur/Destructuring/Strict.js
new file mode 100644
index 0000000000..d2b56659ce
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/Strict.js
@@ -0,0 +1,6 @@
+function f({x}) {
+ 'use strict';
+ return this;
+}
+
+assert.isUndefined(f({x: 42}));
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/TopLevel.js b/packages/babel-core/test/fixtures/traceur/Destructuring/TopLevel.js
new file mode 100644
index 0000000000..6409d45b91
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/TopLevel.js
@@ -0,0 +1,9 @@
+var a, b, c, d;
+[a, [b, c], d] = ['hello', [',', 'junk'], ['world']];
+
+// ----------------------------------------------------------------------------
+
+assert.equal('hello', a);
+assert.equal(',', b);
+assert.equal('junk', c);
+assertArrayEquals(['world'], d);
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/ValueTypes.js b/packages/babel-core/test/fixtures/traceur/Destructuring/ValueTypes.js
new file mode 100644
index 0000000000..b76d12cc6c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/ValueTypes.js
@@ -0,0 +1,58 @@
+(function() {
+ var {toFixed} = 42;
+ assert.equal(Number.prototype.toFixed, toFixed);
+
+ var {toString, toLocaleString} = 42;
+ assert.equal(Number.prototype.toString, toString);
+ assert.equal(Number.prototype.toLocaleString, toLocaleString);
+
+ var [x] = 'string';
+ assert.equal('s', x);
+
+ var [x, y] = 'string';
+ assert.equal('s', x);
+ assert.equal('t', y);
+
+ var [x, ...xs] = 'string';
+ assert.equal('s', x);
+ assert.deepEqual(['t', 'r', 'i', 'n', 'g'], xs);
+
+ var {toFixed: {length}} = 42;
+ assert.equal(1, length);
+
+ var {x: {toString}} = {x: true};
+ assert.equal(Boolean.prototype.toString, toString);
+
+ var [[x]] = ['string'];
+ assert.equal('s', x);
+
+ // Same with assignment expression
+
+ ({toFixed} = 42);
+ assert.equal(Number.prototype.toFixed, toFixed);
+
+ ({toString, toLocaleString} = 42);
+ assert.equal(Number.prototype.toString, toString);
+ assert.equal(Number.prototype.toLocaleString, toLocaleString);
+
+ [x] = 'string';
+ assert.equal('s', x);
+
+ [x, y] = 'string';
+ assert.equal('s', x);
+ assert.equal('t', y);
+
+ [x, ...xs] = 'string';
+ assert.equal('s', x);
+ assert.deepEqual(['t', 'r', 'i', 'n', 'g'], xs);
+
+ ({toFixed: {length}} = 42);
+ assert.equal(1, length);
+
+ ({x: {toString}} = {x: true});
+ assert.equal(Boolean.prototype.toString, toString);
+
+ [[x]] = ['string'];
+ assert.equal('s', x);
+
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Destructuring/VarDecl.js b/packages/babel-core/test/fixtures/traceur/Destructuring/VarDecl.js
new file mode 100644
index 0000000000..ec77aff801
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Destructuring/VarDecl.js
@@ -0,0 +1,27 @@
+// Options: --block-binding
+
+function destructVarDecl() {
+ // Const; and an array inside an object literal inside an array.
+ const a = 0, [b, {c, x: [d]}] = [1, {c: 2, x: [3]}];
+
+ // Now an object literal inside an array inside an object literal.
+ var {x: [{e}, f], g} = {x: [{e:4}, 5], g: 6};
+
+ // Two patterns in one var.
+ var {h} = {h: 7}, {i} = {i: 8};
+
+ return { a: a, b: b, c: c, d: d, e: e, f: f, g: g, h: h, i: i };
+}
+
+// ----------------------------------------------------------------------------
+
+var result = destructVarDecl();
+assert.equal(0, result.a);
+assert.equal(1, result.b);
+assert.equal(2, result.c);
+assert.equal(3, result.d);
+assert.equal(4, result.e);
+assert.equal(5, result.f);
+assert.equal(6, result.g);
+assert.equal(7, result.h);
+assert.equal(8, result.i);
diff --git a/packages/babel-core/test/fixtures/traceur/Exponentiation/Basics.js b/packages/babel-core/test/fixtures/traceur/Exponentiation/Basics.js
new file mode 100644
index 0000000000..c6a775f489
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Exponentiation/Basics.js
@@ -0,0 +1,42 @@
+// Options: --exponentiation
+
+(function() {
+ assert.equal(8, 2 ** 3);
+ assert.equal(24, 3 * 2 ** 3);
+ var x = 2;
+ assert.equal(8, 2 ** ++x);
+ assert.equal(1, 2 ** -1 * 2);
+
+ var calls = 0;
+ var q = {q: 3};
+ var o = {
+ get p() {
+ calls++;
+ return q;
+ }
+ };
+
+ o.p.q **= 2;
+ assert.equal(1, calls);
+ assert.equal(9, o.p.q);
+
+ assert.equal(512, 2 ** (3 ** 2));
+ assert.equal(512, 2 ** 3 ** 2);
+
+ var y = 4;
+ var z = y **= 2;
+ assert.equal(16, z);
+
+ function f(x) {
+ assert.equal(1, arguments.length);
+ return x;
+ }
+ var a = 2;
+ var b = [a **= 2];
+ assert.equal(4, a);
+ assert.equal(1, b.length);
+ assert.equal(4, b[0]);
+
+ assert.equal(64, f(a **= 3));
+ assert.equal(64, a);
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/ForOf/NewNoParens.js b/packages/babel-core/test/fixtures/traceur/ForOf/NewNoParens.js
new file mode 100644
index 0000000000..19e564ac08
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ForOf/NewNoParens.js
@@ -0,0 +1,21 @@
+function C() {}
+C.prototype[Symbol.iterator] = function() {
+ var n = 0;
+ return {
+ next() {
+ return {value: n++, done: n > 3};
+ }
+ };
+};
+
+var s = '';
+for (var x of new C()) {
+ s += x;
+}
+assert.equal(s, '012');
+
+s = '';
+for (var x of new C) {
+ s += x;
+}
+assert.equal(s, '012');
diff --git a/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Error_Disabled.js
new file mode 100644
index 0000000000..e87ed8b891
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Error_Disabled.js
@@ -0,0 +1,4 @@
+// Options: --generator-comprehension=false
+// Error: :4:13: Unexpected reserved word for
+
+var iter = (for (x of [0, 1, 2, 3, 4]) x);
diff --git a/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Error_NotDefined.js b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Error_NotDefined.js
new file mode 100644
index 0000000000..66c7e28002
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Error_NotDefined.js
@@ -0,0 +1,5 @@
+// Options: --generator-comprehension --free-variable-checker
+// Error: :5:1: notDefined is not defined
+
+var iter = (for (notDefined of [0]) notDefined);
+notDefined;
diff --git a/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Simple.js b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Simple.js
new file mode 100644
index 0000000000..ffeae46555
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Simple.js
@@ -0,0 +1,40 @@
+// Options: --generator-comprehension
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+function* range() {
+ for (var i = 0; i < 5; i++) {
+ yield i;
+ }
+}
+
+var iter = (for (x of [0, 1, 2, 3, 4]) x);
+assert.equal('01234', accumulate(iter));
+
+var iter2 = (for (x of [0, 1, 2, 3, 4]) for (y of [0, 1, 2, 3, 4]) x + '' + y );
+assert.equal('00010203041011121314202122232430313233344041424344',
+ accumulate(iter2));
+
+var iter3 = (
+ for (x of [0, 1, 2, 3, 4])
+ for (y of range())
+ if (x === y)
+ x + '' + y);
+assert.equal('0011223344', accumulate(iter3));
+
+// Ensure this works as expression statement
+(for (testVar of []) testVar);
+
+var iter4 = (
+ for (x of range())
+ if (x % 2 === 0)
+ for (y of range())
+ if (y % 2 === 1)
+ x + '' + y);
+assert.equal('010321234143', accumulate(iter4));
diff --git a/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Skip_Closure.js b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Skip_Closure.js
new file mode 100644
index 0000000000..5442161373
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/GeneratorComprehension/Skip_Closure.js
@@ -0,0 +1,23 @@
+// Options: --generator-comprehension
+// Skip. The sugaring uses var instead of let which leads to wrong closure.
+
+var iter = (for (x of [0, 1]) for (y of [2, 3]) () => [x, y] );
+
+assert.isTrue(iter.moveNext());
+var f1 = iter.current;
+
+assert.isTrue(iter.moveNext());
+var f2 = iter.current;
+
+assert.isTrue(iter.moveNext());
+var f3 = iter.current;
+
+assert.isTrue(iter.moveNext());
+var f4 = iter.current;
+
+assert.isFalse(iter.moveNext());
+
+assertArrayEquals([0, 2], f1());
+assertArrayEquals([0, 3], f2());
+assertArrayEquals([1, 2], f3());
+assertArrayEquals([1, 3], f4());
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/LICENSE b/packages/babel-core/test/fixtures/traceur/LICENSE
new file mode 100644
index 0000000000..6d00d2ecac
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2011
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/packages/babel-core/test/fixtures/traceur/Math/acosh.module.js b/packages/babel-core/test/fixtures/traceur/Math/acosh.module.js
new file mode 100644
index 0000000000..716e3c02bc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/acosh.module.js
@@ -0,0 +1,8 @@
+import {acosh} from '../../../src/runtime/polyfills/Math.js';
+
+function testAcosh(acosh) {
+ assert.equal(0, acosh(1));
+}
+
+testAcosh(acosh);
+testAcosh(Math.acosh);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/asinh.module.js b/packages/babel-core/test/fixtures/traceur/Math/asinh.module.js
new file mode 100644
index 0000000000..2590ef121d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/asinh.module.js
@@ -0,0 +1,8 @@
+import {asinh} from '../../../src/runtime/polyfills/Math.js';
+
+function testAsinh(asinh) {
+ assert.equal(0, asinh(0));
+}
+
+testAsinh(asinh);
+testAsinh(Math.asinh);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/atanh.module.js b/packages/babel-core/test/fixtures/traceur/Math/atanh.module.js
new file mode 100644
index 0000000000..0a96869e6b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/atanh.module.js
@@ -0,0 +1,8 @@
+import {atanh} from '../../../src/runtime/polyfills/Math.js';
+
+function testAtanh(atanh) {
+ assert.equal(0, atanh(0));
+}
+
+testAtanh(atanh);
+testAtanh(Math.atanh);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/cbrt.module.js b/packages/babel-core/test/fixtures/traceur/Math/cbrt.module.js
new file mode 100644
index 0000000000..726ff94e2a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/cbrt.module.js
@@ -0,0 +1,8 @@
+import {cbrt} from '../../../src/runtime/polyfills/Math.js';
+
+function testCbrt(cbrt) {
+ assert.equal(0, cbrt(0));
+}
+
+testCbrt(cbrt);
+testCbrt(Math.cbrt);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/clz32.module.js b/packages/babel-core/test/fixtures/traceur/Math/clz32.module.js
new file mode 100644
index 0000000000..2d21aaeaa9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/clz32.module.js
@@ -0,0 +1,9 @@
+import {clz32} from '../../../src/runtime/polyfills/Math.js';
+
+function testClz32(clz32) {
+ [NaN, Infinity, -Infinity, 0, -0, 'abc', 'Infinity', '-Infinity', {}].forEach(
+ (x) => assert.equal(32, clz32(x)));
+}
+
+testClz32(clz32);
+testClz32(Math.clz32);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/cosh.module.js b/packages/babel-core/test/fixtures/traceur/Math/cosh.module.js
new file mode 100644
index 0000000000..c61ab85d06
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/cosh.module.js
@@ -0,0 +1,11 @@
+import {cosh} from '../../../src/runtime/polyfills/Math.js';
+
+function testCosh(cosh) {
+ assert.equal(Infinity, cosh(-Infinity));
+ assert.equal(Infinity, cosh(Infinity));
+ assert.equal(1, cosh(0));
+ assert.equal(1, cosh(-0));
+}
+
+testCosh(cosh);
+testCosh(Math.cosh);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/expm1.module.js b/packages/babel-core/test/fixtures/traceur/Math/expm1.module.js
new file mode 100644
index 0000000000..0bbeb63d26
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/expm1.module.js
@@ -0,0 +1,9 @@
+import {expm1} from '../../../src/runtime/polyfills/Math.js';
+
+function testExpm1(expm1) {
+ assert.equal(Infinity, expm1(Infinity));
+ assert.equal(-1, expm1(-Infinity));
+}
+
+testExpm1(expm1);
+testExpm1(Math.expm1);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/fround.module.js b/packages/babel-core/test/fixtures/traceur/Math/fround.module.js
new file mode 100644
index 0000000000..65fe328483
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/fround.module.js
@@ -0,0 +1,22 @@
+import {fround} from '../../../src/runtime/polyfills/Math.js';
+import {fround as jsFround} from '../../../src/runtime/polyfills/fround.js';
+
+function testFround(x, expected) {
+ assert.strictEqual(expected, Math.fround(x));
+ assert.strictEqual(expected, fround(x));
+ assert.strictEqual(expected, jsFround(x));
+}
+
+testFround(0, 0);
+testFround(-0, -0);
+testFround(Infinity, Infinity);
+testFround(-Infinity, -Infinity);
+
+assert.isTrue(isNaN(Math.fround(NaN)));
+assert.isTrue(isNaN(fround(NaN)));
+assert.isTrue(isNaN(jsFround(NaN)));
+
+testFround(1, 1);
+testFround(1.5, 1.5);
+testFround(1.6, 1.600000023841858);
+testFround(1.337, 1.3370000123977661);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/hypot.module.js b/packages/babel-core/test/fixtures/traceur/Math/hypot.module.js
new file mode 100644
index 0000000000..097e5b5318
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/hypot.module.js
@@ -0,0 +1,9 @@
+import {hypot} from '../../../src/runtime/polyfills/Math.js';
+
+function testHypot(hypot) {
+ assert.equal(1, hypot(1));
+ assert.equal(Math.PI, hypot(Math.PI));
+}
+
+testHypot(hypot);
+testHypot(Math.hypot);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/imul.module.js b/packages/babel-core/test/fixtures/traceur/Math/imul.module.js
new file mode 100644
index 0000000000..e67624dca2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/imul.module.js
@@ -0,0 +1,8 @@
+import {imul} from '../../../src/runtime/polyfills/Math.js';
+
+function testImul(imul) {
+ assert.equal(8, imul(2, 4));
+}
+
+testImul(imul);
+testImul(Math.imul);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/log10.module.js b/packages/babel-core/test/fixtures/traceur/Math/log10.module.js
new file mode 100644
index 0000000000..64cae99669
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/log10.module.js
@@ -0,0 +1,9 @@
+import {log10} from '../../../src/runtime/polyfills/Math.js';
+
+function testLog10(log10) {
+ assert.equal(1, log10(10));
+ assert.equal(2, log10(100));
+}
+
+testLog10(log10);
+testLog10(Math.log10);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/log1p.module.js b/packages/babel-core/test/fixtures/traceur/Math/log1p.module.js
new file mode 100644
index 0000000000..2fd94cbf2f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/log1p.module.js
@@ -0,0 +1,8 @@
+import {log1p} from '../../../src/runtime/polyfills/Math.js';
+
+function testLog1p(log1p) {
+ assert.equal(0, log1p(0));
+}
+
+// testLog1p(log1p);
+testLog1p(Math.log1p);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/log2.module.js b/packages/babel-core/test/fixtures/traceur/Math/log2.module.js
new file mode 100644
index 0000000000..fc5935d091
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/log2.module.js
@@ -0,0 +1,9 @@
+import {log2} from '../../../src/runtime/polyfills/Math.js';
+
+function testLog2(log2) {
+ assert.equal(1, log2(2));
+ assert.equal(2, log2(4));
+}
+
+testLog2(log2);
+testLog2(Math.log2);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/sign.module.js b/packages/babel-core/test/fixtures/traceur/Math/sign.module.js
new file mode 100644
index 0000000000..35c816a583
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/sign.module.js
@@ -0,0 +1,11 @@
+import {sign} from '../../../src/runtime/polyfills/Math.js';
+
+function testSign(sign) {
+ assert.equal(1, sign(1));
+ assert.equal(-1, sign(-1));
+ assert.equal(0, sign(0));
+ assert.equal(-0, sign(-0));
+}
+
+testSign(sign);
+testSign(Math.sign);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/sinh.module.js b/packages/babel-core/test/fixtures/traceur/Math/sinh.module.js
new file mode 100644
index 0000000000..c09335be35
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/sinh.module.js
@@ -0,0 +1,11 @@
+import {sinh} from '../../../src/runtime/polyfills/Math.js';
+
+function testSinh(sinh) {
+ assert.equal(0, sinh(0));
+ assert.equal(-0, sinh(-0));
+ assert.equal(Infinity, sinh(Infinity));
+ assert.equal(-Infinity, sinh(-Infinity));
+}
+
+testSinh(sinh);
+testSinh(Math.sinh);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/tanh.module.js b/packages/babel-core/test/fixtures/traceur/Math/tanh.module.js
new file mode 100644
index 0000000000..056ce2fa32
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/tanh.module.js
@@ -0,0 +1,11 @@
+import {tanh} from '../../../src/runtime/polyfills/Math.js';
+
+function testTanh(tanh) {
+ assert.equal(0, tanh(0));
+ assert.equal(-0, tanh(-0));
+ assert.equal(1, tanh(Infinity));
+ assert.equal(-1, tanh(-Infinity));
+}
+
+testTanh(tanh);
+testTanh(Math.tanh);
diff --git a/packages/babel-core/test/fixtures/traceur/Math/trunc.module.js b/packages/babel-core/test/fixtures/traceur/Math/trunc.module.js
new file mode 100644
index 0000000000..c9841d70ef
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Math/trunc.module.js
@@ -0,0 +1,14 @@
+import {trunc} from '../../../src/runtime/polyfills/Math.js';
+
+function testTrunc(trunc) {
+ assert.equal(0, trunc(0));
+ assert.equal(-0, trunc(-0));
+ assert.equal(Infinity, trunc(Infinity));
+ assert.equal(-Infinity, trunc(-Infinity));
+ assert.equal(42, trunc(42));
+ assert.equal(2, trunc(2.5));
+ assert.equal(-2, trunc(-2.5));
+}
+
+testTrunc(trunc);
+testTrunc(Math.trunc);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/EmptyNamedImport.module.js b/packages/babel-core/test/fixtures/traceur/Modules/EmptyNamedImport.module.js
new file mode 100644
index 0000000000..866efd0a87
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/EmptyNamedImport.module.js
@@ -0,0 +1 @@
+import {} from './resources/m.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_DuplicateImport.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_DuplicateImport.module.js
new file mode 100644
index 0000000000..1b8242c196
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_DuplicateImport.module.js
@@ -0,0 +1,10 @@
+// Error: test/feature/Modules/Error_DuplicateImport.module.js:6:9: 'a' was previously imported at test/feature/Modules/Error_DuplicateImport.module.js:5:9
+// Error: test/feature/Modules/Error_DuplicateImport.module.js:9:8: 'd' was previously imported at test/feature/Modules/Error_DuplicateImport.module.js:8:8
+// Error: test/feature/Modules/Error_DuplicateImport.module.js:10:9: 'd' was previously imported at test/feature/Modules/Error_DuplicateImport.module.js:8:8
+
+import {a} from './resources/a.js';
+import {c as a} from './resources/c.js';
+
+import d from './resources/default-class.js';
+import d from './resources/default-name.js';
+import {a as d} from './resources/a2.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportKeyword.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportKeyword.module.js
new file mode 100644
index 0000000000..be6eb05625
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportKeyword.module.js
@@ -0,0 +1,3 @@
+// Error: :3:9: Unexpected token if
+
+export {if};
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportKeyword2.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportKeyword2.module.js
new file mode 100644
index 0000000000..ac5e6de748
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportKeyword2.module.js
@@ -0,0 +1,3 @@
+// Error: :3:9: Unexpected token if
+
+export {if as x};
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportStarConflict.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportStarConflict.module.js
new file mode 100644
index 0000000000..da408f30cb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportStarConflict.module.js
@@ -0,0 +1,3 @@
+// Error: test/feature/Modules/resources/export-conflict.js:2:8: Duplicate export. 'a' was previously exported at test/feature/Modules/resources/export-conflict.js:1:12
+
+import {a} from './resources/export-conflict.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportStarDuplicateExport.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportStarDuplicateExport.module.js
new file mode 100644
index 0000000000..2e9c0cea53
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_ExportStarDuplicateExport.module.js
@@ -0,0 +1,6 @@
+// Error: test/feature/Modules/Error_ExportStarDuplicateExport.module.js:4:8: Duplicate export. 'a' was previously exported at test/feature/Modules/Error_ExportStarDuplicateExport.module.js:3:8
+
+export * from './resources/a.js';
+export * from './resources/a2.js';
+
+assert.equal(1, 2);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_ImportDefault.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_ImportDefault.module.js
new file mode 100644
index 0000000000..45f14c2c5a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_ImportDefault.module.js
@@ -0,0 +1,3 @@
+// Error: test/feature/Modules/Error_ImportDefault.module.js:3:8: 'default' is not exported by 'test/feature/Modules/resources/a.js'
+
+import error from './resources/a.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_ImportStar.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_ImportStar.module.js
new file mode 100644
index 0000000000..e13fb713fe
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_ImportStar.module.js
@@ -0,0 +1,4 @@
+// Error: :3:10: Unexpected token from
+
+import * from './resources/m.js';
+assert.equal(3, a + b);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport.module.js
new file mode 100644
index 0000000000..85fa2002dc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport.module.js
@@ -0,0 +1,3 @@
+// Error: :3:9: 'c' is not exported by 'test/feature/Modules/resources/a.js'
+
+export {c} from './resources/a.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport2.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport2.module.js
new file mode 100644
index 0000000000..25554def04
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport2.module.js
@@ -0,0 +1,3 @@
+// Error: :3:9: 'c' is not exported by 'test/feature/Modules/resources/a.js'
+
+export {c as d} from './resources/a.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport3.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport3.module.js
new file mode 100644
index 0000000000..0617075628
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidExport3.module.js
@@ -0,0 +1,3 @@
+// Error: test/feature/Modules/Error_InvalidExport3.module.js:3:9: 'c' is not exported by 'test/feature/Modules/resources/b.js'
+
+export {c as d} from './resources/b.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidModuleDeclaration.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidModuleDeclaration.module.js
new file mode 100644
index 0000000000..d44ede0b29
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidModuleDeclaration.module.js
@@ -0,0 +1,7 @@
+// Error: 'test/feature/Modules/resources/no_such_file.js'
+// Error: Specified as ./resources/no_such_file.js.
+// Error: Imported by test/feature/Modules/Error_InvalidModuleDeclaration.module.js.
+// Error: Normalizes to test/feature/Modules/resources/no_such_file.js
+// Error: locate resolved against base
+
+import * as b from './resources/no_such_file.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidModuleDeclaration2.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidModuleDeclaration2.module.js
new file mode 100644
index 0000000000..7702371f2d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_InvalidModuleDeclaration2.module.js
@@ -0,0 +1,3 @@
+// Error: 3:38: Unexpected token .
+
+import * as b from './resources/a.js'.c;
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Error_MissingExport.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Error_MissingExport.module.js
new file mode 100644
index 0000000000..9328df7011
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Error_MissingExport.module.js
@@ -0,0 +1,7 @@
+// Error: :5:12: 'y' is not exported by 'test/feature/Modules/resources/x.js'
+// Error: :5:15: 'z' is not exported by 'test/feature/Modules/resources/x.js'
+// Error: :6:9: 'w' is not exported by 'test/feature/Modules/resources/x.js'
+
+import {x, y, z} from './resources/x.js';
+import {w} from './resources/x.js';
+
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ExportDestructuring.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ExportDestructuring.module.js
new file mode 100644
index 0000000000..414a577f1d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ExportDestructuring.module.js
@@ -0,0 +1,4 @@
+import {x, y} from './resources/export-destructuring.js';
+
+assert.equal(x, 1);
+assert.equal(y, 2);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ExportForwardDefault.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ExportForwardDefault.module.js
new file mode 100644
index 0000000000..eaaf689394
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ExportForwardDefault.module.js
@@ -0,0 +1,7 @@
+// Options: --export-from-extended
+
+import {a, b, default as C} from './resources/export-forward-default-as.js';
+
+assert.equal(42, a);
+assert.equal(123, b());
+assert.equal('m', new C().m());
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ExportStar.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ExportStar.module.js
new file mode 100644
index 0000000000..72ddf57887
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ExportStar.module.js
@@ -0,0 +1,7 @@
+import * as o from './resources/o.js';
+
+assert.equal(1, o.a);
+assert.equal(2, o.b);
+assert.equal(3, o.c);
+assert.equal(4, o.d);
+assert.equal(undefined, o.default);
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ExportStarAs.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ExportStarAs.module.js
new file mode 100644
index 0000000000..9fc38c8ead
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ExportStarAs.module.js
@@ -0,0 +1,6 @@
+import {a, b} from './resources/export-star-as.js';
+
+assert.equal(1, a.a);
+assert.equal(2, a.b);
+assert.equal(3, b.c);
+assert.equal(4, b.d);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/Exports.module.js b/packages/babel-core/test/fixtures/traceur/Modules/Exports.module.js
new file mode 100644
index 0000000000..10a4d9a5d0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/Exports.module.js
@@ -0,0 +1,17 @@
+import * as a from './resources/i.js';
+
+(function() {
+ 'use strict';
+ assert.equal(0, a.i);
+ a.inc();
+ assert.equal(1, a.i);
+
+ assert.throws(function() {
+ a.i = 2;
+ }, TypeError);
+})();
+
+assert.equal(1, a.i);
+
+import * as d from './resources/d.js';
+assert.equal('A', d.a);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportAsExportAs.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportAsExportAs.module.js
new file mode 100644
index 0000000000..148782a5d0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportAsExportAs.module.js
@@ -0,0 +1,2 @@
+import * as m from './resources/m3.js';
+assert.equal(m.x, 'z');
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportBasic.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportBasic.module.js
new file mode 100644
index 0000000000..b30516766c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportBasic.module.js
@@ -0,0 +1,3 @@
+import {p} from './resources/p.js';
+assert.equal('P', p);
+assert(typeof q === 'undefined');
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportCircular.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportCircular.module.js
new file mode 100644
index 0000000000..200b0d798a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportCircular.module.js
@@ -0,0 +1,6 @@
+// Error: Unsupported circular dependency between test/feature/Modules/ImportCircular.module.js and test/feature/Modules/resources/clockwise.js
+
+import {clockwise} from './resources/clockwise.js';
+export function counterclockwise() {
+ return clockwise();
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportDefault.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportDefault.module.js
new file mode 100644
index 0000000000..2dfc7591cb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportDefault.module.js
@@ -0,0 +1,17 @@
+import x from './resources/default.js';
+assert.equal(x, 42);
+
+import C from './resources/default-class.js';
+assert.equal(new C().m(), 'm');
+
+import {default as D} from './resources/default-name.js';
+assert.equal(D, 4);
+
+import f from './resources/default-function.js';
+assert.equal(f(), 123);
+
+import E from './resources/default-class-expression.js';
+assert.equal(new E().n(), 'n');
+
+import g from './resources/default-function-expression.js';
+assert.equal(g(), 456);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportEmptyImportClause.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportEmptyImportClause.module.js
new file mode 100644
index 0000000000..865e5c437e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportEmptyImportClause.module.js
@@ -0,0 +1,4 @@
+this.sideEffect = 1;
+import {} from './resources/side-effect2.js';
+assert.equal(2, this.sideEffect);
+this.sideEffect = 1;
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportFromModule.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportFromModule.module.js
new file mode 100644
index 0000000000..99ac97a287
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportFromModule.module.js
@@ -0,0 +1,17 @@
+import {a as renamedX, b} from './resources/m.js';
+import {a} from './resources/m.js';
+import * as m2 from './resources/m.js';
+
+assert.equal(1, a);
+assert.equal(1, renamedX);
+assert.equal(2, b);
+
+import * as m from './resources/m.js';
+
+assert.equal(a, renamedX);
+assert.equal(a, m.a);
+
+import * as m3 from './resources/m.js';
+
+assert.isTrue(m === m3);
+assert.equal(b, m.b);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportNoImportClause.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportNoImportClause.module.js
new file mode 100644
index 0000000000..e83308df8d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportNoImportClause.module.js
@@ -0,0 +1,4 @@
+this.sideEffect = 1;
+import './resources/side-effect.js';
+assert.equal(2, this.sideEffect);
+this.sideEffect = 1;
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportPair.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportPair.module.js
new file mode 100644
index 0000000000..a02f1039d0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportPair.module.js
@@ -0,0 +1,10 @@
+import def, * as m from './resources/default-and-named.js';
+import def2, {x} from './resources/default-and-named.js';
+import def3, {x as y} from './resources/default-and-named.js';
+
+assert.equal(def, 'default');
+assert.equal(def2, 'default');
+assert.equal(def3, 'default');
+
+assert.equal(x, 'x');
+assert.equal(y, 'x');
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportReExportDefault.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportReExportDefault.module.js
new file mode 100644
index 0000000000..383f8241c6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportReExportDefault.module.js
@@ -0,0 +1,2 @@
+import x from './resources/re-export-default.js';
+assert.equal(x, 42);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ImportReExportDefaultAs.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ImportReExportDefaultAs.module.js
new file mode 100644
index 0000000000..75071473a5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ImportReExportDefaultAs.module.js
@@ -0,0 +1,2 @@
+import {x} from './resources/re-export-default-as.js';
+assert.equal(x, 42);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ModuleDefault.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ModuleDefault.module.js
new file mode 100644
index 0000000000..e2fe225850
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ModuleDefault.module.js
@@ -0,0 +1,3 @@
+import * as m from './resources/default.js';
+
+assert.equal(m.default, 42);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ModuleName.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ModuleName.module.js
new file mode 100644
index 0000000000..4ce1f52df8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ModuleName.module.js
@@ -0,0 +1,3 @@
+var re = /([^\s']+?)(?=test(?:[\/\\])feature(?:[\/\\]))/g;
+
+assert.equal(__moduleName.replace(re, ''), 'test/feature/Modules/ModuleName.module.js');
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/StaticMethod.module.js b/packages/babel-core/test/fixtures/traceur/Modules/StaticMethod.module.js
new file mode 100644
index 0000000000..cc37654001
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/StaticMethod.module.js
@@ -0,0 +1,2 @@
+import {TestClass} from './resources/TestClass.js';
+assert.equal(TestClass.method(), 42);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/ThisInModules.module.js b/packages/babel-core/test/fixtures/traceur/Modules/ThisInModules.module.js
new file mode 100644
index 0000000000..0056ac4272
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/ThisInModules.module.js
@@ -0,0 +1,4 @@
+var global = this;
+
+import * as m from './resources/f.js';
+assert.equal(global, m.f());
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/TestClass.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/TestClass.js
new file mode 100644
index 0000000000..723df2b773
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/TestClass.js
@@ -0,0 +1,5 @@
+export class TestClass {
+ static method() {
+ return 42;
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/a.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/a.js
new file mode 100644
index 0000000000..d0ba61cbde
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/a.js
@@ -0,0 +1 @@
+export var a = 'A';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/a2.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/a2.js
new file mode 100644
index 0000000000..da6520dad9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/a2.js
@@ -0,0 +1 @@
+export var a = 'A2';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/b.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/b.js
new file mode 100644
index 0000000000..e7d0cc71ec
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/b.js
@@ -0,0 +1 @@
+import * as c from './c.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/c.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/c.js
new file mode 100644
index 0000000000..fc55ed1488
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/c.js
@@ -0,0 +1 @@
+export var c = 'C';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/clockwise.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/clockwise.js
new file mode 100644
index 0000000000..02e22761f8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/clockwise.js
@@ -0,0 +1,4 @@
+import {counterclockwise} from '../ImportCircular.module.js';
+export function clockwise() {
+ return 'The circle is complete';
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/d.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/d.js
new file mode 100644
index 0000000000..4a9ab8813e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/d.js
@@ -0,0 +1 @@
+export * from './a.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/default-and-named.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-and-named.js
new file mode 100644
index 0000000000..aa4a2a19e1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-and-named.js
@@ -0,0 +1,2 @@
+export default 'default';
+export var x = 'x';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/default-class-expression.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-class-expression.js
new file mode 100644
index 0000000000..4dcbb96368
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-class-expression.js
@@ -0,0 +1,5 @@
+export default class {
+ n() {
+ return 'n';
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/default-class.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-class.js
new file mode 100644
index 0000000000..8c1e65c3be
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-class.js
@@ -0,0 +1,7 @@
+export default class C {
+ m() {
+ return 'm';
+ }
+}
+
+assert.instanceOf(C, Function);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/default-function-expression.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-function-expression.js
new file mode 100644
index 0000000000..442eb2ccac
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-function-expression.js
@@ -0,0 +1,3 @@
+export default function() {
+ return 456;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/default-function.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-function.js
new file mode 100644
index 0000000000..3522838092
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-function.js
@@ -0,0 +1,5 @@
+export default function f() {
+ return 123;
+}
+
+assert.instanceOf(f, Function);
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/default-name.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-name.js
new file mode 100644
index 0000000000..fc9ffb7a38
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/default-name.js
@@ -0,0 +1,2 @@
+var p = 4;
+export {p as default};
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/default.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/default.js
new file mode 100644
index 0000000000..7a4e8a723a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/default.js
@@ -0,0 +1 @@
+export default 42;
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/export-conflict.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-conflict.js
new file mode 100644
index 0000000000..830463412f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-conflict.js
@@ -0,0 +1,2 @@
+export var a = 'a';
+export * from './a.js'; // also exports a
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/export-destructuring.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-destructuring.js
new file mode 100644
index 0000000000..1c64065e9c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-destructuring.js
@@ -0,0 +1 @@
+export var {x, y = 2} = {x: 1};
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/export-forward-default-as.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-forward-default-as.js
new file mode 100644
index 0000000000..3a9bce6634
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-forward-default-as.js
@@ -0,0 +1,3 @@
+export a from './default.js';
+export b from './default-function.js';
+export default from './default-class.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/export-star-as.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-star-as.js
new file mode 100644
index 0000000000..0f92446363
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/export-star-as.js
@@ -0,0 +1,2 @@
+export * as a from './m.js';
+export * as b from './n.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/f.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/f.js
new file mode 100644
index 0000000000..dff8ba2f28
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/f.js
@@ -0,0 +1 @@
+export var f = () => this;
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/i.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/i.js
new file mode 100644
index 0000000000..1096ab76ca
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/i.js
@@ -0,0 +1,4 @@
+export var i = 0;
+export function inc() {
+ i++;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/m.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/m.js
new file mode 100644
index 0000000000..0b0c3304ff
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/m.js
@@ -0,0 +1,2 @@
+export var a = 1;
+export var b = 2;
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/m2.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/m2.js
new file mode 100644
index 0000000000..4fce0644f6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/m2.js
@@ -0,0 +1,2 @@
+var z = 'z';
+export {z as var};
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/m3.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/m3.js
new file mode 100644
index 0000000000..d0b61d8faf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/m3.js
@@ -0,0 +1,2 @@
+import {var as x} from './m2.js';
+export {x};
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/n.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/n.js
new file mode 100644
index 0000000000..6e7457c073
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/n.js
@@ -0,0 +1,3 @@
+export var c = 3;
+export var d = 4;
+export default 5;
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/o.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/o.js
new file mode 100644
index 0000000000..e0a1758a6a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/o.js
@@ -0,0 +1,2 @@
+export * from './m.js';
+export * from './n.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/p.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/p.js
new file mode 100644
index 0000000000..b85dc962a7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/p.js
@@ -0,0 +1,2 @@
+export var p = 'P';
+export var q = 'Q';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/re-export-default-as.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/re-export-default-as.js
new file mode 100644
index 0000000000..d6ee20f83c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/re-export-default-as.js
@@ -0,0 +1 @@
+export {default as x} from './default.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/re-export-default.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/re-export-default.js
new file mode 100644
index 0000000000..a2229f0904
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/re-export-default.js
@@ -0,0 +1 @@
+export {default} from './default.js';
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/side-effect.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/side-effect.js
new file mode 100644
index 0000000000..cff3fea11b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/side-effect.js
@@ -0,0 +1 @@
+this.sideEffect++;
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/side-effect2.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/side-effect2.js
new file mode 100644
index 0000000000..23cc5b9c39
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/side-effect2.js
@@ -0,0 +1,3 @@
+this.sideEffect++;
+
+
diff --git a/packages/babel-core/test/fixtures/traceur/Modules/resources/x.js b/packages/babel-core/test/fixtures/traceur/Modules/resources/x.js
new file mode 100644
index 0000000000..7e0623ea76
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Modules/resources/x.js
@@ -0,0 +1 @@
+export var x = 'X';
diff --git a/packages/babel-core/test/fixtures/traceur/Number/EPSILON.module.js b/packages/babel-core/test/fixtures/traceur/Number/EPSILON.module.js
new file mode 100644
index 0000000000..8bb6716b37
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Number/EPSILON.module.js
@@ -0,0 +1,10 @@
+import {EPSILON} from '../../../src/runtime/polyfills/Number.js';
+
+function testEpsilon(epsilon) {
+ assert.equal(epsilon, Math.pow(2, -52));
+ assert.equal(1 + epsilon - 1, epsilon);
+ assert.equal(1 + epsilon / 2 - 1, 0);
+}
+
+testEpsilon(EPSILON);
+testEpsilon(Number.EPSILON);
diff --git a/packages/babel-core/test/fixtures/traceur/Number/MAX_SAFE_INTEGER.module.js b/packages/babel-core/test/fixtures/traceur/Number/MAX_SAFE_INTEGER.module.js
new file mode 100644
index 0000000000..44f20fb78b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Number/MAX_SAFE_INTEGER.module.js
@@ -0,0 +1,4 @@
+import {MAX_SAFE_INTEGER} from '../../../src/runtime/polyfills/Number.js';
+
+assert.equal(MAX_SAFE_INTEGER, Math.pow(2, 53) - 1);
+assert.equal(Number.MAX_SAFE_INTEGER, Math.pow(2, 53) - 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Number/MIN_SAFE_INTEGER.module.js b/packages/babel-core/test/fixtures/traceur/Number/MIN_SAFE_INTEGER.module.js
new file mode 100644
index 0000000000..450d5b0b07
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Number/MIN_SAFE_INTEGER.module.js
@@ -0,0 +1,4 @@
+import {MIN_SAFE_INTEGER} from '../../../src/runtime/polyfills/Number.js';
+
+assert.equal(MIN_SAFE_INTEGER, -Math.pow(2, 53) + 1);
+assert.equal(Number.MIN_SAFE_INTEGER, -Math.pow(2, 53) + 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Number/isFinite.module.js b/packages/babel-core/test/fixtures/traceur/Number/isFinite.module.js
new file mode 100644
index 0000000000..51e5d5d66f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Number/isFinite.module.js
@@ -0,0 +1,30 @@
+import {isFinite} from '../../../src/runtime/polyfills/Number.js';
+
+function testIsFinite(isFinite) {
+ assert.isTrue(isFinite(-0));
+ assert.isTrue(isFinite(0));
+ assert.isTrue(isFinite(Number.EPSILON));
+ assert.isTrue(isFinite(Number.MAX_SAFE_INTEGER + 23));
+ assert.isTrue(isFinite(Number.MAX_VALUE));
+ assert.isTrue(isFinite(Number.MIN_SAFE_INTEGER - 13));
+ assert.isTrue(isFinite(Number.MIN_VALUE));
+
+ assert.isFalse(isFinite('-0'));
+ assert.isFalse(isFinite('0'));
+ assert.isFalse(isFinite('x'));
+ assert.isFalse(isFinite(-Infinity));
+ assert.isFalse(isFinite(-NaN));
+ assert.isFalse(isFinite(Infinity));
+ assert.isFalse(isFinite(NaN));
+ assert.isFalse(isFinite(Number.NEGATIVE_INFINITY));
+ assert.isFalse(isFinite(Number.POSITIVE_INFINITY));
+ assert.isFalse(isFinite(false));
+ assert.isFalse(isFinite(new Number(1)));
+ assert.isFalse(isFinite(null));
+ assert.isFalse(isFinite(true));
+ assert.isFalse(isFinite(undefined));
+ assert.isFalse(isFinite({valueOf() { return 1; }}));
+}
+
+testIsFinite(isFinite);
+testIsFinite(Number.isFinite);
diff --git a/packages/babel-core/test/fixtures/traceur/Number/isInteger.module.js b/packages/babel-core/test/fixtures/traceur/Number/isInteger.module.js
new file mode 100644
index 0000000000..73df049c1d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Number/isInteger.module.js
@@ -0,0 +1,30 @@
+import {isInteger} from '../../../src/runtime/polyfills/Number.js';
+
+function testIsInteger(isInteger) {
+ assert.isTrue(isInteger(-0));
+ assert.isTrue(isInteger(0));
+ assert.isTrue(isInteger(Number.MAX_SAFE_INTEGER + 23));
+ assert.isTrue(isInteger(Number.MAX_VALUE));
+ assert.isTrue(isInteger(Number.MIN_SAFE_INTEGER - 13));
+
+ assert.isFalse(isInteger('-0'));
+ assert.isFalse(isInteger('0'));
+ assert.isFalse(isInteger('x'));
+ assert.isFalse(isInteger(-Infinity));
+ assert.isFalse(isInteger(-NaN));
+ assert.isFalse(isInteger(Infinity));
+ assert.isFalse(isInteger(NaN));
+ assert.isFalse(isInteger(Number.EPSILON));
+ assert.isFalse(isInteger(Number.MIN_VALUE));
+ assert.isFalse(isInteger(Number.NEGATIVE_INFINITY));
+ assert.isFalse(isInteger(Number.POSITIVE_INFINITY));
+ assert.isFalse(isInteger(false));
+ assert.isFalse(isInteger(new Number(1)));
+ assert.isFalse(isInteger(null));
+ assert.isFalse(isInteger(true));
+ assert.isFalse(isInteger(undefined));
+ assert.isFalse(isInteger({valueOf() { return 1; }}));
+}
+
+testIsInteger(isInteger);
+testIsInteger(Number.isInteger);
diff --git a/packages/babel-core/test/fixtures/traceur/Number/isNaN.module.js b/packages/babel-core/test/fixtures/traceur/Number/isNaN.module.js
new file mode 100644
index 0000000000..037696594e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Number/isNaN.module.js
@@ -0,0 +1,30 @@
+import {isNaN} from '../../../src/runtime/polyfills/Number.js';
+
+function testIsNaN(isNaN) {
+ assert.isTrue(isNaN(NaN));
+ assert.isTrue(isNaN(-NaN));
+
+ assert.isFalse(isNaN('-0'));
+ assert.isFalse(isNaN('0'));
+ assert.isFalse(isNaN('NaN'));
+ assert.isFalse(isNaN('x'));
+ assert.isFalse(isNaN(-0));
+ assert.isFalse(isNaN(0));
+ assert.isFalse(isNaN(Infinity));
+ assert.isFalse(isNaN(Number.EPSILON));
+ assert.isFalse(isNaN(Number.MAX_SAFE_INTEGER + 23));
+ assert.isFalse(isNaN(Number.MAX_VALUE));
+ assert.isFalse(isNaN(Number.MIN_SAFE_INTEGER - 13));
+ assert.isFalse(isNaN(Number.MIN_VALUE));
+ assert.isFalse(isNaN(Number.NEGATIVE_INFINITY));
+ assert.isFalse(isNaN(Number.POSITIVE_INFINITY));
+ assert.isFalse(isNaN(false));
+ assert.isFalse(isNaN(new Number(NaN)));
+ assert.isFalse(isNaN(null));
+ assert.isFalse(isNaN(true));
+ assert.isFalse(isNaN(undefined));
+ assert.isFalse(isNaN({valueOf() { return NaN; }}));
+}
+
+testIsNaN(isNaN);
+testIsNaN(Number.isNaN);
diff --git a/packages/babel-core/test/fixtures/traceur/Number/isSafeInteger.module.js b/packages/babel-core/test/fixtures/traceur/Number/isSafeInteger.module.js
new file mode 100644
index 0000000000..285ce2a8f2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Number/isSafeInteger.module.js
@@ -0,0 +1,33 @@
+import {isSafeInteger} from '../../../src/runtime/polyfills/Number.js';
+
+function testIsSafeInteger(isSafeInteger) {
+ assert.isTrue(isSafeInteger(-0));
+ assert.isTrue(isSafeInteger(0));
+ assert.isTrue(isSafeInteger(Number.MAX_SAFE_INTEGER - 23));
+ assert.isTrue(isSafeInteger(Number.MAX_SAFE_INTEGER));
+ assert.isTrue(isSafeInteger(Number.MIN_SAFE_INTEGER + 13));
+
+ assert.isFalse(isSafeInteger('-0'));
+ assert.isFalse(isSafeInteger('0'));
+ assert.isFalse(isSafeInteger('x'));
+ assert.isFalse(isSafeInteger(-Infinity));
+ assert.isFalse(isSafeInteger(-NaN));
+ assert.isFalse(isSafeInteger(Infinity));
+ assert.isFalse(isSafeInteger(NaN));
+ assert.isFalse(isSafeInteger(Number.EPSILON));
+ assert.isFalse(isSafeInteger(Number.MAX_SAFE_INTEGER + 23));
+ assert.isFalse(isSafeInteger(Number.MAX_VALUE));
+ assert.isFalse(isSafeInteger(Number.MIN_SAFE_INTEGER - 13));
+ assert.isFalse(isSafeInteger(Number.MIN_VALUE));
+ assert.isFalse(isSafeInteger(Number.NEGATIVE_INFINITY));
+ assert.isFalse(isSafeInteger(Number.POSITIVE_INFINITY));
+ assert.isFalse(isSafeInteger(false));
+ assert.isFalse(isSafeInteger(new Number(1)));
+ assert.isFalse(isSafeInteger(null));
+ assert.isFalse(isSafeInteger(true));
+ assert.isFalse(isSafeInteger(undefined));
+ assert.isFalse(isSafeInteger({valueOf() { return 1; }}));
+}
+
+testIsSafeInteger(isSafeInteger);
+testIsSafeInteger(Number.isSafeInteger);
diff --git a/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_Disabled.js
new file mode 100644
index 0000000000..dd9ad409cd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_Disabled.js
@@ -0,0 +1,4 @@
+// Options: --numeric-literals=false
+// Error: :4:2: Semi-colon expected
+
+0b11;
diff --git a/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_NoBinaryDigits.js b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_NoBinaryDigits.js
new file mode 100644
index 0000000000..5736588322
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_NoBinaryDigits.js
@@ -0,0 +1,4 @@
+// Options: --numeric-literals
+// Error: :4:1: Binary Integer Literal must contain at least one digit
+
+0b;
diff --git a/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_NoOctalDigits.js b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_NoOctalDigits.js
new file mode 100644
index 0000000000..4f9b85264e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Error_NoOctalDigits.js
@@ -0,0 +1,4 @@
+// Options: --numeric-literals
+// Error: :4:1: Octal Integer Literal must contain at least one digit
+
+0o;
diff --git a/packages/babel-core/test/fixtures/traceur/NumericLiteral/Simple.js b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Simple.js
new file mode 100644
index 0000000000..651e03c5b5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/NumericLiteral/Simple.js
@@ -0,0 +1,101 @@
+// Options: --numeric-literals
+
+(function() {
+ assert.equal(0, 0b0);
+ assert.equal(1, 0b1);
+ assert.equal(3, 0b11);
+ assert.equal(3, 0b011);
+ assert.equal(0, 0B0);
+ assert.equal(1, 0B1);
+ assert.equal(3, 0B11);
+ assert.equal(3, 0B011);
+
+ assert.equal(0, 0o0);
+ assert.equal(1, 0o1);
+ assert.equal(7, 0o7);
+ assert.equal(8, 0o10);
+ assert.equal(8, 0o010);
+ assert.equal(63, 0o77);
+ assert.equal(0, 0O0);
+ assert.equal(1, 0O1);
+ assert.equal(7, 0O7);
+ assert.equal(8, 0O10);
+ assert.equal(8, 0O010);
+ assert.equal(63, 0O77);
+
+ var o = {
+ 0b0: 0,
+ 0b1: 1,
+ 0b10: 2,
+ 0B11: 3,
+ 0B0100: 4
+ };
+ assertArrayEquals(['0', '1', '2', '3', '4'], Object.keys(o));
+
+ var o = {
+ 0o0: 0,
+ 0o1: 1,
+ 0o7: 7,
+ 0O10: 8,
+ 0O011: 9
+ };
+ assertArrayEquals(['0', '1', '7', '8', '9'], Object.keys(o));
+
+ var o = {
+ get 0b0() {},
+ get 0b1() {},
+ get 0b10() {},
+ get 0B11() {},
+ get 0B0100() {}
+ };
+ assertArrayEquals(['0', '1', '2', '3', '4'], Object.keys(o));
+
+ var o = {
+ set 0o0(v) {},
+ set 0o1(v) {},
+ set 0o7(v) {},
+ set 0O10(v) {},
+ set 0O011(v) {}
+ };
+ assertArrayEquals(['0', '1', '7', '8', '9'], Object.keys(o));
+
+ var o = {
+ 0b0() {},
+ 0b1() {},
+ 0b10() {},
+ 0B11() {},
+ 0B0100() {}
+ };
+ assertArrayEquals(['0', '1', '2', '3', '4'], Object.keys(o));
+
+ class C {
+ 0b0() {}
+ get 0b1() {}
+ set 0b10(v) {}
+ static 0B11() {}
+ static get 0B100() {}
+ static set 0B101(v) {}
+
+ 0o6() {}
+ get 0o7() {}
+ set 0o10(v) {}
+ static 0O11() {}
+ static get 0O12() {}
+ static set 0O13(v) {}
+ }
+
+ assert.isTrue(C.prototype.hasOwnProperty('0'));
+ assert.isTrue(C.prototype.hasOwnProperty('1'));
+ assert.isTrue(C.prototype.hasOwnProperty('2'));
+ assert.isTrue(C.prototype.hasOwnProperty('6'));
+ assert.isTrue(C.prototype.hasOwnProperty('7'));
+ assert.isTrue(C.prototype.hasOwnProperty('8'));
+
+ assert.isTrue(C.hasOwnProperty('3'));
+ assert.isTrue(C.hasOwnProperty('4'));
+ assert.isTrue(C.hasOwnProperty('5'));
+ assert.isTrue(C.hasOwnProperty('9'));
+ assert.isTrue(C.hasOwnProperty('10'));
+ assert.isTrue(C.hasOwnProperty('11'));
+
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectAssign.js b/packages/babel-core/test/fixtures/traceur/ObjectAssign.js
new file mode 100644
index 0000000000..05841a614c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectAssign.js
@@ -0,0 +1,11 @@
+var target = {a: 0, b: 2};
+var source = {a: 1, c: 3, get d() { return this.b || this.a + 64; }};
+var assigned = Object.assign(target, source);
+
+// ----------------------------------------------------------------------------
+
+assert.isTrue(Object.hasOwnProperty("assign"));
+assert.equal(assigned.a, source.a);
+assert.equal(assigned.b, target.b);
+assert.equal(assigned.c, source.c);
+assert.equal(assigned.d, source.d);
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_Disabled.js
new file mode 100644
index 0000000000..069c869b11
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_Disabled.js
@@ -0,0 +1,5 @@
+// Options: --property-name-shorthand=false
+// Error: :5:16: Unexpected token x
+
+var x = 42;
+var object = {x};
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_Keyword.js b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_Keyword.js
new file mode 100644
index 0000000000..4d3f5644cb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_Keyword.js
@@ -0,0 +1,3 @@
+// Error: :3:18: Unexpected token var
+
+var object = {var};
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_MissingVar.js b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_MissingVar.js
new file mode 100644
index 0000000000..e7c4d29fe4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_MissingVar.js
@@ -0,0 +1,3 @@
+// Error: missingVarObjectInitializerShorthand is not defined
+
+var object = {missingVarObjectInitializerShorthand};
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_StrictKeyword.js b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_StrictKeyword.js
new file mode 100644
index 0000000000..666ffa7956
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Error_StrictKeyword.js
@@ -0,0 +1,12 @@
+// Error: :6:11: implements is a reserved identifier
+// Error: :11:11: yield is a reserved identifier
+
+function f() {
+ 'use strict';
+ return {implements};
+}
+
+function g() {
+ 'use strict';
+ return {yield};
+}
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Ok.js b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Ok.js
new file mode 100644
index 0000000000..591866b272
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/Ok.js
@@ -0,0 +1,8 @@
+var x = 42;
+var y = 43;
+var object = {x, y};
+
+// ----------------------------------------------------------------------------
+
+assert.equal(42, object.x);
+assert.equal(43, object.y);
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/StrictKeyword.js b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/StrictKeyword.js
new file mode 100644
index 0000000000..222aec7a88
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectInitializerShorthand/StrictKeyword.js
@@ -0,0 +1,14 @@
+// This only tests the parsing.
+
+function f() {
+ return {implements};
+}
+
+function f2() {
+ return {yield};
+}
+
+function* g() {
+ 'use strict';
+ return {yield};
+}
diff --git a/packages/babel-core/test/fixtures/traceur/ObjectIs.js b/packages/babel-core/test/fixtures/traceur/ObjectIs.js
new file mode 100644
index 0000000000..2f19b0edda
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/ObjectIs.js
@@ -0,0 +1,34 @@
+assert.isTrue(Object.is(1, 1));
+assert.isTrue(Object.is(0, 0));
+assert.isTrue(Object.is(-0, -0));
+assert.isTrue(Object.is(NaN, NaN));
+assert.isTrue(Object.is(Infinity, Infinity));
+assert.isTrue(Object.is(-Infinity, -Infinity));
+
+assert.isFalse(Object.is(0, -0));
+assert.isFalse(Object.is(-0, 0));
+assert.isFalse(Object.is(Infinity, -Infinity));
+assert.isFalse(Object.is(-Infinity, Infinity));
+
+assert.isTrue(Object.is(true, true));
+assert.isTrue(Object.is(false, false));
+
+assert.isTrue(Object.is(null, null));
+assert.isTrue(Object.is(undefined, undefined));
+
+assert.isTrue(Object.is('', ''));
+assert.isTrue(Object.is('a', 'a'));
+
+{
+ var object = {};
+ assert.isTrue(Object.is(object, object));
+}
+
+assert.isFalse(Object.is(new String('a'), new String('a')));
+assert.isFalse(Object.is(new Boolean, new Boolean));
+assert.isFalse(Object.is(new Number, new Number));
+assert.isFalse(Object.is(new Date(0), new Date(0)));
+assert.isFalse(Object.is(/re/, /re/));
+assert.isFalse(Object.is({}, {}));
+assert.isFalse(Object.is([], []));
+assert.isFalse(Object.is(function() {}, function() {}));
diff --git a/packages/babel-core/test/fixtures/traceur/PrependStatement.js b/packages/babel-core/test/fixtures/traceur/PrependStatement.js
new file mode 100644
index 0000000000..e50fa07ed4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PrependStatement.js
@@ -0,0 +1,18 @@
+var count = 0;
+var o = {
+ get x() {
+ count++;
+ return 1;
+ }
+};
+
+function f({x}) {}
+f(o);
+assert.equal(1, count);
+
+count = 0;
+function g({x}) {
+ 'use strict';
+}
+g(o);
+assert.equal(1, count);
diff --git a/packages/babel-core/test/fixtures/traceur/Promise.js b/packages/babel-core/test/fixtures/traceur/Promise.js
new file mode 100644
index 0000000000..a5f7679209
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Promise.js
@@ -0,0 +1,9 @@
+// Async.
+
+var p = new Promise((resolve, reject) => {
+ resolve(42);
+});
+p.then((v) => {
+ assert.equal(v, 42);
+ done();
+});
diff --git a/packages/babel-core/test/fixtures/traceur/PromiseAll.js b/packages/babel-core/test/fixtures/traceur/PromiseAll.js
new file mode 100644
index 0000000000..92067b82e2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PromiseAll.js
@@ -0,0 +1,17 @@
+// Skip.
+// Async.
+
+// V8 does not yet support iterable argument to Promise.all.
+// https://code.google.com/p/v8/issues/detail?id=3705
+
+function* gen() {
+ yield 1;
+ yield 2;
+}
+
+var p2 = Promise.all(gen());
+
+p2.then((v) => {
+ assert.deepEqual(v, [1,2]);
+ done();
+});
diff --git a/packages/babel-core/test/fixtures/traceur/PromiseResolve.js b/packages/babel-core/test/fixtures/traceur/PromiseResolve.js
new file mode 100644
index 0000000000..69c9aadd3c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PromiseResolve.js
@@ -0,0 +1,3 @@
+var p = Promise.resolve(42);
+
+assert.equal(p, Promise.resolve(p));
diff --git a/packages/babel-core/test/fixtures/traceur/PromiseThrowInResolve.js b/packages/babel-core/test/fixtures/traceur/PromiseThrowInResolve.js
new file mode 100644
index 0000000000..e380f26948
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PromiseThrowInResolve.js
@@ -0,0 +1,15 @@
+// Async.
+
+var message = 'testing';
+var throwInResolve = new Promise((resolve, reject) => {
+ resolve(42);
+});
+throwInResolve.then((v) => {
+ throw new Error(message);
+}).catch(function(ex) {
+ // When catch() is used in testing, these asserts would
+ // not be called, just the done() to avoid timeout.
+ assert(ex instanceof Error);
+ assert(ex.toString().indexOf(message) !== -1);
+ done();
+}).catch(done);
diff --git a/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/Error_Disabled.js
new file mode 100644
index 0000000000..4badc9f2cf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/Error_Disabled.js
@@ -0,0 +1,8 @@
+// Options: --property-methods=false
+// Error: :5:9: Unexpected token (
+
+var object = {
+ method() {
+ return 42;
+ }
+};
diff --git a/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/Error_NotNamed.js b/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/Error_NotNamed.js
new file mode 100644
index 0000000000..dbb08846de
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/Error_NotNamed.js
@@ -0,0 +1,8 @@
+assert.throws(() => {
+ var object = {
+ "notNamedField"() {
+ return notNamedField;
+ }
+ };
+ object.notNamedField();
+}, ReferenceError);
diff --git a/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/PropertyMethodAssignment.js b/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/PropertyMethodAssignment.js
new file mode 100644
index 0000000000..a913227b1b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PropertyMethodAssignment/PropertyMethodAssignment.js
@@ -0,0 +1,71 @@
+var object = {
+ x: {
+ j() {
+ return this.j;
+ }
+ },
+ f() {
+ return this.f;
+ },
+ 'g'() {},
+ "h"() {},
+ 42() {},
+ null() {},
+ true() {},
+ false() {},
+ function() {},
+ var() {},
+ 'class'() {} // NodeJS incorrectly flags {class: ...} as an error.
+};
+
+// ----------------------------------------------------------------------------
+
+assertArrayEquals([
+ '42',
+ 'x',
+ 'f',
+ 'g',
+ 'h',
+ 'null',
+ 'true',
+ 'false',
+ 'function',
+ 'var',
+ 'class'
+], Object.keys(object));
+
+function assertMethod(object, name) {
+ assert.isTrue(object.hasOwnProperty(name));
+ var descriptor = Object.getOwnPropertyDescriptor(object, name);
+ assert.equal('object', typeof descriptor);
+ assert.isTrue(descriptor.enumerable);
+ assert.equal('function', typeof object[name]);
+ // IE does not have a name property on functions.
+ assert.isTrue(object[name].name === '' || object[name].name === undefined);
+}
+
+assertMethod(object, 'f');
+assertMethod(object, 'g');
+assertMethod(object, 'h');
+assertMethod(object, '42');
+assertMethod(object, 'null');
+assertMethod(object, 'true');
+assertMethod(object, 'false');
+assertMethod(object, 'function');
+assertMethod(object, 'var');
+assertMethod(object, 'class');
+
+assert.equal(object.f, object.f());
+
+// Test the nested object.
+assertArrayEquals(['j'], Object.keys(object.x));
+assertMethod(object.x, 'j');
+
+// Test name binding.
+var m = 42;
+class C {
+ m() {
+ return m;
+ }
+}
+assert.equal(42, new C().m())
diff --git a/packages/babel-core/test/fixtures/traceur/PureES6Transformer/Basic.js b/packages/babel-core/test/fixtures/traceur/PureES6Transformer/Basic.js
new file mode 100644
index 0000000000..e7534d7b18
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/PureES6Transformer/Basic.js
@@ -0,0 +1,3 @@
+// Options: --output-language=es6
+// Ironically enough we can't use es6 in this test as node can't eval it.
+function foo() {}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/RegularExpression/Simple.js b/packages/babel-core/test/fixtures/traceur/RegularExpression/Simple.js
new file mode 100644
index 0000000000..0e5a4ae451
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/RegularExpression/Simple.js
@@ -0,0 +1,12 @@
+// Options: --unicode-expressions
+
+// Only test if the transformation worked or not. For everything else, defer
+// to regexpu's test suite:
+// https://github.com/mathiasbynens/regexpu/blob/master/tests/tests.js
+(function() {
+ assert.equal(/a/u.source, 'a');
+ assert.equal(/a.b/u.source,
+ 'a(?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\uE000-\\uFFFF]|' +
+ '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF]' +
+ '(?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])b');
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Rest/Error_NotLast.js b/packages/babel-core/test/fixtures/traceur/Rest/Error_NotLast.js
new file mode 100644
index 0000000000..e6ff97f3cf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Rest/Error_NotLast.js
@@ -0,0 +1,6 @@
+// Error: :3:46: Unexpected token ,
+
+function invalidParam(noDefault, ...restParam, noRestAgain) {
+ // Should fail to parse since non rest param is not allowed after
+ // param.
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Rest/Error_SetAccessor.js b/packages/babel-core/test/fixtures/traceur/Rest/Error_SetAccessor.js
new file mode 100644
index 0000000000..754e2be8ea
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Rest/Error_SetAccessor.js
@@ -0,0 +1,7 @@
+// Error: :4:9: Unexpected token ...
+
+var object = {
+ set x(...rest) {
+ // rest is not allowed for set accessor
+ }
+};
diff --git a/packages/babel-core/test/fixtures/traceur/Rest/Simple.js b/packages/babel-core/test/fixtures/traceur/Rest/Simple.js
new file mode 100644
index 0000000000..00350014e1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Rest/Simple.js
@@ -0,0 +1,16 @@
+function f(...p) {
+ return p;
+}
+
+function g(a, ...p) {
+ return p;
+}
+
+assertArrayEquals([], f());
+assertArrayEquals([0], f(0));
+assertArrayEquals([0, 1], f(0, 1));
+
+assertArrayEquals([], g());
+assertArrayEquals([], g(0));
+assertArrayEquals([1], g(0, 1));
+assertArrayEquals([1, 2], g(0, 1, 2));
diff --git a/packages/babel-core/test/fixtures/traceur/Rest/Strict.js b/packages/babel-core/test/fixtures/traceur/Rest/Strict.js
new file mode 100644
index 0000000000..d69126240c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Rest/Strict.js
@@ -0,0 +1,6 @@
+function f(...xs) {
+ 'use strict';
+ return this;
+}
+
+assert.isUndefined(f());
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding10.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding10.js
new file mode 100644
index 0000000000..d7500efcfd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding10.js
@@ -0,0 +1,15 @@
+// Options: --block-binding
+
+function f() {
+ return 'outer';
+}
+
+{
+ var f = function f() {
+ return 'inner';
+ };
+
+ assert.equal('inner', f());
+}
+
+assert.equal('inner', f());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding11.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding11.js
new file mode 100644
index 0000000000..07ac0a07f1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding11.js
@@ -0,0 +1,18 @@
+// Options: --block-binding
+
+let result = [];
+let obj = {a : 'hello a', b : 'hello b', c : 'hello c' };
+let keys = Object.keys(obj);
+
+// NOTE: Do not fix the deviation from Google JS coding style. This was done in
+// order to check codegen for single statements in the body of 'for' loops.
+for (let i = 0; i < keys.length; i++)
+ result.push(
+ function() { return obj[keys[i]]; }
+ );
+
+// ----------------------------------------------------------------------------
+
+assert.equal('hello a', result[0]());
+assert.equal('hello b', result[1]());
+assert.equal('hello c', result[2]());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding2.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding2.js
new file mode 100644
index 0000000000..afb64e1664
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding2.js
@@ -0,0 +1,15 @@
+// Options: --block-binding
+
+let result = [];
+let obj = {a : 'hello a', b : 'hello b', c : 'hello c' };
+for (let x in obj) {
+ result.push(
+ function() { return obj[x]; }
+ );
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('hello a', result[0]());
+assert.equal('hello b', result[1]());
+assert.equal('hello c', result[2]());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding3.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding3.js
new file mode 100644
index 0000000000..4d620100ca
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding3.js
@@ -0,0 +1,17 @@
+// Options: --block-binding
+
+var f1, f2;
+
+{
+ let z = 'z1 value';
+ f1 = function() { return z; };
+}
+{
+ let z = 'z2 value';
+ f2 = function() { return z; };
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('z1 value', f1());
+assert.equal('z2 value', f2());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding4.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding4.js
new file mode 100644
index 0000000000..b22f6af158
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding4.js
@@ -0,0 +1,14 @@
+// Options: --block-binding
+
+let result = [];
+for (let a = 1; a < 3; a++) {
+ result.push(
+ function() { return 'for ' + a; }
+ );
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('for 1', result[0]());
+assert.equal('for 2', result[1]());
+assert.equal(2, result.length);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding5.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding5.js
new file mode 100644
index 0000000000..92284dc856
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding5.js
@@ -0,0 +1,18 @@
+// Options: --block-binding
+
+let result = [];
+for (let i = 1; i < 3; i ++) {
+ for (let j = 9; j > 7; j --) {
+ result.push(
+ function() { return i + ':' + j; }
+ );
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('1:9', result[0]());
+assert.equal('1:8', result[1]());
+assert.equal('2:9', result[2]());
+assert.equal('2:8', result[3]());
+assert.equal(4, result.length);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding6.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding6.js
new file mode 100644
index 0000000000..abaf0feb5d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding6.js
@@ -0,0 +1,14 @@
+// Options: --block-binding
+
+function testBlock() {
+ // Test function expressions.
+ {
+ var x = function g() { return 'g'; } || function h() { return 'h'; };
+ return x;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+var result = testBlock();
+assert.equal('g', result());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding7.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding7.js
new file mode 100644
index 0000000000..b3fa8ddd15
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding7.js
@@ -0,0 +1,15 @@
+// Options: --block-binding
+
+function blockTest() {
+ {
+ let x = 'let x value';
+ function g() {
+ return x;
+ }
+ return g;
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('let x value', blockTest()());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding8.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding8.js
new file mode 100644
index 0000000000..ed1f6877b0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding8.js
@@ -0,0 +1,15 @@
+// Options: --block-binding
+
+function f() {
+ return 'outer';
+}
+
+{
+ function f() {
+ return 'inner';
+ }
+
+ assert.equal('inner', f());
+}
+
+assert.equal('outer', f());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding9.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding9.js
new file mode 100644
index 0000000000..3a88b3b819
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBinding9.js
@@ -0,0 +1,15 @@
+// Options: --block-binding
+
+function f() {
+ return 'outer';
+}
+
+{
+ (function f() {
+ return 'inner';
+ });
+
+ assert.equal('outer', f());
+}
+
+assert.equal('outer', f());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBindingHiddenOuterLet.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBindingHiddenOuterLet.js
new file mode 100644
index 0000000000..eae0a1f4f9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBindingHiddenOuterLet.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+
+// See issue #1671. Pass if no exception
+let c;
+
+function f(c) {
+ var p;
+ for (p of g(() => c));
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/BlockBindingSiblingRefenceError.js b/packages/babel-core/test/fixtures/traceur/Scope/BlockBindingSiblingRefenceError.js
new file mode 100644
index 0000000000..7db18e2948
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/BlockBindingSiblingRefenceError.js
@@ -0,0 +1,6 @@
+assert.throws(() => {
+ {
+ let inner = 'inner value';
+ }
+ var x = inner;
+}, ReferenceError);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/DeconstructingBlockBinding.js b/packages/babel-core/test/fixtures/traceur/Scope/DeconstructingBlockBinding.js
new file mode 100644
index 0000000000..3f679a351d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/DeconstructingBlockBinding.js
@@ -0,0 +1,12 @@
+// Options: --block-binding
+
+if (true) {
+ let [a,b] = [1,2];
+ const [c,d] = [4,5];
+}
+if (true) {
+ let {x: [{e}, f], g} = {x: [{e:4}, 5], g: 6};
+ const a = 0, [b, {c, x: [d]}] = [1, {c: 2, x: [3]}];
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLet.js b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLet.js
new file mode 100644
index 0000000000..c7433749ca
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLet.js
@@ -0,0 +1,12 @@
+// Options: --block-binding
+
+var a = 'var a';
+{
+ var b = 'var b';
+ {
+ var c = 'var c';
+ let d = 'let d';
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetConst.js b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetConst.js
new file mode 100644
index 0000000000..3bf59e93d6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetConst.js
@@ -0,0 +1,14 @@
+// Options: --block-binding
+
+var a = 'var a';
+{
+ var b = 'var b';
+ {
+ let c = 'let c';
+ {
+ const d = 'const d';
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetVar.js b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetVar.js
new file mode 100644
index 0000000000..fb459cb060
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetVar.js
@@ -0,0 +1,14 @@
+// Options: --block-binding
+
+var a = 'var a';
+{
+ var b = 'var b';
+ {
+ let c = 'let c';
+ {
+ var d = 'var d';
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetVarNoInit.js b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetVarNoInit.js
new file mode 100644
index 0000000000..e70b8eb3fc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/DeepNestedLetVarNoInit.js
@@ -0,0 +1,14 @@
+// Options: --block-binding
+
+var var_a;
+{
+ var var_b;
+ {
+ let let_c = 'let c';
+ {
+ var var_d;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ConstMissingInitializer.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ConstMissingInitializer.js
new file mode 100644
index 0000000000..5f7c7ccc43
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ConstMissingInitializer.js
@@ -0,0 +1,4 @@
+// Options: --block-binding
+// Error: :4:14: const variables must have an initializer
+
+const x = 1, y;
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_Disabled.js
new file mode 100644
index 0000000000..d5eeb41b6a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_Disabled.js
@@ -0,0 +1,6 @@
+// Options: --block-binding=false
+// Error: :5:3: Unexpected reserved word let
+
+{
+ let x = 42;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerConst.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerConst.js
new file mode 100644
index 0000000000..751de8a5d5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerConst.js
@@ -0,0 +1,5 @@
+// Options: --block-binding
+// Error: :4:18: Unexpected token in
+
+for (const i = 0 in {}) {
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerLet.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerLet.js
new file mode 100644
index 0000000000..9f5fb459e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerLet.js
@@ -0,0 +1,5 @@
+// Options: --block-binding
+// Error: :4:16: Unexpected token in
+
+for (let i = 0 in {}) {
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerVar.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerVar.js
new file mode 100644
index 0000000000..f154d2202e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForInWithInitializerVar.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+// Error: :7:22: Unexpected token in
+
+var x = 0;
+
+// ES6 does not allow this.
+for (var i = (x = 1) in {}) {
+}
+
+assert.equal(1, x);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerConst.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerConst.js
new file mode 100644
index 0000000000..d6498c8a36
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerConst.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+// Error: :8:18: Unexpected token of
+
+function* gen() {
+ yield 1;
+}
+
+for (const i = 0 of gen()) {
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerLet.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerLet.js
new file mode 100644
index 0000000000..b7578b9060
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerLet.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+// Error: :8:16: Unexpected token of
+
+function* gen() {
+ yield 1;
+}
+
+for (let i = 0 of gen()) {
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerVar.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerVar.js
new file mode 100644
index 0000000000..c41cf1aff9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForOfWithInitializerVar.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+// Error: :8:16: Unexpected token of
+
+function* gen() {
+ yield 1;
+}
+
+for (var i = 0 of gen()) {
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_ForWithoutInitializerConst.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForWithoutInitializerConst.js
new file mode 100644
index 0000000000..afd9bce632
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_ForWithoutInitializerConst.js
@@ -0,0 +1,7 @@
+// Options: --block-binding
+// Error: :5:12: const variables must have an initializer
+
+var i = 0;
+for (const x; i < 3; i++) {
+
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Error_FunctionExpressionInBlock.js b/packages/babel-core/test/fixtures/traceur/Scope/Error_FunctionExpressionInBlock.js
new file mode 100644
index 0000000000..58ca667d5c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Error_FunctionExpressionInBlock.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+// Error: functionExpression is not defined
+
+{
+ (function functionExpression() {
+ return 'inner';
+ });
+
+ functionExpression; // function expression doesn't add name to the scope.
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/ForInInitializers.js b/packages/babel-core/test/fixtures/traceur/Scope/ForInInitializers.js
new file mode 100644
index 0000000000..39b9ef829f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/ForInInitializers.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+(function() {
+ var y;
+ for (var x in {a: 'A'}) {
+ assert.equal(x, 'a');
+ y = x;
+ }
+ assert.equal(y, 'a');
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/FunctionInBlock.js b/packages/babel-core/test/fixtures/traceur/Scope/FunctionInBlock.js
new file mode 100644
index 0000000000..3112dc3d66
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/FunctionInBlock.js
@@ -0,0 +1,14 @@
+(function() {
+ 'use strict';
+ var x = 1;
+ {
+ function f() {
+ x = 2;
+ }
+
+ if (false) {}
+
+ f();
+ }
+ assert.equal(2, x);
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetForInInitializers1.js b/packages/babel-core/test/fixtures/traceur/Scope/LetForInInitializers1.js
new file mode 100644
index 0000000000..c4f02e7790
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetForInInitializers1.js
@@ -0,0 +1,22 @@
+// Options: --block-binding
+
+var result;
+{
+ let let_result = [];
+ let let_array = ['one', 'two', 'three'];
+ for (var index in let_array) {
+ let let_index = index;
+ let let_value = let_array[let_index];
+ let_result.push(
+ function() {
+ return [let_index, let_value];
+ });
+ }
+ result = let_result;
+}
+
+// ----------------------------------------------------------------------------
+
+assertArrayEquals(['0', 'one'], result[0]());
+assertArrayEquals(['1', 'two'], result[1]());
+assertArrayEquals(['2', 'three'], result[2]());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetForInitializers1.js b/packages/babel-core/test/fixtures/traceur/Scope/LetForInitializers1.js
new file mode 100644
index 0000000000..19dbcfcab4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetForInitializers1.js
@@ -0,0 +1,14 @@
+// Options: --block-binding
+
+var result;
+{
+ let let_x = 'let x';
+ let let_l = [];
+ for (var var_x = 1, var_y = 2, var_z = 3; var_x < 10; var_x ++) {
+ let l_x = var_x, l_y = var_y, l_z = var_z;
+ let_l.push( function() { return [ l_x, l_y, l_z ]; } );
+ }
+ result = let_l;
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInClass.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInClass.js
new file mode 100644
index 0000000000..fa248e8257
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInClass.js
@@ -0,0 +1,19 @@
+// Options: --block-binding
+
+class LetInClass {
+ get z() {
+ let let_z = 10;
+ return let_z;
+ }
+
+ set z(v) {
+ let let_zv = v;
+ }
+
+ distance() {
+ let dist = this.y - this.x;
+ return dist;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInClosure.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInClosure.js
new file mode 100644
index 0000000000..9d2e89dd76
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInClosure.js
@@ -0,0 +1,25 @@
+// Options: --block-binding
+
+function letInClosure(n) {
+ var l = [];
+ for (var i = 0; i < n; i ++) {
+ let let_i = i;
+ if (i % 3 == 0) {
+ continue;
+ }
+ l.push(function() {
+ return let_i;
+ });
+ }
+ return l;
+}
+
+// ----------------------------------------------------------------------------
+
+var result = letInClosure(10);
+assert.equal(1, result[0]());
+assert.equal(2, result[1]());
+assert.equal(4, result[2]());
+assert.equal(5, result[3]());
+assert.equal(7, result[4]());
+assert.equal(8, result[5]());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInFor.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInFor.js
new file mode 100644
index 0000000000..c7347c3fea
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInFor.js
@@ -0,0 +1,7 @@
+// Options: --block-binding
+
+for (var x = 0; x < 10; x ++) {
+ let y = 'let y';
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreak.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreak.js
new file mode 100644
index 0000000000..5ccde528d6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreak.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+for (var x = 0; x < 10; x ++) {
+ let y = 'let y';
+ if (x % 2 == 0) {
+ break;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreakInner.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreakInner.js
new file mode 100644
index 0000000000..b0374fecac
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreakInner.js
@@ -0,0 +1,12 @@
+// Options: --block-binding
+
+for (var x = 0; x < 10; x ++) {
+ for (var y = 0; y < 10; y ++) {
+ let z = 'let z';
+ if (x == 7) {
+ break;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreakNamed.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreakNamed.js
new file mode 100644
index 0000000000..4b72973f4a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInForBreakNamed.js
@@ -0,0 +1,13 @@
+// Options: --block-binding
+
+outer:
+for (var x = 0; x < 10; x ++) {
+ for (var y = 0; y < 10; y ++) {
+ let z = 'let z';
+ if (x == 7) {
+ break outer;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinue.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinue.js
new file mode 100644
index 0000000000..0d3e0318f7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinue.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+for (var x = 0; x < 10; x ++) {
+ let y = 'let y';
+ if (x % 2 == 0) {
+ continue;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinueInner.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinueInner.js
new file mode 100644
index 0000000000..7231db3399
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinueInner.js
@@ -0,0 +1,12 @@
+// Options: --block-binding
+
+for (var x = 0; x < 10; x ++) {
+ for (var y = 0; y < 10; y ++) {
+ let z = 'let z';
+ if (x == 7) {
+ continue;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinueNamed.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinueNamed.js
new file mode 100644
index 0000000000..5907676016
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInForContinueNamed.js
@@ -0,0 +1,13 @@
+// Options: --block-binding
+
+outer:
+for (var x = 0; x < 10; x ++) {
+ for (var y = 0; y < 10; y ++) {
+ let z = 'let z';
+ if (x == 7) {
+ continue outer;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInGenerators.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInGenerators.js
new file mode 100644
index 0000000000..28ceea17ef
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInGenerators.js
@@ -0,0 +1,15 @@
+function h(t) {
+ return t();
+}
+
+function* f() {
+ for (let i = 0; i < 3; ++i) {
+ yield h(() => i);
+ }
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 0, done: false});
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInProperties.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInProperties.js
new file mode 100644
index 0000000000..22c2378e9e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInProperties.js
@@ -0,0 +1,19 @@
+// Options: --block-binding
+
+var object = {
+ get x() {
+ while (true) {
+ let let_x = 'let x';
+ return let_x;
+ }
+ },
+
+ set x(v) {
+ do {
+ let let_v = v;
+ this.v = let_v;
+ } while (false);
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInWhileLoop.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInWhileLoop.js
new file mode 100644
index 0000000000..06bdaab3df
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInWhileLoop.js
@@ -0,0 +1,5 @@
+while( true ) {
+ let foo = 1;
+ assert.equal(1, (() => foo)());
+ break;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor1.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor1.js
new file mode 100644
index 0000000000..dd3ac7cc70
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor1.js
@@ -0,0 +1,7 @@
+// Options: --block-binding
+
+for (let x = 1; x < 10; x++) {
+ x;
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor2.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor2.js
new file mode 100644
index 0000000000..46f0c97ad5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor2.js
@@ -0,0 +1,8 @@
+// Options: --block-binding
+
+for (let x = 1, y = 2, z = 3; x < 10; x ++) {
+ y++;
+ z++;
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor3.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor3.js
new file mode 100644
index 0000000000..ff742b3cdc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerFor3.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+
+for (let x = 1, y = x + 1; x < 10 && y != 0; x ++, y *= 2) {
+ if (y > 300) {
+ continue;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerForIn.js b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerForIn.js
new file mode 100644
index 0000000000..8bab17d1a6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetInitializerForIn.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+
+let sum = 0;
+let a = [1,2,3];
+for (let x in a) {
+ sum = sum + a[x];
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetNoInitializer.js b/packages/babel-core/test/fixtures/traceur/Scope/LetNoInitializer.js
new file mode 100644
index 0000000000..3018218fc8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetNoInitializer.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+var x = 1;
+{
+ let x;
+ assert.equal(undefined, x);
+ x = 2;
+ assert.equal(2, x);
+}
+assert.equal(1, x);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetNoInitializerGlobal.js b/packages/babel-core/test/fixtures/traceur/Scope/LetNoInitializerGlobal.js
new file mode 100644
index 0000000000..58426a151e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetNoInitializerGlobal.js
@@ -0,0 +1,6 @@
+// Options: --block-binding
+
+let x2;
+assert.equal(undefined, x2);
+x2 = 2;
+assert.equal(2, x2);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetReinitializeInLoop.js b/packages/babel-core/test/fixtures/traceur/Scope/LetReinitializeInLoop.js
new file mode 100644
index 0000000000..c16bd2326d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetReinitializeInLoop.js
@@ -0,0 +1,9 @@
+(function() {
+ var i = 0;
+ while (i < 3) {
+ let x;
+ assert.equal(undefined, x);
+ x = i;
+ i++;
+ }
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetWithFor.js b/packages/babel-core/test/fixtures/traceur/Scope/LetWithFor.js
new file mode 100644
index 0000000000..f6ac1982eb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetWithFor.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+for (var x = 0; x < 10; x++) {
+ let let_y = 'let y';
+ for (var for_z = 0; for_z < 2; for_z ++) {
+ break;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetWithForIn.js b/packages/babel-core/test/fixtures/traceur/Scope/LetWithForIn.js
new file mode 100644
index 0000000000..6b75ebf3b9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetWithForIn.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+for (var x in [1,2,3]) {
+ let let_y = x;
+ for (var for_in_z in [4,5,6]) {
+ continue;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetWithSwitch.js b/packages/babel-core/test/fixtures/traceur/Scope/LetWithSwitch.js
new file mode 100644
index 0000000000..756d7ecba7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetWithSwitch.js
@@ -0,0 +1,16 @@
+// Options: --block-binding
+
+for (var i = 0; i < 5; i ++) {
+ let let_x = 'let x';
+
+ switch (i) {
+ case 0:
+ break;
+ case 2:
+ break;
+ default:
+ break;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/LetWithSwitch2.js b/packages/babel-core/test/fixtures/traceur/Scope/LetWithSwitch2.js
new file mode 100644
index 0000000000..ea92dbf7c8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/LetWithSwitch2.js
@@ -0,0 +1,16 @@
+// Options: --block-binding
+
+for (var i = 0; i < 5; i ++) {
+ let let_x = 'let x';
+
+ switch (i) {
+ case 0:
+ continue;
+ case 2:
+ break;
+ default:
+ break;
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/NameBindingInFunction.js b/packages/babel-core/test/fixtures/traceur/Scope/NameBindingInFunction.js
new file mode 100644
index 0000000000..3bc7634018
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/NameBindingInFunction.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+{
+ function f() {
+ return f;
+ }
+ var g = f;
+ f = 42;
+ assert.equal(42, g());
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/NestedForLoops.js b/packages/babel-core/test/fixtures/traceur/Scope/NestedForLoops.js
new file mode 100644
index 0000000000..0b4f4a194a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/NestedForLoops.js
@@ -0,0 +1,40 @@
+// Options: --block-binding --for-of
+
+(function() {
+ var count = 0;
+ for (let x = 0; x < 1; x++) {
+ for (let x = 1; x < 2; x++) {
+ for (let x = 2; x < 3; x++) {
+ count++;
+ assert.equal(2, x);
+ }
+ }
+ }
+ assert.equal(1, count);
+})();
+
+(function() {
+ var count = 0;
+ for (let x in {0: 0}) {
+ for (let x in {1: 1}) {
+ for (let x in {2: 2}) {
+ count++;
+ assert.equal('2', x);
+ }
+ }
+ }
+ assert.equal(1, count);
+})();
+
+(function() {
+ var count = 0;
+ for (let x of [0]) {
+ for (let x of [1]) {
+ for (let x of [2]) {
+ count++;
+ assert.equal(2, x);
+ }
+ }
+ }
+ assert.equal(1, count);
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction1.js b/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction1.js
new file mode 100644
index 0000000000..297042dd57
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction1.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+
+function nestedFunction1() {
+ return function() {
+ let let_x = 'let x';
+ }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction2.js b/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction2.js
new file mode 100644
index 0000000000..85238bc29e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction2.js
@@ -0,0 +1,10 @@
+// Options: --block-binding
+
+function nestedFunction2() {
+ let let_func = function() {
+ let let_x = 'let x';
+ }
+ return let_func;
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction3.js b/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction3.js
new file mode 100644
index 0000000000..3ffda64978
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/NestedFunction3.js
@@ -0,0 +1,8 @@
+// Options: --block-binding
+
+function nestedFunction3() {
+ let let_x = 'let x';
+ function function_foo() { }
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/NestedLet.js b/packages/babel-core/test/fixtures/traceur/Scope/NestedLet.js
new file mode 100644
index 0000000000..54b2e91afa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/NestedLet.js
@@ -0,0 +1,11 @@
+// Options: --block-binding
+
+var x = 'var';
+{
+ let y = 'let 1';
+}
+{
+ let y = 'let 2';
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/NestedLetConflict.js b/packages/babel-core/test/fixtures/traceur/Scope/NestedLetConflict.js
new file mode 100644
index 0000000000..808a556509
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/NestedLetConflict.js
@@ -0,0 +1,12 @@
+(function() {
+ var x = 1;
+ function f() {
+ assert.equal(x, 1);
+ {
+ let x = 2;
+ assert.equal(x, 2);
+ }
+ assert.equal(x, 1);
+ }
+ f();
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/Regress1381.js b/packages/babel-core/test/fixtures/traceur/Scope/Regress1381.js
new file mode 100644
index 0000000000..ab64e59a9b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/Regress1381.js
@@ -0,0 +1,8 @@
+function test() {
+ let ret = true;
+ while (false)
+ for (let i = 0; i < 1; i++)
+ ret = () => i;
+ return ret
+}
+assert.isTrue(test());
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/RenameFunctionBlock.js b/packages/babel-core/test/fixtures/traceur/Scope/RenameFunctionBlock.js
new file mode 100644
index 0000000000..90e2035365
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/RenameFunctionBlock.js
@@ -0,0 +1,11 @@
+// Options: --block-binding
+// Issue #1773
+function when() {
+ function* where() {
+ var index = 0;
+ for (let x of Object) {
+ index++;
+ }
+ }
+ var x = 5;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/SiblingScopes.js b/packages/babel-core/test/fixtures/traceur/Scope/SiblingScopes.js
new file mode 100644
index 0000000000..c3e230e98c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/SiblingScopes.js
@@ -0,0 +1,15 @@
+// Options: --free-variable-checker=false
+
+assert.throws(() => {
+ {
+ let testVariable = 1;
+ assert.equal(testVariable, 1);
+ }
+
+ {
+ let testVariable = 2;
+ assert.equal(testVariable, 2);
+ }
+
+ testVariable;
+}, ReferenceError);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLet.js b/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLet.js
new file mode 100644
index 0000000000..0f2db5940b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLet.js
@@ -0,0 +1,7 @@
+// Options: --block-binding
+
+let x = 'let';
+
+// ----------------------------------------------------------------------------
+
+assert.equal(x, 'let');
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLetConst.js b/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLetConst.js
new file mode 100644
index 0000000000..3b3adfbcfc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLetConst.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+
+let x = 'let';
+const y = 'const';
+
+// ----------------------------------------------------------------------------
+
+assert.equal('let', x);
+assert.equal('const', y);
diff --git a/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLetVar.js b/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLetVar.js
new file mode 100644
index 0000000000..a90a4d5397
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Scope/TopLevelLetVar.js
@@ -0,0 +1,9 @@
+// Options: --block-binding
+
+let x = 'let';
+var y = 'var';
+
+// ----------------------------------------------------------------------------
+
+assert.equal('let', x);
+assert.equal('var', y);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/Array.js b/packages/babel-core/test/fixtures/traceur/Spread/Array.js
new file mode 100644
index 0000000000..0819b914e1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/Array.js
@@ -0,0 +1,14 @@
+var a = [];
+var b = [0, ...a];
+var c = [...b, ...b];
+var d;
+var e = [0, ...d = [1, 2], 3];
+var f = [0, ...[[1, 2], [3, 4]], 5];
+
+// ----------------------------------------------------------------------------
+
+assertArrayEquals([0], b);
+assertArrayEquals([0, 0], c);
+assertArrayEquals([1, 2], d);
+assertArrayEquals([0, 1, 2, 3], e);
+assertArrayEquals([0, [1, 2], [3, 4], 5], f);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/Call.js b/packages/babel-core/test/fixtures/traceur/Spread/Call.js
new file mode 100644
index 0000000000..2560165c93
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/Call.js
@@ -0,0 +1,22 @@
+function* G() {
+ yield 'hi';
+ yield 'there';
+}
+
+function f(...args) {
+ return args;
+}
+
+var result = f(0, ...[1, 2], 3, ...G());
+assertArrayEquals([0, 1, 2, 3, 'hi', 'there'], result);
+
+result = f(...G());
+assertArrayEquals(['hi', 'there'], result);
+
+function g() {
+ 'use strict';
+ assert.strictEqual(undefined, this);
+}
+
+g();
+g(...[]);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/CallWithUndefined.js b/packages/babel-core/test/fixtures/traceur/Spread/CallWithUndefined.js
new file mode 100644
index 0000000000..1243fa0e79
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/CallWithUndefined.js
@@ -0,0 +1,8 @@
+function f(...args) {
+ return args;
+}
+
+assert.throw(function() {
+ // Should throw due to ToObject(undefined)
+ f(0, ...undefined, 1);
+}, TypeError)
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/Class.js b/packages/babel-core/test/fixtures/traceur/Spread/Class.js
new file mode 100644
index 0000000000..7d9bafc2d3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/Class.js
@@ -0,0 +1,17 @@
+class SpreadTestClass {
+ constructor(x, y) {
+ this.SpreadTestClass = SpreadTestClass;
+ this.self = this;
+ this.x = x;
+ this.y = y;
+ }
+}
+
+var object = new SpreadTestClass(...[0, 1]);
+
+// ----------------------------------------------------------------------------
+
+assert.equal(object.x, 0);
+assert.equal(object.y, 1);
+assert.equal(object.self, object);
+assert.isTrue(object instanceof object.SpreadTestClass);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/Spread/Error_Disabled.js
new file mode 100644
index 0000000000..75b75b251a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/Error_Disabled.js
@@ -0,0 +1,4 @@
+// Options: --spread=false
+// Error: :4:8: Unexpected token ...
+
+[0, 1, ...[2, 3]];
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/Iterators.js b/packages/babel-core/test/fixtures/traceur/Spread/Iterators.js
new file mode 100644
index 0000000000..af5dae5f0b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/Iterators.js
@@ -0,0 +1,17 @@
+function* G() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+var a = [...G()];
+var b = [4, ...G()];
+var c = [...G(), 4];
+var d = [4, ...G(), 5];
+
+// ----------------------------------------------------------------------------
+
+assertArrayEquals([1, 2, 3], a);
+assertArrayEquals([4, 1, 2, 3], b);
+assertArrayEquals([1, 2, 3, 4], c);
+assertArrayEquals([4, 1, 2, 3, 5], d);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/MethodCall.js b/packages/babel-core/test/fixtures/traceur/Spread/MethodCall.js
new file mode 100644
index 0000000000..72f08531f7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/MethodCall.js
@@ -0,0 +1,18 @@
+var obj = {
+ method: function(...args) {
+ return {
+ self: this,
+ args: args
+ };
+ }
+};
+
+var result = {
+ obj: obj,
+ result: obj.method(0, ...[1, 2], 3)
+};
+
+// ----------------------------------------------------------------------------
+
+assert.equal(result.obj, result.result.self);
+assertArrayEquals([0, 1, 2, 3], result.result.args);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/MethodCallQuotedName.js b/packages/babel-core/test/fixtures/traceur/Spread/MethodCallQuotedName.js
new file mode 100644
index 0000000000..7440fd9b97
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/MethodCallQuotedName.js
@@ -0,0 +1,18 @@
+var obj = {
+ method: function(...args) {
+ return {
+ self: this,
+ args: args
+ };
+ }
+};
+
+var result = {
+ obj: obj,
+ result: obj['meth' + 'od'](0, ...[1, 2], 3)
+};
+
+// ----------------------------------------------------------------------------
+
+assert.equal(result.obj, result.result.self);
+assertArrayEquals([0, 1, 2, 3], result.result.args);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/New.js b/packages/babel-core/test/fixtures/traceur/Spread/New.js
new file mode 100644
index 0000000000..edd3204077
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/New.js
@@ -0,0 +1,26 @@
+function* G() {
+ yield 3;
+ yield 4;
+}
+
+function F(x, y, z, a, b) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.a = a;
+ this.b = b;
+ this.self = this;
+ this.F = F;
+}
+
+var object = new F(0, ...[1, 2], ...G());
+
+// ----------------------------------------------------------------------------
+
+assert.equal(0, object.x);
+assert.equal(1, object.y);
+assert.equal(2, object.z);
+assert.equal(3, object.a);
+assert.equal(4, object.b);
+assert.equal(object, object.self);
+assert.isTrue(object instanceof object.F);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/New2.js b/packages/babel-core/test/fixtures/traceur/Spread/New2.js
new file mode 100644
index 0000000000..79e9484727
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/New2.js
@@ -0,0 +1,23 @@
+function G() {}
+
+function F(x, y, z) {
+ var obj = new G;
+ obj.x = x;
+ obj.y = y;
+ obj.z = z;
+ obj.f = this;
+ obj.G = G;
+ obj.F = F;
+ return obj;
+}
+
+var object = new F(0, ...[1, 2]);
+
+// ----------------------------------------------------------------------------
+
+assert.equal(0, object.x);
+assert.equal(1, object.y);
+assert.equal(2, object.z);
+assert.isFalse(object instanceof object.F);
+assert.isTrue(object instanceof object.G);
+assert.isTrue(object.f instanceof object.F);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/NewBuiltin.js b/packages/babel-core/test/fixtures/traceur/Spread/NewBuiltin.js
new file mode 100644
index 0000000000..c718932b90
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/NewBuiltin.js
@@ -0,0 +1,7 @@
+var d = new Date(...[2011, 4, 3]);
+
+// ----------------------------------------------------------------------------
+
+assert.equal(2011, d.getFullYear());
+assert.equal(4, d.getMonth());
+assert.equal(3, d.getDate());
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/NoIterator.js b/packages/babel-core/test/fixtures/traceur/Spread/NoIterator.js
new file mode 100644
index 0000000000..d9f757f408
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/NoIterator.js
@@ -0,0 +1 @@
+assert.throw(() => [...{}], TypeError);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/NotAnObject.js b/packages/babel-core/test/fixtures/traceur/Spread/NotAnObject.js
new file mode 100644
index 0000000000..4b68c2c9e1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/NotAnObject.js
@@ -0,0 +1 @@
+assert.throw(() => [...null], TypeError);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/String.js b/packages/babel-core/test/fixtures/traceur/Spread/String.js
new file mode 100644
index 0000000000..fcef0b86f5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/String.js
@@ -0,0 +1,13 @@
+var a = '';
+var b = ['b', ...a];
+var c = [...b, ...b];
+var d;
+var e = [0, ...d = '12', 3];
+var f = [... new String('abc')];
+
+// ----------------------------------------------------------------------------
+
+assertArrayEquals(['b'], b);
+assertArrayEquals(['b', 'b'], c);
+assertArrayEquals([0, '1', '2', 3], e);
+assertArrayEquals(['a', 'b', 'c'], f);
diff --git a/packages/babel-core/test/fixtures/traceur/Spread/Type.js b/packages/babel-core/test/fixtures/traceur/Spread/Type.js
new file mode 100644
index 0000000000..bd46c4200d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Spread/Type.js
@@ -0,0 +1,29 @@
+
+assert.throw(() => {
+ [0, ...{}, 1];
+}, TypeError);
+
+assert.throw(() => {
+ [0, ...{0: 1, 1: 2, length: 2}, 3];
+}, TypeError);
+
+assert.throw(() => {
+ [0, ...true, 1];
+}, TypeError);
+
+assert.throw(() => {
+ [0, ...1, 1];
+}, TypeError);
+
+assert.throw(() => {
+ [0, ...function() {}, 1];
+}, TypeError);
+
+assert.throw(function() {
+ [0, ...null, 1];
+}, TypeError);
+
+assert.throw(function() {
+ [0, ...undefined, 1];
+}, TypeError);
+
diff --git a/packages/babel-core/test/fixtures/traceur/StringExtras/CodePointAt.js b/packages/babel-core/test/fixtures/traceur/StringExtras/CodePointAt.js
new file mode 100644
index 0000000000..54369eb5a8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/StringExtras/CodePointAt.js
@@ -0,0 +1,76 @@
+// Tests taken from https://mths.be/codepointat
+
+assert.equal(String.prototype.codePointAt.length, 1);
+
+// String that starts with a BMP symbol
+assert.equal('abc\uD834\uDF06def'.codePointAt(''), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt('_'), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt(), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt(-Infinity), undefined);
+assert.equal('abc\uD834\uDF06def'.codePointAt(-1), undefined);
+assert.equal('abc\uD834\uDF06def'.codePointAt(-0), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt(0), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt(3), 0x1D306);
+assert.equal('abc\uD834\uDF06def'.codePointAt(4), 0xDF06);
+assert.equal('abc\uD834\uDF06def'.codePointAt(5), 0x64);
+assert.equal('abc\uD834\uDF06def'.codePointAt(42), undefined);
+assert.equal('abc\uD834\uDF06def'.codePointAt(Infinity), undefined);
+assert.equal('abc\uD834\uDF06def'.codePointAt(Infinity), undefined);
+assert.equal('abc\uD834\uDF06def'.codePointAt(NaN), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt(false), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt(null), 0x61);
+assert.equal('abc\uD834\uDF06def'.codePointAt(undefined), 0x61);
+
+// String that starts with an astral symbol
+assert.equal('\uD834\uDF06def'.codePointAt(''), 0x1D306);
+assert.equal('\uD834\uDF06def'.codePointAt('1'), 0xDF06);
+assert.equal('\uD834\uDF06def'.codePointAt('_'), 0x1D306);
+assert.equal('\uD834\uDF06def'.codePointAt(), 0x1D306);
+assert.equal('\uD834\uDF06def'.codePointAt(-1), undefined);
+assert.equal('\uD834\uDF06def'.codePointAt(-0), 0x1D306);
+assert.equal('\uD834\uDF06def'.codePointAt(0), 0x1D306);
+assert.equal('\uD834\uDF06def'.codePointAt(1), 0xDF06);
+assert.equal('\uD834\uDF06def'.codePointAt(42), undefined);
+assert.equal('\uD834\uDF06def'.codePointAt(false), 0x1D306);
+assert.equal('\uD834\uDF06def'.codePointAt(null), 0x1D306);
+assert.equal('\uD834\uDF06def'.codePointAt(undefined), 0x1D306);
+
+// Lone high surrogates
+assert.equal('\uD834abc'.codePointAt(''), 0xD834);
+assert.equal('\uD834abc'.codePointAt('_'), 0xD834);
+assert.equal('\uD834abc'.codePointAt(), 0xD834);
+assert.equal('\uD834abc'.codePointAt(-1), undefined);
+assert.equal('\uD834abc'.codePointAt(-0), 0xD834);
+assert.equal('\uD834abc'.codePointAt(0), 0xD834);
+assert.equal('\uD834abc'.codePointAt(false), 0xD834);
+assert.equal('\uD834abc'.codePointAt(NaN), 0xD834);
+assert.equal('\uD834abc'.codePointAt(null), 0xD834);
+assert.equal('\uD834abc'.codePointAt(undefined), 0xD834);
+
+// Lone low surrogates
+assert.equal('\uDF06abc'.codePointAt(''), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt('_'), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt(), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt(-1), undefined);
+assert.equal('\uDF06abc'.codePointAt(-0), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt(0), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt(false), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt(NaN), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt(null), 0xDF06);
+assert.equal('\uDF06abc'.codePointAt(undefined), 0xDF06);
+
+assert.throw(function() { String.prototype.codePointAt.call(undefined); }, TypeError);
+assert.throw(function() { String.prototype.codePointAt.call(undefined, 4); }, TypeError);
+assert.throw(function() { String.prototype.codePointAt.call(null); }, TypeError);
+assert.throw(function() { String.prototype.codePointAt.call(null, 4); }, TypeError);
+assert.equal(String.prototype.codePointAt.call(42, 0), 0x34);
+assert.equal(String.prototype.codePointAt.call(42, 1), 0x32);
+assert.equal(String.prototype.codePointAt.call({ 'toString': function() { return 'abc'; } }, 2), 0x63);
+
+assert.throw(function() { String.prototype.codePointAt.apply(undefined); }, TypeError);
+assert.throw(function() { String.prototype.codePointAt.apply(undefined, [4]); }, TypeError);
+assert.throw(function() { String.prototype.codePointAt.apply(null); }, TypeError);
+assert.throw(function() { String.prototype.codePointAt.apply(null, [4]); }, TypeError);
+assert.equal(String.prototype.codePointAt.apply(42, [0]), 0x34);
+assert.equal(String.prototype.codePointAt.apply(42, [1]), 0x32);
+assert.equal(String.prototype.codePointAt.apply({ 'toString': function() { return 'abc'; } }, [2]), 0x63);
diff --git a/packages/babel-core/test/fixtures/traceur/StringExtras/EndsWith.js b/packages/babel-core/test/fixtures/traceur/StringExtras/EndsWith.js
new file mode 100644
index 0000000000..b4585b2e8d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/StringExtras/EndsWith.js
@@ -0,0 +1,217 @@
+// Tests taken from https://mths.be/endswith
+
+assert.equal(String.prototype.endsWith.length, 1);
+
+assert.equal('undefined'.endsWith(), true);
+assert.equal('undefined'.endsWith(undefined), true);
+assert.equal('undefined'.endsWith(null), false);
+assert.equal('null'.endsWith(), false);
+assert.equal('null'.endsWith(undefined), false);
+assert.equal('null'.endsWith(null), true);
+
+assert.equal('abc'.endsWith(), false);
+assert.equal('abc'.endsWith(''), true);
+assert.equal('abc'.endsWith('\0'), false);
+assert.equal('abc'.endsWith('c'), true);
+assert.equal('abc'.endsWith('b'), false);
+assert.equal('abc'.endsWith('ab'), false);
+assert.equal('abc'.endsWith('bc'), true);
+assert.equal('abc'.endsWith('abc'), true);
+assert.equal('abc'.endsWith('bcd'), false);
+assert.equal('abc'.endsWith('abcd'), false);
+assert.equal('abc'.endsWith('bcde'), false);
+
+assert.equal('abc'.endsWith('', NaN), true);
+assert.equal('abc'.endsWith('\0', NaN), false);
+assert.equal('abc'.endsWith('c', NaN), false);
+assert.equal('abc'.endsWith('b', NaN), false);
+assert.equal('abc'.endsWith('ab', NaN), false);
+assert.equal('abc'.endsWith('bc', NaN), false);
+assert.equal('abc'.endsWith('abc', NaN), false);
+assert.equal('abc'.endsWith('bcd', NaN), false);
+assert.equal('abc'.endsWith('abcd', NaN), false);
+assert.equal('abc'.endsWith('bcde', NaN), false);
+
+assert.equal('abc'.endsWith('', false), true);
+assert.equal('abc'.endsWith('\0', false), false);
+assert.equal('abc'.endsWith('c', false), false);
+assert.equal('abc'.endsWith('b', false), false);
+assert.equal('abc'.endsWith('ab', false), false);
+assert.equal('abc'.endsWith('bc', false), false);
+assert.equal('abc'.endsWith('abc', false), false);
+assert.equal('abc'.endsWith('bcd', false), false);
+assert.equal('abc'.endsWith('abcd', false), false);
+assert.equal('abc'.endsWith('bcde', false), false);
+
+assert.equal('abc'.endsWith('', undefined), true);
+assert.equal('abc'.endsWith('\0', undefined), false);
+assert.equal('abc'.endsWith('c', undefined), true);
+assert.equal('abc'.endsWith('b', undefined), false);
+assert.equal('abc'.endsWith('ab', undefined), false);
+assert.equal('abc'.endsWith('bc', undefined), true);
+assert.equal('abc'.endsWith('abc', undefined), true);
+assert.equal('abc'.endsWith('bcd', undefined), false);
+assert.equal('abc'.endsWith('abcd', undefined), false);
+assert.equal('abc'.endsWith('bcde', undefined), false);
+
+assert.equal('abc'.endsWith('', null), true);
+assert.equal('abc'.endsWith('\0', null), false);
+assert.equal('abc'.endsWith('c', null), false);
+assert.equal('abc'.endsWith('b', null), false);
+assert.equal('abc'.endsWith('ab', null), false);
+assert.equal('abc'.endsWith('bc', null), false);
+assert.equal('abc'.endsWith('abc', null), false);
+assert.equal('abc'.endsWith('bcd', null), false);
+assert.equal('abc'.endsWith('abcd', null), false);
+assert.equal('abc'.endsWith('bcde', null), false);
+
+assert.equal('abc'.endsWith('', -Infinity), true);
+assert.equal('abc'.endsWith('\0', -Infinity), false);
+assert.equal('abc'.endsWith('c', -Infinity), false);
+assert.equal('abc'.endsWith('b', -Infinity), false);
+assert.equal('abc'.endsWith('ab', -Infinity), false);
+assert.equal('abc'.endsWith('bc', -Infinity), false);
+assert.equal('abc'.endsWith('abc', -Infinity), false);
+assert.equal('abc'.endsWith('bcd', -Infinity), false);
+assert.equal('abc'.endsWith('abcd', -Infinity), false);
+assert.equal('abc'.endsWith('bcde', -Infinity), false);
+
+assert.equal('abc'.endsWith('', -1), true);
+assert.equal('abc'.endsWith('\0', -1), false);
+assert.equal('abc'.endsWith('c', -1), false);
+assert.equal('abc'.endsWith('b', -1), false);
+assert.equal('abc'.endsWith('ab', -1), false);
+assert.equal('abc'.endsWith('bc', -1), false);
+assert.equal('abc'.endsWith('abc', -1), false);
+assert.equal('abc'.endsWith('bcd', -1), false);
+assert.equal('abc'.endsWith('abcd', -1), false);
+assert.equal('abc'.endsWith('bcde', -1), false);
+
+assert.equal('abc'.endsWith('', -0), true);
+assert.equal('abc'.endsWith('\0', -0), false);
+assert.equal('abc'.endsWith('c', -0), false);
+assert.equal('abc'.endsWith('b', -0), false);
+assert.equal('abc'.endsWith('ab', -0), false);
+assert.equal('abc'.endsWith('bc', -0), false);
+assert.equal('abc'.endsWith('abc', -0), false);
+assert.equal('abc'.endsWith('bcd', -0), false);
+assert.equal('abc'.endsWith('abcd', -0), false);
+assert.equal('abc'.endsWith('bcde', -0), false);
+
+assert.equal('abc'.endsWith('', +0), true);
+assert.equal('abc'.endsWith('\0', +0), false);
+assert.equal('abc'.endsWith('c', +0), false);
+assert.equal('abc'.endsWith('b', +0), false);
+assert.equal('abc'.endsWith('ab', +0), false);
+assert.equal('abc'.endsWith('bc', +0), false);
+assert.equal('abc'.endsWith('abc', +0), false);
+assert.equal('abc'.endsWith('bcd', +0), false);
+assert.equal('abc'.endsWith('abcd', +0), false);
+assert.equal('abc'.endsWith('bcde', +0), false);
+
+assert.equal('abc'.endsWith('', 1), true);
+assert.equal('abc'.endsWith('\0', 1), false);
+assert.equal('abc'.endsWith('c', 1), false);
+assert.equal('abc'.endsWith('b', 1), false);
+assert.equal('abc'.endsWith('ab', 1), false);
+assert.equal('abc'.endsWith('bc', 1), false);
+assert.equal('abc'.endsWith('abc', 1), false);
+assert.equal('abc'.endsWith('bcd', 1), false);
+assert.equal('abc'.endsWith('abcd', 1), false);
+assert.equal('abc'.endsWith('bcde', 1), false);
+
+assert.equal('abc'.endsWith('', 2), true);
+assert.equal('abc'.endsWith('\0', 2), false);
+assert.equal('abc'.endsWith('c', 2), false);
+assert.equal('abc'.endsWith('b', 2), true);
+assert.equal('abc'.endsWith('ab', 2), true);
+assert.equal('abc'.endsWith('bc', 2), false);
+assert.equal('abc'.endsWith('abc', 2), false);
+assert.equal('abc'.endsWith('bcd', 2), false);
+assert.equal('abc'.endsWith('abcd', 2), false);
+assert.equal('abc'.endsWith('bcde', 2), false);
+
+assert.equal('abc'.endsWith('', +Infinity), true);
+assert.equal('abc'.endsWith('\0', +Infinity), false);
+assert.equal('abc'.endsWith('c', +Infinity), true);
+assert.equal('abc'.endsWith('b', +Infinity), false);
+assert.equal('abc'.endsWith('ab', +Infinity), false);
+assert.equal('abc'.endsWith('bc', +Infinity), true);
+assert.equal('abc'.endsWith('abc', +Infinity), true);
+assert.equal('abc'.endsWith('bcd', +Infinity), false);
+assert.equal('abc'.endsWith('abcd', +Infinity), false);
+assert.equal('abc'.endsWith('bcde', +Infinity), false);
+
+assert.equal('abc'.endsWith('', true), true);
+assert.equal('abc'.endsWith('\0', true), false);
+assert.equal('abc'.endsWith('c', true), false);
+assert.equal('abc'.endsWith('b', true), false);
+assert.equal('abc'.endsWith('ab', true), false);
+assert.equal('abc'.endsWith('bc', true), false);
+assert.equal('abc'.endsWith('abc', true), false);
+assert.equal('abc'.endsWith('bcd', true), false);
+assert.equal('abc'.endsWith('abcd', true), false);
+assert.equal('abc'.endsWith('bcde', true), false);
+
+assert.equal('abc'.endsWith('', 'x'), true);
+assert.equal('abc'.endsWith('\0', 'x'), false);
+assert.equal('abc'.endsWith('c', 'x'), false);
+assert.equal('abc'.endsWith('b', 'x'), false);
+assert.equal('abc'.endsWith('ab', 'x'), false);
+assert.equal('abc'.endsWith('bc', 'x'), false);
+assert.equal('abc'.endsWith('abc', 'x'), false);
+assert.equal('abc'.endsWith('bcd', 'x'), false);
+assert.equal('abc'.endsWith('abcd', 'x'), false);
+assert.equal('abc'.endsWith('bcde', 'x'), false);
+
+assert.equal('[a-z]+(bar)?'.endsWith('(bar)?'), true);
+assert.throw(function() { '[a-z]+(bar)?'.endsWith(/(bar)?/); }, TypeError);
+assert.equal('[a-z]+(bar)?'.endsWith('[a-z]+', 6), true);
+assert.throw(function() { '[a-z]+(bar)?'.endsWith(/(bar)?/); }, TypeError);
+assert.throw(function() { '[a-z]+/(bar)?/'.endsWith(/(bar)?/); }, TypeError);
+
+// https://mathiasbynens.be/notes/javascript-unicode#poo-test
+var string = 'I\xF1t\xEBrn\xE2ti\xF4n\xE0liz\xE6ti\xF8n\u2603\uD83D\uDCA9';
+assert.equal(string.endsWith(''), true);
+assert.equal(string.endsWith('\xF1t\xEBr'), false);
+assert.equal(string.endsWith('\xF1t\xEBr', 5), true);
+assert.equal(string.endsWith('\xE0liz\xE6'), false);
+assert.equal(string.endsWith('\xE0liz\xE6', 16), true);
+assert.equal(string.endsWith('\xF8n\u2603\uD83D\uDCA9'), true);
+assert.equal(string.endsWith('\xF8n\u2603\uD83D\uDCA9', 23), true);
+assert.equal(string.endsWith('\u2603'), false);
+assert.equal(string.endsWith('\u2603', 21), true);
+assert.equal(string.endsWith('\uD83D\uDCA9'), true);
+assert.equal(string.endsWith('\uD83D\uDCA9', 23), true);
+
+assert.throw(function() { String.prototype.endsWith.call(undefined); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.call(undefined, 'b'); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.call(undefined, 'b', 4); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.call(null); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.call(null, 'b'); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.call(null, 'b', 4); }, TypeError);
+assert.equal(String.prototype.endsWith.call(42, '2'), true);
+assert.equal(String.prototype.endsWith.call(42, '4'), false);
+assert.equal(String.prototype.endsWith.call(42, 'b', 4), false);
+assert.equal(String.prototype.endsWith.call(42, '2', 1), false);
+assert.equal(String.prototype.endsWith.call(42, '2', 4), true);
+assert.equal(String.prototype.endsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 0), false);
+assert.equal(String.prototype.endsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 1), false);
+assert.equal(String.prototype.endsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 2), true);
+assert.throw(function() { String.prototype.endsWith.call({ 'toString': function() { throw RangeError(); } }, /./); }, RangeError);
+
+assert.throw(function() { String.prototype.endsWith.apply(undefined); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.apply(undefined, ['b']); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.apply(undefined, ['b', 4]); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.apply(null); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.apply(null, ['b']); }, TypeError);
+assert.throw(function() { String.prototype.endsWith.apply(null, ['b', 4]); }, TypeError);
+assert.equal(String.prototype.endsWith.apply(42, ['2']), true);
+assert.equal(String.prototype.endsWith.apply(42, ['4']), false);
+assert.equal(String.prototype.endsWith.apply(42, ['b', 4]), false);
+assert.equal(String.prototype.endsWith.apply(42, ['2', 1]), false);
+assert.equal(String.prototype.endsWith.apply(42, ['2', 4]), true);
+assert.equal(String.prototype.endsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 0]), false);
+assert.equal(String.prototype.endsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 1]), false);
+assert.equal(String.prototype.endsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 2]), true);
+assert.throw(function() { String.prototype.endsWith.apply({ 'toString': function() { throw RangeError(); } }, [/./]); }, RangeError);
diff --git a/packages/babel-core/test/fixtures/traceur/StringExtras/FromCodePoint.js b/packages/babel-core/test/fixtures/traceur/StringExtras/FromCodePoint.js
new file mode 100644
index 0000000000..fc4831f708
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/StringExtras/FromCodePoint.js
@@ -0,0 +1,25 @@
+// Tests taken from https://mths.be/fromcodepoint
+
+assert.equal(String.fromCodePoint.length, 1);
+
+assert.equal(String.fromCodePoint(''), '\0');
+assert.equal(String.fromCodePoint(), '');
+assert.equal(String.fromCodePoint(-0), '\0');
+assert.equal(String.fromCodePoint(0), '\0');
+assert.equal(String.fromCodePoint(0x1D306), '\uD834\uDF06');
+assert.equal(String.fromCodePoint(0x1D306, 0x61, 0x1D307), '\uD834\uDF06a\uD834\uDF07');
+assert.equal(String.fromCodePoint(0x61, 0x62, 0x1D307), 'ab\uD834\uDF07');
+assert.equal(String.fromCodePoint(false), '\0');
+assert.equal(String.fromCodePoint(null), '\0');
+
+assert.throw(function() { String.fromCodePoint('_'); }, RangeError);
+assert.throw(function() { String.fromCodePoint('+Infinity'); }, RangeError);
+assert.throw(function() { String.fromCodePoint('-Infinity'); }, RangeError);
+assert.throw(function() { String.fromCodePoint(-1); }, RangeError);
+assert.throw(function() { String.fromCodePoint(0x10FFFF + 1); }, RangeError);
+assert.throw(function() { String.fromCodePoint(3.14); }, RangeError);
+assert.throw(function() { String.fromCodePoint(3e-2); }, RangeError);
+assert.throw(function() { String.fromCodePoint(Infinity); }, RangeError);
+assert.throw(function() { String.fromCodePoint(NaN); }, RangeError);
+assert.throw(function() { String.fromCodePoint(undefined); }, RangeError);
+assert.throw(function() { String.fromCodePoint({}); }, RangeError);
diff --git a/packages/babel-core/test/fixtures/traceur/StringExtras/Includes.js b/packages/babel-core/test/fixtures/traceur/StringExtras/Includes.js
new file mode 100644
index 0000000000..b5cf58373d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/StringExtras/Includes.js
@@ -0,0 +1,114 @@
+// Tests taken from https://mths.be/includes
+
+assert.equal(String.prototype.includes.length, 1);
+assert.equal(String.prototype.propertyIsEnumerable('includes'), false);
+
+assert.equal('abc'.includes(), false);
+assert.equal('aundefinedb'.includes(), true);
+assert.equal('abc'.includes(undefined), false);
+assert.equal('aundefinedb'.includes(undefined), true);
+assert.equal('abc'.includes(null), false);
+assert.equal('anullb'.includes(null), true);
+assert.equal('abc'.includes(false), false);
+assert.equal('afalseb'.includes(false), true);
+assert.equal('abc'.includes(NaN), false);
+assert.equal('aNaNb'.includes(NaN), true);
+assert.equal('abc'.includes('abc'), true);
+assert.equal('abc'.includes('def'), false);
+assert.equal('abc'.includes(''), true);
+assert.equal(''.includes(''), true);
+
+assert.equal('abc'.includes('b', -Infinity), true);
+assert.equal('abc'.includes('b', -1), true);
+assert.equal('abc'.includes('b', -0), true);
+assert.equal('abc'.includes('b', +0), true);
+assert.equal('abc'.includes('b', NaN), true);
+assert.equal('abc'.includes('b', 'x'), true);
+assert.equal('abc'.includes('b', false), true);
+assert.equal('abc'.includes('b', undefined), true);
+assert.equal('abc'.includes('b', null), true);
+assert.equal('abc'.includes('b', 1), true);
+assert.equal('abc'.includes('b', 2), false);
+assert.equal('abc'.includes('b', 3), false);
+assert.equal('abc'.includes('b', 4), false);
+assert.equal('abc'.includes('b', +Infinity), false);
+assert.equal('abc'.includes('bc'), true);
+assert.equal('abc'.includes('bc\0'), false);
+
+assert.equal('abc123def'.includes(1, -Infinity), true);
+assert.equal('abc123def'.includes(1, -1), true);
+assert.equal('abc123def'.includes(1, -0), true);
+assert.equal('abc123def'.includes(1, +0), true);
+assert.equal('abc123def'.includes(1, NaN), true);
+assert.equal('abc123def'.includes(1, 'x'), true);
+assert.equal('abc123def'.includes(1, false), true);
+assert.equal('abc123def'.includes(1, undefined), true);
+assert.equal('abc123def'.includes(1, null), true);
+assert.equal('abc123def'.includes(1, 1), true);
+assert.equal('abc123def'.includes(1, 2), true);
+assert.equal('abc123def'.includes(1, 3), true);
+assert.equal('abc123def'.includes(1, 4), false);
+assert.equal('abc123def'.includes(1, 5), false);
+assert.equal('abc123def'.includes(1, +Infinity), false);
+
+assert.equal('abc123def'.includes(9, -Infinity), false);
+assert.equal('abc123def'.includes(9, -1), false);
+assert.equal('abc123def'.includes(9, -0), false);
+assert.equal('abc123def'.includes(9, +0), false);
+assert.equal('abc123def'.includes(9, NaN), false);
+assert.equal('abc123def'.includes(9, 'x'), false);
+assert.equal('abc123def'.includes(9, false), false);
+assert.equal('abc123def'.includes(9, undefined), false);
+assert.equal('abc123def'.includes(9, null), false);
+assert.equal('abc123def'.includes(9, 1), false);
+assert.equal('abc123def'.includes(9, 2), false);
+assert.equal('abc123def'.includes(9, 3), false);
+assert.equal('abc123def'.includes(9, 4), false);
+assert.equal('abc123def'.includes(9, 5), false);
+assert.equal('abc123def'.includes(9, +Infinity), false);
+
+assert.equal('foo[a-z]+(bar)?'.includes('[a-z]+'), true);
+assert.throw(function() { 'foo[a-z]+(bar)?'.includes(/[a-z]+/); }, TypeError);
+assert.throw(function() { 'foo/[a-z]+/(bar)?'.includes(/[a-z]+/); }, TypeError);
+assert.equal('foo[a-z]+(bar)?'.includes('(bar)?'), true);
+assert.throw(function() { 'foo[a-z]+(bar)?'.includes(/(bar)?/); }, TypeError);
+assert.throw(function() { 'foo[a-z]+/(bar)?/'.includes(/(bar)?/); }, TypeError);
+
+// https://mathiasbynens.be/notes/javascript-unicode#poo-test
+var string = 'I\xF1t\xEBrn\xE2ti\xF4n\xE0liz\xE6ti\xF8n\u2603\uD83D\uDCA9';
+assert.equal(string.includes(''), true);
+assert.equal(string.includes('\xF1t\xEBr'), true);
+assert.equal(string.includes('\xE0liz\xE6'), true);
+assert.equal(string.includes('\xF8n\u2603\uD83D\uDCA9'), true);
+assert.equal(string.includes('\u2603'), true);
+assert.equal(string.includes('\uD83D\uDCA9'), true);
+
+assert.throw(function() { String.prototype.includes.call(undefined); }, TypeError);
+assert.throw(function() { String.prototype.includes.call(undefined, 'b'); }, TypeError);
+assert.throw(function() { String.prototype.includes.call(undefined, 'b', 4); }, TypeError);
+assert.throw(function() { String.prototype.includes.call(null); }, TypeError);
+assert.throw(function() { String.prototype.includes.call(null, 'b'); }, TypeError);
+assert.throw(function() { String.prototype.includes.call(null, 'b', 4); }, TypeError);
+assert.equal(String.prototype.includes.call(42, '2'), true);
+assert.equal(String.prototype.includes.call(42, 'b', 4), false);
+assert.equal(String.prototype.includes.call(42, '2', 4), false);
+assert.equal(String.prototype.includes.call({ 'toString': function() { return 'abc'; } }, 'b', 0), true);
+assert.equal(String.prototype.includes.call({ 'toString': function() { return 'abc'; } }, 'b', 1), true);
+assert.equal(String.prototype.includes.call({ 'toString': function() { return 'abc'; } }, 'b', 2), false);
+assert.throw(function() { String.prototype.includes.call({ 'toString': function() { throw RangeError(); } }, /./); }, RangeError);
+assert.throw(function() { String.prototype.includes.call({ 'toString': function() { return 'abc'; } }, /./); }, TypeError);
+
+assert.throw(function() { String.prototype.includes.apply(undefined); }, TypeError);
+assert.throw(function() { String.prototype.includes.apply(undefined, ['b']); }, TypeError);
+assert.throw(function() { String.prototype.includes.apply(undefined, ['b', 4]); }, TypeError);
+assert.throw(function() { String.prototype.includes.apply(null); }, TypeError);
+assert.throw(function() { String.prototype.includes.apply(null, ['b']); }, TypeError);
+assert.throw(function() { String.prototype.includes.apply(null, ['b', 4]); }, TypeError);
+assert.equal(String.prototype.includes.apply(42, ['2']), true);
+assert.equal(String.prototype.includes.apply(42, ['b', 4]), false);
+assert.equal(String.prototype.includes.apply(42, ['2', 4]), false);
+assert.equal(String.prototype.includes.apply({ 'toString': function() { return 'abc'; } }, ['b', 0]), true);
+assert.equal(String.prototype.includes.apply({ 'toString': function() { return 'abc'; } }, ['b', 1]), true);
+assert.equal(String.prototype.includes.apply({ 'toString': function() { return 'abc'; } }, ['b', 2]), false);
+assert.throw(function() { String.prototype.includes.apply({ 'toString': function() { throw RangeError(); } }, [/./]); }, RangeError);
+assert.throw(function() { String.prototype.includes.apply({ 'toString': function() { return 'abc'; } }, [/./]); }, TypeError);
diff --git a/packages/babel-core/test/fixtures/traceur/StringExtras/Repeat.js b/packages/babel-core/test/fixtures/traceur/StringExtras/Repeat.js
new file mode 100644
index 0000000000..08c5d02ae9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/StringExtras/Repeat.js
@@ -0,0 +1,33 @@
+// Tests taken from https://mths.be/repeat
+
+assert.equal(String.prototype.repeat.length, 1);
+
+assert.equal('abc'.repeat(), '');
+assert.equal('abc'.repeat(undefined), '');
+assert.equal('abc'.repeat(null), '');
+assert.equal('abc'.repeat(false), '');
+assert.equal('abc'.repeat(NaN), '');
+assert.equal('abc'.repeat('abc'), '');
+assert.throw(function() { 'abc'.repeat(-Infinity); }, RangeError);
+assert.throw(function() { 'abc'.repeat(-1); }, RangeError);
+assert.equal('abc'.repeat(-0), '');
+assert.equal('abc'.repeat(+0), '');
+assert.equal('abc'.repeat(1), 'abc');
+assert.equal('abc'.repeat(2), 'abcabc');
+assert.equal('abc'.repeat(3), 'abcabcabc');
+assert.equal('abc'.repeat(4), 'abcabcabcabc');
+assert.throw(function() { 'abc'.repeat(+Infinity); }, RangeError);
+
+assert.throw(function() { String.prototype.repeat.call(undefined); }, TypeError);
+assert.throw(function() { String.prototype.repeat.call(undefined, 4); }, TypeError);
+assert.throw(function() { String.prototype.repeat.call(null); }, TypeError);
+assert.throw(function() { String.prototype.repeat.call(null, 4); }, TypeError);
+assert.equal(String.prototype.repeat.call(42, 4), '42424242');
+assert.equal(String.prototype.repeat.call({ 'toString': function() { return 'abc'; } }, 2), 'abcabc');
+
+assert.throw(function() { String.prototype.repeat.apply(undefined); }, TypeError);
+assert.throw(function() { String.prototype.repeat.apply(undefined, [4]); }, TypeError);
+assert.throw(function() { String.prototype.repeat.apply(null); }, TypeError);
+assert.throw(function() { String.prototype.repeat.apply(null, [4]); }, TypeError);
+assert.equal(String.prototype.repeat.apply(42, [4]), '42424242');
+assert.equal(String.prototype.repeat.apply({ 'toString': function() { return 'abc'; } }, [2]), 'abcabc');
diff --git a/packages/babel-core/test/fixtures/traceur/StringExtras/StartsWith.js b/packages/babel-core/test/fixtures/traceur/StringExtras/StartsWith.js
new file mode 100644
index 0000000000..8c71a21f95
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/StringExtras/StartsWith.js
@@ -0,0 +1,210 @@
+// Tests taken from https://mths.be/startswith
+
+Object.prototype[1] = 2; // try to break `arguments[1]`
+
+assert.equal(String.prototype.startsWith.length, 1);
+
+assert.equal('undefined'.startsWith(), true);
+assert.equal('undefined'.startsWith(undefined), true);
+assert.equal('undefined'.startsWith(null), false);
+assert.equal('null'.startsWith(), false);
+assert.equal('null'.startsWith(undefined), false);
+assert.equal('null'.startsWith(null), true);
+
+assert.equal('abc'.startsWith(), false);
+assert.equal('abc'.startsWith(''), true);
+assert.equal('abc'.startsWith('\0'), false);
+assert.equal('abc'.startsWith('a'), true);
+assert.equal('abc'.startsWith('b'), false);
+assert.equal('abc'.startsWith('ab'), true);
+assert.equal('abc'.startsWith('bc'), false);
+assert.equal('abc'.startsWith('abc'), true);
+assert.equal('abc'.startsWith('bcd'), false);
+assert.equal('abc'.startsWith('abcd'), false);
+assert.equal('abc'.startsWith('bcde'), false);
+
+assert.equal('abc'.startsWith('', NaN), true);
+assert.equal('abc'.startsWith('\0', NaN), false);
+assert.equal('abc'.startsWith('a', NaN), true);
+assert.equal('abc'.startsWith('b', NaN), false);
+assert.equal('abc'.startsWith('ab', NaN), true);
+assert.equal('abc'.startsWith('bc', NaN), false);
+assert.equal('abc'.startsWith('abc', NaN), true);
+assert.equal('abc'.startsWith('bcd', NaN), false);
+assert.equal('abc'.startsWith('abcd', NaN), false);
+assert.equal('abc'.startsWith('bcde', NaN), false);
+
+assert.equal('abc'.startsWith('', false), true);
+assert.equal('abc'.startsWith('\0', false), false);
+assert.equal('abc'.startsWith('a', false), true);
+assert.equal('abc'.startsWith('b', false), false);
+assert.equal('abc'.startsWith('ab', false), true);
+assert.equal('abc'.startsWith('bc', false), false);
+assert.equal('abc'.startsWith('abc', false), true);
+assert.equal('abc'.startsWith('bcd', false), false);
+assert.equal('abc'.startsWith('abcd', false), false);
+assert.equal('abc'.startsWith('bcde', false), false);
+
+assert.equal('abc'.startsWith('', undefined), true);
+assert.equal('abc'.startsWith('\0', undefined), false);
+assert.equal('abc'.startsWith('a', undefined), true);
+assert.equal('abc'.startsWith('b', undefined), false);
+assert.equal('abc'.startsWith('ab', undefined), true);
+assert.equal('abc'.startsWith('bc', undefined), false);
+assert.equal('abc'.startsWith('abc', undefined), true);
+assert.equal('abc'.startsWith('bcd', undefined), false);
+assert.equal('abc'.startsWith('abcd', undefined), false);
+assert.equal('abc'.startsWith('bcde', undefined), false);
+
+assert.equal('abc'.startsWith('', null), true);
+assert.equal('abc'.startsWith('\0', null), false);
+assert.equal('abc'.startsWith('a', null), true);
+assert.equal('abc'.startsWith('b', null), false);
+assert.equal('abc'.startsWith('ab', null), true);
+assert.equal('abc'.startsWith('bc', null), false);
+assert.equal('abc'.startsWith('abc', null), true);
+assert.equal('abc'.startsWith('bcd', null), false);
+assert.equal('abc'.startsWith('abcd', null), false);
+assert.equal('abc'.startsWith('bcde', null), false);
+
+assert.equal('abc'.startsWith('', -Infinity), true);
+assert.equal('abc'.startsWith('\0', -Infinity), false);
+assert.equal('abc'.startsWith('a', -Infinity), true);
+assert.equal('abc'.startsWith('b', -Infinity), false);
+assert.equal('abc'.startsWith('ab', -Infinity), true);
+assert.equal('abc'.startsWith('bc', -Infinity), false);
+assert.equal('abc'.startsWith('abc', -Infinity), true);
+assert.equal('abc'.startsWith('bcd', -Infinity), false);
+assert.equal('abc'.startsWith('abcd', -Infinity), false);
+assert.equal('abc'.startsWith('bcde', -Infinity), false);
+
+assert.equal('abc'.startsWith('', -1), true);
+assert.equal('abc'.startsWith('\0', -1), false);
+assert.equal('abc'.startsWith('a', -1), true);
+assert.equal('abc'.startsWith('b', -1), false);
+assert.equal('abc'.startsWith('ab', -1), true);
+assert.equal('abc'.startsWith('bc', -1), false);
+assert.equal('abc'.startsWith('abc', -1), true);
+assert.equal('abc'.startsWith('bcd', -1), false);
+assert.equal('abc'.startsWith('abcd', -1), false);
+assert.equal('abc'.startsWith('bcde', -1), false);
+
+assert.equal('abc'.startsWith('', -0), true);
+assert.equal('abc'.startsWith('\0', -0), false);
+assert.equal('abc'.startsWith('a', -0), true);
+assert.equal('abc'.startsWith('b', -0), false);
+assert.equal('abc'.startsWith('ab', -0), true);
+assert.equal('abc'.startsWith('bc', -0), false);
+assert.equal('abc'.startsWith('abc', -0), true);
+assert.equal('abc'.startsWith('bcd', -0), false);
+assert.equal('abc'.startsWith('abcd', -0), false);
+assert.equal('abc'.startsWith('bcde', -0), false);
+
+assert.equal('abc'.startsWith('', +0), true);
+assert.equal('abc'.startsWith('\0', +0), false);
+assert.equal('abc'.startsWith('a', +0), true);
+assert.equal('abc'.startsWith('b', +0), false);
+assert.equal('abc'.startsWith('ab', +0), true);
+assert.equal('abc'.startsWith('bc', +0), false);
+assert.equal('abc'.startsWith('abc', +0), true);
+assert.equal('abc'.startsWith('bcd', +0), false);
+assert.equal('abc'.startsWith('abcd', +0), false);
+assert.equal('abc'.startsWith('bcde', +0), false);
+
+assert.equal('abc'.startsWith('', 1), true);
+assert.equal('abc'.startsWith('\0', 1), false);
+assert.equal('abc'.startsWith('a', 1), false);
+assert.equal('abc'.startsWith('b', 1), true);
+assert.equal('abc'.startsWith('ab', 1), false);
+assert.equal('abc'.startsWith('bc', 1), true);
+assert.equal('abc'.startsWith('abc', 1), false);
+assert.equal('abc'.startsWith('bcd', 1), false);
+assert.equal('abc'.startsWith('abcd', 1), false);
+assert.equal('abc'.startsWith('bcde', 1), false);
+
+assert.equal('abc'.startsWith('', +Infinity), true);
+assert.equal('abc'.startsWith('\0', +Infinity), false);
+assert.equal('abc'.startsWith('a', +Infinity), false);
+assert.equal('abc'.startsWith('b', +Infinity), false);
+assert.equal('abc'.startsWith('ab', +Infinity), false);
+assert.equal('abc'.startsWith('bc', +Infinity), false);
+assert.equal('abc'.startsWith('abc', +Infinity), false);
+assert.equal('abc'.startsWith('bcd', +Infinity), false);
+assert.equal('abc'.startsWith('abcd', +Infinity), false);
+assert.equal('abc'.startsWith('bcde', +Infinity), false);
+
+assert.equal('abc'.startsWith('', true), true);
+assert.equal('abc'.startsWith('\0', true), false);
+assert.equal('abc'.startsWith('a', true), false);
+assert.equal('abc'.startsWith('b', true), true);
+assert.equal('abc'.startsWith('ab', true), false);
+assert.equal('abc'.startsWith('bc', true), true);
+assert.equal('abc'.startsWith('abc', true), false);
+assert.equal('abc'.startsWith('bcd', true), false);
+assert.equal('abc'.startsWith('abcd', true), false);
+assert.equal('abc'.startsWith('bcde', true), false);
+
+assert.equal('abc'.startsWith('', 'x'), true);
+assert.equal('abc'.startsWith('\0', 'x'), false);
+assert.equal('abc'.startsWith('a', 'x'), true);
+assert.equal('abc'.startsWith('b', 'x'), false);
+assert.equal('abc'.startsWith('ab', 'x'), true);
+assert.equal('abc'.startsWith('bc', 'x'), false);
+assert.equal('abc'.startsWith('abc', 'x'), true);
+assert.equal('abc'.startsWith('bcd', 'x'), false);
+assert.equal('abc'.startsWith('abcd', 'x'), false);
+assert.equal('abc'.startsWith('bcde', 'x'), false);
+
+assert.equal('[a-z]+(bar)?'.startsWith('[a-z]+'), true);
+assert.throw(function() { '[a-z]+(bar)?'.startsWith(/[a-z]+/); }, TypeError);
+assert.equal('[a-z]+(bar)?'.startsWith('(bar)?', 6), true);
+assert.throw(function() { '[a-z]+(bar)?'.startsWith(/(bar)?/); }, TypeError);
+assert.throw(function() { '[a-z]+/(bar)?/'.startsWith(/(bar)?/); }, TypeError);
+
+// https://mathiasbynens.be/notes/javascript-unicode#poo-test
+var string = 'I\xF1t\xEBrn\xE2ti\xF4n\xE0liz\xE6ti\xF8n\u2603\uD83D\uDCA9';
+assert.equal(string.startsWith(''), true);
+assert.equal(string.startsWith('\xF1t\xEBr'), false);
+assert.equal(string.startsWith('\xF1t\xEBr', 1), true);
+assert.equal(string.startsWith('\xE0liz\xE6'), false);
+assert.equal(string.startsWith('\xE0liz\xE6', 11), true);
+assert.equal(string.startsWith('\xF8n\u2603\uD83D\uDCA9'), false);
+assert.equal(string.startsWith('\xF8n\u2603\uD83D\uDCA9', 18), true);
+assert.equal(string.startsWith('\u2603'), false);
+assert.equal(string.startsWith('\u2603', 20), true);
+assert.equal(string.startsWith('\uD83D\uDCA9'), false);
+assert.equal(string.startsWith('\uD83D\uDCA9', 21), true);
+
+assert.throw(function() { String.prototype.startsWith.call(undefined); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.call(undefined, 'b'); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.call(undefined, 'b', 4); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.call(null); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.call(null, 'b'); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.call(null, 'b', 4); }, TypeError);
+assert.equal(String.prototype.startsWith.call(42, '2'), false);
+assert.equal(String.prototype.startsWith.call(42, '4'), true);
+assert.equal(String.prototype.startsWith.call(42, 'b', 4), false);
+assert.equal(String.prototype.startsWith.call(42, '2', 1), true);
+assert.equal(String.prototype.startsWith.call(42, '2', 4), false);
+assert.equal(String.prototype.startsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 0), false);
+assert.equal(String.prototype.startsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 1), true);
+assert.equal(String.prototype.startsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 2), false);
+assert.throw(function() { String.prototype.startsWith.call({ 'toString': function() { throw RangeError(); } }, /./); }, RangeError);
+
+assert.throw(function() { String.prototype.startsWith.apply(undefined); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.apply(undefined, ['b']); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.apply(undefined, ['b', 4]); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.apply(null); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.apply(null, ['b']); }, TypeError);
+assert.throw(function() { String.prototype.startsWith.apply(null, ['b', 4]); }, TypeError);
+assert.equal(String.prototype.startsWith.apply(42, ['2']), false);
+assert.equal(String.prototype.startsWith.apply(42, ['4']), true);
+assert.equal(String.prototype.startsWith.apply(42, ['b', 4]), false);
+assert.equal(String.prototype.startsWith.apply(42, ['2', 1]), true);
+assert.equal(String.prototype.startsWith.apply(42, ['2', 4]), false);
+assert.equal(String.prototype.startsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 0]), false);
+assert.equal(String.prototype.startsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 1]), true);
+assert.equal(String.prototype.startsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 2]), false);
+assert.throw(function() { String.prototype.startsWith.apply({ 'toString': function() { throw RangeError(); } }, [/./]); }, RangeError);
+
+delete Object.prototype[1];
diff --git a/packages/babel-core/test/fixtures/traceur/StringIterator.js b/packages/babel-core/test/fixtures/traceur/StringIterator.js
new file mode 100644
index 0000000000..8b5dc5ccfa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/StringIterator.js
@@ -0,0 +1,15 @@
+var s = 'abc 💩 def';
+
+var expected = ['a', 'b', 'c', ' ', '💩', ' ', 'd', 'e', 'f'];
+var actual = [];
+for (var x of s) {
+ actual.push(x);
+}
+assert.deepEqual(actual, expected);
+
+var newS = new String('abc');
+var res = [];
+for (var x of newS) {
+ res.push(x);
+}
+assert.deepEqual(res, ['a', 'b', 'c']);
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/Error_Super.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/Error_Super.js
new file mode 100644
index 0000000000..e92759c500
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/Error_Super.js
@@ -0,0 +1,10 @@
+// Error: :8:17: Unexpected token ;
+
+var p = {};
+
+var o = {
+ __proto__: p,
+ method() {
+ return super;
+ }
+};
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperChaining.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperChaining.js
new file mode 100644
index 0000000000..9254653816
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperChaining.js
@@ -0,0 +1,30 @@
+var a = {
+ foo() {
+ return 'A';
+ }
+};
+
+var b = {
+ __proto__: a,
+ foo() {
+ return super.foo() + ' B';
+ }
+};
+
+var c = {
+ __proto__: b,
+ foo() {
+ return super.foo() + ' C';
+ }
+};
+
+var d = {
+ __proto__: c,
+ foo() {
+ return super.foo() + ' D';
+ }
+};
+
+// ----------------------------------------------------------------------------
+
+assert.equal('A B C D', d.foo());
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperChangeProto.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperChangeProto.js
new file mode 100644
index 0000000000..592c2078d1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperChangeProto.js
@@ -0,0 +1,22 @@
+var log = '';
+
+var base = {
+ p() { log += '[base]'; }
+};
+
+var otherBase = {
+ p() { log += '[otherBase]'; }
+};
+
+var derived = {
+ __proto__: base,
+ p() {
+ log += '[derived]';
+ super.p();
+ derived.__proto__ = otherBase;
+ super.p();
+ }
+};
+
+derived.p();
+assert.equal(log, '[derived][base][otherBase]');
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperInArrow.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperInArrow.js
new file mode 100644
index 0000000000..ba826c8ea8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperInArrow.js
@@ -0,0 +1,20 @@
+var x;
+
+var p = {
+ m(v) {
+ x = v;
+ }
+};
+
+var o = {
+ __proto__: p,
+ n(x) {
+ var f = (x) => {
+ super.m(x);
+ };
+ f(x);
+ }
+};
+
+o.n(42);
+assert.equal(x, 42);
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperNestedObject.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperNestedObject.js
new file mode 100644
index 0000000000..6f719cc10b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperNestedObject.js
@@ -0,0 +1,37 @@
+var p = {
+ m() {
+ this.name = 'p';
+ },
+ n() {
+ return 'name';
+ }
+};
+
+var p2 = {
+ m() {
+ this.name = 'p2';
+ }
+};
+
+var o = {
+ __proto__: p,
+ name: 'o',
+ m() {
+ this.inner = {
+ __proto__: p2,
+ [super.n()]: 'inner',
+ m() {
+ super.m();
+ }
+ };
+ super.m();
+ }
+};
+
+o.m();
+assert.equal(o.name, 'p');
+assert.equal(o.inner.name, 'inner');
+
+o.inner.m();
+assert.equal(o.name, 'p');
+assert.equal(o.inner.name, 'p2');
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperPostfix.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperPostfix.js
new file mode 100644
index 0000000000..36b11cd8aa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperPostfix.js
@@ -0,0 +1,22 @@
+var p = {
+ _x: 0,
+ get x() {
+ return this._x;
+ },
+ set x(x) {
+ this._x = x;
+ }
+};
+
+var o = {
+ __proto__: p,
+ m() {
+ assert.equal(this.x, 0);
+ assert.equal(super.x++, 0);
+ assert.equal(this.x, 1);
+ assert.equal(super.x--, 1);
+ assert.equal(this.x, 0);
+ }
+};
+
+o.m();
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperSet.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperSet.js
new file mode 100644
index 0000000000..2be6e336bf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperSet.js
@@ -0,0 +1,51 @@
+var p = {
+ _y: {v: 321},
+ _z: 1,
+
+ set x(value) {
+ this._x = value;
+ },
+ get x() {
+ return this._y;
+ },
+ getX() {
+ return this._x;
+ },
+ getV() {
+ return this._y.v;
+ },
+ set z(v) {
+ this._z = v;
+ },
+ get z() {
+ return this._z;
+ },
+};
+
+var o = {
+ __proto__: p,
+ set x(value) {
+ assert.equal(super.x = value, value);
+ },
+ set v(value) {
+ return super.x.v = value;
+ },
+ inc(val) {
+ assert.equal(super.z += val, 4);
+ },
+ incLookup(val) {
+ assert.equal(super['z'] += val, 9);
+ }
+};
+
+o.x = 42;
+assert.equal(42, o.getX());
+
+o.v = 123;
+assert.equal(123, o.getV());
+
+o.inc(3);
+assert.equal(4, o.z);
+
+o.incLookup(5);
+assert.equal(9, o.z);
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperUnary.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperUnary.js
new file mode 100644
index 0000000000..54a6bc7405
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperUnary.js
@@ -0,0 +1,25 @@
+var p = {
+ _x: 0,
+ get x() {
+ return this._x;
+ },
+ set x(x) {
+ this._x = x;
+ },
+};
+
+var o = {
+ __proto__: p,
+ m() {
+ assert.equal(this.x, 0);
+ assert.equal(++super.x, 1);
+ assert.equal(this.x, 1);
+ assert.equal(--super.x, 0);
+ assert.equal(this.x, 0);
+
+ // Don't use assert.typeOf since we are testing typeof.
+ assert.equal(typeof super.x, 'number');
+ }
+};
+
+o.m();
diff --git a/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperWithoutProto.js b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperWithoutProto.js
new file mode 100644
index 0000000000..416d9f62d5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/SuperObjectLiteral/SuperWithoutProto.js
@@ -0,0 +1,8 @@
+var o = {
+ x: true,
+ m() {
+ return super.hasOwnProperty('x');
+ }
+};
+
+assert.isTrue(o.m());
diff --git a/packages/babel-core/test/fixtures/traceur/Symbol/GetOwnPropertySymbols.js b/packages/babel-core/test/fixtures/traceur/Symbol/GetOwnPropertySymbols.js
new file mode 100644
index 0000000000..75946b17d4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Symbol/GetOwnPropertySymbols.js
@@ -0,0 +1,7 @@
+var s1 = Symbol();
+var s2 = Symbol();
+var object = {a: 'a'};
+object[s1] = 's1';
+object.b = 'b';
+object[s2] = 's2';
+assertArrayEquals([s1, s2], Object.getOwnPropertySymbols(object));
diff --git a/packages/babel-core/test/fixtures/traceur/Symbol/Inherited.js b/packages/babel-core/test/fixtures/traceur/Symbol/Inherited.js
new file mode 100644
index 0000000000..dd31d0e177
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Symbol/Inherited.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var s = Symbol();
+var p = {};
+Object.defineProperty(p, s, {
+ get: function() {
+ return 42;
+ },
+ configurable: true
+});
+
+var o = Object.create(p);
+assert.equal(42, o[s]);
+assert.throws(function() {
+ o[s] = 1;
+}, TypeError);
+
+var val;
+Object.defineProperty(p, s, {
+ set: function(v) {
+ val = v;
+ },
+ configurable: true
+});
+
+o[s] = 33;
+assert.equal(33, val);
diff --git a/packages/babel-core/test/fixtures/traceur/Symbol/Object.js b/packages/babel-core/test/fixtures/traceur/Symbol/Object.js
new file mode 100644
index 0000000000..6d00300ab4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Symbol/Object.js
@@ -0,0 +1,29 @@
+var s = Symbol();
+var object = {};
+object[s] = 42;
+assert.equal(42, object[s]);
+// Native Symbol throws for ToString.
+// assert.isUndefined(object[s + '']);
+assertArrayEquals([], Object.getOwnPropertyNames(object));
+assert.isTrue(object.hasOwnProperty(s));
+
+assert.equal(32, object[s] -= 10);
+assert.equal(16, object[s] /= 2);
+assert.equal(16, object[s]);
+
+var n = Symbol();
+assert.equal(object[n] = 1, 1);
+assert.equal(object[n] += 2, 3);
+
+assert.isTrue(Object.getOwnPropertyDescriptor(object, n).enumerable);
+
+assert.isTrue(n in object);
+assert.isTrue(delete object[n]);
+assert.isFalse(n in object);
+
+var keys = [];
+for (var k in object) {
+ keys.push(k);
+}
+assert.equal(0, keys.length, keys + '');
+assert.equal(0, Object.keys(object).length);
diff --git a/packages/babel-core/test/fixtures/traceur/Symbol/ObjectModel.js b/packages/babel-core/test/fixtures/traceur/Symbol/ObjectModel.js
new file mode 100644
index 0000000000..a80c496a63
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Symbol/ObjectModel.js
@@ -0,0 +1,13 @@
+var s = Symbol('s');
+assert.equal(typeof s, 'symbol');
+assert.equal(s.constructor, Symbol);
+assert.isFalse(s instanceof Symbol);
+
+assert.throws(() => {
+ new Symbol;
+});
+
+// TODO(jjb): Our impl not to spec so generators can use Symbols without
+// requiring transcoding
+// assert.equal(s.toString(), 'Symbol(s)');
+assert.equal(s.valueOf(), s);
diff --git a/packages/babel-core/test/fixtures/traceur/Symbol/TransformationOff.js b/packages/babel-core/test/fixtures/traceur/Symbol/TransformationOff.js
new file mode 100644
index 0000000000..1b0ee783b5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Symbol/TransformationOff.js
@@ -0,0 +1,8 @@
+var s = Symbol();
+var s2 = Symbol();
+var object = {};
+object[s] = 1;
+object[s2] = 2;
+
+assert.equal(object[s], 1);
+assert.equal(object[s2], 2);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/ArrayWithHoles.js b/packages/babel-core/test/fixtures/traceur/Syntax/ArrayWithHoles.js
new file mode 100644
index 0000000000..47477ebe94
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/ArrayWithHoles.js
@@ -0,0 +1,10 @@
+var arr = [,1, ,3,];
+assert.equal(4, arr.length);
+
+var arr2 = [,1, ,...[3],];
+assert.equal(4, arr.length);
+
+var x, y;
+[x, , y] = [0, 1, 2];
+assert.equal(0, x);
+assert.equal(2, y);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/CaseClauseShouldBeStatementListItem.js b/packages/babel-core/test/fixtures/traceur/Syntax/CaseClauseShouldBeStatementListItem.js
new file mode 100644
index 0000000000..cff0d8269a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/CaseClauseShouldBeStatementListItem.js
@@ -0,0 +1,14 @@
+switch (1) {
+ case 2:
+ let x;
+ break;
+ case 3:
+ const y = 4;
+ break;
+ case 5:
+ function f() {}
+ break;
+ default:
+ class C {}
+ break;
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/get-module-name-option/actual.js b/packages/babel-core/test/fixtures/traceur/Syntax/Empty.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/get-module-name-option/actual.js
rename to packages/babel-core/test/fixtures/traceur/Syntax/Empty.js
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_Arguments.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_Arguments.js
new file mode 100644
index 0000000000..bb2d410758
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_Arguments.js
@@ -0,0 +1,6 @@
+// Error: :6:6: Unexpected token )
+
+function f(x) {
+}
+
+f(x, );
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileClass.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileClass.js
new file mode 100644
index 0000000000..5ea5fedfde
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileClass.js
@@ -0,0 +1,4 @@
+// Options: --block-binding
+// Error: :4:4: Unexpected reserved word class
+
+do class C {} while (false);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileConst.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileConst.js
new file mode 100644
index 0000000000..1b509a5550
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileConst.js
@@ -0,0 +1,4 @@
+// Options: --block-binding
+// Error: :4:4: Unexpected reserved word const
+
+do const y = 1; while (false);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileFunction.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileFunction.js
new file mode 100644
index 0000000000..330b4be080
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileFunction.js
@@ -0,0 +1,4 @@
+// Options: --block-binding
+// Error: :4:4: Unexpected reserved word function
+
+do function f() {} while (false);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileLet.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileLet.js
new file mode 100644
index 0000000000..be2fd327d4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileLet.js
@@ -0,0 +1,4 @@
+// Options: --block-binding
+// Error: :4:4: Unexpected reserved word let
+
+do let x; while (false);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileLetOpenSquare.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileLetOpenSquare.js
new file mode 100644
index 0000000000..4f1c7766e9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInDoWhileLetOpenSquare.js
@@ -0,0 +1,4 @@
+// Options: --block-binding
+// Error: :4:4: A statement cannot start with 'let ['
+
+do let[0] = 1; while (false);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInElse.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInElse.js
new file mode 100644
index 0000000000..cf7db93de4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInElse.js
@@ -0,0 +1,22 @@
+// Options: --block-binding
+// Error: :9:3: Unexpected reserved word let
+// Error: :12:3: Unexpected reserved word const
+// Error: :15:3: Unexpected reserved word function
+// Error: :18:3: Unexpected reserved word class
+// Error: :21:3: A statement cannot start with 'let ['
+
+if (true) {} else
+ let x;
+
+if (true) {} else
+ const y = 1;
+
+if (true) {} else
+ function f() {}
+
+if (true) {} else
+ class C {}
+
+if (true) {} else
+ let[0] = 1;
+
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInFor.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInFor.js
new file mode 100644
index 0000000000..3f23c1a5c7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInFor.js
@@ -0,0 +1,21 @@
+// Options: --block-binding
+// Error: :9:3: Unexpected reserved word let
+// Error: :12:3: Unexpected reserved word const
+// Error: :15:3: Unexpected reserved word function
+// Error: :18:3: Unexpected reserved word class
+// Error: :21:3: A statement cannot start with 'let ['
+
+for (;;)
+ let x;
+
+for (;;)
+ const y = 1;
+
+for (;;)
+ function f() {}
+
+for (;;)
+ class C {}
+
+for (;;)
+ let[0] = 1;
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInForIn.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInForIn.js
new file mode 100644
index 0000000000..a037d53501
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInForIn.js
@@ -0,0 +1,21 @@
+// Options: --block-binding
+// Error: :9:3: Unexpected reserved word let
+// Error: :12:3: Unexpected reserved word const
+// Error: :15:3: Unexpected reserved word function
+// Error: :18:3: Unexpected reserved word class
+// Error: :21:3: A statement cannot start with 'let ['
+
+for (var key in {})
+ let x;
+
+for (var key in {})
+ const y = 1;
+
+for (var key in {})
+ function f() {}
+
+for (var key in {})
+ class C {}
+
+for (var key in {})
+ let[0] = 1;
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInForOf.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInForOf.js
new file mode 100644
index 0000000000..6114e7897c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInForOf.js
@@ -0,0 +1,21 @@
+// Options: --block-binding
+// Error: :9:3: Unexpected reserved word let
+// Error: :12:3: Unexpected reserved word const
+// Error: :15:3: Unexpected reserved word function
+// Error: :18:3: Unexpected reserved word class
+// Error: :21:3: A statement cannot start with 'let ['
+
+for (var item of [])
+ let x;
+
+for (var item of [])
+ const y = 1;
+
+for (var item of [])
+ function f() {}
+
+for (var item of [])
+ class C {}
+
+for (var item of [])
+ let[0] = 1;
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInIf.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInIf.js
new file mode 100644
index 0000000000..84ffdc7df8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInIf.js
@@ -0,0 +1,21 @@
+// Options: --block-binding
+// Error: :9:3: Unexpected reserved word let
+// Error: :12:3: Unexpected reserved word const
+// Error: :15:3: Unexpected reserved word function
+// Error: :18:3: Unexpected reserved word class
+// Error: :21:3: A statement cannot start with 'let ['
+
+if (true)
+ let x;
+
+if (true)
+ const y = 1;
+
+if (true)
+ function f() {}
+
+if (true)
+ class C {}
+
+if (true)
+ let[0] = 1;
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInWhile.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInWhile.js
new file mode 100644
index 0000000000..049626f80c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_DeclarationInWhile.js
@@ -0,0 +1,21 @@
+// Options: --block-binding
+// Error: :9:3: Unexpected reserved word let
+// Error: :12:3: Unexpected reserved word const
+// Error: :15:3: Unexpected reserved word function
+// Error: :18:3: Unexpected reserved word class
+// Error: :21:3: A statement cannot start with 'let ['
+
+while (false)
+ let x;
+
+while (false)
+ const y = 1;
+
+while (false)
+ function f() {}
+
+while (false)
+ class C {}
+
+while (false)
+ let[0] = 1;
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_ForInLoopTooManyVariableDeclarations.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ForInLoopTooManyVariableDeclarations.js
new file mode 100644
index 0000000000..39072eeec4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ForInLoopTooManyVariableDeclarations.js
@@ -0,0 +1,3 @@
+// Error: :3:15: Unexpected token in
+
+for (var i, j in {}) {}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_ForOfLoopTooManyVariableDeclarations.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ForOfLoopTooManyVariableDeclarations.js
new file mode 100644
index 0000000000..47300cbe20
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ForOfLoopTooManyVariableDeclarations.js
@@ -0,0 +1,3 @@
+// Error: :3:15: Unexpected token of
+
+for (var i, j of []) {}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_FunctionParam.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_FunctionParam.js
new file mode 100644
index 0000000000..4f7b7741e5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_FunctionParam.js
@@ -0,0 +1,5 @@
+// Error: :3:14: Unexpected token )
+
+function f(x,) {
+ return x;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_IllegalReturn.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_IllegalReturn.js
new file mode 100644
index 0000000000..fd775a56aa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_IllegalReturn.js
@@ -0,0 +1,3 @@
+// Error: :3:1: Illegal return statement
+
+return 42;
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_IllegalReturn.module.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_IllegalReturn.module.js
new file mode 100644
index 0000000000..fd775a56aa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_IllegalReturn.module.js
@@ -0,0 +1,3 @@
+// Error: :3:1: Illegal return statement
+
+return 42;
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_IsValidSimpleAssignmentTarget.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_IsValidSimpleAssignmentTarget.js
new file mode 100644
index 0000000000..a978e81cb7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_IsValidSimpleAssignmentTarget.js
@@ -0,0 +1,41 @@
+// Options: --async-functions --async-generators --for-on
+// Error: :16:1: Invalid left-hand side expression in assignment
+// Error: :17:1: Invalid left-hand side expression in assignment
+// Error: :18:3: Invalid left-hand side expression in prefix operation
+// Error: :19:3: Invalid left-hand side expression in prefix operation
+// Error: :20:1: Invalid left-hand side expression in postfix operation
+// Error: :21:1: Invalid left-hand side expression in postfix operation
+// Error: :25:3: Invalid left-hand side expression in assignment
+// Error: :26:3: Invalid left-hand side expression in assignment
+// Error: :30:5: Invalid left-hand side expression in assignment
+// Error: :33:12: Invalid left-hand side expression in assignment
+// Error: :35:6: Invalid left-hand side expression in assignment
+// Error: :37:6: Invalid left-hand side expression in assignment
+// Error: :40:7: Invalid left-hand side expression in assignment
+
+this = 1;
+42 = 1;
+++42
+--42
+42++
+42--
+
+function f() {
+ 'use strict';
+ arguments = 1;
+ eval = 1;
+}
+
+var x;
+[x, 42] = [1, 2];
+
+var y;
+({y, prop: 42} = {y: 2, prop: 3});
+
+for (42 in {}) {}
+
+for (42 of []) {}
+
+async function* ag() {
+ for (42 on {}) {}
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_MultipleDefault.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_MultipleDefault.js
new file mode 100644
index 0000000000..a103f5fe88
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_MultipleDefault.js
@@ -0,0 +1,12 @@
+// Error: :9:5: Switch statements may have at most one 'default' clause
+
+(function() {
+ switch (42) {
+ case 1:
+ return;
+ default:
+ return;
+ default:
+ return;
+ }
+});
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_NoLineTerminatorPostfix.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_NoLineTerminatorPostfix.js
new file mode 100644
index 0000000000..da9ad46a47
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_NoLineTerminatorPostfix.js
@@ -0,0 +1,7 @@
+// Error: 6:7: Unexpected token ;
+
+function f(x) {
+ var x = 0;
+ x
+ ++;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_ParamDuplicateCheck.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ParamDuplicateCheck.js
new file mode 100644
index 0000000000..ce6aaf9204
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ParamDuplicateCheck.js
@@ -0,0 +1,27 @@
+// Error: :10:18: Duplicate parameter name x
+// Error: :10:24: Duplicate parameter name x
+// Error: :14:17: Duplicate parameter name x
+// Error: :14:23: Duplicate parameter name x
+// Error: :20:20: Duplicate parameter name a
+// Error: :20:23: Duplicate parameter name a
+// Error: :24:19: Duplicate parameter name a
+// Error: :24:22: Duplicate parameter name a
+
+function f(x, y, x, z, x) {
+ 'use strict';
+}
+
+var f2 = (x, y, x, z, x) => {
+ 'use strict';
+};
+
+function g() {
+ 'use strict';
+ function h(a, b, a, a) {
+
+ }
+
+ var g2 = (a, b, a, a) => {
+
+ };
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_ParamDuplicateCheckNonSimple.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ParamDuplicateCheckNonSimple.js
new file mode 100644
index 0000000000..6377946c13
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_ParamDuplicateCheckNonSimple.js
@@ -0,0 +1,64 @@
+// Error: :24:18: Duplicate parameter name x
+// Error: :24:24: Duplicate parameter name x
+// Error: :27:19: Duplicate parameter name a
+// Error: :27:23: Duplicate parameter name a
+// Error: :30:22: Duplicate parameter name c
+// Error: :30:25: Duplicate parameter name c
+// Error: :33:20: Duplicate parameter name e
+// Error: :33:23: Duplicate parameter name e
+// Error: :36:15: Duplicate parameter name g
+// Error: :39:15: Duplicate parameter name i
+// Error: :42:15: Duplicate parameter name k
+// Error: :45:17: Duplicate parameter name x
+// Error: :45:23: Duplicate parameter name x
+// Error: :48:18: Duplicate parameter name a
+// Error: :48:22: Duplicate parameter name a
+// Error: :51:21: Duplicate parameter name c
+// Error: :51:24: Duplicate parameter name c
+// Error: :54:19: Duplicate parameter name e
+// Error: :54:22: Duplicate parameter name e
+// Error: :57:14: Duplicate parameter name g
+// Error: :60:14: Duplicate parameter name i
+// Error: :63:14: Duplicate parameter name k
+
+function f(x, y, x, ...x) {
+}
+
+function g([a, b, a], a) {
+}
+
+function h(c = 1, d, c, c) {
+}
+
+function i({e, f}, e, e) {
+}
+
+function j(g, g, [h]) {
+}
+
+function h(i, i, j = 1) {
+}
+
+function i(k, k, ...l) {
+}
+
+var f2 = (x, y, x, ...x) => {
+};
+
+var g2 = ([a, b, a], a) => {
+};
+
+var h2 = (c = 1, d, c, c) => {
+};
+
+var i2 = ({e, f}, e, e) => {
+};
+
+var j2 = (g, g, [h]) => {
+};
+
+var h2 = (i, i, j = 1) => {
+};
+
+var i2 = (k, k, ...l) => {
+};
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_RegExpNotClosed.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_RegExpNotClosed.js
new file mode 100644
index 0000000000..5cd0381dd7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_RegExpNotClosed.js
@@ -0,0 +1,3 @@
+// Error: :3:1: Expected '/' in regular expression literal
+
+/
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInArguments.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInArguments.js
new file mode 100644
index 0000000000..2ab9b50a90
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInArguments.js
@@ -0,0 +1,14 @@
+// Error: :8:25: implements is a reserved identifier
+// Error :8:25: implements is a reserved identifier
+// Error :10:1: implements is a reserved identifier
+// Error :11:2: implements is a reserved identifier
+// Error :12:3: implements is a reserved identifier
+// Error :13:6: implements is a reserved identifier
+
+function testImplements(implements) { 'use strict'; }
+
+implements => { 'use strict'; };
+(implements) => { 'use strict'; };
+([implements]) => { 'use strict'; };
+([...implements]) => { 'use strict'; };
+({implements}) => { 'use strict'; };
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInArgumentsPattern.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInArgumentsPattern.js
new file mode 100644
index 0000000000..944f89d8f9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInArgumentsPattern.js
@@ -0,0 +1,6 @@
+// Error: :3:26: implements is a reserved identifier
+
+function testImplements({implements}) {
+ 'use strict';
+ return 42;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInPropertyDefinitionIdentifierReference.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInPropertyDefinitionIdentifierReference.js
new file mode 100644
index 0000000000..fc8a0fefde
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInPropertyDefinitionIdentifierReference.js
@@ -0,0 +1,6 @@
+// Error: :5:11: yield is a reserved identifier
+
+function testStrictKeywordsInPropertyDefinitionIdentifierReference() {
+ 'use strict';
+ return {yield};
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInStrict.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInStrict.js
new file mode 100644
index 0000000000..cb73fa3a3e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_StrictKeywordsInStrict.js
@@ -0,0 +1,6 @@
+// Error: :4:26: implements is a reserved identifier
+
+'use strict';
+function testImplements({implements}) {
+ return 42;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_UnicodeEscapeSequenceInName.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_UnicodeEscapeSequenceInName.js
new file mode 100644
index 0000000000..3e35a4d5cc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_UnicodeEscapeSequenceInName.js
@@ -0,0 +1,3 @@
+// Error: :3:5: Character code '48' is not a valid identifier start char
+
+var \u0030ab = 42; // 0ab
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInClass.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInClass.js
new file mode 100644
index 0000000000..3015ee964f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInClass.js
@@ -0,0 +1,7 @@
+// Error: :5:5: Strict mode code may not include a with statement
+
+class C {
+ method() {
+ with ({}) {}
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInModule.module.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInModule.module.js
new file mode 100644
index 0000000000..31172a46bc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInModule.module.js
@@ -0,0 +1,3 @@
+// Error: :3:1: Strict mode code may not include a with statement
+
+with ({}) {}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInStrictFunction.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInStrictFunction.js
new file mode 100644
index 0000000000..7510f92ed9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInStrictFunction.js
@@ -0,0 +1,7 @@
+// Error: :6:3: Strict mode code may not include a with statement
+
+function testWithInStrict() {
+ 'use foo';
+ 'use strict';
+ with ({}) {}
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInStrictProgram.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInStrictProgram.js
new file mode 100644
index 0000000000..e9bf1f2440
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_WithInStrictProgram.js
@@ -0,0 +1,5 @@
+// Error: :5:1: Strict mode code may not include a with statement
+
+'use foo';
+'use strict';
+with ({}) {}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/Error_YieldStarNewLine.js b/packages/babel-core/test/fixtures/traceur/Syntax/Error_YieldStarNewLine.js
new file mode 100644
index 0000000000..9c7ddee6f1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/Error_YieldStarNewLine.js
@@ -0,0 +1,6 @@
+// Error: :5:7: Unexpected token *
+
+function* yieldStarNewLine() {
+ yield
+ *42;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/ExpressionValidation.js b/packages/babel-core/test/fixtures/traceur/Syntax/ExpressionValidation.js
new file mode 100644
index 0000000000..a217ea9eed
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/ExpressionValidation.js
@@ -0,0 +1,29 @@
+'use strict';
+
+(function() {
+
+// test MemberLookupExpression
+function f(a) {
+ var b = [42];
+ return (a||b)[0];
+}
+
+assert.equal(42, f(null));
+assert.equal(43, f([43]));
+
+// test NewExpression
+var a, b = function() { this.ans = 42; };
+assert.equal(new (a||b)().ans, 42);
+
+a = function() { this.ans = 43; };
+assert.equal(new (a||b)().ans, 43);
+
+// test CallExpression
+a = undefined;
+b = function() { return 42; }
+assert.equal((a||b)(), 42);
+
+a = function() { return 43; }
+assert.equal((a||b)(), 43);
+
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/ImplicitSemiColon.js b/packages/babel-core/test/fixtures/traceur/Syntax/ImplicitSemiColon.js
new file mode 100644
index 0000000000..af00da62c4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/ImplicitSemiColon.js
@@ -0,0 +1,6 @@
+function f() {
+ return
+ 42;
+}
+
+assert.isUndefined(f());
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/ImportFromTypo.module.js b/packages/babel-core/test/fixtures/traceur/Syntax/ImportFromTypo.module.js
new file mode 100644
index 0000000000..4ae054a80e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/ImportFromTypo.module.js
@@ -0,0 +1,3 @@
+// Error: :3:11: Unexpected token FROM
+
+import {} FROM 'abc';
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/InInBinding.js b/packages/babel-core/test/fixtures/traceur/Syntax/InInBinding.js
new file mode 100644
index 0000000000..2d5bd70b44
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/InInBinding.js
@@ -0,0 +1,2 @@
+var [x = 'a' in {a: 1}] = [];
+assert.equal(true, x);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/IsValidSimpleAssignmentTarget.js b/packages/babel-core/test/fixtures/traceur/Syntax/IsValidSimpleAssignmentTarget.js
new file mode 100644
index 0000000000..27181066e0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/IsValidSimpleAssignmentTarget.js
@@ -0,0 +1,38 @@
+(function() {
+ var eval = 1;
+ eval++;
+ ++eval;
+ eval--;
+ --eval;
+ [eval] = [eval];
+ ({eval} = {eval});
+ eval += 1;
+ eval /= 2;
+ assert.equal(1, eval);
+})();
+
+(function() {
+ var arguments = 1;
+ arguments++;
+ ++arguments;
+ arguments--;
+ --arguments;
+ [arguments] = [arguments];
+ ({arguments} = {arguments});
+ arguments += 1;
+ arguments /= 2;
+ assert.equal(1, arguments);
+})();
+
+(function() {
+ var yield = 1;
+ yield++;
+ ++yield;
+ yield--;
+ --yield;
+ [yield] = [yield];
+ ({yield} = {yield});
+ yield += 1;
+ yield /= 2;
+ assert.equal(1, yield);
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/MultlineCommentIsNewLine.js b/packages/babel-core/test/fixtures/traceur/Syntax/MultlineCommentIsNewLine.js
new file mode 100644
index 0000000000..6de511896e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/MultlineCommentIsNewLine.js
@@ -0,0 +1,28 @@
+function f() {
+ return /*
+ */ 1;
+}
+assert.equal(undefined, f());
+
+function g() {
+ return /* */ 1;
+}
+assert.equal(1, g());
+
+function h() {
+ return /* */ /*
+ */ 1;
+}
+assert.equal(undefined, h());
+
+function i() {
+ return /* */ //
+ 1;
+}
+assert.equal(undefined, i());
+
+function j() {
+ return //
+ 1;
+}
+assert.equal(undefined, j());
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/NoNewLineHereEndOfFile.js b/packages/babel-core/test/fixtures/traceur/Syntax/NoNewLineHereEndOfFile.js
new file mode 100644
index 0000000000..c5e9e23bba
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/NoNewLineHereEndOfFile.js
@@ -0,0 +1,3 @@
+// Comment not closed.
+var f = (x) /*
+ => {}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/NumberLiteralMemberExpression.js b/packages/babel-core/test/fixtures/traceur/Syntax/NumberLiteralMemberExpression.js
new file mode 100644
index 0000000000..43b6ab7fdf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/NumberLiteralMemberExpression.js
@@ -0,0 +1,4 @@
+assert.equal(1 .toString(), '1');
+assert.equal(1.1.toString(), '1.1');
+assert.equal(1e1.toString(), '10');
+assert.equal(1E1.toString(), '10');
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/ParamDuplicateCheckNonSimpleOk.js b/packages/babel-core/test/fixtures/traceur/Syntax/ParamDuplicateCheckNonSimpleOk.js
new file mode 100644
index 0000000000..e3f5b85e08
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/ParamDuplicateCheckNonSimpleOk.js
@@ -0,0 +1,15 @@
+function f(a, b, {c = function(a) {}}) {
+
+}
+
+var f2 = (a, b, {c = function(a) {}}) => {
+
+};
+
+function g(d, e, [f = function(d) {}]) {
+
+}
+
+var g2 = (d, e, [f = function(d) {}]) => {
+
+};
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/ParamDuplicateCheckOk.js b/packages/babel-core/test/fixtures/traceur/Syntax/ParamDuplicateCheckOk.js
new file mode 100644
index 0000000000..ac6df64fcf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/ParamDuplicateCheckOk.js
@@ -0,0 +1,18 @@
+function f(x, y = function(x) {}) {
+ 'use strict';
+}
+
+var f2 = (x, y = function(x) {}) => {
+ 'use strict';
+};
+
+function g() {
+ 'use strict';
+ function h(x, y = function(x) {}) {
+
+ }
+
+ var h2 = (x, y = function(x) {}) => {
+
+ };
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/RegularExpression.js b/packages/babel-core/test/fixtures/traceur/Syntax/RegularExpression.js
new file mode 100644
index 0000000000..cc313822a2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/RegularExpression.js
@@ -0,0 +1,10 @@
+var re1 = /a*b/;
+var re2 = /=a+/;
+var re3 = /\//;
+var re4 = /=/;
+var re5 = /=*/;
+var re6 = /a*b/g;
+var re7 = /=a+/g;
+var re8 = /\//g;
+var re9 = /=/g;
+var re10 = /=*/g;
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/StrictKeywords.js b/packages/babel-core/test/fixtures/traceur/Syntax/StrictKeywords.js
new file mode 100644
index 0000000000..47fdad0db4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/StrictKeywords.js
@@ -0,0 +1,47 @@
+function testImplementsVar() {
+ var implements = 1;
+ return implements;
+}
+assert.equal(testImplementsVar(), 1);
+
+function testInterfaceVar() {
+ var interface = 1;
+ return interface;
+}
+assert.equal(testInterfaceVar(), 1);
+
+function testPackageVar() {
+ var package = 1;
+ return package;
+}
+assert.equal(testPackageVar(), 1);
+
+function testPrivateVar() {
+ var private = 1;
+ return private;
+}
+assert.equal(testPrivateVar(), 1);
+
+function testProtectedVar() {
+ var protected = 1;
+ return protected;
+}
+assert.equal(testProtectedVar(), 1);
+
+function testPublicVar() {
+ var public = 1;
+ return public;
+}
+assert.equal(testPublicVar(), 1);
+
+function testStaticVar() {
+ var static = 1;
+ return static;
+}
+assert.equal(testStaticVar(), 1);
+
+function testYieldVar() {
+ var yield = 1;
+ return yield;
+}
+assert.equal(testYieldVar(), 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/StrictKeywordsInPattern.js b/packages/babel-core/test/fixtures/traceur/Syntax/StrictKeywordsInPattern.js
new file mode 100644
index 0000000000..16d407c7f6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/StrictKeywordsInPattern.js
@@ -0,0 +1,39 @@
+function testImplementsInPattern({implements}) {
+ return implements;
+}
+assert.equal(testImplementsInPattern({implements: 1}), 1);
+
+function testInterfaceInPattern({interface}) {
+ return interface;
+}
+assert.equal(testInterfaceInPattern({interface: 1}), 1);
+
+function testPackageInPattern({package}) {
+ return package;
+}
+assert.equal(testPackageInPattern({package: 1}), 1);
+
+function testPrivateInPattern({private}) {
+ return private;
+}
+assert.equal(testPrivateInPattern({private: 1}), 1);
+
+function testProtectedInPattern({protected}) {
+ return protected;
+}
+assert.equal(testProtectedInPattern({protected: 1}), 1);
+
+function testPublicInPattern({public}) {
+ return public;
+}
+assert.equal(testPublicInPattern({public: 1}), 1);
+
+function testStaticInPattern({static}) {
+ return static;
+}
+assert.equal(testStaticInPattern({static: 1}), 1);
+
+function testYieldInPattern({yield}) {
+ return yield;
+}
+assert.equal(testYieldInPattern({yield: 1}), 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/StringEscapes.js b/packages/babel-core/test/fixtures/traceur/Syntax/StringEscapes.js
new file mode 100644
index 0000000000..335c142dbe
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/StringEscapes.js
@@ -0,0 +1,13 @@
+var o1 = {
+ '\\\'': 42,
+ '\0\b\f\n\r\t\v\x42\u1234': 1234
+};
+var o2 = {
+ '\\\'\
+': 42,
+ '\0\b\f\n\r\t\v\x42\u1234': 1234
+};
+
+assertArrayEquals(Object.keys(o1), Object.keys(o2));
+assert.equal(42, o1['\\\'']);
+assert.equal(42, o2['\\\'']);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/UnicodeEscapeSequenceInName.js b/packages/babel-core/test/fixtures/traceur/Syntax/UnicodeEscapeSequenceInName.js
new file mode 100644
index 0000000000..9f2dd2d23a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/UnicodeEscapeSequenceInName.js
@@ -0,0 +1,5 @@
+var a\u0062c = 1;
+assert.equal(1, abc);
+
+var λ = 2;
+assert.equal(2, \u03bb);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/UseStrictEscapeSequence.js b/packages/babel-core/test/fixtures/traceur/Syntax/UseStrictEscapeSequence.js
new file mode 100644
index 0000000000..9ad36444d4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/UseStrictEscapeSequence.js
@@ -0,0 +1,7 @@
+function testUseStrictEscapeSequence() {
+ 'use str\x69ct';
+ return this;
+}
+
+assert.notEqual(testUseStrictEscapeSequence(), undefined);
+
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/UseStrictLineContinuation.js b/packages/babel-core/test/fixtures/traceur/Syntax/UseStrictLineContinuation.js
new file mode 100644
index 0000000000..c312bca40a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/UseStrictLineContinuation.js
@@ -0,0 +1,7 @@
+function testUseStrictLineContinuation() {
+ 'use \
+strict';
+ return this;
+}
+
+assert.notEqual(testUseStrictLineContinuation(), undefined);
diff --git a/packages/babel-core/test/fixtures/traceur/Syntax/null.js b/packages/babel-core/test/fixtures/traceur/Syntax/null.js
new file mode 100644
index 0000000000..ec747fa47d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Syntax/null.js
@@ -0,0 +1 @@
+null
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/CallExpression.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/CallExpression.js
new file mode 100644
index 0000000000..69ab401dba
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/CallExpression.js
@@ -0,0 +1,18 @@
+// Options: --block-binding
+
+{
+ let i = 0, called = 0;
+ function f() {
+ called++;
+ return function() {
+ return ++i;
+ };
+ }
+
+ assert.equal(1, f() `whatevs`);
+ assert.equal(1, called);
+ assert.equal(2, f `abc` `def`);
+ assert.equal(2, called);
+ assert.equal(3, f `ghi` ());
+ assert.equal(3, called);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/CommaExpression.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/CommaExpression.js
new file mode 100644
index 0000000000..c6749db6db
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/CommaExpression.js
@@ -0,0 +1,10 @@
+assert.equal('24', `${ 1, 2 }${ 3, 4 }`);
+assert.equal('6', `${ 5, 6 }`);
+
+function templateLiteralCommaTest(callsite, x, y) {
+ assert.equal(2, x);
+ assert.equal(4, y);
+ return x + y;
+}
+
+assert.equal(6, templateLiteralCommaTest`${ 1, 2 }${ 3, 4 }`);
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Default.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Default.js
new file mode 100644
index 0000000000..7b9326f29e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Default.js
@@ -0,0 +1,95 @@
+// Options: --block-binding
+
+assert.equal('', ``);
+assert.equal('a', `a`);
+assert.equal('"', `"`);
+assert.equal("'", `'`);
+assert.equal("`", `\``);
+assert.equal('"', `\"`);
+
+assert.equal('\\"', `\\"`);
+assert.equal('"\\', `"\\`);
+
+assert.equal('\n', `\n`);
+assert.equal('\r', `\r`);
+assert.equal('\r\n', `\r\n`);
+assert.equal('\t', `\t`);
+assert.equal('\u2028', `\u2028`);
+assert.equal('\u2029', `\u2029`);
+
+assert.equal('$', `$`);
+assert.equal('$ a', `$ a`);
+assert.equal('$ {a}', `$ {a}`);
+
+assert.equal('undefined', `${ undefined }`);
+assert.equal('null', `${ null }`);
+
+{
+ let $ = 'DOLLAR';
+ let $$ = 'DD'
+ assert.equal('$$', `$$`);
+ assert.equal('DOLLAR', `${$}`);
+ assert.equal('$$$', `$$$`);
+ assert.equal('DOLLARDOLLAR', `${$}${$}`);
+ assert.equal('DOLLAR$$', `${$}$$`);
+ assert.equal('$$DOLLAR', `$$${$}`);
+ assert.equal('$$$', `\$$$`);
+
+ let a = 'A';
+ let b = 'B';
+ assert.equal('aAbB', `a${a}b${b}`);
+ assert.equal('aAb$b', `a${a}b$b`);
+ assert.equal('$a.$b', `$a.$b`);
+
+ let x = 3;
+ let y = 5;
+
+ assert.equal('3 + 5 = 8', `${x} + ${y} = ${ x + y}`);
+
+ // nested
+ assert.equal('3 + 5 = 8', `${x} + ${ `${y} = ${ `${x + y}` }` }`);
+
+ assert.equal('3', `${x}`);
+ assert.equal(' 3', ` ${x}`);
+ assert.equal('3 ', `${x} `);
+ assert.equal('35', `${x}${y}`);
+ assert.equal(' 35', ` ${x}${y}`);
+ assert.equal('3 5', `${x} ${y}`);
+ assert.equal('35 ', `${x}${y} `);
+ assert.equal(' 3 5 ', ` ${x} ${y} `);
+
+ // def s(x):
+ // return ' ' if x else ''
+ // for i in range(16):
+ // v = (s(i&8), s(i&4), s(i&2), s(i&1))
+ // print "assert.equal('%s3%s5%s8%s', `%s${x}%s${y}%s${x+y}%s`);" % (v+v)
+ assert.equal('358', `${x}${y}${x+y}`);
+ assert.equal('358 ', `${x}${y}${x+y} `);
+ assert.equal('35 8', `${x}${y} ${x+y}`);
+ assert.equal('35 8 ', `${x}${y} ${x+y} `);
+ assert.equal('3 58', `${x} ${y}${x+y}`);
+ assert.equal('3 58 ', `${x} ${y}${x+y} `);
+ assert.equal('3 5 8', `${x} ${y} ${x+y}`);
+ assert.equal('3 5 8 ', `${x} ${y} ${x+y} `);
+ assert.equal(' 358', ` ${x}${y}${x+y}`);
+ assert.equal(' 358 ', ` ${x}${y}${x+y} `);
+ assert.equal(' 35 8', ` ${x}${y} ${x+y}`);
+ assert.equal(' 35 8 ', ` ${x}${y} ${x+y} `);
+ assert.equal(' 3 58', ` ${x} ${y}${x+y}`);
+ assert.equal(' 3 58 ', ` ${x} ${y}${x+y} `);
+ assert.equal(' 3 5 8', ` ${x} ${y} ${x+y}`);
+ assert.equal(' 3 5 8 ', ` ${x} ${y} ${x+y} `);
+}
+
+// Line continuations
+assert.equal('ab', `a\
+b`);
+assert.equal('ab', `a\
+\
+b`);
+
+assert.equal('\n', `
+`);
+assert.equal('\n\n', `
+
+`);
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_Disabled.js
new file mode 100644
index 0000000000..8d857e11fe
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_Disabled.js
@@ -0,0 +1,9 @@
+// Options: --template-literals=false
+// Error: :5:1: Unexpected token `
+// Error: :9:5: Unexpected token `
+
+`abc`;
+
+function tag() {}
+
+tag `def`;
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_InvalidSubstitution.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_InvalidSubstitution.js
new file mode 100644
index 0000000000..781d8d0298
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_InvalidSubstitution.js
@@ -0,0 +1,5 @@
+// Error: :6:1: Unterminated template literal
+
+function f() {}
+
+f`a${ `
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_InvalidSubstitution2.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_InvalidSubstitution2.js
new file mode 100644
index 0000000000..89df2eb6d3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_InvalidSubstitution2.js
@@ -0,0 +1,5 @@
+// Error: :5:7: Unexpected token }
+
+function f() {}
+
+f`a${ }`
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_NotClosed.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_NotClosed.js
new file mode 100644
index 0000000000..00acb1154a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Error_NotClosed.js
@@ -0,0 +1,5 @@
+// Error: :6:1: Unterminated template literal
+
+function f() {}
+
+f`not closed \`
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/InBlock.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/InBlock.js
new file mode 100644
index 0000000000..61e8073ac3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/InBlock.js
@@ -0,0 +1,9 @@
+// This just tests that we do not get any compile errors.
+
+{
+ `abc`
+}
+
+(function() {
+ `def`
+});
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/MemberExpression.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/MemberExpression.js
new file mode 100644
index 0000000000..dfa14f4661
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/MemberExpression.js
@@ -0,0 +1,25 @@
+// Options: --block-binding
+
+{
+ let a = [function() {
+ return 1;
+ }];
+
+ assert.equal(1, a[0] `whatevs`);
+
+ function f() {
+ return [function() {
+ return 2;
+ }];
+ }
+
+ assert.equal(2, f `abc` [0] `def`);
+
+ let o = {
+ g: function() {
+ return 3;
+ }
+ };
+
+ assert.equal(3, o.g `ghi`);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/NewExpression.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/NewExpression.js
new file mode 100644
index 0000000000..0f863428fa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/NewExpression.js
@@ -0,0 +1,44 @@
+// Options: --block-binding
+
+{
+ let i = 0, log = [];
+ this.logger = function(...e) {
+ log.push(e.join(' '));
+ }
+
+ // https://crbug.com/450942
+ assert.equal(typeof new Function`logger('a')`, 'object');
+ assert.deepEqual(log, ['a']);
+
+ log.length = 0;
+ function tag(...e) {
+ var text = e[0] && String.raw(...e);
+ if (this instanceof tag) {
+ log.push('new;' + text);
+ } else {
+ log.push('tag;' + text);
+ return tag;
+ }
+ }
+
+ assert.equal(typeof new tag`a``b``c`, 'object');
+ assert.deepEqual(log, [
+ 'tag;a',
+ 'tag;b',
+ 'tag;c',
+ 'new;undefined'
+ ]);
+
+ log.length = 0;
+ function C(cs) {
+ log.push(cs[0]);
+ if (this instanceof C) {
+ this.name = cs;
+ } else {
+ return C;
+ }
+ }
+
+ assert.deepEqual(new C`a``b``c`('test'), { name: 'test' });
+ assert.deepEqual(log, ['a', 'b', 'c', 't']);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Strict.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Strict.js
new file mode 100644
index 0000000000..6efd163ea7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Strict.js
@@ -0,0 +1,7 @@
+'use strict';
+
+function f(...args) {
+ return this;
+}
+
+assert.equal(undefined, f `a`);
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/StringRaw.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/StringRaw.js
new file mode 100644
index 0000000000..29a55675df
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/StringRaw.js
@@ -0,0 +1,10 @@
+assert.equal('', String.raw ``);
+assert.equal('\n', String.raw `
+`);
+assert.equal('\\n', String.raw `\n`);
+assert.equal('\\n42\\t', String.raw `\n${ 40 + 2 }\t`);
+assert.equal('\n42\t', String.raw `
+${42} `);
+assert.equal('\\\n42\\\n', String.raw `\
+${42}\
+`);
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Tag.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Tag.js
new file mode 100644
index 0000000000..727b8a8977
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/Tag.js
@@ -0,0 +1,87 @@
+// Options: --block-binding
+
+{
+ function expose(callSite, var_args) {
+ assert.isTrue(Array.isArray(callSite));
+ assert.isTrue(Object.isFrozen(callSite));
+ var rawDescr = Object.getOwnPropertyDescriptor(callSite, 'raw');
+ assert.isTrue(rawDescr !== undefined);
+ assert.isTrue('value' in rawDescr);
+ assert.isFalse(rawDescr.enumerable);
+ assert.isFalse(rawDescr.writable);
+ assert.isFalse(rawDescr.configurable);
+ assert.isTrue(Object.isFrozen(callSite.raw));
+ assert.isTrue(Array.isArray(callSite.raw));
+ assert.isTrue(Object.isFrozen(callSite.raw));
+ assert.equal(callSite.raw.length, callSite.length);
+
+ // The number of the literal portions is always same or one greater than the
+ // number of substitutions
+ var literalPortionCount = callSite.raw.length;
+ var substitutionCount = arguments.length - 1;
+ assert.isTrue(literalPortionCount == substitutionCount ||
+ literalPortionCount == substitutionCount + 1);
+
+ return arguments;
+ }
+
+ let x = 3;
+ let y = 5;
+
+ assert.equal(1, expose``.length);
+ assert.equal(1, expose`a`.length);
+ assert.equal(2, expose`a${x}`.length);
+ assert.equal(2, expose`a${x} b`.length);
+ assert.equal(3, expose`a${x} ${y}`.length);
+ assert.equal(3, expose`${x}${y}`.length);
+ assert.equal(2, expose`${x}a`.length);
+
+ assert.equal(1, expose``[0].length);
+ assert.equal(1, expose``[0].raw.length);
+
+ assertArrayEquals(['a'], expose`a`[0].raw);
+ assertArrayEquals(['a'], expose`a`[0]);
+
+ assertArrayEquals(['\\n'], expose`\n`[0].raw);
+ assertArrayEquals(['\n'], expose`\n`[0]);
+
+ assertArrayEquals(['\\r'], expose`\r`[0].raw);
+ assertArrayEquals(['\r'], expose`\r`[0]);
+
+ assertArrayEquals(['\\f'], expose`\f`[0].raw);
+ assertArrayEquals(['\f'], expose`\f`[0]);
+
+ assertArrayEquals(['\\b'], expose`\b`[0].raw);
+ assertArrayEquals(['\b'], expose`\b`[0]);
+
+ assertArrayEquals(['\\u2028'], expose`\u2028`[0].raw);
+ assertArrayEquals(['\u2028'], expose`\u2028`[0]);
+
+ assertArrayEquals(['\\u2029'], expose`\u2029`[0].raw);
+ assertArrayEquals(['\u2029'], expose`\u2029`[0]);
+
+ assertArrayEquals(['a', 'b'], expose`a${x}b`[0].raw);
+ assertArrayEquals(['a', 'b'], expose`a${x}b`[0]);
+
+ // These have tab characters in them.
+ assertArrayEquals(['\t', '\\t'], expose` ${x}\t`[0].raw);
+ assertArrayEquals(['\t', '\t'], expose` ${x}\t`[0]);
+
+ assertArrayEquals(['\n', '\\n'], expose`
+${x}\n`[0].raw);
+ assertArrayEquals(['\n', '\n'], expose`
+${x}\n`[0]);
+
+ // These contains the ES new line chars \u2028 and \u2029
+ assertArrayEquals(['\u2028', '\\u2028'], expose`
${x}\u2028`[0].raw);
+ assertArrayEquals(['\u2028', '\u2028'], expose`
${x}\u2028`[0]);
+
+ assertArrayEquals(['\u2029', '\\u2029'], expose`
${x}\u2029`[0].raw);
+ assertArrayEquals(['\u2029', '\u2029'], expose`
${x}\u2029`[0]);
+
+ assertArrayEquals(['a/*b*/c'], expose`a/*b*/c`[0].raw);
+ assertArrayEquals(['a/*b*/c'], expose`a/*b*/c`[0]);
+
+ assertArrayEquals(['a'], expose/* comment */`a`[0].raw);
+ assertArrayEquals(['a'], expose/* comment */`a`[0]);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/TemplateObjectCaching.module.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/TemplateObjectCaching.module.js
new file mode 100644
index 0000000000..e0d3b27225
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/TemplateObjectCaching.module.js
@@ -0,0 +1,17 @@
+import {cooked, raw} from './resources/template-objects.js';
+
+function assertCooked(obj) {
+ assert.equal(obj, cooked);
+ assert.notEqual(obj, raw);
+}
+
+function assertRaw(obj) {
+ assert.equal(obj, raw);
+ assert.notEqual(obj, cooked);
+}
+
+assertCooked `a${1}b`;
+assertCooked `a${2}b`;
+
+assertRaw `c${3}d\n`;
+assertRaw `c${4}d\n`;
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/f.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/f.js
new file mode 100644
index 0000000000..f78d33206e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/f.js
@@ -0,0 +1,3 @@
+export function f(...args) {
+ return args;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/m.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/m.js
new file mode 100644
index 0000000000..364751373a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/m.js
@@ -0,0 +1,3 @@
+import {f} from './f.js';
+
+assert.equal('a', (f `a`)[0][0]);
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/n.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/n.js
new file mode 100644
index 0000000000..108fed14bf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/n.js
@@ -0,0 +1,3 @@
+import {f} from './f.js';
+
+assert.equal('b', (f `b`)[0][0]);
diff --git a/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/template-objects.js b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/template-objects.js
new file mode 100644
index 0000000000..f7caefa37c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/TemplateLiterals/resources/template-objects.js
@@ -0,0 +1,13 @@
+export let cooked;
+export let raw;
+
+function setCooked(obj) {
+ cooked = obj;
+}
+
+function setRaw(obj) {
+ raw = obj;
+}
+
+setCooked `a${1}b`;
+setRaw `c${3}d\n`;
diff --git a/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_CodePointTooHigh.js b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_CodePointTooHigh.js
new file mode 100644
index 0000000000..cd46882d85
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_CodePointTooHigh.js
@@ -0,0 +1,4 @@
+// Options: --unicode-escape-sequences
+// Error: :4:5: The code point in a Unicode escape sequence cannot exceed 10FFFF
+
+"\u{1000000}";
diff --git a/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_Disabled.js
new file mode 100644
index 0000000000..1a36396b2a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_Disabled.js
@@ -0,0 +1,4 @@
+// Options: --unicode-escape-sequences=false
+// Error: :4:4: Hex digit expected
+
+"\u{0}";
diff --git a/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected.js b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected.js
new file mode 100644
index 0000000000..ccffc71d37
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected.js
@@ -0,0 +1,4 @@
+// Options: --unicode-escape-sequences
+// Error: :4:5: Hex digit expected
+
+"\u{";
diff --git a/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected2.js b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected2.js
new file mode 100644
index 0000000000..9ebfa1245c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected2.js
@@ -0,0 +1,4 @@
+// Options: --unicode-escape-sequences
+// Error: :4:5: Hex digit expected
+
+"\u{1";
diff --git a/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected3.js b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected3.js
new file mode 100644
index 0000000000..29efadfc29
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected3.js
@@ -0,0 +1,4 @@
+// Options: --unicode-escape-sequences
+// Error: :4:5: Hex digit expected
+
+"\u{
diff --git a/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected4.js b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected4.js
new file mode 100644
index 0000000000..1ac1390cf4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Error_HexDigitExpected4.js
@@ -0,0 +1,4 @@
+// Options: --unicode-escape-sequences
+// Error: :4:5: Hex digit expected
+
+"\u{}";
diff --git a/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Simple.js b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Simple.js
new file mode 100644
index 0000000000..fbc1c788a7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/UnicodeEscapeSequence/Simple.js
@@ -0,0 +1,15 @@
+// Options: --unicode-escape-sequences
+
+(function() {
+ assert.equal("\u{0}", "\u0000");
+ assert.equal("\u{000000001}", "\u0001");
+ assert.equal("\u{FFFF}", "\uFFFF");
+
+ assert.equal("\u{10000}", "\uD800\uDC00");
+ assert.equal("\u{10FFFF}", "\uDBFF\uDFFF");
+
+ assert.equal("\\u{1}", "\\u{1}");
+ assert.equal("\\\u{1}", "\\\u0001");
+
+ assert.equal("\U{1}", "\U{1}");
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Arguments.js b/packages/babel-core/test/fixtures/traceur/Yield/Arguments.js
new file mode 100644
index 0000000000..6e02361a44
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Arguments.js
@@ -0,0 +1,8 @@
+function* f() {
+ yield [arguments[0], arguments[1]];
+}
+
+for (var arr of f(1, 2)) {
+ assert.equal(1, arr[0]);
+ assert.equal(2, arr[1]);
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/BadIterable.js b/packages/babel-core/test/fixtures/traceur/Yield/BadIterable.js
new file mode 100644
index 0000000000..625aaf9b4a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/BadIterable.js
@@ -0,0 +1,44 @@
+function* wrap(generator) {
+ return yield *generator;
+}
+
+class BadIterable {
+ constructor() {
+ this.closed = false;
+ }
+
+ [Symbol.iterator]() {
+ return {
+ iterable: this,
+ next(v) {
+ return {value: 42, done: false};
+ },
+ // throw method missing
+ return(v) {
+ this.iterable.closed = true;
+ return {value: undefined, done: true};
+ }
+ };
+ }
+}
+
+var i1 = new BadIterable();
+var g1 = wrap(i1);
+assert.deepEqual(g1.next(), {value: 42, done: false});
+assert.throws(() => g1.throw('ex1'), TypeError);
+assert.isTrue(i1.closed);
+
+function* f2() {
+ try {
+ yield 1;
+ } finally {
+ f2.closed = true;
+ }
+}
+f2.closed = false;
+
+var g2 = wrap(f2());
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.throws(() => g2.throw('ex2'), 'ex2');
+assert.isTrue(f2.closed);
+
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/BinaryOperator.js b/packages/babel-core/test/fixtures/traceur/Yield/BinaryOperator.js
new file mode 100644
index 0000000000..49a63ff271
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/BinaryOperator.js
@@ -0,0 +1,9 @@
+function* f(x) {
+ var a = (yield x) + (yield x + 1);
+ return a;
+}
+
+var g = f(1);
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(1), {value: 2, done: false});
+assert.deepEqual(g.next(2), {value: 3, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Break.js b/packages/babel-core/test/fixtures/traceur/Yield/Break.js
new file mode 100644
index 0000000000..1fd1b2c46d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Break.js
@@ -0,0 +1,48 @@
+var x = ':';
+
+function* f() {
+ label1: {
+ x += 'a';
+ yield 1;
+ x += 'b'
+ while (true && true) {
+ break label1;
+ }
+ x += 'c';
+ }
+ x += 'd'
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assert.equal(x, ':abd');
+
+
+x = ':';
+
+function* f2() {
+ label1: {
+ x += 'a';
+ while(true) {
+ x += 'b';
+ label2: {
+ x += 'c';
+ yield 3;
+ x += 'd';
+ while (true) {
+ break label1;
+ }
+ x += 'e';
+ }
+ x += 'f';
+ }
+ x += 'g';
+ }
+ x += 'h';
+}
+
+g = f2();
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assert.equal(x, ':abcdh');
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/BreakForOf.js b/packages/babel-core/test/fixtures/traceur/Yield/BreakForOf.js
new file mode 100644
index 0000000000..98ecf6c99e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/BreakForOf.js
@@ -0,0 +1,54 @@
+var g, x;
+
+function* f() {
+ try {
+ yield 1;
+ yield 2;
+ } finally {
+ x = 42;
+ }
+}
+
+g = f();
+x = 0;
+
+for (let i of g) {
+ break;
+}
+
+assert.equal(x, 42);
+
+g = f();
+x = 10;
+
+(function () {
+ for (let i of g) {
+ return;
+ }
+}());
+
+assert.equal(x, 42);
+
+g = f();
+x = 20;
+
+label1:
+for (let i of g) {
+ if (i == 1) {
+ continue label1;
+ }
+ assert.equal(x, 20);
+}
+
+g = f();
+x = 30;
+
+label2:
+label3:
+for (let i of g) {
+ if (i == 1) {
+ continue label2;
+ }
+ assert.equal(x, 30);
+}
+
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/CommaOperator.js b/packages/babel-core/test/fixtures/traceur/Yield/CommaOperator.js
new file mode 100644
index 0000000000..1747a62dff
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/CommaOperator.js
@@ -0,0 +1,9 @@
+function* f(x, y) {
+ yield x, yield y;
+ return x + y;
+}
+
+var g = f(1, 2);
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(1), {value: 2, done: false});
+assert.deepEqual(g.next(2), {value: 3, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Continue.js b/packages/babel-core/test/fixtures/traceur/Yield/Continue.js
new file mode 100644
index 0000000000..61d392e093
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Continue.js
@@ -0,0 +1,18 @@
+var x = ':';
+
+function* f() {
+ yield 1;
+ var j = 0;
+ label1: for (var i = 0; i < 3; i++) {
+ x += 'i:' + i;
+ x += 'j:' + j;
+ if (j++ > 4) return;
+ continue label1;
+ x += 'x';
+ }
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assert.equal(x, ':i:0j:0i:1j:1i:2j:2');
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/DefaultArguments.js b/packages/babel-core/test/fixtures/traceur/Yield/DefaultArguments.js
new file mode 100644
index 0000000000..9a009aa806
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/DefaultArguments.js
@@ -0,0 +1,7 @@
+function* f(x = 1) {
+ yield x;
+}
+
+for (var x of f(42)) {
+ assert.equal(42, x);
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/DoGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/DoGenerator.js
new file mode 100644
index 0000000000..42f901fc00
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/DoGenerator.js
@@ -0,0 +1,19 @@
+function* doGenerator() {
+ var i = 0;
+ do {
+ if (++i % 2 == 0) continue;
+ yield i;
+ } while (i < 6);
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('135', accumulate(doGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/DoWhileStatementWithYield.js b/packages/babel-core/test/fixtures/traceur/Yield/DoWhileStatementWithYield.js
new file mode 100644
index 0000000000..967aba4264
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/DoWhileStatementWithYield.js
@@ -0,0 +1,33 @@
+function* f() {
+ var x = 0;
+ do {
+ yield x++;
+ } while (yield 'test');
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 0, done: false});
+assert.deepEqual(g.next(), {value: 'test', done: false});
+assert.deepEqual(g.next(true), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 'test', done: false});
+assert.deepEqual(g.next(true), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 'test', done: false});
+assert.deepEqual(g.next(false), {value: undefined, done: true});
+
+function* f2() {
+ var x = 0;
+ do {
+ yield x++;
+ } while ((yield 'a') || (yield 'b'));
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 0, done: false});
+assert.deepEqual(g2.next(), {value: 'a', done: false});
+assert.deepEqual(g2.next(true), {value: 1, done: false});
+assert.deepEqual(g2.next(), {value: 'a', done: false});
+assert.deepEqual(g2.next(false), {value: 'b', done: false});
+assert.deepEqual(g2.next(true), {value: 2, done: false});
+assert.deepEqual(g2.next(false), {value: 'a', done: false});
+assert.deepEqual(g2.next(false), {value: 'b', done: false});
+assert.deepEqual(g2.next(), {value: undefined, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/EmptyGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/EmptyGenerator.js
new file mode 100644
index 0000000000..0fd11a4e7a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/EmptyGenerator.js
@@ -0,0 +1,5 @@
+function* f() {
+}
+
+var g = f();
+assert.deepEqual(g.next(), {done: true, value: undefined});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Error_Disabled.js b/packages/babel-core/test/fixtures/traceur/Yield/Error_Disabled.js
new file mode 100644
index 0000000000..6add24ed19
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Error_Disabled.js
@@ -0,0 +1,8 @@
+// Options: --generators=false
+// Error: :4:9: Unexpected token *
+
+function* range(start, end) {
+ for (var i = start; i < end; i++) {
+ yield i;
+ }
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Error_Disabled2.js b/packages/babel-core/test/fixtures/traceur/Yield/Error_Disabled2.js
new file mode 100644
index 0000000000..303c0eb057
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Error_Disabled2.js
@@ -0,0 +1,7 @@
+// Options: --forOf=false
+// Error: :5:12: Unexpected token of
+
+var s = [];
+for (var i of yieldFor()) {
+ s.push(i);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Error_MissingStar.js b/packages/babel-core/test/fixtures/traceur/Yield/Error_MissingStar.js
new file mode 100644
index 0000000000..4023645a9e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Error_MissingStar.js
@@ -0,0 +1,5 @@
+// Error: :4:9: Semi-colon expected
+
+function simpleGenerator() {
+ yield 1;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Finally.js b/packages/babel-core/test/fixtures/traceur/Yield/Finally.js
new file mode 100644
index 0000000000..e4519b74f4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Finally.js
@@ -0,0 +1,22 @@
+var finallyVisited = false;
+
+function* test() {
+ try {
+ yield 42;
+ } finally {
+ finallyVisited = true;
+ }
+}
+
+var it = test();
+assert.deepEqual({value: 42, done: false}, it.next());
+assert.isFalse(finallyVisited);
+
+assert.deepEqual({value: undefined, done: true}, it.next());
+assert.isTrue(finallyVisited);
+
+finallyVisited = false;
+for (var i of test()) {
+ assert.equal(42, i);
+}
+assert.isTrue(finallyVisited);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForEmptyGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/ForEmptyGenerator.js
new file mode 100644
index 0000000000..760f40ad6a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForEmptyGenerator.js
@@ -0,0 +1,15 @@
+function* forEmptyGenerator() {
+ yield* [];
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('', accumulate(forEmptyGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/ForGenerator.js
new file mode 100644
index 0000000000..526e9e5e06
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForGenerator.js
@@ -0,0 +1,25 @@
+function* forGenerator() {
+ var a = 1, b = 1;
+ for (var i = 0; i < 4; i++) {
+ // TODO(jmesserly): this was changed until we get destructing
+ //[a, b] = [b, a + b];
+ var t0 = b;
+ var t1 = a + b;
+ a = t0;
+ b = t1;
+
+ yield a;
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('1235', accumulate(forGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator.js
new file mode 100644
index 0000000000..09b6a0f9c7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator.js
@@ -0,0 +1,27 @@
+function* forInGenerator() {
+ var object = {
+ a: 0,
+ b: 1,
+ c: 2
+ };
+ for (var key in object) {
+ if (key == 'a') {
+ delete object.b;
+ object.d = 3;
+ }
+ yield key;
+ yield object[key];
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('a0c2',accumulate(forInGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator2.js b/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator2.js
new file mode 100644
index 0000000000..47c3f9bcfd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator2.js
@@ -0,0 +1,28 @@
+function* forInGenerator2() {
+ var object = {
+ a: 0,
+ b: 1,
+ c: 2
+ };
+ var key;
+ for (key in object) {
+ if (key == 'a') {
+ delete object.b;
+ object.d = 3;
+ }
+ yield key;
+ yield object[key];
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('a0c2',accumulate(forInGenerator2()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator3.js b/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator3.js
new file mode 100644
index 0000000000..093158bc11
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForInGenerator3.js
@@ -0,0 +1,27 @@
+function* forInGenerator3() {
+ var object = {
+ a: 0,
+ b: {
+ c: 1,
+ },
+ d: 2
+ };
+ for (var key in object) {
+ yield key;
+ for (var key2 in object[key]) {
+ yield key2;
+ }
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('abcd',accumulate(forInGenerator3()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForLexicallyNestedGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/ForLexicallyNestedGenerator.js
new file mode 100644
index 0000000000..ec389c977c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForLexicallyNestedGenerator.js
@@ -0,0 +1,15 @@
+function* forLexicallyNestedGenerator() {
+ yield* (function*() { yield [1,2,3]; yield* [4,5,6]; })();
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('1,2,3456', accumulate(forLexicallyNestedGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForMissingParts.js b/packages/babel-core/test/fixtures/traceur/Yield/ForMissingParts.js
new file mode 100644
index 0000000000..6ea2941738
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForMissingParts.js
@@ -0,0 +1,95 @@
+function* f0() {
+ var x = 0;
+ for (;;) {
+ yield x++;
+ }
+}
+
+function* f1() {
+ var x = 0;
+ for (; ; 1) {
+ yield x++;
+ }
+}
+
+function* f2() {
+ var x = 0;
+ for (; 1; ) {
+ yield x++;
+ }
+}
+
+function* f3() {
+ var x = 0;
+ for (; 1; 1) {
+ yield x++;
+ }
+}
+
+function* f4() {
+ var x = 0;
+ for (1; ; ) {
+ yield x++;
+ }
+}
+
+function* f5() {
+ var x = 0;
+ for (1; ; 1) {
+ yield x++;
+ }
+}
+
+function* f6() {
+ var x = 0;
+ for (1; 1; ) {
+ yield x++;
+ }
+}
+
+function* f7() {
+ var x = 0;
+ for (1; 1; 1) {
+ yield x++;
+ }
+}
+
+var g0 = f0();
+assert.deepEqual(g0.next(), {value: 0, done: false});
+assert.deepEqual(g0.next(), {value: 1, done: false});
+assert.deepEqual(g0.next(), {value: 2, done: false});
+
+var g1 = f1();
+assert.deepEqual(g1.next(), {value: 0, done: false});
+assert.deepEqual(g1.next(), {value: 1, done: false});
+assert.deepEqual(g1.next(), {value: 2, done: false});
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 0, done: false});
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.next(), {value: 2, done: false});
+
+var g3 = f3();
+assert.deepEqual(g3.next(), {value: 0, done: false});
+assert.deepEqual(g3.next(), {value: 1, done: false});
+assert.deepEqual(g3.next(), {value: 2, done: false});
+
+var g4 = f4();
+assert.deepEqual(g4.next(), {value: 0, done: false});
+assert.deepEqual(g4.next(), {value: 1, done: false});
+assert.deepEqual(g4.next(), {value: 2, done: false});
+
+var g5 = f5();
+assert.deepEqual(g5.next(), {value: 0, done: false});
+assert.deepEqual(g5.next(), {value: 1, done: false});
+assert.deepEqual(g5.next(), {value: 2, done: false});
+
+var g6 = f6();
+assert.deepEqual(g6.next(), {value: 0, done: false});
+assert.deepEqual(g6.next(), {value: 1, done: false});
+assert.deepEqual(g6.next(), {value: 2, done: false});
+
+var g7 = f7();
+assert.deepEqual(g7.next(), {value: 0, done: false});
+assert.deepEqual(g7.next(), {value: 1, done: false});
+assert.deepEqual(g7.next(), {value: 2, done: false});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForOfGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/ForOfGenerator.js
new file mode 100644
index 0000000000..94def9e357
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForOfGenerator.js
@@ -0,0 +1,49 @@
+function* forEachGenerator() {
+ yield* forInGenerator3();
+ yield* forInGenerator2();
+}
+
+function* forInGenerator3() {
+ var object = {
+ a: 0,
+ b: {
+ c: 1,
+ },
+ d: 2
+ };
+ for (var key in object) {
+ yield key;
+ for (var key2 in object[key]) {
+ yield key2;
+ }
+ }
+}
+
+function* forInGenerator2() {
+ var object = {
+ a: 0,
+ b: 1,
+ c: 2
+ };
+ var key;
+ for (key in object) {
+ if (key == 'a') {
+ delete object.b;
+ object.d = 3;
+ }
+ yield key;
+ yield object[key];
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('abcda0c2', accumulate(forEachGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForOfIteratorException.js b/packages/babel-core/test/fixtures/traceur/Yield/ForOfIteratorException.js
new file mode 100644
index 0000000000..9d6c815e8f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForOfIteratorException.js
@@ -0,0 +1,27 @@
+class Iterable {
+ constructor() {
+ this.returnCalled = false;
+ }
+ [Symbol.iterator]() {
+ return {
+ iterable: this,
+ next(v) {
+ throw "ex";
+ },
+ throw(e) {
+ throw e;
+ },
+ return(v) {
+ this.iterable.returnCalled = true;
+ }
+ }
+ }
+}
+
+var iterable = new Iterable();
+var i;
+assert.throws(() => {
+ for (i of iterable) {
+ }
+}, "ex");
+assert.isFalse(iterable.returnCalled);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ForStatement.js b/packages/babel-core/test/fixtures/traceur/Yield/ForStatement.js
new file mode 100644
index 0000000000..08e2b1dbf5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ForStatement.js
@@ -0,0 +1,46 @@
+function* f() {
+ var x = 0;
+ for (yield 'init'; x < 3; x++) {
+ yield x;
+ }
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 'init', done: false});
+assert.deepEqual(g.next(), {value: 0, done: false});
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+
+function* f2() {
+ for (var x = 0; yield 'test'; x++) {
+ yield x;
+ }
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 'test', done: false});
+assert.deepEqual(g2.next(true), {value: 0, done: false});
+assert.deepEqual(g2.next(), {value: 'test', done: false});
+assert.deepEqual(g2.next(true), {value: 1, done: false});
+assert.deepEqual(g2.next(), {value: 'test', done: false});
+assert.deepEqual(g2.next(true), {value: 2, done: false});
+assert.deepEqual(g2.next(), {value: 'test', done: false});
+assert.deepEqual(g2.next(false), {value: undefined, done: true});
+
+function* f3() {
+ for (var x = 0; x < 5; x = yield 'inc') {
+ yield x;
+ }
+}
+
+var g3 = f3();
+assert.deepEqual(g3.next(), {value: 0, done: false});
+assert.deepEqual(g3.next(), {value: 'inc', done: false});
+assert.deepEqual(g3.next(2), {value: 2, done: false});
+assert.deepEqual(g3.next(), {value: 'inc', done: false});
+assert.deepEqual(g3.next(4), {value: 4, done: false});
+assert.deepEqual(g3.next(), {value: 'inc', done: false});
+assert.deepEqual(g3.next(1), {value: 1, done: false});
+assert.deepEqual(g3.next(), {value: 'inc', done: false});
+assert.deepEqual(g3.next(5), {value: undefined, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/FunctionDeclaration.js b/packages/babel-core/test/fixtures/traceur/Yield/FunctionDeclaration.js
new file mode 100644
index 0000000000..2d0893d277
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/FunctionDeclaration.js
@@ -0,0 +1,12 @@
+(function() {
+
+ function* f() {
+ function g() {
+ return 42;
+ }
+ yield g;
+ }
+
+ assert.equal(42, f().next().value());
+
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/GeneratorReturn.js b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorReturn.js
new file mode 100644
index 0000000000..b26d35f08e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorReturn.js
@@ -0,0 +1,86 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+//-----------------------------------------------------------------------------
+
+var g;
+
+function* G1() {
+ return 42;
+}
+
+function* G2() {
+ return;
+}
+
+function* G3() {
+ return undefined;
+}
+
+function* G4() {
+ return 42;
+ yield 1000;
+}
+
+function* G5() {
+ yield 1000;
+ return 42;
+}
+
+function* G6() {
+ try {
+ yield 1000;
+ return 42;
+ yield 2000;
+ } catch(e) {
+ return 43;
+ } finally {
+ // TODO: Is 'return' allowed inside 'finally'?
+ // return 44;
+ }
+}
+
+//----
+
+function id(G) {
+ return G;
+}
+
+function wrap(G) {
+ return function*() {
+ var r = yield* G();
+ return r;
+ };
+}
+
+//----
+
+var tests = [
+ [G1, [], 42],
+ [G2, [], undefined],
+ [G3, [], undefined],
+ [G4, [], 42],
+ [G5, [1000], 42],
+ [G6, [1000], 42]
+];
+
+//-----------------------------------------------------------------------------
+
+[id, wrap].forEach((W) => {
+
+ tests.forEach(([G, y, r]) => {
+ var g = W(G)();
+ y.forEach((x) => assert.deepEqual({value: x, done: false}, g.next()));
+
+ assert.deepEqual({value: r, done: true}, g.next());
+ assertClosed(g);
+ });
+
+ //----
+
+ g = W(G6)();
+ assert.deepEqual({value: 1000, done: false}, g.next());
+ assert.deepEqual({value: 43, done: true}, g.throw());
+
+});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/GeneratorSend.js b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorSend.js
new file mode 100644
index 0000000000..0c1dc743d7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorSend.js
@@ -0,0 +1,232 @@
+function assertThrownEquals(x, func) {
+ var actualError;
+ try {
+ func();
+ } catch (err) {
+ actualError = err;
+ }
+ assert.equal(x, actualError);
+}
+
+//-----------------------------------------------------------------------------
+
+function id(G) {
+ return G;
+}
+
+function wrap(G) {
+ return function* () {
+ yield* G();
+ };
+}
+
+[id, wrap].forEach((W) => { // wrap_forEach
+
+//-----------------------------------------------------------------------------
+//
+// http://wiki.ecmascript.org/doku.php?id=harmony:generators
+//
+// G.[[Send]]
+//
+// Let State = G.[[State]]
+// If State = “executing” Throw Error
+// If State = “closed” Throw Error
+// Let X be the first argument
+// If State = “newborn”
+// If X != undefined Throw TypeError
+// Let K = a new execution context as for a function call
+// K.currentGenerator := G
+// K.scopeChain := G.[[Scope]]
+// Push K onto the stack
+// Return Execute(G.[[Code]])
+// G.[[State]] := “executing”
+// Let Result = Resume(G.[[ExecutionContext]], normal, X)
+// Return Result
+
+var g;
+
+//-----------------------------------------------------------------------------
+//
+// If State = “executing” Throw Error
+
+function* G1() {
+ yield g.next();
+}
+
+g = W(G1)();
+// To be nitpicky, ionmonkey throws TypeError, and not Error. I'm not checking
+// things quite that closely at this point in time.
+assert.throw(() => g.next(), '"next" on executing generator');
+
+//-----------------------------------------------------------------------------
+//
+// If State = “closed” Throw Error
+
+// Note: ionmonkey continues to throw StopIteration for every 'next' on a
+// closed generator, while harmony:generators seems to favor throwing it once
+// only, at the point of generator exit, and throwing Error for all the
+// following 'next' calls.
+
+function* G2() {
+ yield 1;
+}
+
+var closeMethods = [
+ (g) => assertThrownEquals(42, () => g.throw(42)),
+ (g) => {
+ assert.deepEqual({value: 1, done: false}, g.next());
+ assert.deepEqual({value: undefined, done: true}, g.next());
+ }
+];
+
+closeMethods.forEach((closeMethod) => {
+ g = W(G2)();
+ closeMethod(g);
+ for (var i = 0; i < 8; i++) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+ }
+});
+
+//-----------------------------------------------------------------------------
+//
+// If State = “newborn”
+// If X != undefined Throw TypeError
+
+g = W(G2)();
+for (var i = 0; i < 8; i++) {
+ assert.throw(() => g.next(42), 'Sent value to newborn generator');
+}
+
+assert.deepEqual({value: 1, done: false}, g.next(undefined));
+
+
+//-----------------------------------------------------------------------------
+//
+// Let K = a new execution context as for a function call
+// K.currentGenerator := G
+// K.scopeChain := G.[[Scope]]
+// Push K onto the stack
+// Return Execute(G.[[Code]])
+
+// (see below)
+
+//-----------------------------------------------------------------------------
+//
+// G.[[State]] := “executing”
+// Let Result = Resume(G.[[ExecutionContext]], normal, X)
+// Return Result
+
+// (see below)
+
+//-----------------------------------------------------------------------------
+
+// Example adapted from:
+// https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Iterators_and_Generators
+function* fib() {
+ var fn1 = 1;
+ var fn2 = 1;
+ var reset;
+ while (1) {
+ var current = fn2;
+ fn2 = fn1;
+ fn1 = fn1 + current;
+ reset = yield current;
+ if (reset) {
+ fn1 = 1;
+ fn2 = 1;
+ }
+ }
+}
+
+// var
+function* fibVar() {
+ var fn1 = 1;
+ var fn2 = 1;
+ while (1) {
+ var current = fn2;
+ fn2 = fn1;
+ fn1 = fn1 + current;
+ var reset = yield current;
+ if (reset) {
+ fn1 = 1;
+ fn2 = 1;
+ }
+ }
+}
+
+// destructuring
+function* fibD() {
+ var fn1 = 1;
+ var fn2 = 1;
+ var reset;
+ var tmp;
+ while (1) {
+ var current = fn2;
+ fn2 = fn1;
+ fn1 = fn1 + current;
+ [reset, tmp] = yield current;
+ assert.equal(reset, tmp);
+ if (reset) {
+ fn1 = 1;
+ fn2 = 1;
+ }
+ }
+}
+
+// destructuring with var
+function* fibVarD() {
+ var fn1 = 1;
+ var fn2 = 1;
+ var tmp;
+ while (1) {
+ var current = fn2;
+ fn2 = fn1;
+ fn1 = fn1 + current;
+ var [reset, tmp] = yield current;
+ assert.equal(reset, tmp);
+ if (reset) {
+ fn1 = 1;
+ fn2 = 1;
+ }
+ }
+}
+
+function next(g) {
+ return g.next();
+}
+
+function send(g, v) {
+ return g.next(v);
+}
+
+function nextD(g) {
+ return g.next([]);
+}
+
+function sendD(g, v) {
+ return g.next([v, v]);
+}
+
+function testfib(fibonacci, next, send) {
+ var sequence = fibonacci();
+ assert.deepEqual({value: 1, done: false}, sequence.next());
+ assert.deepEqual({value: 1, done: false}, next(sequence));
+ assert.deepEqual({value: 2, done: false}, next(sequence));
+ assert.deepEqual({value: 3, done: false}, next(sequence));
+ assert.deepEqual({value: 5, done: false}, next(sequence));
+ assert.deepEqual({value: 8, done: false}, next(sequence));
+ assert.deepEqual({value: 13, done: false}, next(sequence));
+ assert.deepEqual({value: 1, done: false}, send(sequence, true));
+ assert.deepEqual({value: 1, done: false}, next(sequence));
+ assert.deepEqual({value: 2, done: false}, next(sequence));
+ assert.deepEqual({value: 3, done: false}, next(sequence));
+}
+
+//----
+
+testfib(W(fib), next, send);
+testfib(W(fibVar), next, send);
+testfib(W(fibD), nextD, sendD);
+testfib(W(fibVarD), nextD, sendD);
+
+}); // end wrap_forEach
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/GeneratorThrow.js b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorThrow.js
new file mode 100644
index 0000000000..e84edf95cc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorThrow.js
@@ -0,0 +1,153 @@
+function assertThrownEquals(x, func) {
+ var actualError;
+ try {
+ func();
+ } catch (err) {
+ actualError = err;
+ }
+ assert.equal(x, actualError);
+}
+
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+//-----------------------------------------------------------------------------
+
+function id(G) {
+ return G;
+}
+
+function wrap(G) {
+ return function* () {
+ yield* G();
+ };
+}
+
+[id, wrap].forEach((W) => { // wrap_forEach
+
+//-----------------------------------------------------------------------------
+//
+// http://wiki.ecmascript.org/doku.php?id=harmony:generators
+//
+// G.[[Throw]]
+//
+// Let State = G.[[State]]
+// If State = “executing” Throw Error
+// If State = “closed” Throw Error
+// Let X be the first argument
+// If State = “newborn”
+// G.[[State]] := “closed”
+// G.[[Code]] := null
+// Return (throw, X, null)
+// G.[[State]] := “executing”
+// Let Result = Resume(G.[[ExecutionContext]], throw, X)
+// Return Result
+
+var g;
+
+//-----------------------------------------------------------------------------
+//
+// If State = “executing” Throw Error
+
+function* G1() {
+ yield g.throw();
+}
+g = W(G1)();
+assert.throw(() => g.next(), '"throw" on executing generator');
+
+//-----------------------------------------------------------------------------
+//
+// If State = “closed” Throw Error
+
+function* G2() {
+ try {
+ yield 1;
+ yield 2;
+ } catch(e) {
+ yield '(' + e + ')';
+ }
+ yield 3;
+}
+
+// - calling throw() on a closed generator should throw an Error.
+// - calling throw() on an ended generator should throw an Error.
+// (this is the same as closed, really)
+
+var closeMethods = [
+ (g) => {
+ assert.deepEqual({value: 1, done: false}, g.next());
+ assert.deepEqual({value: '(22)', done: false}, g.throw(22));
+ assert.deepEqual({value: 3, done: false}, g.next());
+ assertThrownEquals(42, () => g.throw(42));
+ },
+ (g) => {
+ assert.deepEqual({value: 1, done: false}, g.next());
+ assert.deepEqual({value: 2, done: false}, g.next());
+ assert.deepEqual({value: 3, done: false}, g.next());
+ assert.deepEqual({value: undefined, done: true}, g.next());
+ }
+];
+
+closeMethods.forEach((closeMethod) => {
+ g = W(G2)();
+ closeMethod(g);
+ for (var i = 0; i < 8; i++) {
+ assertThrownEquals(44, () => g.throw(44));
+ }
+});
+
+//-----------------------------------------------------------------------------
+//
+// Let X be the first argument
+// If State = “newborn”
+// G.[[State]] := “closed”
+// G.[[Code]] := null
+// Return (throw, X, null)
+
+g = W(G2)();
+
+// calling throw(x) on a newborn generator should close the generator, and
+// throw x back to the caller.
+assertThrownEquals(44, () => g.throw(44));
+assertClosed(g);
+
+//-----------------------------------------------------------------------------
+//
+// G.[[State]] := “executing”
+// Let Result = Resume(G.[[ExecutionContext]], throw, X)
+// Return Result
+
+g = W(G2)();
+
+// calling throw(x) on a started generator should be the same as hot-replacing
+// the last 'yield' with a 'throw x' and calling next() on that generator. So
+// it could either throw an exception, or return a value, depending on the
+// flow of control.
+assert.deepEqual({value: 1, done: false}, g.next());
+assert.deepEqual({value: '(22)', done: false}, g.throw(22));
+assert.deepEqual({value: 3, done: false}, g.next());
+
+assertThrownEquals(44, () => g.throw(44));
+assertClosed(g);
+
+//----
+
+function* G3() {
+ try{
+ yield 1;
+ yield 2;
+ yield 3;
+ } catch(e) {}
+}
+
+g = W(G3)();
+
+// Note: this behavior differs from ionmonkey, which throws 'undefined', and
+// not StopIteration, but the StopIteration behavior better matches what I'd
+// expect, given the description from the previous test.
+assert.deepEqual({value: 1, done: false}, g.next());
+assert.deepEqual({value: undefined, done: true}, g.throw(44));
+assertClosed(g);
+
+}); // end wrap_forEach
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/GeneratorWithoutYieldOrReturn.js b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorWithoutYieldOrReturn.js
new file mode 100644
index 0000000000..ebfaf68da9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/GeneratorWithoutYieldOrReturn.js
@@ -0,0 +1,10 @@
+var x = 0;
+
+function* f() {
+ x++;
+}
+
+var g = f();
+assert.equal(x, 0);
+assert.deepEqual(g.next(), {done: true, value: undefined});
+assert.equal(x, 1);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Hoisting.js b/packages/babel-core/test/fixtures/traceur/Yield/Hoisting.js
new file mode 100644
index 0000000000..5ccad05058
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Hoisting.js
@@ -0,0 +1,13 @@
+// f is declared at the end to test hoisting.
+
+var g = f();
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+
+function* f() {
+ yield 1;
+}
+
+function* f() {
+ yield 2;
+}
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/HoistingBlockbinding.js b/packages/babel-core/test/fixtures/traceur/Yield/HoistingBlockbinding.js
new file mode 100644
index 0000000000..ffe0ac320c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/HoistingBlockbinding.js
@@ -0,0 +1,21 @@
+// Options: --block-binding
+
+{
+ function* f() {
+ yield 1;
+ }
+
+ let g = f();
+ assert.deepEqual(g.next(), {value: 1, done: false});
+ assert.deepEqual(g.next(), {value: undefined, done: true});
+}
+
+{
+ function* f() {
+ yield 1;
+ }
+
+ let g = f();
+ assert.deepEqual(g.next(), {value: 1, done: false});
+ assert.deepEqual(g.next(), {value: undefined, done: true});
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/IfGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/IfGenerator.js
new file mode 100644
index 0000000000..43758965b3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/IfGenerator.js
@@ -0,0 +1,26 @@
+function* ifGenerator(condition) {
+ if (condition) {
+ yield 1;
+ }
+ if (!condition) {
+ yield 2;
+ }
+ if (condition) {
+ yield 3;
+ } else {
+ yield 4;
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('13', accumulate(ifGenerator(true)));
+assert.equal('24', accumulate(ifGenerator(false)));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/IfStatementWithYield.js b/packages/babel-core/test/fixtures/traceur/Yield/IfStatementWithYield.js
new file mode 100644
index 0000000000..f5b5a8a192
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/IfStatementWithYield.js
@@ -0,0 +1,14 @@
+function* f(x) {
+ if (yield x) {
+ return 2;
+ }
+ return 3;
+}
+
+var g = f(1);
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(true), {value: 2, done: true});
+
+g = f(4);
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(false), {value: 3, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/LabelledBlockGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/LabelledBlockGenerator.js
new file mode 100644
index 0000000000..c79897f816
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/LabelledBlockGenerator.js
@@ -0,0 +1,20 @@
+var i = 0;
+var s = '';
+
+function* f() {
+ s += 'a';
+ while(i++ < 3) {
+ s += 'b';
+ label1: {
+ s += 'c';
+ break label1;
+ s += 'd';
+ }
+ s += 'e';
+ }
+ s += 'f';
+}
+
+var g = f();
+g.next();
+assert.equal(s, 'abcebcebcef');
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/LabelledBreakGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/LabelledBreakGenerator.js
new file mode 100644
index 0000000000..c656461fb4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/LabelledBreakGenerator.js
@@ -0,0 +1,34 @@
+function* labelledBreakGenerator() {
+ var x = 1;
+ var y = 2;
+label:
+ while (true) {
+ x++;
+ while (true) {
+ yield x * y;
+ y++;
+ if (y == 3) {
+ continue label;
+ }
+ yield x * y * 5;
+ if (y == 4) {
+ break label;
+ }
+ yield x * y * 13;
+ }
+ yield x * y * 11;
+ }
+ yield x * y * 7;
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result += String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('496084', accumulate(labelledBreakGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/MapFilterGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/MapFilterGenerator.js
new file mode 100644
index 0000000000..5ae3d9bb52
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/MapFilterGenerator.js
@@ -0,0 +1,31 @@
+function mapFilterGenerator() {
+ function* map(list, fun) {
+ for (var item of list) {
+ yield fun(item);
+ }
+ }
+ function* filter(list, fun) {
+ for (var item of list) {
+ if (fun(item)) {
+ yield item;
+ }
+ }
+ }
+ // squares even numbers. no intermediate array is created.
+ var numbers = [1,2,3,4,5,6,7,8,9,10];
+ return map(
+ filter(numbers, function(x) { return x % 2 == 0; }),
+ function(x) { return (x * x) + ','; });
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('4,16,36,64,100,', accumulate(mapFilterGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ObjectModel.js b/packages/babel-core/test/fixtures/traceur/Yield/ObjectModel.js
new file mode 100644
index 0000000000..60638f6bf4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ObjectModel.js
@@ -0,0 +1,41 @@
+// f is declared at the end to test hoisting.
+
+var GeneratorFunctionPrototype = f.__proto__;
+var GeneratorFunction = GeneratorFunctionPrototype.constructor;
+
+assert.equal(GeneratorFunction.name, 'GeneratorFunction');
+assert.equal(GeneratorFunction.prototype, GeneratorFunctionPrototype);
+assert.equal(GeneratorFunctionPrototype.prototype.constructor,
+ GeneratorFunctionPrototype);
+assert.equal(GeneratorFunctionPrototype.prototype, f.prototype.__proto__);
+assert.equal(GeneratorFunctionPrototype.__proto__, Function.prototype);
+
+var g = f();
+assert.instanceOf(g, f);
+
+assert.equal(g.__proto__, f.prototype);
+
+assert.deepEqual([], Object.getOwnPropertyNames(f.prototype));
+assert.deepEqual([], Object.getOwnPropertyNames(g));
+
+f.prototype.x = 42;
+
+var g2 = f();
+assert.equal(g2.x, 42);
+
+var g3 = new f();
+assert.equal(g3.x, 42);
+
+function* f2() {
+ yield 1;
+}
+
+assert.equal(f.__proto__, f2.__proto__);
+
+assert.isFalse(f.hasOwnProperty('constructor'));
+assert.equal(f.__proto__.constructor.name, 'GeneratorFunction');
+
+// Intentionally at the end to test hoisting.
+function* f() {
+ yield this;
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/OverrideGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/OverrideGenerator.js
new file mode 100644
index 0000000000..a897f02322
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/OverrideGenerator.js
@@ -0,0 +1,14 @@
+function* f() {
+ yield 1;
+}
+
+var f2 = f;
+
+f = 42;
+
+var g = f2();
+
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+
+assert.instanceOf(g, f2);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ReturnCatch.js b/packages/babel-core/test/fixtures/traceur/Yield/ReturnCatch.js
new file mode 100644
index 0000000000..163fa4c2cc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ReturnCatch.js
@@ -0,0 +1,16 @@
+function* f () {
+ try {
+ yield 1;
+ } catch (e) {
+ f.x = 2;
+ } finally {
+ f.y = 3;
+ }
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.return(3), {value: 3, done: true});
+assert.equal(f.x, undefined);
+assert.equal(f.y, 3);
+
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ReturnGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/ReturnGenerator.js
new file mode 100644
index 0000000000..7c7d676868
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ReturnGenerator.js
@@ -0,0 +1,227 @@
+function* f1() {
+ yield 1;
+ yield 2;
+}
+
+var g1 = f1();
+assert.deepEqual(g1.next(), {value: 1, done: false});
+assert.deepEqual(g1.return(42), {value: 42, done: true});
+assert.deepEqual(g1.next(), {value: undefined, done: true});
+
+function* f2() {
+ yield 1;
+ try {
+ yield 2;
+ } catch (e) {
+ return 3;
+ }
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.return(42), {value: 42, done: true});
+assert.deepEqual(g2.next(), {value: undefined, done: true});
+
+function* f3() {
+ try {
+ yield 1;
+ } finally {
+ yield 2;
+ }
+}
+
+var g3 = f3();
+assert.deepEqual(g3.next(), {value: 1, done: false});
+assert.deepEqual(g3.return(42), {value: 2, done: false});
+assert.deepEqual(g3.next(), {value: 42, done: true});
+assert.deepEqual(g3.next(), {value: undefined, done: true});
+
+function* f4() {
+ var x = 9;
+ function *g() {
+ try {
+ yield 1;
+ yield 2;
+ } finally {
+ x = 10;
+ }
+ }
+ try {
+ yield* g();
+ } finally {
+ yield x;
+ }
+}
+
+var g4 = f4();
+assert.deepEqual(g4.next(), {value: 1, done: false});
+assert.deepEqual(g4.return(42), {value: 10, done: false});
+assert.deepEqual(g4.next(), {value: 42, done: true});
+assert.deepEqual(g4.next(), {value: undefined, done: true});
+
+function* f5() {
+ try {
+ yield 1;
+ } finally {
+ return 2;
+ }
+}
+
+var g5 = f5();
+assert.deepEqual(g5.next(), {value: 1, done: false});
+assert.deepEqual(g5.return(42), {value: 2, done: true});
+assert.deepEqual(g5.next(), {value: undefined, done: true});
+
+function* f6() {
+ yield 1;
+}
+
+var g6 = f6();
+assert.deepEqual(g6.return(42), {value: 42, done: true});
+assert.deepEqual(g6.next(), {value: undefined, done: true});
+
+function* f7() {
+ return 1;
+}
+
+var g7 = f7();
+assert.deepEqual(g7.next(), {value: 1, done: true});
+assert.deepEqual(g7.next(), {value: undefined, done: true});
+assert.deepEqual(g7.return(42), {value: 42, done: true});
+assert.deepEqual(g7.next(), {value: undefined, done: true});
+
+function* f8() {
+ function* g() {
+ try {
+ yield 1;
+ yield 2;
+ } finally {
+ return 10;
+ }
+ }
+ yield* g();
+}
+
+var g8 = f8();
+assert.deepEqual(g8.next(), {value: 1, done: false});
+assert.deepEqual(g8.return(42), {value: 10, done: true});
+assert.deepEqual(g8.next(), {value: undefined, done: true});
+
+function* f9() {
+ function* g() {
+ try {
+ yield 1;
+ yield 2;
+ } finally {
+ yield 3;
+ }
+ }
+ yield* g();
+}
+
+var g9 = f9();
+assert.deepEqual(g9.next(), {value: 1, done: false});
+assert.deepEqual(g9.return(142), {value: 3, done: false});
+assert.deepEqual(g9.next(), {value: undefined, done: true});
+
+function* f10() {
+ try {
+ try {
+ yield 1;
+ }
+ finally {
+ try {
+ throw 2;
+ } catch (e) {
+ }
+ }
+ return 3;
+ } finally {
+ return 4;
+ }
+}
+
+var g10 = f10();
+assert.deepEqual(g10.next(), {value: 1, done: false});
+assert.deepEqual(g10.return(42), {value: 4, done: true});
+assert.deepEqual(g10.next(), {value: undefined, done: true});
+
+function* f11() {
+ function* g() {
+ try {
+ yield 1;
+ yield 2;
+ } finally {
+ yield 3333;
+ f11.x = 10;
+ yield 4;
+ }
+ }
+ yield* g();
+ yield 5;
+}
+
+var g11 = f11();
+assert.deepEqual(g11.next(), {value: 1, done: false});
+assert.deepEqual(g11.return(42), {value: 3333, done: false});
+assert.deepEqual(g11.next(), {value: 4, done: false});
+assert.deepEqual(g11.next(), {value: 5, done: false});
+assert.deepEqual(g11.next(), {value: undefined, done: true});
+assert.equal(f11.x, 10);
+
+
+function* f12() {
+ try {
+ return 'apple';
+ } finally {
+ yield 'orange';
+ }
+}
+var g12 = f12();
+assert.deepEqual(g12.next(), {value: 'orange', done: false});
+assert.deepEqual(g12.next(), {value: 'apple', done: true});
+
+function* f13() {
+ function* f() {
+ try {
+ yield 'pear';
+ } finally {
+ yield 'strawberry';
+ }
+ }
+ try {
+ return 'cherry';
+ } finally {
+ f13.x = yield* f();
+ yield 'banana';
+ }
+}
+var g13 = f13();
+assert.deepEqual(g13.next(), {value: 'pear', done: false});
+assert.deepEqual(g13.return('peach'), {value: 'strawberry', done: false});
+assert.deepEqual(g13.next(), {value: 'banana', done: false});
+assert.deepEqual(g13.next(), {value: 'cherry', done: true});
+assert.equal(f13.x, 'peach');
+
+function* f14() {
+ function* g() {
+ try {
+ yield 11;
+ yield 22;
+ } finally {
+ yield 33;
+ f14.x = 44;
+ yield 55;
+ }
+ }
+ return yield* g();
+}
+
+var g14 = f14();
+assert.deepEqual(g14.next(), {value: 11, done: false});
+assert.deepEqual(g14.return(43), {value: 33, done: false});
+assert.deepEqual(g14.next(), {value: 55, done: false});
+assert.equal(f14.x, 44);
+assert.deepEqual(g14.next(), {value: 43, done: true});
+assert.deepEqual(g14.next(), {value: undefined, done: true});
+
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ReturnInFinally.js b/packages/babel-core/test/fixtures/traceur/Yield/ReturnInFinally.js
new file mode 100644
index 0000000000..fac9cb49db
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ReturnInFinally.js
@@ -0,0 +1,33 @@
+function* f() {
+ try {
+ yield 1;
+ } finally {
+ return 2;
+ }
+ yield 3;
+ return 4;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: true});
+
+function* f2() {
+ try {
+ yield 1
+ } catch (ex) {
+ yield ex;
+ } finally {
+ return 2;
+ }
+ yield 3;
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.next(), {value: 2, done: true});
+
+g2 = f2();
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.throw(42), {value: 42, done: false});
+assert.deepEqual(g2.next(), {value: 2, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ReturnYield.js b/packages/babel-core/test/fixtures/traceur/Yield/ReturnYield.js
new file mode 100644
index 0000000000..a349833743
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ReturnYield.js
@@ -0,0 +1,55 @@
+function* f() {
+ return yield 1;
+}
+
+var g = f();
+
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(2), {value: 2, done: true});
+function* f2() {
+ return (yield 3) + (yield 4);
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 3, done: false});
+assert.deepEqual(g2.next(5), {value: 4, done: false});
+assert.deepEqual(g2.next(6), {value: 11, done: true});
+
+
+function* f3() {
+ return (yield 7) || (yield 8);
+}
+
+var g3 = f3();
+assert.deepEqual(g3.next(), {value: 7, done: false});
+assert.deepEqual(g3.next(9), {value: 9, done: true});
+
+g3 = f3();
+assert.deepEqual(g3.next(), {value: 7, done: false});
+assert.deepEqual(g3.next(0), {value: 8, done: false});
+assert.deepEqual(g3.next(10), {value: 10, done: true});
+
+function* f4() {
+ return (yield 11) && (yield 12);
+}
+
+var g4 = f4();
+assert.deepEqual(g4.next(), {value: 11, done: false});
+assert.deepEqual(g4.next(0), {value: 0, done: true});
+g4 = f4();
+assert.deepEqual(g4.next(), {value: 11, done: false});
+assert.deepEqual(g4.next(13), {value: 12, done: false});
+assert.deepEqual(g4.next(14), {value: 14, done: true});
+
+function* f5() {
+ return (yield 15) ? (yield 16) : (yield 17);
+}
+
+var g5 = f5();
+assert.deepEqual(g5.next(), {value: 15, done: false});
+assert.deepEqual(g5.next(true), {value: 16, done: false});
+assert.deepEqual(g5.next(18), {value: 18, done: true});
+g5 = f5();
+assert.deepEqual(g5.next(), {value: 15, done: false});
+assert.deepEqual(g5.next(false), {value: 17, done: false});
+assert.deepEqual(g5.next(19), {value: 19, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ReturnYieldFor.js b/packages/babel-core/test/fixtures/traceur/Yield/ReturnYieldFor.js
new file mode 100644
index 0000000000..1448be3e23
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ReturnYieldFor.js
@@ -0,0 +1,15 @@
+function* f() {
+ return yield* h();
+}
+
+function* h() {
+ yield 111;
+ yield 222;
+ return 333;
+}
+
+var g = f();
+
+assert.deepEqual({value: 111, done: false}, g.next());
+assert.deepEqual({value: 222, done: false}, g.next());
+assert.deepEqual({value: 333, done: true}, g.next());
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/SequenceGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/SequenceGenerator.js
new file mode 100644
index 0000000000..d895985767
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/SequenceGenerator.js
@@ -0,0 +1,23 @@
+function* sequenceGenerator() {
+ var i = 1;
+ yield i;
+ i = 3;
+ yield i + 1;
+ {
+ var x = 3;
+ yield i + x;
+ yield x;
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('1463', accumulate(sequenceGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/SimpleGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/SimpleGenerator.js
new file mode 100644
index 0000000000..b865e12f0c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/SimpleGenerator.js
@@ -0,0 +1,15 @@
+function* simpleGenerator() {
+ yield 1;
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('1', accumulate(simpleGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/StatementTestGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/StatementTestGenerator.js
new file mode 100644
index 0000000000..74105b412c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/StatementTestGenerator.js
@@ -0,0 +1,37 @@
+// Options: --block-binding
+
+function* statementTestGenerator() {
+ // all of these statement constructs should be allowed
+ // provided that they contain no yield statements
+ switch (1) {
+ case 2: break;
+ default: break;
+ }
+ try {
+ } catch (e) {}
+ try {
+ } finally {}
+ do {} while (false);
+ for (;false;) {}
+
+ //TODO(jmesserly): this had to be changed to "var" until we get BlockBindingTransformer
+ //for (let x in {}) {}
+ //for (let x of simpleGenerator()) {}
+ for (var x in {}) {}
+ for (var x of simpleGenerator()) {}
+
+ if (false) {} else {}
+ //TODO(jmesserly): this had to be changed to "var" until we get BlockBindingTransformer
+ //{ let x = 1; }
+ { var x = 1; }
+ { const y = 2; }
+
+ yield 1;
+}
+
+
+function* simpleGenerator() {
+ yield 1;
+}
+
+// ----------------------------------------------------------------------------
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/SwitchGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/SwitchGenerator.js
new file mode 100644
index 0000000000..c516ec0131
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/SwitchGenerator.js
@@ -0,0 +1,37 @@
+function* switchGenerator(val) {
+ switch (val) {
+ case 1:
+ yield val;
+ case 2:
+ yield val * 2;
+ break;
+ case 3:
+ break;
+ default:
+ yield val * 10;
+ }
+
+ // switch without a default
+ switch (val) {
+ case 1000:
+ yield val;
+ break;
+ }
+ yield val * 5;
+}
+
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('125', accumulate(switchGenerator(1)));
+assert.equal('410', accumulate(switchGenerator(2)));
+assert.equal('15', accumulate(switchGenerator(3)));
+assert.equal('4020', accumulate(switchGenerator(4)));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/SwitchStatementWithYield.js b/packages/babel-core/test/fixtures/traceur/Yield/SwitchStatementWithYield.js
new file mode 100644
index 0000000000..12affe930e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/SwitchStatementWithYield.js
@@ -0,0 +1,23 @@
+function* f(x) {
+ switch (yield x) {
+ case 1:
+ return 1;
+ case 2:
+ return 2;
+ default:
+ return 3;
+ }
+ throw new Error('Unreachable');
+}
+
+var g = f(1);
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(2), {value: 2, done: true});
+
+g = f(3);
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(1), {value: 1, done: true});
+
+var g = f(4);
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(55), {value: 3, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/This.js b/packages/babel-core/test/fixtures/traceur/Yield/This.js
new file mode 100644
index 0000000000..b17bea2b69
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/This.js
@@ -0,0 +1,8 @@
+function* f() {
+ yield this;
+}
+
+var o = {};
+for (var x of f.call(o)) {
+ assert.equal(o, x);
+}
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ThrowInCatch.js b/packages/babel-core/test/fixtures/traceur/Yield/ThrowInCatch.js
new file mode 100644
index 0000000000..db2b1773b1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ThrowInCatch.js
@@ -0,0 +1,15 @@
+function* f() {
+ try {
+ yield 1;
+ throw 'caught';
+ } catch (e) {
+ throw 'ex';
+ } finally {
+ f.x = 2;
+ }
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.next(), 'ex');
+assert.equal(f.x, 2);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/ThrowInIterator.js b/packages/babel-core/test/fixtures/traceur/Yield/ThrowInIterator.js
new file mode 100644
index 0000000000..618fcebba4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/ThrowInIterator.js
@@ -0,0 +1,34 @@
+function* f() {
+ yield 1;
+ yield 2;
+ yield 3;
+}
+
+function* f1() {
+ try {
+ yield* [4, 5, 6];
+ } catch (ex) {
+ if (ex instanceof TypeError) {
+ yield 10;
+ }
+ }
+}
+
+var g1 = f1();
+assert.deepEqual(g1.next(), {value: 4, done: false});
+assert.deepEqual(g1.throw(42), {value: 10, done: false});
+assert.deepEqual(g1.next(), {value: undefined, done: true});
+
+function* f2() {
+ try {
+ yield* f();
+ } catch (ex) {
+ yield ex;
+ }
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.throw(42), {value: 42, done: false});
+assert.deepEqual(g2.next(), {value: undefined, done: true});
+
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Tree.js b/packages/babel-core/test/fixtures/traceur/Yield/Tree.js
new file mode 100644
index 0000000000..6866802364
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Tree.js
@@ -0,0 +1,73 @@
+// A binary tree class.
+class Tree {
+ constructor(label, left, right) {
+ this.label = label;
+ this.left = left;
+ this.right = right;
+ }
+ *[Symbol.iterator]() {
+ if (this.left) {
+ yield* this.left;
+ }
+ yield this.label;
+ if (this.right) {
+ yield* this.right;
+ }
+ }
+}
+
+// Create a Tree from a list.
+function tree(list) {
+ var n = list.length;
+ if (n == 0) {
+ return null;
+ }
+ var i = Math.floor(n / 2);
+ return new Tree(list[i], tree(list.slice(0, i)), tree(list.slice(i + 1)));
+}
+
+// A recursive generator that generates Tree labels in in-order.
+function* inorder1(t) {
+ if (t) {
+ for (var x of inorder1(t.left)) {
+ yield x;
+ }
+ yield t.label;
+ for (var x of inorder1(t.right)) {
+ yield x;
+ }
+ }
+}
+
+// A non-recursive generator.
+function* inorder2(node) {
+ var stack = [];
+ while (node) {
+ while (node.left) {
+ stack.push(node);
+ node = node.left;
+ }
+ yield node.label;
+ while (!node.right && stack.length) {
+ node = stack.pop();
+ yield node.label;
+ }
+ node = node.right;
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+var root = tree(alphabet);
+assert.equal(alphabet, accumulate(inorder1(root)));
+assert.equal(alphabet, accumulate(inorder2(root)));
+assert.equal(alphabet, accumulate(root));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try.js b/packages/babel-core/test/fixtures/traceur/Yield/Try.js
new file mode 100644
index 0000000000..bad1941f1f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try.js
@@ -0,0 +1,52 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+function* f() {
+ yield 1;
+ try {
+ yield 2;
+ yield 3;
+ } catch (ex) {
+ yield ex;
+ }
+ yield 4;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: 'ex', done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: 'ex', done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try10.js b/packages/babel-core/test/fixtures/traceur/Yield/Try10.js
new file mode 100644
index 0000000000..d289a199d4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try10.js
@@ -0,0 +1,90 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x;
+
+function* f() {
+ x = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } catch (ex) {
+ yield 4 + ex;
+ }
+ yield 5;
+ } catch (ex) {
+ yield 6 + ex;
+ } finally {
+ x = 7
+ }
+ yield x;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.throw('b'), {value: '6b', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 7);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try11.js b/packages/babel-core/test/fixtures/traceur/Yield/Try11.js
new file mode 100644
index 0000000000..3b131f46b6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try11.js
@@ -0,0 +1,106 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x, y;
+
+function* f() {
+ x = 0;
+ y = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } finally {
+ x = 4;
+ }
+ yield x;
+ } catch (ex) {
+ yield 5 + ex;
+ } finally {
+ y = 6
+ }
+ yield y;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 6);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try12.js b/packages/babel-core/test/fixtures/traceur/Yield/Try12.js
new file mode 100644
index 0000000000..edcb5e3506
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try12.js
@@ -0,0 +1,111 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x, y;
+
+function* f() {
+ x = 0;
+ y = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } catch (ex) {
+ yield 4 + ex;
+ } finally {
+ x = 5;
+ }
+ yield x;
+ } catch (ex) {
+ yield 6 + ex;
+ } finally {
+ y = 7
+ }
+ yield y;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.throw('b'), {value: '6b', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 7);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 7);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try2.js b/packages/babel-core/test/fixtures/traceur/Yield/Try2.js
new file mode 100644
index 0000000000..f6ec973710
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try2.js
@@ -0,0 +1,57 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x;
+
+function* f() {
+ x = 0;
+ yield 1;
+ try {
+ yield 2;
+ yield 3;
+ } finally {
+ x = 4;
+ }
+ yield x;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 4);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try3.js b/packages/babel-core/test/fixtures/traceur/Yield/Try3.js
new file mode 100644
index 0000000000..ead1617dfd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try3.js
@@ -0,0 +1,56 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x;
+
+function* f() {
+ x = 0;
+ yield 1;
+ try {
+ yield 2;
+ yield 3;
+ } catch (ex) {
+ yield ex;
+ } finally {
+ x = 4;
+ }
+ yield x;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: 'ex', done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: 'ex', done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 4);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try4.js b/packages/babel-core/test/fixtures/traceur/Yield/Try4.js
new file mode 100644
index 0000000000..72692a4f9c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try4.js
@@ -0,0 +1,80 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+function* f() {
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } catch (ex) {
+ yield 4 + ex;
+ }
+ yield 5;
+ } catch (ex) {
+ yield 6 + ex;
+ }
+ yield 7;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.throw('b'), {value: '6b', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try5.js b/packages/babel-core/test/fixtures/traceur/Yield/Try5.js
new file mode 100644
index 0000000000..31ba02b0b8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try5.js
@@ -0,0 +1,95 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x;
+
+function* f() {
+ x = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } finally {
+ x = 4
+ }
+ yield x;
+ } catch (ex) {
+ yield 5 + ex;
+ }
+ yield 6;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.throw('ex'), {value: '5ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 4);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try6.js b/packages/babel-core/test/fixtures/traceur/Yield/Try6.js
new file mode 100644
index 0000000000..b5fa2e2b7c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try6.js
@@ -0,0 +1,74 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x;
+
+function* f() {
+ x = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } catch (ex) {
+ yield 4 + ex
+ }
+ yield 5;
+ } finally {
+ x = 6;
+ }
+ yield x;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 6);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try7.js b/packages/babel-core/test/fixtures/traceur/Yield/Try7.js
new file mode 100644
index 0000000000..43bc6db414
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try7.js
@@ -0,0 +1,78 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x, y;
+
+function* f() {
+ x = 0;
+ y = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } finally {
+ x = 4;
+ }
+ yield x;
+ } finally {
+ y = 5;
+ }
+ yield y;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 5);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assert.equal(x, 0);
+assert.equal(y, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 5);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 5);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 5);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 4, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 4);
+assert.equal(y, 5);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try8.js b/packages/babel-core/test/fixtures/traceur/Yield/Try8.js
new file mode 100644
index 0000000000..19f9e621e3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try8.js
@@ -0,0 +1,83 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x, y;
+
+function* f() {
+ x = 0;
+ y = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } catch (ex) {
+ yield 4 + ex;
+ } finally {
+ x = 5;
+ }
+ yield x;
+ } finally {
+ y = 6;
+ }
+ yield y;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 6, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 6);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 5);
+assert.equal(y, 6);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/Try9.js b/packages/babel-core/test/fixtures/traceur/Yield/Try9.js
new file mode 100644
index 0000000000..90677decc6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/Try9.js
@@ -0,0 +1,90 @@
+function assertClosed(g) {
+ assert.deepEqual({value: undefined, done: true}, g.next());
+}
+
+var x;
+
+function* f() {
+ x = 0;
+ yield 1;
+ try {
+ yield 2;
+ try {
+ yield 3;
+ } catch (ex) {
+ yield 4 + ex;
+ } finally {
+ x = 5;
+ }
+ yield x;
+ } catch (ex) {
+ yield 6 + ex;
+ }
+ yield 7;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.throws(() => g.throw('ex'));
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.throws(() => g.throw('b'));
+assertClosed(g);
+assert.equal(x, 0);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.throw('ex'), {value: '4ex', done: false});
+assert.deepEqual(g.throw('b'), {value: '6b', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 5, done: false});
+assert.deepEqual(g.throw('ex'), {value: '6ex', done: false});
+assert.deepEqual(g.next(), {value: 7, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+assertClosed(g);
+assert.equal(x, 5);
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/TryCatchGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/TryCatchGenerator.js
new file mode 100644
index 0000000000..2efd6c7076
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/TryCatchGenerator.js
@@ -0,0 +1,153 @@
+function* tryCatchGenerator() {
+ var x;
+ try {
+ yield 1;
+ throw 2;
+ yield 3;
+ } catch (e) {
+ x = e;
+ }
+ yield x;
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result += value;
+ }
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+
+function id(G) {
+ return G;
+}
+
+function wrap(G) {
+ return function* () {
+ yield* G();
+ };
+}
+
+
+[id, wrap].forEach((W) => { // wrap_forEach
+
+// ----------------------------------------------------------------------------
+
+assert.equal('12', accumulate(tryCatchGenerator()));
+
+// ----------------------------------------------------------------------------
+
+function* throwGenerator() {
+ yield 1;
+ throw 2;
+ yield 3;
+}
+
+function* throwFromCatchGenerator() {
+ try {
+ throw 1;
+ } catch(e) {
+ yield e;
+ throw 2;
+ yield 3;
+ }
+}
+
+function* throwFromFinallyGenerator() {
+ try {
+ yield 1;
+ } finally {
+ throw 2;
+ }
+ yield 3;
+}
+
+function accumulateCatch(iterator) {
+ var result = '';
+ var i;
+ for (i = 0; i < 4; i++) {
+ try {
+ for (var value of iterator) {
+ result += value;
+ }
+ } catch(e) {
+ result += ' [' + e + ']';
+ }
+ }
+ return result;
+}
+
+function repeat(s, n) {
+ return Array(n + 1).join(s);
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('1 [2]', accumulateCatch(W(throwGenerator)()));
+assert.equal('1 [2]', accumulateCatch(W(throwFromCatchGenerator)()));
+assert.equal('1 [2]', accumulateCatch(W(throwFromFinallyGenerator)()));
+
+// ----------------------------------------------------------------------------
+
+// out-of-band info
+var oob;
+
+function* throwOOBGen() {
+ try {
+ yield 1;
+ throw 2;
+ oob += 3;
+ } finally {
+ oob += 4;
+ }
+ oob += 5;
+ yield 6;
+}
+
+function* throwOOB2xGen() {
+ try {
+ try {
+ yield 1;
+ throw 2;
+ oob += 3;
+ } finally {
+ oob += 4;
+ }
+ oob += 5;
+ yield 6;
+ } catch(e) {
+ yield 7 + '(' + e + ')';
+ throw 8;
+ } finally {
+ oob += 9;
+ }
+}
+
+function accumulateCatchOOB(iterator) {
+ var result = '';
+ var i;
+
+ for (i = 0; i < 4; i++) {
+ oob = '';
+ try {
+ for (var value of iterator) {
+ result += value;
+ }
+ } catch(e) {
+ result += ' [' + e + ']';
+ } finally {
+ result += ' <' + oob + '>';
+ }
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+var emptyResult = repeat(' <>', 3);
+assert.equal('1 [2] <4>' + emptyResult, accumulateCatchOOB(W(throwOOBGen)()));
+assert.equal('17(2) [8] <49>' + emptyResult, accumulateCatchOOB(W(throwOOB2xGen)()));
+
+}); // end wrap_forEach
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/TryCatchYieldGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/TryCatchYieldGenerator.js
new file mode 100644
index 0000000000..ce631b33ca
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/TryCatchYieldGenerator.js
@@ -0,0 +1,21 @@
+// yield form within a catch block
+function* tryCatchYieldGenerator() {
+ var x = 3;
+ try {
+ throw 5;
+ } catch (e) {
+ yield e * x;
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('15', accumulate(tryCatchYieldGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/TryFinallyGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/TryFinallyGenerator.js
new file mode 100644
index 0000000000..b21b9bdacb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/TryFinallyGenerator.js
@@ -0,0 +1,39 @@
+function* tryFinallyGenerator() {
+ var x = 1;
+ var y;
+
+ // finally inside a catch
+ try {
+ try {
+ yield x;
+ throw 7;
+ x = 2;
+ } finally {
+ x = 3;
+ }
+ } catch (e) {
+ y = e;
+ }
+ yield x * y;
+
+ // finally with no enclosing try
+ try {
+ y = 11;
+ yield y;
+ } finally {
+ y = 3;
+ }
+ yield y;
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('121113', accumulate(tryFinallyGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/WhileGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/WhileGenerator.js
new file mode 100644
index 0000000000..c35e852381
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/WhileGenerator.js
@@ -0,0 +1,25 @@
+function* whileGenerator(max, continueValue, breakValue) {
+ var i = 0;
+ while (i < max) {
+ i++;
+ if (i == continueValue) {
+ continue;
+ }
+ if (i == breakValue) {
+ break;
+ }
+ yield i;
+ }
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('13', accumulate(whileGenerator(10, 2, 4)));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/WhileStatementWithYield.js b/packages/babel-core/test/fixtures/traceur/Yield/WhileStatementWithYield.js
new file mode 100644
index 0000000000..a79c3127f0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/WhileStatementWithYield.js
@@ -0,0 +1,33 @@
+function* f() {
+ var x = 0;
+ while (yield 'test') {
+ yield x++;
+ }
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 'test', done: false});
+assert.deepEqual(g.next(true), {value: 0, done: false});
+assert.deepEqual(g.next(), {value: 'test', done: false});
+assert.deepEqual(g.next(true), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 'test', done: false});
+assert.deepEqual(g.next(true), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: 'test', done: false});
+assert.deepEqual(g.next(false), {value: undefined, done: true});
+
+function* f2() {
+ var x = 0;
+ while ((yield 'a') || (yield 'b')) {
+ yield x++;
+ }
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 'a', done: false});
+assert.deepEqual(g2.next(true), {value: 0, done: false});
+assert.deepEqual(g2.next(), {value: 'a', done: false});
+assert.deepEqual(g2.next(false), {value: 'b', done: false});
+assert.deepEqual(g2.next(true), {value: 1, done: false});
+assert.deepEqual(g2.next(), {value: 'a', done: false});
+assert.deepEqual(g2.next(false), {value: 'b', done: false});
+assert.deepEqual(g2.next(false), {value: undefined, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/YieldAssignThrow.js b/packages/babel-core/test/fixtures/traceur/Yield/YieldAssignThrow.js
new file mode 100644
index 0000000000..c9247d7619
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/YieldAssignThrow.js
@@ -0,0 +1,18 @@
+function* f() {
+ var x;
+ try {
+ x = yield 1;
+ } catch (ex) {
+ yield ex;
+ }
+ return 2;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: true});
+
+g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.throw(3), {value: 3, done: false});
+assert.deepEqual(g.next(), {value: 2, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/YieldIdentifier.js b/packages/babel-core/test/fixtures/traceur/Yield/YieldIdentifier.js
new file mode 100644
index 0000000000..51143e7b71
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/YieldIdentifier.js
@@ -0,0 +1,29 @@
+(function() {
+
+ // ensure non strict mode.
+ function f() { return this; }
+ assert(f.call(undefined) !== undefined);
+
+ var yield = 1;
+ assert.equal(yield, 1);
+
+ function g(yield) {
+ return yield;
+ }
+ assert.equal(g(2), 2);
+
+ var o = {
+ yield: yield
+ };
+ assert.equal(o.yield, 1);
+
+ var o2 = {
+ yield
+ };
+ assert.equal(o.yield, 1);
+
+ function h(yield) {
+ return yield * yield;
+ }
+ assert.equal(h(3), 9);
+})();
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/YieldInFinally.js b/packages/babel-core/test/fixtures/traceur/Yield/YieldInFinally.js
new file mode 100644
index 0000000000..772a1fc630
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/YieldInFinally.js
@@ -0,0 +1,41 @@
+var x;
+
+function* f() {
+ x = 0;
+ try {
+ x++;
+ } finally {
+ yield x++;
+ }
+ yield x++;
+}
+
+var g = f();
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(), {value: 2, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: true});
+
+function* f2() {
+ try {
+ yield 1
+ } catch (ex) {
+ yield ex;
+ } finally {
+ yield 2;
+ }
+ yield 3;
+}
+
+var g2 = f2();
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.next(), {value: 2, done: false});
+assert.deepEqual(g2.next(), {value: 3, done: false});
+assert.deepEqual(g2.next(), {value: undefined, done: true});
+
+g2 = f2();
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.throw(42), {value: 42, done: false});
+assert.deepEqual(g2.next(), {value: 2, done: false});
+assert.deepEqual(g2.next(), {value: 3, done: false});
+assert.deepEqual(g2.next(), {value: undefined, done: true});
+
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/YieldNoExpression.js b/packages/babel-core/test/fixtures/traceur/Yield/YieldNoExpression.js
new file mode 100644
index 0000000000..e5104b89c1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/YieldNoExpression.js
@@ -0,0 +1,19 @@
+function sum(x, y) {
+ return x + y;
+}
+
+function* f() {
+ yield;
+ yield sum(yield, yield);
+ return yield;
+}
+
+var g = f(42);
+
+assert.deepEqual(g.next(), {value: undefined, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: false});
+assert.deepEqual(g.next(3), {value: undefined, done: false});
+assert.deepEqual(g.next(39), {value: 42, done: false});
+assert.deepEqual(g.next(), {value: undefined, done: false});
+assert.deepEqual(g.next('abc'), {value: 'abc', done: true});
+assert.deepEqual(g.next(), {value: undefined, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/YieldUndefinedGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/YieldUndefinedGenerator.js
new file mode 100644
index 0000000000..ce398ce020
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/YieldUndefinedGenerator.js
@@ -0,0 +1,24 @@
+function* yieldUndefinedGenerator1() {
+ yield 1;
+ yield;
+ yield 2;
+}
+
+function* yieldUndefinedGenerator2() {
+ yield 1;
+ yield undefined;
+ yield 2;
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('1undefined2', accumulate(yieldUndefinedGenerator1()));
+assert.equal('1undefined2', accumulate(yieldUndefinedGenerator2()));
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/YieldYield.js b/packages/babel-core/test/fixtures/traceur/Yield/YieldYield.js
new file mode 100644
index 0000000000..1bddfe81a6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/YieldYield.js
@@ -0,0 +1,19 @@
+function* f(x) {
+ yield (yield x);
+}
+
+var g = f(1);
+assert.deepEqual(g.next(), {value: 1, done: false});
+assert.deepEqual(g.next(2), {value: 2, done: false});
+assert.deepEqual(g.next(3), {value: undefined, done: true});
+
+function* f2(x) {
+ yield* (yield x);
+}
+
+g = f(1);
+var g2 = f2(1);
+assert.deepEqual(g2.next(), {value: 1, done: false});
+assert.deepEqual(g2.next(g), {value: 1, done: false});
+assert.deepEqual(g2.next(2), {value: 2, done: false});
+assert.deepEqual(g2.next(3), {value: undefined, done: true});
diff --git a/packages/babel-core/test/fixtures/traceur/Yield/tryFinallyFinallyGenerator.js b/packages/babel-core/test/fixtures/traceur/Yield/tryFinallyFinallyGenerator.js
new file mode 100644
index 0000000000..d9dc2d096b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/Yield/tryFinallyFinallyGenerator.js
@@ -0,0 +1,29 @@
+// finally inside a try finally
+function* tryFinallyFinallyGenerator() {
+ var y;
+
+ try {
+ y = 13;
+ try {
+ yield y;
+ } finally {
+ y = 17;
+ }
+ yield y;
+ } finally {
+ y = 23;
+ }
+ yield y;
+}
+
+function accumulate(iterator) {
+ var result = '';
+ for (var value of iterator) {
+ result = result + String(value);
+ }
+ return result;
+}
+
+// ----------------------------------------------------------------------------
+
+assert.equal('131723', accumulate(tryFinallyFinallyGenerator()));
diff --git a/packages/babel-core/test/fixtures/traceur/options.json b/packages/babel-core/test/fixtures/traceur/options.json
new file mode 100644
index 0000000000..668b348e59
--- /dev/null
+++ b/packages/babel-core/test/fixtures/traceur/options.json
@@ -0,0 +1,25 @@
+{
+ "plugins": [
+ "transform-exponentiation-operator",
+ "syntax-async-functions",
+ "transform-regenerator",
+ "transform-es2015-template-literals",
+ "transform-es2015-literals",
+ "transform-es2015-arrow-functions",
+ "transform-es2015-block-scoped-functions",
+ "transform-es2015-classes",
+ "transform-es2015-object-super",
+ "transform-es2015-shorthand-properties",
+ "transform-es2015-computed-properties",
+ "transform-es2015-for-of",
+ "transform-es2015-sticky-regex",
+ "transform-es2015-unicode-regex",
+ "transform-es2015-constants",
+ "transform-es2015-spread",
+ "transform-es2015-parameters",
+ "transform-es2015-destructuring",
+ "transform-es2015-block-scoping",
+ "transform-es2015-typeof-symbol",
+ "transform-regenerator"
+ ]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/assignment.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/assignment.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/assignment.js
rename to packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/assignment.js
diff --git a/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call-2.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call-2.js
new file mode 100644
index 0000000000..f3e7cff3e1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call-2.js
@@ -0,0 +1,7 @@
+function b() {
+ assert.equal(a, 1);
+}
+
+let a = 1;
+
+b();
diff --git a/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call-3.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call-3.js
new file mode 100644
index 0000000000..e9cc15b450
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call-3.js
@@ -0,0 +1,7 @@
+function b() {
+ assert.equal(a, 1);
+}
+
+b();
+
+let a = 1;
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/call.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/call.js
rename to packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/call.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/defaults.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/defaults.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/defaults.js
rename to packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/defaults.js
diff --git a/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/destructuring.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/destructuring.js
new file mode 100644
index 0000000000..8d08a379de
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/destructuring.js
@@ -0,0 +1,15 @@
+function foo({
+ x: {
+ y: {
+ z: a = b
+ } = {},
+ w: b = 20
+ },
+ a: c = 30
+}) {
+ assert.equal(a, 10);
+ assert.equal(b, 20);
+ assert.equal(c, 30);
+}
+
+foo({ x: {} });
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/export.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/export.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/export.js
rename to packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/export.js
diff --git a/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/options.json b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/options.json
new file mode 100644
index 0000000000..e61cd761b2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/options.json
@@ -0,0 +1,4 @@
+{
+ "plugins": ["transform-es2015-block-scoping", "transform-es2015-parameters", "transform-es2015-destructuring", "transform-es2015-modules-commonjs"],
+ "throws": "is not defined - temporal dead zone"
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/update.js b/packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/update.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-fail/update.js
rename to packages/babel-core/test/fixtures/transformation/.es6.block-scoping-fail/update.js
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/class-decorator.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/class-decorator.js
new file mode 100644
index 0000000000..4333b596e3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/class-decorator.js
@@ -0,0 +1,18 @@
+function noop() {}
+
+function override() {
+ return "bar";
+}
+
+@override
+class Foo {}
+
+@noop
+class Bar {
+ constructor() {
+ this.foo = "bar";
+ }
+}
+
+assert.equal(Foo, "bar");
+assert.equal(new Bar().foo, "bar");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/getters.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/getters.js
new file mode 100644
index 0000000000..6c613018af
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/getters.js
@@ -0,0 +1,23 @@
+class Person {
+ @reader _first;
+ @reader last;
+
+ constructor(first, last) {
+ this._first = first;
+ this._last = last;
+ }
+
+ @reader get _fullName() {
+ return `${this._first} ${this._last}`;
+ }
+}
+
+let jason = new Person("Jason", "Orendorff");
+
+assert.equal(jason.first, "Jason");
+assert.equal(jason.last, "Orendorff");
+assert.equal(jason.fullName, "Jason Orendorff");
+
+jason.update("JSON", "Orendorff")
+assert.equal(jason.first, "JSON");
+assert.equal(jason.fullName, "JSON Orendorff");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialised-property-declarations.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialised-property-declarations.js
new file mode 100644
index 0000000000..761ba3c538
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialised-property-declarations.js
@@ -0,0 +1,8 @@
+class Person {
+ @reader _first = "Andreas";
+ @reader _last = "Rossberg";
+}
+
+let andreas = new Person();
+assert.equal(andreas.first, "Andreas");
+assert.equal(andreas.last, "Rossberg");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialised-static-properties.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialised-static-properties.js
new file mode 100644
index 0000000000..e928cd349c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialised-static-properties.js
@@ -0,0 +1,8 @@
+class Person {
+ @reader static _first = "Brendan";
+ @reader static _last = "Eich";
+}
+
+let brendan = Person;
+assert.equal(brendan.first, "Brendan");
+assert.equal(brendan.last, "Eich");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialized-properties-in-object-literals.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialized-properties-in-object-literals.js
new file mode 100644
index 0000000000..e242da8ad2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/initialized-properties-in-object-literals.js
@@ -0,0 +1,7 @@
+let person = {
+ @reader _first: "Mark",
+ @reader _last: "Miller"
+};
+
+assert.equal(person.first, "Mark");
+assert.equal(person.last, "Miller");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/methods.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/methods.js
new file mode 100644
index 0000000000..c3d6a66bd7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/methods.js
@@ -0,0 +1,33 @@
+function reader(target, descriptor) {
+ let { enumerable, configurable, property: { name, get }, hint } = descriptor;
+ let publicName = extractPublicName(name());
+ Object.defineProperty(target, publicName, {
+ enumerable, configurable, get: function() { return get(this, name); }
+ });
+ return descriptor;
+}
+
+function extractPublicName(name) {
+ // _first -> first
+ return name.slice(1);
+}
+
+class Person {
+ @reader _first;
+ @reader _last;
+
+ constructor(first, last) {
+ this._first = first;
+ this._last = last;
+ }
+
+ @reader _update(first, last) {
+ this._first = first;
+ this._last = last;
+ }
+}
+
+let alex = new Person("Alex", "Russell");
+assert.equal(alex.first, "Alex");
+alex.update("Alexander", "Russell");
+assert.equal(alex.first, "Alexander");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/options.json b/packages/babel-core/test/fixtures/transformation/.es7.decorators/options.json
new file mode 100644
index 0000000000..94198b683e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-destructuring", "transform-es2015-block-scoping", "transform-decorators", "transform-es2015-classes", "transform-class-properties"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/uninitialized-field-declaration.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/uninitialized-field-declaration.js
new file mode 100644
index 0000000000..71c118d267
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/uninitialized-field-declaration.js
@@ -0,0 +1,17 @@
+class Person {
+ @reader _first;
+ @reader _last;
+
+ constructor(first="Waldemar", last="Horwat") {
+ this._first = first;
+ this._last = last;
+ }
+}
+
+let waldemar = new Person();
+assert.equal(waldemar.first, "Waldemar");
+assert.equal(waldemar.last, "Horwat");
+
+let jeff = new Person("Jeff", "Morrison");
+assert.equal(jeff.first, "Jeff");
+assert.equal(jeff.last, "Morrison");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/uninitialized-properties-in-object-literals.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/uninitialized-properties-in-object-literals.js
new file mode 100644
index 0000000000..9f577a129f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/uninitialized-properties-in-object-literals.js
@@ -0,0 +1,11 @@
+let person = {
+ @reader _first,
+ @reader _last
+};
+
+assert.equal(person.first, "undefined");
+
+Object.assign(person, { _first: "Brian", _last: "Terlson" });
+
+assert.equal(person.first, "Brian");
+assert.equal(person.last, "Terlson");
diff --git a/packages/babel-core/test/fixtures/transformation/.es7.decorators/unitialised-static-properties.js b/packages/babel-core/test/fixtures/transformation/.es7.decorators/unitialised-static-properties.js
new file mode 100644
index 0000000000..f57d08af44
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/.es7.decorators/unitialised-static-properties.js
@@ -0,0 +1,13 @@
+class Person {
+ @reader static _first;
+ @reader static _last;
+}
+
+let jonathan = Person;
+
+assert.equal(jonathan.first, undefined);
+
+Object.assign(jonathan, { _first: "Jonathan", _last: "Turner" });
+
+assert.equal(jonathan.first, "Jonathan");
+assert.equal(jonathan.last, "Turner");
diff --git a/packages/babel/test/fixtures/transformation/async-to-generator/async/actual.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/async/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/async-to-generator/async/actual.js
rename to packages/babel-core/test/fixtures/transformation/async-to-generator/async/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/async-to-generator/async/expected.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/async/expected.js
new file mode 100644
index 0000000000..29da0ca451
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/async-to-generator/async/expected.js
@@ -0,0 +1,7 @@
+class Foo {
+ foo() {
+ return babelHelpers.asyncToGenerator(function* () {
+ var wat = await bar();
+ })();
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/async-to-generator/expression/actual.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/async-to-generator/expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/async-to-generator/expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/async-to-generator/expression/expected.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/expression/expected.js
new file mode 100644
index 0000000000..41da03021d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/async-to-generator/expression/expected.js
@@ -0,0 +1,5 @@
+var foo = function () {
+ return babelHelpers.asyncToGenerator(function* () {
+ var wat = yield bar();
+ })();
+};
diff --git a/packages/babel/test/fixtures/transformation/async-to-generator/named-expression/actual.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/named-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/async-to-generator/named-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/async-to-generator/named-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/async-to-generator/named-expression/expected.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/named-expression/expected.js
new file mode 100644
index 0000000000..0cf977e389
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/async-to-generator/named-expression/expected.js
@@ -0,0 +1,7 @@
+var foo = function () {
+ return babelHelpers.asyncToGenerator(function* bar() {
+ console.log(bar);
+ })();
+};
+
+foo();
diff --git a/packages/babel-core/test/fixtures/transformation/async-to-generator/options.json b/packages/babel-core/test/fixtures/transformation/async-to-generator/options.json
new file mode 100644
index 0000000000..43f478db36
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/async-to-generator/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-async-to-generator"]
+}
diff --git a/packages/babel/test/fixtures/transformation/async-to-generator/statement/actual.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/async-to-generator/statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/async-to-generator/statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/async-to-generator/statement/expected.js b/packages/babel-core/test/fixtures/transformation/async-to-generator/statement/expected.js
new file mode 100644
index 0000000000..9b407f49d8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/async-to-generator/statement/expected.js
@@ -0,0 +1,5 @@
+let foo = function foo() {
+ return babelHelpers.asyncToGenerator(function* foo() {
+ var wat = yield bar();
+ })();
+};
diff --git a/packages/babel/test/fixtures/transformation/bluebird-coroutines/class/actual.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/bluebird-coroutines/class/actual.js
rename to packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/expected.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/expected.js
new file mode 100644
index 0000000000..cf00496e19
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/expected.js
@@ -0,0 +1,8 @@
+import { coroutine as _coroutine } from "bluebird";
+class Foo {
+ foo() {
+ return _coroutine(function* () {
+ var wat = await bar();
+ })();
+ }
+}
diff --git a/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/options.json b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/options.json
new file mode 100644
index 0000000000..a6a12735e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/class/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2"]
+}
diff --git a/packages/babel/test/fixtures/transformation/bluebird-coroutines/expression/actual.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/bluebird-coroutines/expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/bluebird-coroutines/expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/expression/expected.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/expression/expected.js
new file mode 100644
index 0000000000..b0329029bb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/expression/expected.js
@@ -0,0 +1,6 @@
+import { coroutine as _coroutine } from "bluebird";
+var foo = function () {
+ return _coroutine(function* () {
+ var wat = yield bar();
+ })();
+};
diff --git a/packages/babel/test/fixtures/transformation/bluebird-coroutines/named-expression/actual.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/named-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/bluebird-coroutines/named-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/bluebird-coroutines/named-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/named-expression/expected.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/named-expression/expected.js
new file mode 100644
index 0000000000..e7bc57ac50
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/named-expression/expected.js
@@ -0,0 +1,8 @@
+import { coroutine as _coroutine } from "bluebird";
+var foo = function () {
+ return _coroutine(function* bar() {
+ console.log(bar);
+ })();
+};
+
+foo();
diff --git a/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/options.json b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/options.json
new file mode 100644
index 0000000000..def78a4244
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", ["transform-async-to-module-method", { "module": "bluebird", "method": "coroutine" }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/bluebird-coroutines/statement/actual.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/bluebird-coroutines/statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/bluebird-coroutines/statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/statement/expected.js b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/statement/expected.js
new file mode 100644
index 0000000000..b74500ba7f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/bluebird-coroutines/statement/expected.js
@@ -0,0 +1,7 @@
+import { coroutine as _coroutine } from "bluebird";
+
+let foo = function foo() {
+ return _coroutine(function* foo() {
+ var wat = yield bar();
+ })();
+};
diff --git a/packages/babel/test/fixtures/transformation/errors/syntax/actual.js b/packages/babel-core/test/fixtures/transformation/errors/syntax/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/errors/syntax/actual.js
rename to packages/babel-core/test/fixtures/transformation/errors/syntax/actual.js
diff --git a/packages/babel/test/fixtures/transformation/errors/syntax/options.json b/packages/babel-core/test/fixtures/transformation/errors/syntax/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/errors/syntax/options.json
rename to packages/babel-core/test/fixtures/transformation/errors/syntax/options.json
diff --git a/packages/babel/test/fixtures/transformation/es3/member-expression-literals/actual.js b/packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es3/member-expression-literals/actual.js
rename to packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/expected.js b/packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/expected.js
new file mode 100644
index 0000000000..2e7b269153
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/expected.js
@@ -0,0 +1,4 @@
+test["catch"];
+test["catch"].foo;
+test["catch"];
+test["catch"].foo;
diff --git a/packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/options.json b/packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/options.json
new file mode 100644
index 0000000000..668132c997
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es3/member-expression-literals/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es3-member-expression-literals"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es3/property-literals/actual.js b/packages/babel-core/test/fixtures/transformation/es3/property-literals/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es3/property-literals/actual.js
rename to packages/babel-core/test/fixtures/transformation/es3/property-literals/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es3/property-literals/expected.js b/packages/babel-core/test/fixtures/transformation/es3/property-literals/expected.js
new file mode 100644
index 0000000000..c531023c19
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es3/property-literals/expected.js
@@ -0,0 +1,6 @@
+var obj = {
+ "test": "foob",
+ "!@#$": "foob",
+ "33rd": "foob",
+ fooBar: "foob"
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es3/property-literals/options.json b/packages/babel-core/test/fixtures/transformation/es3/property-literals/options.json
new file mode 100644
index 0000000000..1d5027ef40
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es3/property-literals/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es3-property-literals"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es5.properties.mutators/getter-and-setter/actual.js b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter-and-setter/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es5.properties.mutators/getter-and-setter/actual.js
rename to packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter-and-setter/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter-and-setter/expected.js b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter-and-setter/expected.js
new file mode 100644
index 0000000000..2c4dc83b97
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter-and-setter/expected.js
@@ -0,0 +1,12 @@
+var obj = Object.defineProperties({}, {
+ foo: {
+ get: function () {
+ return 5 + 5;
+ },
+ set: function (value) {
+ this._foo = value;
+ },
+ configurable: true,
+ enumerable: true
+ }
+});
diff --git a/packages/babel/test/fixtures/transformation/es5.properties.mutators/getter/actual.js b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es5.properties.mutators/getter/actual.js
rename to packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter/expected.js b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter/expected.js
new file mode 100644
index 0000000000..4c602f131b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/getter/expected.js
@@ -0,0 +1,9 @@
+var obj = Object.defineProperties({}, {
+ foo: {
+ get: function () {
+ return 5 + 5;
+ },
+ configurable: true,
+ enumerable: true
+ }
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/options.json b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/options.json
new file mode 100644
index 0000000000..608fb1f012
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es5-property-mutators"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es5.properties.mutators/setter/actual.js b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/setter/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es5.properties.mutators/setter/actual.js
rename to packages/babel-core/test/fixtures/transformation/es5.properties.mutators/setter/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/setter/expected.js b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/setter/expected.js
new file mode 100644
index 0000000000..aa5165f2a3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es5.properties.mutators/setter/expected.js
@@ -0,0 +1,9 @@
+var obj = Object.defineProperties({}, {
+ foo: {
+ set: function (value) {
+ this._foo = value;
+ },
+ configurable: true,
+ enumerable: true
+ }
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/arguments/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/arguments/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/arguments/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/arguments/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/arguments/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/arguments/expected.js
new file mode 100644
index 0000000000..a9b5c60879
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/arguments/expected.js
@@ -0,0 +1,67 @@
+function one() {
+ var _arguments = arguments;
+
+ var inner = function () {
+ return _arguments;
+ };
+ return [].slice.call(inner());
+}
+one(1, 2);
+
+function two() {
+ var _arguments2 = arguments;
+
+ var inner = function () {
+ return _arguments2;
+ };
+
+ var another = function () {
+ var _arguments3 = arguments;
+
+ var inner2 = function () {
+ return _arguments3;
+ };
+ };
+
+ return [].slice.call(inner());
+}
+two(1, 2);
+
+function three() {
+ var _arguments4 = arguments;
+
+ var fn = function () {
+ return _arguments4[0] + "bar";
+ };
+ return fn();
+}
+three("foo");
+
+function four() {
+ var _arguments5 = arguments;
+
+ var fn = function () {
+ return _arguments5[0].foo + "bar";
+ };
+ return fn();
+}
+four({ foo: "foo" });
+
+function five(obj) {
+ var fn = function () {
+ return obj.arguments[0].foo + "bar";
+ };
+ return fn();
+}
+five({ arguments: ["foo"] });
+
+function six(obj) {
+ var fn = function () {
+ var fn2 = function () {
+ return arguments[0];
+ };
+ return fn2("foobar");
+ };
+ return fn();
+}
+six();
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/default-parameters/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/default-parameters/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/default-parameters/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/default-parameters/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/default-parameters/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/default-parameters/expected.js
new file mode 100644
index 0000000000..7b03aac22d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/default-parameters/expected.js
@@ -0,0 +1,7 @@
+var some = function () {
+ let count = arguments.length <= 0 || arguments[0] === undefined ? "30" : arguments[0];
+
+ console.log("count", count);
+};
+
+some();
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/expected.js
new file mode 100644
index 0000000000..4fb396bb78
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/expected.js
@@ -0,0 +1,5 @@
+var a = function (_ref) {
+ let target = _ref.target;
+ return console.log(target);
+};
+a({ target: "I am a target" });
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/options.json b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/options.json
new file mode 100644
index 0000000000..9e979cda64
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/destructuring-parameters/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-destructuring", "transform-es2015-parameters", "transform-es2015-arrow-functions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/empty-arguments/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-arguments/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/empty-arguments/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-arguments/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-arguments/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-arguments/expected.js
new file mode 100644
index 0000000000..4f6faf9601
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-arguments/expected.js
@@ -0,0 +1,3 @@
+var t = function () {
+ return 5 + 5;
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/empty-block/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-block/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/empty-block/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-block/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-block/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-block/expected.js
new file mode 100644
index 0000000000..e62660f7c1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/empty-block/expected.js
@@ -0,0 +1 @@
+var t = function () {};
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/expression/expected.js
new file mode 100644
index 0000000000..e2bcfeb4cd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/expression/expected.js
@@ -0,0 +1,3 @@
+arr.map(function (x) {
+ return x * x;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/inside-call/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/inside-call/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/inside-call/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/inside-call/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/inside-call/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/inside-call/expected.js
new file mode 100644
index 0000000000..61defa50d6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/inside-call/expected.js
@@ -0,0 +1,3 @@
+arr.map(function (i) {
+ return i + 1;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/multiple-arguments/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/multiple-arguments/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/multiple-arguments/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/multiple-arguments/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/multiple-arguments/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/multiple-arguments/expected.js
new file mode 100644
index 0000000000..8a79fc9fe8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/multiple-arguments/expected.js
@@ -0,0 +1,3 @@
+var t = function (i, x) {
+ return i * x;
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/nested/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/nested/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/nested/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/nested/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/nested/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/nested/expected.js
new file mode 100644
index 0000000000..6ee2486f4f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/nested/expected.js
@@ -0,0 +1,15 @@
+module.exports = {
+ init: function () {
+ var _this = this;
+
+ return new Promise(function (resolve, reject) {
+ MongoClient.connect(config.mongodb, function (err, db) {
+ if (err) {
+ return reject(err);
+ }
+ _this.db = db;
+ resolve(_this);
+ });
+ });
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/options.json b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/options.json
new file mode 100644
index 0000000000..2fd23e5bad
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-parameters", "transform-es2015-arrow-functions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/paran-insertion/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/paran-insertion/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/paran-insertion/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/paran-insertion/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/paran-insertion/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/paran-insertion/expected.js
new file mode 100644
index 0000000000..689ec63907
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/paran-insertion/expected.js
@@ -0,0 +1,3 @@
+var t = function (i) {
+ return i * 5;
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/single-argument/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/single-argument/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/single-argument/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/single-argument/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/single-argument/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/single-argument/expected.js
new file mode 100644
index 0000000000..689ec63907
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/single-argument/expected.js
@@ -0,0 +1,3 @@
+var t = function (i) {
+ return i * 5;
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/spec/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/spec/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/expected.js
new file mode 100644
index 0000000000..52dd949dce
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/expected.js
@@ -0,0 +1,20 @@
+function foo() {
+ var _this = this;
+
+ arr.map((function (x) {
+ babelHelpers.newArrowCheck(this, _this);
+ return x * x;
+ }).bind(this));
+ var f = (function (x, y) {
+ babelHelpers.newArrowCheck(this, _this);
+ return x * y;
+ }).bind(this);
+ (function () {
+ var _this2 = this;
+
+ return (function () {
+ babelHelpers.newArrowCheck(this, _this2);
+ return this;
+ }).bind(this);
+ })();
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/options.json b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/options.json
new file mode 100644
index 0000000000..76b6077907
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/spec/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", ["transform-es2015-arrow-functions", { "spec": true }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/statement/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/statement/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/statement/expected.js
new file mode 100644
index 0000000000..40ecaad572
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/statement/expected.js
@@ -0,0 +1,5 @@
+nums.forEach(function (v) {
+ if (v % 5 === 0) {
+ fives.push(v);
+ }
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.arrow-functions/this/actual.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/this/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.arrow-functions/this/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.arrow-functions/this/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/this/expected.js b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/this/expected.js
new file mode 100644
index 0000000000..78d4cce09c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.arrow-functions/this/expected.js
@@ -0,0 +1,7 @@
+function b() {
+ var _this = this;
+
+ var t = function (x) {
+ return _this.x + x;
+ };
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/block-scoped-2.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/block-scoped-2.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/block-scoped-2.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/block-scoped-2.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/block-scoped.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/block-scoped.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/block-scoped.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/block-scoped.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/closure-wrap-collision.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/closure-wrap-collision.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/closure-wrap-collision.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/closure-wrap-collision.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/collision-for.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/collision-for.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/collision-for.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/collision-for.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/destructuring-defaults.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/destructuring-defaults.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/destructuring-defaults.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/destructuring-defaults.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/duplicate-function-scope.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/duplicate-function-scope.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/duplicate-function-scope.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/duplicate-function-scope.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/for-continuation.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/for-continuation.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/for-continuation.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/for-continuation.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/for-loop-head.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/for-loop-head.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/for-loop-head.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/for-loop-head.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/label.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/label.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/label.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/label.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/multiple.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/multiple.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/multiple.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/multiple.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-2.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-2.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-2.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-2.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-3.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-3.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-3.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-3.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-4.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-4.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-4.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels-4.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/nested-labels.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/nested-labels.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/options.json b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/options.json
new file mode 100644
index 0000000000..510d03805a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-for-of", "transform-es2015-arrow-functions", "transform-es2015-destructuring", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping-exec/switch-break.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/switch-break.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping-exec/switch-break.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-exec/switch-break.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/assignment.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/assignment.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/assignment.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/assignment.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/call.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/call.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/call.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/call.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/defaults.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/defaults.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/defaults.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/defaults.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/destructuring.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/destructuring.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/destructuring.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/destructuring.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/export.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/export.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/export.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/export.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/options.json b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/options.json
new file mode 100644
index 0000000000..599c8d9a01
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-block-scoping", "transform-es2015-parameters", "transform-es2015-destructuring", "transform-es2015-modules-commonjs"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/update.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/update.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.block-scoping-pass/update.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping-pass/update.js
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/assignment-patterns/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/assignment-patterns/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/assignment-patterns/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/assignment-patterns/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/assignment-patterns/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/assignment-patterns/expected.js
new file mode 100644
index 0000000000..b497a041e4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/assignment-patterns/expected.js
@@ -0,0 +1,8 @@
+const foo = "foo";
+
+function foobar() {
+ for (var item of [1, 2, 3]) {
+ var _foo = "bar";
+ [bar, _foo] = [1, 2];
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/for-break-continue-return/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break-continue-return/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/for-break-continue-return/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break-continue-return/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break-continue-return/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break-continue-return/expected.js
new file mode 100644
index 0000000000..3135af5869
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break-continue-return/expected.js
@@ -0,0 +1,31 @@
+(function () {
+ var _loop = function (i) {
+ fns.push(function () {
+ return i;
+ });
+ if (i === 1) {
+ return "continue";
+ } else if (i === 2) {
+ return "break";
+ } else if (i === 3) {
+ return {
+ v: i
+ };
+ }
+ };
+
+ _loop2: for (var i in nums) {
+ var _ret = _loop(i);
+
+ switch (_ret) {
+ case "continue":
+ continue;
+
+ case "break":
+ break _loop2;
+
+ default:
+ if (typeof _ret === "object") return _ret.v;
+ }
+ }
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/for-break/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/for-break/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break/expected.js
new file mode 100644
index 0000000000..4a739e21cb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-break/expected.js
@@ -0,0 +1,12 @@
+var _loop = function (i) {
+ fns.push(function () {
+ return i;
+ });
+ return "break";
+};
+
+for (var i in nums) {
+ var _ret = _loop(i);
+
+ if (_ret === "break") break;
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/for-continuation/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continuation/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/for-continuation/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continuation/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continuation/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continuation/expected.js
new file mode 100644
index 0000000000..d4481fece7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continuation/expected.js
@@ -0,0 +1,12 @@
+var _loop = function (_i) {
+ (function () {
+ _i;
+ });
+ console.log(_i);
+ _i += 1;
+ i = _i;
+};
+
+for (var i = 0; i < 2; i++) {
+ _loop(i);
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/for-continue/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continue/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/for-continue/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continue/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continue/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continue/expected.js
new file mode 100644
index 0000000000..4f72461412
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-continue/expected.js
@@ -0,0 +1,12 @@
+var _loop = function (i) {
+ fns.push(function () {
+ return i;
+ });
+ return "continue";
+};
+
+for (var i in nums) {
+ var _ret = _loop(i);
+
+ if (_ret === "continue") continue;
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/for-return-undefined/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return-undefined/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/for-return-undefined/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return-undefined/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return-undefined/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return-undefined/expected.js
new file mode 100644
index 0000000000..724322adb8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return-undefined/expected.js
@@ -0,0 +1,16 @@
+(function () {
+ var _loop = function (i) {
+ fns.push(function () {
+ return i;
+ });
+ return {
+ v: undefined
+ };
+ };
+
+ for (var i in nums) {
+ var _ret = _loop(i);
+
+ if (typeof _ret === "object") return _ret.v;
+ }
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/for-return/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/for-return/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return/expected.js
new file mode 100644
index 0000000000..7b1d6ee700
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/for-return/expected.js
@@ -0,0 +1,16 @@
+(function () {
+ var _loop = function (i) {
+ fns.push(function () {
+ return i;
+ });
+ return {
+ v: i
+ };
+ };
+
+ for (var i in nums) {
+ var _ret = _loop(i);
+
+ if (typeof _ret === "object") return _ret.v;
+ }
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/function/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/function/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/function/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/function/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/function/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/function/expected.js
new file mode 100644
index 0000000000..bb4b09c9c5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/function/expected.js
@@ -0,0 +1,3 @@
+function test() {
+ var foo = "bar";
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/hoisting/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/hoisting/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/expected.js
new file mode 100644
index 0000000000..633c9ab5ae
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/expected.js
@@ -0,0 +1,35 @@
+var _loop = function (i) {
+ x = 5;
+ ({ f } = { f: 2 });
+
+ fns.push(function () {
+ return i * x;
+ });
+};
+
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = nums[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var i = _step.value;
+ var x;
+ var f;
+
+ _loop(i);
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/options.json b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/options.json
new file mode 100644
index 0000000000..7f7165f7a3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/hoisting/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-block-scoping", "syntax-jsx", "transform-react-jsx", "transform-es2015-block-scoped-functions", "transform-es2015-for-of"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/issue-1051/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-1051/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/issue-1051/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-1051/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-1051/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-1051/expected.js
new file mode 100644
index 0000000000..e9e5798e9b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-1051/expected.js
@@ -0,0 +1,18 @@
+foo.func1 = function () {
+ if (cond1) {
+ for (;;) {
+ if (cond2) {
+ var _ret = (function () {
+ function func2() {}
+ function func3() {}
+ func4(function () {
+ func2();
+ });
+ return "break";
+ })();
+
+ if (_ret === "break") break;
+ }
+ }
+ }
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/issue-2174/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-2174/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/issue-2174/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-2174/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-2174/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-2174/expected.js
new file mode 100644
index 0000000000..1dce9c4c17
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-2174/expected.js
@@ -0,0 +1,11 @@
+if (true) {
+ var x;
+
+ (function () {
+ function foo() {}
+ function bar() {
+ return foo;
+ }
+ for (x in {}) {}
+ })();
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/issue-973/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-973/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/issue-973/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-973/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-973/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-973/expected.js
new file mode 100644
index 0000000000..f5455d75ad
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/issue-973/expected.js
@@ -0,0 +1,12 @@
+var arr = [];
+for (var i = 0; i < 10; i++) {
+ var _loop = function (_i) {
+ arr.push(function () {
+ return _i;
+ });
+ };
+
+ for (var _i = 0; _i < 10; _i++) {
+ _loop(_i);
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/jsx-identifier/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/jsx-identifier/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/jsx-identifier/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/jsx-identifier/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/jsx-identifier/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/jsx-identifier/expected.js
new file mode 100644
index 0000000000..f59893c792
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/jsx-identifier/expected.js
@@ -0,0 +1,6 @@
+// #1683
+
+var arr = [];
+for (var i = 0; i < 4; ++i) {
+ arr.push(React.createElement("i", null));
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/loop-initializer-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/loop-initializer-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/loop-initializer-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/loop-initializer-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/loop-initializer-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/loop-initializer-default/expected.js
new file mode 100644
index 0000000000..76ee5c3826
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/loop-initializer-default/expected.js
@@ -0,0 +1,11 @@
+while (value) {
+ var foo = undefined;
+
+ if (bar) {
+ foo = [];
+ }
+
+ if (foo) {
+ doIt();
+ }
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/options.json b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/options.json
new file mode 100644
index 0000000000..0a6b7013b3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-block-scoping", "syntax-jsx", "transform-react-jsx", "transform-es2015-block-scoped-functions", "transform-es2015-arrow-functions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/program/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/program/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/program/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/program/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/program/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/program/expected.js
new file mode 100644
index 0000000000..b9006b4d0d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/program/expected.js
@@ -0,0 +1 @@
+var test = "foo";
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/switch/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/switch/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/switch/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/switch/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/switch/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/switch/expected.js
new file mode 100644
index 0000000000..ec0210e749
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/switch/expected.js
@@ -0,0 +1,11 @@
+var a = true;
+var b = false;
+
+switch (a) {
+ case true:
+ var b = 2;
+ break;
+ case false:
+ var c = 3;
+ break;
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.block-scoping/wrap-closure-shadow-variables/actual.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/wrap-closure-shadow-variables/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.block-scoping/wrap-closure-shadow-variables/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.block-scoping/wrap-closure-shadow-variables/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.block-scoping/wrap-closure-shadow-variables/expected.js b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/wrap-closure-shadow-variables/expected.js
new file mode 100644
index 0000000000..019f453259
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.block-scoping/wrap-closure-shadow-variables/expected.js
@@ -0,0 +1,12 @@
+var a = 1;
+
+var _loop = function (_a) {
+ items.forEach(function (item) {
+ return _a;
+ });
+};
+
+for (var _a = 1; _a < 100; _a++) {
+ _loop(_a);
+}
+console.log(a);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-exec/declaration-binding.js b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/declaration-binding.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-exec/declaration-binding.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-exec/declaration-binding.js
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-exec/expression-binding.js b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/expression-binding.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-exec/expression-binding.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-exec/expression-binding.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-exec/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/options.json
new file mode 100644
index 0000000000..e5e9ad8a9a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-classes", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-exec/retain-no-call-on-reassign.js b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/retain-no-call-on-reassign.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-exec/retain-no-call-on-reassign.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-exec/retain-no-call-on-reassign.js
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-exec/shadow-container.js b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/shadow-container.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-exec/shadow-container.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-exec/shadow-container.js
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-exec/super-change-proto.js b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/super-change-proto.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-exec/super-change-proto.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-exec/super-change-proto.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-exec/super-return.js b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/super-return.js
new file mode 100644
index 0000000000..9531b4bd65
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-exec/super-return.js
@@ -0,0 +1,14 @@
+class Foo {
+ constructor() {
+ return { i: 1 };
+ }
+}
+
+class Bar extends Foo {
+ constructor() {
+ assert.equal(super().i, 1);
+ assert.equal(this.i, 1);
+ }
+}
+
+new Bar;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-class/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-class/actual.js
new file mode 100644
index 0000000000..83f054a6e9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-class/actual.js
@@ -0,0 +1,13 @@
+class Test extends Foo {
+ constructor() {
+ woops.super.test();
+ super();
+ super.test();
+
+ super(...arguments);
+ super("test", ...arguments);
+
+ super.test(...arguments);
+ super.test("test", ...arguments);
+ }
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-class/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-class/expected.js
new file mode 100644
index 0000000000..dc81b57bd6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-class/expected.js
@@ -0,0 +1,25 @@
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ var _Foo$prototype$test, _Foo$prototype$test2;
+
+ babelHelpers.classCallCheck(this, Test);
+
+ woops.super.test();
+
+ var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call(this));
+
+ _Foo.prototype.test.call(_this);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, _Foo.apply(this, arguments));
+
+ var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call.apply(_Foo, [this, "test"].concat(Array.prototype.slice.call(arguments))));
+
+ (_Foo$prototype$test = _Foo.prototype.test).call.apply(_Foo$prototype$test, [_this].concat(Array.prototype.slice.call(arguments)));
+ (_Foo$prototype$test2 = _Foo.prototype.test).call.apply(_Foo$prototype$test2, [_this, "test"].concat(Array.prototype.slice.call(arguments)));
+ return _this;
+ }
+
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-loose/accessing-super-properties/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-properties/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-loose/accessing-super-properties/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-properties/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-properties/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-properties/expected.js
new file mode 100644
index 0000000000..1c9524d16d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/accessing-super-properties/expected.js
@@ -0,0 +1,15 @@
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call(this));
+
+ _Foo.prototype.test;
+ _Foo.prototype.test.whatever;
+ return _this;
+ }
+
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-loose/calling-super-properties/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/calling-super-properties/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-loose/calling-super-properties/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-loose/calling-super-properties/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/calling-super-properties/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/calling-super-properties/expected.js
new file mode 100644
index 0000000000..322e2d1a0c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/calling-super-properties/expected.js
@@ -0,0 +1,19 @@
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, _Foo.call(this));
+
+ _Foo.prototype.test.whatever();
+ _Foo.prototype.test.call(_this);
+ return _this;
+ }
+
+ Test.test = function test() {
+ return _Foo.wow.call(this);
+ };
+
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-loose/constructor-order/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/constructor-order/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-loose/constructor-order/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-loose/constructor-order/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/constructor-order/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/constructor-order/expected.js
new file mode 100644
index 0000000000..7732e9c42a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/constructor-order/expected.js
@@ -0,0 +1,17 @@
+var x = (function () {
+ x.prototype.f = function f() {
+ 1;
+ 2;
+ 3;
+ };
+
+ function x() {
+ babelHelpers.classCallCheck(this, x);
+
+ 4;
+ 5;
+ 6;
+ }
+
+ return x;
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-loose/literal-key/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/literal-key/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-loose/literal-key/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-loose/literal-key/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/literal-key/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/literal-key/expected.js
new file mode 100644
index 0000000000..bb11e8c355
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/literal-key/expected.js
@@ -0,0 +1,9 @@
+var Foo = (function () {
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ }
+
+ Foo.prototype["bar"] = function bar() {};
+
+ return Foo;
+})();
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/options.json
new file mode 100644
index 0000000000..399559329f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-function-name", ["transform-es2015-classes", { "loose": true }], "transform-es2015-spread", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-loose/super-class-id-member-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class-id-member-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-loose/super-class-id-member-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class-id-member-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class-id-member-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class-id-member-expression/expected.js
new file mode 100644
index 0000000000..ffe79cc6c4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class-id-member-expression/expected.js
@@ -0,0 +1,21 @@
+var BaseController = (function (_Chaplin$Controller) {
+ babelHelpers.inherits(BaseController, _Chaplin$Controller);
+
+ function BaseController() {
+ babelHelpers.classCallCheck(this, BaseController);
+ return babelHelpers.possibleConstructorReturn(this, _Chaplin$Controller.apply(this, arguments));
+ }
+
+ return BaseController;
+})(Chaplin.Controller);
+
+var BaseController2 = (function (_Chaplin$Controller$A) {
+ babelHelpers.inherits(BaseController2, _Chaplin$Controller$A);
+
+ function BaseController2() {
+ babelHelpers.classCallCheck(this, BaseController2);
+ return babelHelpers.possibleConstructorReturn(this, _Chaplin$Controller$A.apply(this, arguments));
+ }
+
+ return BaseController2;
+})(Chaplin.Controller.Another);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-loose/super-class/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-loose/super-class/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class/expected.js
new file mode 100644
index 0000000000..9a50791c8b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-class/expected.js
@@ -0,0 +1,10 @@
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ return babelHelpers.possibleConstructorReturn(this, _Foo.apply(this, arguments));
+ }
+
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes-loose/super-function-fallback/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-function-fallback/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes-loose/super-function-fallback/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-function-fallback/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-function-fallback/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-function-fallback/expected.js
new file mode 100644
index 0000000000..1f23d494a8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes-loose/super-function-fallback/expected.js
@@ -0,0 +1,5 @@
+var Test = function Test() {
+ babelHelpers.classCallCheck(this, Test);
+
+ Function.prototype.hasOwnProperty.call(this, "test");
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/accessing-super-class/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-class/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/accessing-super-class/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-class/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-class/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-class/expected.js
new file mode 100644
index 0000000000..f03982fc1e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-class/expected.js
@@ -0,0 +1,46 @@
+var _Object$getPrototypeO;
+
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ var _babelHelpers$get;
+
+ babelHelpers.classCallCheck(this, Test);
+
+ woops.super.test();
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).call(this));
+
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).call(_this);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).apply(this, arguments));
+
+ var _this = babelHelpers.possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(Test)).call.apply(_Object$getPrototypeO, [this, "test"].concat(Array.prototype.slice.call(arguments))));
+
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).apply(_this, arguments);
+ (_babelHelpers$get = babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this)).call.apply(_babelHelpers$get, [_this, "test"].concat(Array.prototype.slice.call(arguments)));
+ return _this;
+ }
+
+ babelHelpers.createClass(Test, [{
+ key: "test",
+ value: function test() {
+ var _babelHelpers$get2;
+
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", this).call(this);
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", this).apply(this, arguments);
+ (_babelHelpers$get2 = babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", this)).call.apply(_babelHelpers$get2, [this, "test"].concat(Array.prototype.slice.call(arguments)));
+ }
+ }], [{
+ key: "foo",
+ value: function foo() {
+ var _babelHelpers$get3;
+
+ babelHelpers.get(Object.getPrototypeOf(Test), "foo", this).call(this);
+ babelHelpers.get(Object.getPrototypeOf(Test), "foo", this).apply(this, arguments);
+ (_babelHelpers$get3 = babelHelpers.get(Object.getPrototypeOf(Test), "foo", this)).call.apply(_babelHelpers$get3, [this, "test"].concat(Array.prototype.slice.call(arguments)));
+ }
+ }]);
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/accessing-super-properties/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-properties/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/accessing-super-properties/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-properties/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-properties/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-properties/expected.js
new file mode 100644
index 0000000000..c30864e083
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/accessing-super-properties/expected.js
@@ -0,0 +1,15 @@
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).call(this));
+
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this);
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).whatever;
+ return _this;
+ }
+
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/calling-super-properties/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/calling-super-properties/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/calling-super-properties/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/calling-super-properties/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/calling-super-properties/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/calling-super-properties/expected.js
new file mode 100644
index 0000000000..cce857b8e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/calling-super-properties/expected.js
@@ -0,0 +1,21 @@
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).call(this));
+
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).whatever();
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "test", _this).call(_this);
+ return _this;
+ }
+
+ babelHelpers.createClass(Test, null, [{
+ key: "test",
+ value: function test() {
+ return babelHelpers.get(Object.getPrototypeOf(Test), "wow", this).call(this);
+ }
+ }]);
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/computed-methods/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/computed-methods/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/computed-methods/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/computed-methods/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/computed-methods/exec.js b/packages/babel-core/test/fixtures/transformation/es6.classes/computed-methods/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/computed-methods/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/computed-methods/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/computed-methods/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/computed-methods/expected.js
new file mode 100644
index 0000000000..ecc9ae3f21
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/computed-methods/expected.js
@@ -0,0 +1,20 @@
+var Foo = (function () {
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ }
+
+ babelHelpers.createClass(Foo, [{
+ key: "foo",
+ value: function foo() {}
+ }, {
+ key: "foo",
+ value: function foo() {}
+ }, {
+ key: bar,
+ value: function value() {}
+ }, {
+ key: bar + "foo",
+ value: function value() {}
+ }]);
+ return Foo;
+})();
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/constructor-binding-collision/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/constructor-binding-collision/actual.js
new file mode 100644
index 0000000000..abc706f3e4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/constructor-binding-collision/actual.js
@@ -0,0 +1,7 @@
+class Example {
+ constructor() {
+ var Example;
+ }
+}
+
+var t = new Example();
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/constructor-binding-collision/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/constructor-binding-collision/expected.js
new file mode 100644
index 0000000000..5247dab668
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/constructor-binding-collision/expected.js
@@ -0,0 +1,7 @@
+var Example = function Example() {
+ babelHelpers.classCallCheck(this, Example);
+
+ var _Example;
+};
+
+var t = new Example();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/constructor/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/constructor/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/constructor/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/constructor/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/constructor/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/constructor/expected.js
new file mode 100644
index 0000000000..8f1b418649
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/constructor/expected.js
@@ -0,0 +1,29 @@
+var Test = function Test() {
+ babelHelpers.classCallCheck(this, Test);
+
+ this.state = "test";
+};
+
+var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this));
+
+ _this.state = "test";
+ return _this;
+ }
+
+ return Foo;
+})(Bar);
+
+var ConstructorScoping = function ConstructorScoping() {
+ babelHelpers.classCallCheck(this, ConstructorScoping);
+
+ var bar = undefined;
+ {
+ var _bar = undefined;
+ }
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/delay-arrow-function-for-bare-super-derived/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/delay-arrow-function-for-bare-super-derived/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/delay-arrow-function-for-bare-super-derived/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/delay-arrow-function-for-bare-super-derived/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/delay-arrow-function-for-bare-super-derived/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/delay-arrow-function-for-bare-super-derived/expected.js
new file mode 100644
index 0000000000..e65c69e209
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/delay-arrow-function-for-bare-super-derived/expected.js
@@ -0,0 +1,14 @@
+var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo() {
+ var _this;
+
+ babelHelpers.classCallCheck(this, Foo);
+ return _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, () => {
+ _this.test;
+ }));
+ }
+
+ return Foo;
+})(Bar);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/expected.js
new file mode 100644
index 0000000000..25025db980
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/expected.js
@@ -0,0 +1,9 @@
+var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ }
+
+ return Foo;
+})(Bar);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/options.json
new file mode 100644
index 0000000000..2b7d826bab
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/derived-constructor-must-call-super/options.json
@@ -0,0 +1,3 @@
+{
+ "throws": "missing super() call in constructor"
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/instance-getter-and-setter/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter-and-setter/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/instance-getter-and-setter/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter-and-setter/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter-and-setter/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter-and-setter/expected.js
new file mode 100644
index 0000000000..56420bf1f4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter-and-setter/expected.js
@@ -0,0 +1,16 @@
+var Test = (function () {
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ }
+
+ babelHelpers.createClass(Test, [{
+ key: "test",
+ get: function get() {
+ return 5 + 5;
+ },
+ set: function set(val) {
+ this._test = val;
+ }
+ }]);
+ return Test;
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/instance-getter/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/instance-getter/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter/expected.js
new file mode 100644
index 0000000000..419321e583
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-getter/expected.js
@@ -0,0 +1,13 @@
+var Test = (function () {
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ }
+
+ babelHelpers.createClass(Test, [{
+ key: "test",
+ get: function get() {
+ return 5 + 5;
+ }
+ }]);
+ return Test;
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/instance-method/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-method/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/instance-method/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/instance-method/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/instance-method/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-method/expected.js
new file mode 100644
index 0000000000..92ee97fde2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-method/expected.js
@@ -0,0 +1,13 @@
+var Test = (function () {
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ }
+
+ babelHelpers.createClass(Test, [{
+ key: "test",
+ value: function test() {
+ return 5 + 5;
+ }
+ }]);
+ return Test;
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/instance-setter/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-setter/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/instance-setter/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/instance-setter/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/instance-setter/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-setter/expected.js
new file mode 100644
index 0000000000..da0ac43573
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/instance-setter/expected.js
@@ -0,0 +1,13 @@
+var Test = (function () {
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ }
+
+ babelHelpers.createClass(Test, [{
+ key: "test",
+ set: function set(val) {
+ this._test = val;
+ }
+ }]);
+ return Test;
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/name-method-collision/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/name-method-collision/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/expected.js
new file mode 100644
index 0000000000..60c74367a8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/expected.js
@@ -0,0 +1,15 @@
+var _a2 = require("./a");
+
+var Foo = (function () {
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ }
+
+ babelHelpers.createClass(Foo, [{
+ key: "_a",
+ value: function _a() {
+ (0, _a2.a)();
+ }
+ }]);
+ return Foo;
+})();
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/options.json
new file mode 100644
index 0000000000..1c490a8649
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/name-method-collision/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-function-name", "transform-es2015-classes", "transform-es2015-spread", "transform-es2015-block-scoping", "transform-es2015-modules-commonjs"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/options.json
new file mode 100644
index 0000000000..7c3739a60c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-function-name", "transform-es2015-classes", "transform-es2015-spread", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/plain-class/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/plain-class/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/plain-class/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/plain-class/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/plain-class/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/plain-class/expected.js
new file mode 100644
index 0000000000..c18eb5aa04
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/plain-class/expected.js
@@ -0,0 +1,3 @@
+var Test = function Test() {
+ babelHelpers.classCallCheck(this, Test);
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/preserves-directives/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/preserves-directives/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/preserves-directives/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/preserves-directives/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/preserves-directives/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/preserves-directives/expected.js
new file mode 100644
index 0000000000..df1be86af7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/preserves-directives/expected.js
@@ -0,0 +1,22 @@
+var MyCtrl = function MyCtrl(a) {
+ "any directive prologue";
+
+ babelHelpers.classCallCheck(this, MyCtrl);
+ foo;
+};
+
+var MyCtrl2 = function MyCtrl2(a) {
+ "a";
+ "b";
+
+ babelHelpers.classCallCheck(this, MyCtrl2);
+ foo;
+};
+
+var MyCtrl3 = function MyCtrl3(a) {
+ "a";
+
+ babelHelpers.classCallCheck(this, MyCtrl3);
+ foo;
+ "b";
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/relaxed-method-coercion/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/relaxed-method-coercion/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/relaxed-method-coercion/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/relaxed-method-coercion/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/relaxed-method-coercion/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/relaxed-method-coercion/expected.js
new file mode 100644
index 0000000000..9ecfb9d445
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/relaxed-method-coercion/expected.js
@@ -0,0 +1,16 @@
+// #1649
+
+var Foo = (function () {
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ }
+
+ babelHelpers.createClass(Foo, [{
+ key: Symbol(),
+ value: function value() {}
+ }, {
+ key: Symbol(),
+ value: function value() {}
+ }]);
+ return Foo;
+})();
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/returning-from-derived-constructor/exec.js b/packages/babel-core/test/fixtures/transformation/es6.classes/returning-from-derived-constructor/exec.js
new file mode 100644
index 0000000000..a37d09054b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/returning-from-derived-constructor/exec.js
@@ -0,0 +1,26 @@
+class Foo {
+ constructor() {
+ return { x: 1 };
+ }
+}
+
+assert.equal(new Foo().x, 1);
+
+class Bar extends Foo {
+ constructor() {
+ super();
+ return;
+ }
+}
+
+assert.equal(new Bar().x, 1);
+
+class Bar2 extends Foo {
+ constructor() {
+ super();
+ assert.equal(this.x, 1);
+ return { x: 2 };
+ }
+}
+
+assert.equal(new Bar2().x, 2);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/statement/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/statement/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/statement/expected.js
new file mode 100644
index 0000000000..a320977e84
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/statement/expected.js
@@ -0,0 +1,25 @@
+var BaseView = function BaseView() {
+ babelHelpers.classCallCheck(this, BaseView);
+
+ this.autoRender = true;
+};
+
+var BaseView = function BaseView() {
+ babelHelpers.classCallCheck(this, BaseView);
+
+ this.autoRender = true;
+};
+
+var BaseView = (function () {
+ function BaseView() {
+ babelHelpers.classCallCheck(this, BaseView);
+ }
+
+ babelHelpers.createClass(BaseView, [{
+ key: "foo",
+ value: function foo() {
+ this.autoRender = true;
+ }
+ }]);
+ return BaseView;
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/static/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/static/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/static/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/static/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/static/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/static/expected.js
new file mode 100644
index 0000000000..76e5b2195c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/static/expected.js
@@ -0,0 +1,15 @@
+var A = (function () {
+ function A() {
+ babelHelpers.classCallCheck(this, A);
+ }
+
+ babelHelpers.createClass(A, null, [{
+ key: "a",
+ value: function a() {}
+ }, {
+ key: "b",
+ get: function get() {},
+ set: function set(b) {}
+ }]);
+ return A;
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/expected.js
new file mode 100644
index 0000000000..898e1ce1c7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/expected.js
@@ -0,0 +1,5 @@
+var Foo = function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+
+ Object.getPrototypeOf(Foo).call(this);
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/options.json
new file mode 100644
index 0000000000..49ce838f4b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/super-call-only-allowed-in-derived-constructor/options.json
@@ -0,0 +1,3 @@
+{
+ "throws": "super() is only allowed in a derived constructor"
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-class-anonymous/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-anonymous/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-class-anonymous/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-class-anonymous/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-anonymous/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-anonymous/expected.js
new file mode 100644
index 0000000000..541efbdde1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-anonymous/expected.js
@@ -0,0 +1,99 @@
+var TestEmpty = (function (_ref) {
+ babelHelpers.inherits(TestEmpty, _ref);
+
+ function TestEmpty() {
+ babelHelpers.classCallCheck(this, TestEmpty);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestEmpty).apply(this, arguments));
+ }
+
+ return TestEmpty;
+})((function () {
+ function _class() {
+ babelHelpers.classCallCheck(this, _class);
+ }
+
+ return _class;
+})());
+
+var TestConstructorOnly = (function (_ref2) {
+ babelHelpers.inherits(TestConstructorOnly, _ref2);
+
+ function TestConstructorOnly() {
+ babelHelpers.classCallCheck(this, TestConstructorOnly);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestConstructorOnly).apply(this, arguments));
+ }
+
+ return TestConstructorOnly;
+})((function () {
+ function _class2() {
+ babelHelpers.classCallCheck(this, _class2);
+ }
+
+ return _class2;
+})());
+
+var TestMethodOnly = (function (_ref3) {
+ babelHelpers.inherits(TestMethodOnly, _ref3);
+
+ function TestMethodOnly() {
+ babelHelpers.classCallCheck(this, TestMethodOnly);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestMethodOnly).apply(this, arguments));
+ }
+
+ return TestMethodOnly;
+})((function () {
+ function _class3() {
+ babelHelpers.classCallCheck(this, _class3);
+ }
+
+ babelHelpers.createClass(_class3, [{
+ key: "method",
+ value: function method() {}
+ }]);
+ return _class3;
+})());
+
+var TestConstructorAndMethod = (function (_ref4) {
+ babelHelpers.inherits(TestConstructorAndMethod, _ref4);
+
+ function TestConstructorAndMethod() {
+ babelHelpers.classCallCheck(this, TestConstructorAndMethod);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestConstructorAndMethod).apply(this, arguments));
+ }
+
+ return TestConstructorAndMethod;
+})((function () {
+ function _class4() {
+ babelHelpers.classCallCheck(this, _class4);
+ }
+
+ babelHelpers.createClass(_class4, [{
+ key: "method",
+ value: function method() {}
+ }]);
+ return _class4;
+})());
+
+var TestMultipleMethods = (function (_ref5) {
+ babelHelpers.inherits(TestMultipleMethods, _ref5);
+
+ function TestMultipleMethods() {
+ babelHelpers.classCallCheck(this, TestMultipleMethods);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(TestMultipleMethods).apply(this, arguments));
+ }
+
+ return TestMultipleMethods;
+})((function () {
+ function _class5() {
+ babelHelpers.classCallCheck(this, _class5);
+ }
+
+ babelHelpers.createClass(_class5, [{
+ key: "m1",
+ value: function m1() {}
+ }, {
+ key: "m2",
+ value: function m2() {}
+ }]);
+ return _class5;
+})());
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-class-id-member-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-id-member-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-class-id-member-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-class-id-member-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-id-member-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-id-member-expression/expected.js
new file mode 100644
index 0000000000..abeca347e0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class-id-member-expression/expected.js
@@ -0,0 +1,21 @@
+var BaseController = (function (_Chaplin$Controller) {
+ babelHelpers.inherits(BaseController, _Chaplin$Controller);
+
+ function BaseController() {
+ babelHelpers.classCallCheck(this, BaseController);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(BaseController).apply(this, arguments));
+ }
+
+ return BaseController;
+})(Chaplin.Controller);
+
+var BaseController2 = (function (_Chaplin$Controller$A) {
+ babelHelpers.inherits(BaseController2, _Chaplin$Controller$A);
+
+ function BaseController2() {
+ babelHelpers.classCallCheck(this, BaseController2);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(BaseController2).apply(this, arguments));
+ }
+
+ return BaseController2;
+})(Chaplin.Controller.Another);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-class/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-class/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-class/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/super-class/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class/expected.js
new file mode 100644
index 0000000000..10cc6dd095
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/super-class/expected.js
@@ -0,0 +1,10 @@
+var Test = (function (_Foo) {
+ babelHelpers.inherits(Test, _Foo);
+
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Test).apply(this, arguments));
+ }
+
+ return Test;
+})(Foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-function-fallback/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-function-fallback/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-function-fallback/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-function-fallback/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/super-function-fallback/expected.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-function-fallback/expected.js
new file mode 100644
index 0000000000..26b0ffd3e1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/super-function-fallback/expected.js
@@ -0,0 +1,5 @@
+var Test = function Test() {
+ babelHelpers.classCallCheck(this, Test);
+
+ babelHelpers.get(Object.getPrototypeOf(Test.prototype), "hasOwnProperty", this).call(this, "test");
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-illegal-non-constructor-call/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-illegal-non-constructor-call/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-illegal-non-constructor-call/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-illegal-non-constructor-call/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.classes/super-illegal-non-constructor-call/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/super-illegal-non-constructor-call/options.json
new file mode 100644
index 0000000000..f63d64488d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.classes/super-illegal-non-constructor-call/options.json
@@ -0,0 +1,3 @@
+{
+ "throws": "super() outside of class constructor"
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes-2/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/actual.js b/packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/options.json b/packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.classes/this-not-allowed-before-super-in-derived-classes/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/block-scoped/exec.js b/packages/babel-core/test/fixtures/transformation/es6.constants/block-scoped/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/block-scoped/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/block-scoped/exec.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/block-statement/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/block-statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/block-statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/block-statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.constants/block-statement/expected.js b/packages/babel-core/test/fixtures/transformation/es6.constants/block-statement/expected.js
new file mode 100644
index 0000000000..8ff11044f9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.constants/block-statement/expected.js
@@ -0,0 +1,4 @@
+for (var i in arr) {
+ var MULTIPLIER = 5;
+ console.log(arr[i] * MULTIPLIER);
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/destructuring-assignment/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/destructuring-assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/destructuring-assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/destructuring-assignment/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/destructuring-assignment/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/destructuring-assignment/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/destructuring-assignment/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/destructuring-assignment/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/destructuring/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/destructuring/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/destructuring/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/destructuring/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.constants/destructuring/expected.js b/packages/babel-core/test/fixtures/transformation/es6.constants/destructuring/expected.js
new file mode 100644
index 0000000000..3ad6e248ea
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.constants/destructuring/expected.js
@@ -0,0 +1,10 @@
+var a = 1;
+var b = 2;
+var c = 3;
+var d = 4;
+var _e$f = { e: 5, f: 6 };
+var e = _e$f.e;
+var f = _e$f.f;
+var _a$b = { a: 7, b: 8 };
+var g = _a$b.a;
+var h = _a$b.b;
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/ignore-member-expressions/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/ignore-member-expressions/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/ignore-member-expressions/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/ignore-member-expressions/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.constants/ignore-member-expressions/expected.js b/packages/babel-core/test/fixtures/transformation/es6.constants/ignore-member-expressions/expected.js
new file mode 100644
index 0000000000..ac77be1e13
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.constants/ignore-member-expressions/expected.js
@@ -0,0 +1,2 @@
+var x = {};
+x.key = "value";
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/loop/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/loop/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/loop/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/loop/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/loop/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/loop/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/loop/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/loop/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-assignment/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/no-assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-assignment/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-assignment/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/no-assignment/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-assignment/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-assignment/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-classes/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/no-classes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-classes/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-classes/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-classes/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/no-classes/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-classes/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-classes/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-declaration/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/no-declaration/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-declaration/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-declaration/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-declaration/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/no-declaration/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-declaration/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-declaration/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-for-in/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/no-for-in/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-for-in/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-for-in/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-for-in/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/no-for-in/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-for-in/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-for-in/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-functions/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/no-functions/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-functions/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-functions/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/no-functions/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/no-functions/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/no-functions/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/no-functions/options.json
diff --git a/packages/babel-core/test/fixtures/transformation/es6.constants/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/options.json
new file mode 100644
index 0000000000..b4063f1b64
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.constants/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-constants", "transform-es2015-block-scoping", "transform-es2015-destructuring"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/program/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/program/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/program/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/program/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.constants/program/expected.js b/packages/babel-core/test/fixtures/transformation/es6.constants/program/expected.js
new file mode 100644
index 0000000000..56dae9f66f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.constants/program/expected.js
@@ -0,0 +1,5 @@
+var MULTIPLIER = 5;
+
+for (var i in arr) {
+ console.log(arr[i] * MULTIPLIER);
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/update-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.constants/update-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/update-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.constants/update-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.constants/update-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.constants/update-expression/expected.js
new file mode 100644
index 0000000000..dce8a70d97
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.constants/update-expression/expected.js
@@ -0,0 +1,4 @@
+var foo = 1;
+(function () {
+ throw new TypeError("\"foo\" is read-only");
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.constants/update-expression/options.json b/packages/babel-core/test/fixtures/transformation/es6.constants/update-expression/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.constants/update-expression/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.constants/update-expression/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/expected.js
new file mode 100644
index 0000000000..e6b45f91cb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/array-unpack-optimisation/expected.js
@@ -0,0 +1,27 @@
+var a = 1;
+var b = 2;
+var a = 1;
+var b = 2;
+var a = 1;
+var b = 2;
+var c = [3, 4];
+var a = 1;
+var b = 2;
+var c = [3, 4];
+var _ref = [1, 2, 3];
+var a = _ref[0];
+var b = _ref[1];
+var _ref2 = [1, 2, 3];
+var a = _ref2[0];
+var b = _ref2[1];
+var _ref3 = [a, b];
+var a = _ref3[0];
+var b = _ref3[1];
+var _ref4 = [a[1], a[0]];
+a[0] = _ref4[0];
+a[1] = _ref4[1];
+
+var _ref5 = [].concat(babelHelpers.toConsumableArray(foo), [bar]);
+
+var a = _ref5[0];
+var b = _ref5[1];
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/array/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/array/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/array/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/array/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/array/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/array/expected.js
new file mode 100644
index 0000000000..ca9b5413ef
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/array/expected.js
@@ -0,0 +1,10 @@
+var a = "hello";
+var _ref = [", ", "junk"];
+var b = _ref[0];
+var c = "world";
+a = "hello";
+var _ref2 = [", ", "junk"];
+b = _ref2[0];
+c = "world";
+
+;
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/assignment-expression-completion-record/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-completion-record/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/assignment-expression-completion-record/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-completion-record/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-completion-record/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-completion-record/expected.js
new file mode 100644
index 0000000000..0836058dc7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-completion-record/expected.js
@@ -0,0 +1,5 @@
+var x, y;
+var _ref = [1, 2];
+x = _ref[0];
+y = _ref[1];
+_ref;
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/assignment-expression-pattern/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-pattern/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/assignment-expression-pattern/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-pattern/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-pattern/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-pattern/expected.js
new file mode 100644
index 0000000000..47004a5c9d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression-pattern/expected.js
@@ -0,0 +1,4 @@
+var z = {};
+var _z$x = z.x;
+_z$x = _z$x === undefined ? {} : _z$x;
+var y = _z$x.y;
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/assignment-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/assignment-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression/expected.js
new file mode 100644
index 0000000000..0c1da0040f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-expression/expected.js
@@ -0,0 +1,3 @@
+var _ref;
+
+console.log((_ref = [123], x = _ref[0], _ref));
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/assignment-statement/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/assignment-statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-statement/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-statement/expected.js
new file mode 100644
index 0000000000..defe900595
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/assignment-statement/expected.js
@@ -0,0 +1,8 @@
+var _f = f();
+
+var _f2 = babelHelpers.slicedToArray(_f, 2);
+
+a = _f2[0];
+b = _f2[1];
+
+;
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/chained/exec.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/chained/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/chained/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/chained/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/actual.js
new file mode 100644
index 0000000000..deb5faf388
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/actual.js
@@ -0,0 +1,17 @@
+var f0 = function (a, b = a, c = b) {
+ return [a, b, c];
+};
+
+assert.deepEqual(f0(1), [1, 1, 1]);
+
+var f1 = function ({a}, b = a, c = b) {
+ return [a, b, c];
+};
+
+assert.deepEqual(f1({a: 1}), [1, 1, 1]);
+
+var f2 = function ({a}, b = a, c = a) {
+ return [a, b, c];
+};
+
+assert.deepEqual(f2({a: 1}), [1, 1, 1]);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/exec.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/exec.js
new file mode 100644
index 0000000000..deb5faf388
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/exec.js
@@ -0,0 +1,17 @@
+var f0 = function (a, b = a, c = b) {
+ return [a, b, c];
+};
+
+assert.deepEqual(f0(1), [1, 1, 1]);
+
+var f1 = function ({a}, b = a, c = b) {
+ return [a, b, c];
+};
+
+assert.deepEqual(f1({a: 1}), [1, 1, 1]);
+
+var f2 = function ({a}, b = a, c = a) {
+ return [a, b, c];
+};
+
+assert.deepEqual(f2({a: 1}), [1, 1, 1]);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/expected.js
new file mode 100644
index 0000000000..676f9c51d5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/default-precedence/expected.js
@@ -0,0 +1,28 @@
+var f0 = function (a) {
+ var b = arguments.length <= 1 || arguments[1] === undefined ? a : arguments[1];
+ var c = arguments.length <= 2 || arguments[2] === undefined ? b : arguments[2];
+
+ return [a, b, c];
+};
+
+assert.deepEqual(f0(1), [1, 1, 1]);
+
+var f1 = function (_ref) {
+ var a = _ref.a;
+ var b = arguments.length <= 1 || arguments[1] === undefined ? a : arguments[1];
+ var c = arguments.length <= 2 || arguments[2] === undefined ? b : arguments[2];
+
+ return [a, b, c];
+};
+
+assert.deepEqual(f1({ a: 1 }), [1, 1, 1]);
+
+var f2 = function (_ref2) {
+ var a = _ref2.a;
+ var b = arguments.length <= 1 || arguments[1] === undefined ? a : arguments[1];
+ var c = arguments.length <= 2 || arguments[2] === undefined ? a : arguments[2];
+
+ return [a, b, c];
+};
+
+assert.deepEqual(f2({ a: 1 }), [1, 1, 1]);
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/empty-object-pattern/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty-object-pattern/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/empty-object-pattern/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/empty-object-pattern/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/empty-object-pattern/exec.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty-object-pattern/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/empty-object-pattern/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/empty-object-pattern/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty-object-pattern/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty-object-pattern/expected.js
new file mode 100644
index 0000000000..61ae1a06dc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty-object-pattern/expected.js
@@ -0,0 +1,2 @@
+var _ref = null;
+babelHelpers.objectDestructuringEmpty(_ref);
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/empty/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/empty/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/empty/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty/expected.js
new file mode 100644
index 0000000000..f075fa1000
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/empty/expected.js
@@ -0,0 +1,11 @@
+var _ref = ["foo", "hello", [", ", "junk"], ["world"]];
+var a = _ref[1];
+
+var _ref$ = babelHelpers.slicedToArray(_ref[2], 1);
+
+var b = _ref$[0];
+
+var _ref$2 = babelHelpers.slicedToArray(_ref[3], 1);
+
+var c = _ref$2[0];
+var d = _ref[4];
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/es7-object-rest/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/es7-object-rest/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/es7-object-rest/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/es7-object-rest/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/es7-object-rest/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/es7-object-rest/expected.js
new file mode 100644
index 0000000000..935f76c0e0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/es7-object-rest/expected.js
@@ -0,0 +1,11 @@
+var z = {};
+var x = babelHelpers.objectWithoutProperties(z, []);
+var x = z.x;
+var y = babelHelpers.objectWithoutProperties(z, ["x"]);
+var x = z[x];
+var y = babelHelpers.objectWithoutProperties(z, [x]);
+
+(function (_ref) {
+ var x = _ref.x;
+ var y = babelHelpers.objectWithoutProperties(_ref, ["x"]);
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/for-in/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-in/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/for-in/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/for-in/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-in/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-in/expected.js
new file mode 100644
index 0000000000..87574b678d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-in/expected.js
@@ -0,0 +1,8 @@
+for (var _ref in obj) {
+ var _ref2 = babelHelpers.slicedToArray(_ref, 2);
+
+ var name = _ref2[0];
+ var value = _ref2[1];
+
+ print("Name: " + name + ", Value: " + value);
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/for-of/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-of/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/for-of/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/for-of/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-of/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-of/expected.js
new file mode 100644
index 0000000000..45ddc2fc6a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/for-of/expected.js
@@ -0,0 +1,7 @@
+for (var _ref of test.expectation.registers) {
+ var _ref2 = babelHelpers.slicedToArray(_ref, 3);
+
+ var name = _ref2[0];
+ var before = _ref2[1];
+ var after = _ref2[2];
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/known-array/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/known-array/actual.js
new file mode 100644
index 0000000000..cf5f7c01f3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/known-array/actual.js
@@ -0,0 +1,2 @@
+var z = [];
+var [x, ...y] = z;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/known-array/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/known-array/expected.js
new file mode 100644
index 0000000000..34c0ca8df5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/known-array/expected.js
@@ -0,0 +1,3 @@
+var z = [];
+var x = z[0];
+var y = z.slice(1);
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/member-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/member-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/member-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/member-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/member-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/member-expression/expected.js
new file mode 100644
index 0000000000..300da8c461
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/member-expression/expected.js
@@ -0,0 +1,5 @@
+var _ref = [1, 2];
+foo.foo = _ref[0];
+foo.bar = _ref[1];
+
+;
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/mixed/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/mixed/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/mixed/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/mixed/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/mixed/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/mixed/expected.js
new file mode 100644
index 0000000000..dfb38be734
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/mixed/expected.js
@@ -0,0 +1,11 @@
+var rect = {};
+
+var _rect$topLeft = babelHelpers.slicedToArray(rect.topLeft, 2);
+
+var x1 = _rect$topLeft[0];
+var y1 = _rect$topLeft[1];
+
+var _rect$bottomRight = babelHelpers.slicedToArray(rect.bottomRight, 2);
+
+var x2 = _rect$bottomRight[0];
+var y2 = _rect$bottomRight[1];
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/multiple/expected.js
new file mode 100644
index 0000000000..b77339c9e8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/multiple/expected.js
@@ -0,0 +1,4 @@
+var coords = [1, 2];
+var x = coords.x;
+var y = coords.y;
+var foo = "bar";
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/object-advanced/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-advanced/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/object-advanced/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/object-advanced/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-advanced/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-advanced/expected.js
new file mode 100644
index 0000000000..8086ab92ee
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-advanced/expected.js
@@ -0,0 +1,10 @@
+var rect = {};
+var _rect$topLeft = rect.topLeft;
+var x1 = _rect$topLeft.x;
+var y1 = _rect$topLeft.y;
+var _rect$bottomRight = rect.bottomRight;
+var x2 = _rect$bottomRight.x;
+var y2 = _rect$bottomRight.y;
+var _ref = [0, 1, 2, 3, 4, 5, 6];
+var foo = _ref[3];
+var bar = _ref[5];
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/object-basic/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-basic/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/object-basic/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/object-basic/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-basic/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-basic/expected.js
new file mode 100644
index 0000000000..24833dda4c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/object-basic/expected.js
@@ -0,0 +1,3 @@
+var coords = [1, 2];
+var x = coords.x;
+var y = coords.y;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/options.json b/packages/babel-core/test/fixtures/transformation/es6.destructuring/options.json
new file mode 100644
index 0000000000..492b43d890
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-destructuring", "transform-es2015-spread", "transform-es2015-parameters", "transform-es2015-block-scoping", "transform-object-rest-spread"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/parameters/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/parameters/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/parameters/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/parameters/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/parameters/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/parameters/expected.js
new file mode 100644
index 0000000000..bfd42de2b8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/parameters/expected.js
@@ -0,0 +1,37 @@
+function somethingAdvanced(_ref, p2, p3) {
+ var _ref$topLeft = _ref.topLeft;
+ _ref$topLeft = _ref$topLeft === undefined ? {} : _ref$topLeft;
+ var x1 = _ref$topLeft.x;
+ var y1 = _ref$topLeft.y;
+ var _ref$bottomRight = _ref.bottomRight;
+ _ref$bottomRight = _ref$bottomRight === undefined ? {} : _ref$bottomRight;
+ var x2 = _ref$bottomRight.x;
+ var y2 = _ref$bottomRight.y;
+}
+
+function unpackObject(_ref2) {
+ var title = _ref2.title;
+ var author = _ref2.author;
+
+ return title + " " + author;
+}
+
+console.log(unpackObject({ title: "title", author: "author" }));
+
+var unpackArray = function (_ref3, _ref4) {
+ var _ref6 = babelHelpers.slicedToArray(_ref3, 3);
+
+ var a = _ref6[0];
+ var b = _ref6[1];
+ var c = _ref6[2];
+
+ var _ref5 = babelHelpers.slicedToArray(_ref4, 3);
+
+ var x = _ref5[0];
+ var y = _ref5[1];
+ var z = _ref5[2];
+
+ return a + b + c;
+};
+
+console.log(unpackArray(["hello", ", ", "world"], [1, 2, 3]));
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/spread-generator/exec.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/spread-generator/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/spread-generator/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/spread-generator/exec.js
diff --git a/packages/babel/test/fixtures/transformation/es6.destructuring/spread/actual.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/spread/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.destructuring/spread/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.destructuring/spread/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.destructuring/spread/expected.js b/packages/babel-core/test/fixtures/transformation/es6.destructuring/spread/expected.js
new file mode 100644
index 0000000000..798f3a407a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.destructuring/spread/expected.js
@@ -0,0 +1,12 @@
+function isSorted(_ref) {
+ var _ref2 = babelHelpers.toArray(_ref);
+
+ var x = _ref2[0];
+ var y = _ref2[1];
+
+ var wow = _ref2.slice(2);
+
+ if (!zs.length) return true;
+ if (y > x) return isSorted(zs);
+ return false;
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of-loose/identifier/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/identifier/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of-loose/identifier/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of-loose/identifier/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/identifier/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/identifier/expected.js
new file mode 100644
index 0000000000..4ce44f50f5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/identifier/expected.js
@@ -0,0 +1,10 @@
+for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+ if (_isArray) {
+ if (_i >= _iterator.length) break;
+ i = _iterator[_i++];
+ } else {
+ _i = _iterator.next();
+ if (_i.done) break;
+ i = _i.value;
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of-loose/ignore-cases/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/ignore-cases/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of-loose/ignore-cases/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of-loose/ignore-cases/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/ignore-cases/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/ignore-cases/expected.js
new file mode 100644
index 0000000000..9c64275021
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/ignore-cases/expected.js
@@ -0,0 +1,19 @@
+for (var _iterator = foo, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+ var _ref;
+
+ if (_isArray) {
+ if (_i >= _iterator.length) break;
+ _ref = _iterator[_i++];
+ } else {
+ _i = _iterator.next();
+ if (_i.done) break;
+ _ref = _i.value;
+ }
+
+ var i = _ref;
+
+ switch (i) {
+ case 1:
+ break;
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of-loose/let/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/let/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of-loose/let/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of-loose/let/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/let/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/let/expected.js
new file mode 100644
index 0000000000..097ced3ac7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/let/expected.js
@@ -0,0 +1,14 @@
+for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+ var _ref;
+
+ if (_isArray) {
+ if (_i >= _iterator.length) break;
+ _ref = _iterator[_i++];
+ } else {
+ _i = _iterator.next();
+ if (_i.done) break;
+ _ref = _i.value;
+ }
+
+ let i = _ref;
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of-loose/member-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/member-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of-loose/member-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of-loose/member-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/member-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/member-expression/expected.js
new file mode 100644
index 0000000000..4945bb7127
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/member-expression/expected.js
@@ -0,0 +1,10 @@
+for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+ if (_isArray) {
+ if (_i >= _iterator.length) break;
+ obj.prop = _iterator[_i++];
+ } else {
+ _i = _iterator.next();
+ if (_i.done) break;
+ obj.prop = _i.value;
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of-loose/multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of-loose/multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of-loose/multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/multiple/expected.js
new file mode 100644
index 0000000000..985c62fc85
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/multiple/expected.js
@@ -0,0 +1,29 @@
+for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+ var _ref;
+
+ if (_isArray) {
+ if (_i >= _iterator.length) break;
+ _ref = _iterator[_i++];
+ } else {
+ _i = _iterator.next();
+ if (_i.done) break;
+ _ref = _i.value;
+ }
+
+ var i = _ref;
+}
+
+for (var _iterator2 = numbers, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
+ var _ref2;
+
+ if (_isArray2) {
+ if (_i2 >= _iterator2.length) break;
+ _ref2 = _iterator2[_i2++];
+ } else {
+ _i2 = _iterator2.next();
+ if (_i2.done) break;
+ _ref2 = _i2.value;
+ }
+
+ var i = _ref2;
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/options.json b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/options.json
new file mode 100644
index 0000000000..8abc0aa64a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": [["transform-es2015-for-of", { "loose": true }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of-loose/var/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/var/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of-loose/var/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of-loose/var/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/var/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/var/expected.js
new file mode 100644
index 0000000000..7565d63def
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of-loose/var/expected.js
@@ -0,0 +1,14 @@
+for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
+ var _ref;
+
+ if (_isArray) {
+ if (_i >= _iterator.length) break;
+ _ref = _iterator[_i++];
+ } else {
+ _i = _iterator.next();
+ if (_i.done) break;
+ _ref = _i.value;
+ }
+
+ var i = _ref;
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of/identifier/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/identifier/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of/identifier/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of/identifier/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/identifier/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/identifier/expected.js
new file mode 100644
index 0000000000..a3d54af48f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/identifier/expected.js
@@ -0,0 +1,22 @@
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ i = _step.value;
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of/ignore-cases/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/ignore-cases/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of/ignore-cases/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of/ignore-cases/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/ignore-cases/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/ignore-cases/expected.js
new file mode 100644
index 0000000000..dcd4320b80
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/ignore-cases/expected.js
@@ -0,0 +1,27 @@
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = foo[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var i = _step.value;
+
+ switch (i) {
+ case 1:
+ break;
+ }
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of/let/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/let/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of/let/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of/let/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/let/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/let/expected.js
new file mode 100644
index 0000000000..fb997e23ad
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/let/expected.js
@@ -0,0 +1,22 @@
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ let i = _step.value;
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of/member-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/member-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of/member-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of/member-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/member-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/member-expression/expected.js
new file mode 100644
index 0000000000..af5bbbb407
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/member-expression/expected.js
@@ -0,0 +1,22 @@
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ obj.prop = _step.value;
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of/multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of/multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of/multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/multiple/expected.js
new file mode 100644
index 0000000000..a3568407fe
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/multiple/expected.js
@@ -0,0 +1,45 @@
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var i = _step.value;
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
+
+var _iteratorNormalCompletion2 = true;
+var _didIteratorError2 = false;
+var _iteratorError2 = undefined;
+
+try {
+ for (var _iterator2 = numbers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
+ var i = _step2.value;
+ }
+} catch (err) {
+ _didIteratorError2 = true;
+ _iteratorError2 = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion2 && _iterator2.return) {
+ _iterator2.return();
+ }
+ } finally {
+ if (_didIteratorError2) {
+ throw _iteratorError2;
+ }
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of/nested-label-for-of/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/nested-label-for-of/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of/nested-label-for-of/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of/nested-label-for-of/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/nested-label-for-of/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/nested-label-for-of/expected.js
new file mode 100644
index 0000000000..7388ecdf69
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/nested-label-for-of/expected.js
@@ -0,0 +1,46 @@
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ b: for (var _iterator = d()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ let c = _step.value;
+ var _iteratorNormalCompletion2 = true;
+ var _didIteratorError2 = false;
+ var _iteratorError2 = undefined;
+
+ try {
+ for (var _iterator2 = f()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
+ let e = _step2.value;
+
+ continue b;
+ }
+ } catch (err) {
+ _didIteratorError2 = true;
+ _iteratorError2 = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion2 && _iterator2.return) {
+ _iterator2.return();
+ }
+ } finally {
+ if (_didIteratorError2) {
+ throw _iteratorError2;
+ }
+ }
+ }
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/options.json b/packages/babel-core/test/fixtures/transformation/es6.for-of/options.json
new file mode 100644
index 0000000000..dd11655f55
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-for-of"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.for-of/var/actual.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/var/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.for-of/var/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.for-of/var/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.for-of/var/expected.js b/packages/babel-core/test/fixtures/transformation/es6.for-of/var/expected.js
new file mode 100644
index 0000000000..70fa6471db
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.for-of/var/expected.js
@@ -0,0 +1,22 @@
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var i = _step.value;
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/export-specifier-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/export-specifier-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/export-specifier-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/export-specifier-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/export-specifier-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/export-specifier-default/expected.js
new file mode 100644
index 0000000000..de3df365d6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/export-specifier-default/expected.js
@@ -0,0 +1,7 @@
+define(["exports"], function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ var a = 1;
+ exports.default = a;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/exports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/exports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-default/expected.js
new file mode 100644
index 0000000000..4ca1761354
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-default/expected.js
@@ -0,0 +1,25 @@
+define(["exports"], function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ exports.default = function () {};
+
+ exports.default = foo;
+ exports.default = 42;
+ exports.default = {};
+ exports.default = [];
+ exports.default = foo;
+ exports.default = class {};
+
+ function foo() {}
+
+ class Foo {}
+
+ exports.default = Foo;
+ exports.default = foo;
+
+ exports.default = (function () {
+ return "foo";
+ })();
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-default/untitled b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-default/untitled
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/exports-from/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-from/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/exports-from/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-from/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-from/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-from/expected.js
new file mode 100644
index 0000000000..df024b3edc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-from/expected.js
@@ -0,0 +1,58 @@
+define(["exports", "foo"], function (exports, _foo) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ for (let _key in _foo) {
+ if (_key === "default") continue;
+ Object.defineProperty(exports, _key, {
+ enumerable: true,
+ get: function () {
+ return _foo[_key];
+ }
+ });
+ }
+
+ Object.defineProperty(exports, "foo", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "foo", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.bar;
+ }
+ });
+ Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.bar;
+ }
+ });
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/exports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/exports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-named/expected.js
new file mode 100644
index 0000000000..ebfaeff38a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-named/expected.js
@@ -0,0 +1,12 @@
+define(["exports"], function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.foo = foo;
+ exports.foo = foo;
+ exports.bar = bar;
+ exports.bar = foo;
+ exports.default = foo;
+ exports.default = foo;
+ exports.bar = bar;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/exports-variable/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-variable/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/exports-variable/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-variable/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-variable/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-variable/expected.js
new file mode 100644
index 0000000000..f3a3b41647
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/exports-variable/expected.js
@@ -0,0 +1,22 @@
+define(["exports"], function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.foo7 = foo7;
+ var foo = exports.foo = 1;
+ var foo = exports.foo = 1,
+ bar = exports.bar = 2;
+
+ var foo2 = exports.foo2 = function () {};
+
+ var foo3 = exports.foo3 = undefined;
+ let foo4 = exports.foo4 = 2;
+ let foo5 = exports.foo5 = undefined;
+ const foo6 = exports.foo6 = 3;
+
+ function foo7() {}
+
+ class foo8 {}
+
+ exports.foo8 = foo8;
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/get-module-name-option/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/get-module-name-option/actual.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/get-module-name-option/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/get-module-name-option/expected.js
new file mode 100644
index 0000000000..236ed887cb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/get-module-name-option/expected.js
@@ -0,0 +1 @@
+define("my custom module name", [], function () {});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/get-module-name-option/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/get-module-name-option/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/get-module-name-option/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/get-module-name-option/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/hoist-function-exports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/hoist-function-exports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/hoist-function-exports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/hoist-function-exports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/hoist-function-exports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/hoist-function-exports/expected.js
new file mode 100644
index 0000000000..4a1cf55db8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/hoist-function-exports/expected.js
@@ -0,0 +1,17 @@
+define(["exports", "./evens"], function (exports, _evens) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.isOdd = undefined;
+ exports.nextOdd = nextOdd;
+
+ function nextOdd(n) {
+ return (0, _evens.isEven)(n) ? n + 1 : n + 2;
+ }
+
+ var isOdd = exports.isOdd = (function (isEven) {
+ return function (n) {
+ return !isEven(n);
+ };
+ })(_evens.isEven);
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/imports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/imports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-default/expected.js
new file mode 100644
index 0000000000..920bf04d48
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-default/expected.js
@@ -0,0 +1,6 @@
+define(["foo"], function (_foo) {
+ var _foo2 = babelHelpers.interopRequireDefault(_foo);
+
+ _foo2.default;
+ _foo2.default;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/imports-glob/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-glob/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/imports-glob/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-glob/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-glob/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-glob/expected.js
new file mode 100644
index 0000000000..08282514a1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-glob/expected.js
@@ -0,0 +1,4 @@
+define(["foo"], function (_foo) {
+ var foo = babelHelpers.interopRequireWildcard(_foo);
+ foo;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/imports-mixing/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-mixing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/imports-mixing/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-mixing/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-mixing/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-mixing/expected.js
new file mode 100644
index 0000000000..660f045a4e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-mixing/expected.js
@@ -0,0 +1,6 @@
+define(["foo"], function (_foo) {
+ var _foo2 = babelHelpers.interopRequireDefault(_foo);
+
+ _foo2.default;
+ _foo.baz;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/imports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/imports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-named/expected.js
new file mode 100644
index 0000000000..bdbf6205eb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports-named/expected.js
@@ -0,0 +1,8 @@
+define(["foo"], function (_foo) {
+ _foo.bar;
+ _foo.bar2;
+ _foo.baz;
+ _foo.bar;
+ _foo.bar;
+ _foo.xyz;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/imports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/imports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports/expected.js
new file mode 100644
index 0000000000..ac340082b3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/imports/expected.js
@@ -0,0 +1 @@
+define(["foo", "foo-bar", "./directory/foo-bar"], function () {});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/module-name/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/module-name/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/module-name/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/module-name/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/module-name/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/module-name/expected.js
new file mode 100644
index 0000000000..57378003a7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/module-name/expected.js
@@ -0,0 +1,3 @@
+define("es6.modules-amd/module-name/expected", [], function () {
+ foobar();
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/module-name/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/module-name/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/module-name/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/module-name/options.json
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/options.json
new file mode 100644
index 0000000000..edd6ab30c0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-modules-amd"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/overview/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/overview/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/overview/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/overview/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/overview/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/overview/expected.js
new file mode 100644
index 0000000000..de671af9d2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/overview/expected.js
@@ -0,0 +1,14 @@
+define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports, _foo) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.test2 = exports.test = undefined;
+ var foo2 = babelHelpers.interopRequireWildcard(_foo);
+ exports.test = test;
+ var test2 = exports.test2 = 5;
+ exports.default = test;
+ foo2.default;
+ foo2;
+ _foo.bar;
+ _foo.foo;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-amd/remap/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/remap/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-amd/remap/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-amd/remap/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-amd/remap/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/remap/expected.js
new file mode 100644
index 0000000000..9211a9b13d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-amd/remap/expected.js
@@ -0,0 +1,25 @@
+define(["exports"], function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ var test = exports.test = 2;
+ exports.test = test = 5;
+ exports.test = test += 1;
+
+ (function () {
+ var test = 2;
+ test = 3;
+ test++;
+ })();
+
+ var a = 2;
+ exports.a = a;
+ exports.a = a = 3;
+ var b = 2;
+ exports.c = b;
+ exports.c = b = 3;
+ var d = 3;
+ exports.e = d;
+ exports.f = d;
+ exports.f = exports.e = d = 4;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common-strict/export-1/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-1/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common-strict/export-1/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-1/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-1/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-1/expected.js
new file mode 100644
index 0000000000..3853346ca6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-1/expected.js
@@ -0,0 +1 @@
+exports.default = foo;
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common-strict/export-2/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-2/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common-strict/export-2/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-2/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-2/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-2/expected.js
new file mode 100644
index 0000000000..3853346ca6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export-2/expected.js
@@ -0,0 +1 @@
+exports.default = foo;
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common-strict/export/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common-strict/export/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export/expected.js
new file mode 100644
index 0000000000..a78f99e303
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/export/expected.js
@@ -0,0 +1,2 @@
+exports.foo = foo;
+function foo() {}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common-strict/import/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/import/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common-strict/import/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/import/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/import/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/import/expected.js
new file mode 100644
index 0000000000..81e62c8a6a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/import/expected.js
@@ -0,0 +1,5 @@
+var _foo = require("foo");
+
+_foo.default;
+_foo.default;
+_foo.foo3;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/options.json
new file mode 100644
index 0000000000..3591ef1e6f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common-strict/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", ["transform-es2015-modules-commonjs", { "strict": true }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/exports-default-non-function/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default-non-function/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/exports-default-non-function/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default-non-function/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default-non-function/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default-non-function/expected.js
new file mode 100644
index 0000000000..0c17404a23
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default-non-function/expected.js
@@ -0,0 +1,6 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.Cachier = Cachier;
+exports.default = new Cachier();
+function Cachier(databaseName) {}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/exports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/exports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default/expected.js
new file mode 100644
index 0000000000..dac611107f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-default/expected.js
@@ -0,0 +1,20 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+exports.default = function () {};
+
+exports.default = foo;
+exports.default = 42;
+exports.default = {};
+exports.default = [];
+exports.default = foo;
+exports.default = class {};
+function foo() {}
+class Foo {}
+exports.default = Foo;
+exports.default = foo;
+
+exports.default = (function () {
+ return "foo";
+})();
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/exports-from/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-from/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/exports-from/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-from/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-from/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-from/expected.js
new file mode 100644
index 0000000000..b11ab3a306
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-from/expected.js
@@ -0,0 +1,58 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _foo = require("foo");
+
+for (let _key in _foo) {
+ if (_key === "default") continue;
+ Object.defineProperty(exports, _key, {
+ enumerable: true,
+ get: function () {
+ return _foo[_key];
+ }
+ });
+}
+
+Object.defineProperty(exports, "foo", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+});
+Object.defineProperty(exports, "foo", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+});
+Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.bar;
+ }
+});
+Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+});
+Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+});
+Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+});
+Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.bar;
+ }
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/exports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/exports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-named/expected.js
new file mode 100644
index 0000000000..8deb82b599
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-named/expected.js
@@ -0,0 +1,10 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.foo = foo;
+exports.foo = foo;
+exports.bar = bar;
+exports.bar = foo;
+exports.default = foo;
+exports.default = foo;
+exports.bar = bar;
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/exports-variable/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-variable/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/exports-variable/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-variable/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-variable/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-variable/expected.js
new file mode 100644
index 0000000000..ce80d1d2b8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/exports-variable/expected.js
@@ -0,0 +1,15 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.foo7 = foo7;
+var foo = exports.foo = 1;
+var foo = exports.foo = 1,
+ bar = exports.bar = 2;
+var foo2 = exports.foo2 = function () {};
+var foo3 = exports.foo3 = undefined;
+let foo4 = exports.foo4 = 2;
+let foo5 = exports.foo5 = undefined;
+const foo6 = exports.foo6 = 3;
+function foo7() {}
+class foo8 {}
+exports.foo8 = foo8;
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/hoist-function-exports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/hoist-function-exports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/hoist-function-exports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/hoist-function-exports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/hoist-function-exports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/hoist-function-exports/expected.js
new file mode 100644
index 0000000000..dc60fbd4d1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/hoist-function-exports/expected.js
@@ -0,0 +1,17 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.isOdd = undefined;
+exports.nextOdd = nextOdd;
+
+var _evens = require("./evens");
+
+function nextOdd(n) {
+ return (0, _evens.isEven)(n) ? n + 1 : n + 2;
+}
+
+var isOdd = exports.isOdd = (function (isEven) {
+ return function (n) {
+ return !isEven(n);
+ };
+})(_evens.isEven);
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule-2/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/illegal-export-esmodule/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/imports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/imports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/expected.js
new file mode 100644
index 0000000000..e318052d21
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/expected.js
@@ -0,0 +1,6 @@
+var _foo = require("foo");
+
+var _foo2 = babelHelpers.interopRequireDefault(_foo);
+
+_foo2.default;
+_foo2.default;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/options.json
new file mode 100644
index 0000000000..a6a12735e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-default/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/imports-glob/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-glob/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/imports-glob/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-glob/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-glob/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-glob/expected.js
new file mode 100644
index 0000000000..8483a8db49
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-glob/expected.js
@@ -0,0 +1,3 @@
+var _foo = require("foo");
+
+var foo = babelHelpers.interopRequireWildcard(_foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/imports-mixing/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/imports-mixing/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/expected.js
new file mode 100644
index 0000000000..b8dd69bad9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/expected.js
@@ -0,0 +1,6 @@
+var _foo = require("foo");
+
+var _foo2 = babelHelpers.interopRequireDefault(_foo);
+
+_foo2.default;
+_foo.baz;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/options.json
new file mode 100644
index 0000000000..a6a12735e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-mixing/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/imports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/imports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-named/expected.js
new file mode 100644
index 0000000000..0c5c96485c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports-named/expected.js
@@ -0,0 +1,8 @@
+var _foo = require("foo");
+
+_foo.bar;
+_foo.bar2;
+_foo.baz;
+_foo.bar;
+_foo.bar;
+_foo.xyz;
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/imports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/imports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/imports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports/expected.js
new file mode 100644
index 0000000000..e3de8abeb0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/imports/expected.js
@@ -0,0 +1,5 @@
+require("foo");
+
+require("foo-bar");
+
+require("./directory/foo-bar");
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/module-shadow/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/module-shadow/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/module-shadow/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/module-shadow/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/module-shadow/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/module-shadow/expected.js
new file mode 100644
index 0000000000..130e6fa256
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/module-shadow/expected.js
@@ -0,0 +1,5 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+function _module() {}
+exports.module = _module;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-common/options.json
new file mode 100644
index 0000000000..956132f2a1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-modules-commonjs"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/overview/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/overview/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/expected.js
new file mode 100644
index 0000000000..ed191101ce
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/expected.js
@@ -0,0 +1,29 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.test = undefined;
+
+require("foo");
+
+require("foo-bar");
+
+require("./directory/foo-bar");
+
+var _foo = require("foo2");
+
+var _foo2 = babelHelpers.interopRequireDefault(_foo);
+
+var _foo3 = require("foo3");
+
+var foo2 = babelHelpers.interopRequireWildcard(_foo3);
+
+var _foo4 = require("foo4");
+
+var _foo5 = require("foo5");
+
+exports.test = test;
+var test = exports.test = 5;
+
+_foo4.bar;
+_foo5.foo;
+_foo2.default;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/options.json
new file mode 100644
index 0000000000..a6a12735e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/overview/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-common/remap/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/remap/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-common/remap/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-common/remap/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-common/remap/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-common/remap/expected.js
new file mode 100644
index 0000000000..376fb187da
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-common/remap/expected.js
@@ -0,0 +1,28 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var test = exports.test = 2;
+exports.test = test = 5;
+exports.test = test += 1;
+
+(function () {
+ var test = 2;
+ test = 3;
+ test++;
+})();
+
+var a = 2;
+exports.a = a;
+
+exports.a = a = 3;
+
+var b = 2;
+exports.c = b;
+
+exports.c = b = 3;
+
+var d = 3;
+exports.e = d;
+exports.f = d;
+
+exports.f = exports.e = d = 4;
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/exports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/exports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-default/expected.js
new file mode 100644
index 0000000000..233a3d1916
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-default/expected.js
@@ -0,0 +1,30 @@
+System.register([], function (_export) {
+ _export("default", function () {});
+
+ _export("default", class {});
+
+ function foo() {}
+
+ _export("default", foo);
+
+ return {
+ setters: [],
+ execute: function () {
+ _export("default", 42);
+
+ _export("default", {});
+
+ _export("default", []);
+
+ _export("default", foo);
+
+ class Foo {}
+
+ _export("default", Foo);
+
+ _export("default", (function () {
+ return "foo";
+ })());
+ }
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/exports-from/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-from/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/exports-from/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-from/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-from/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-from/expected.js
new file mode 100644
index 0000000000..2138d0b019
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-from/expected.js
@@ -0,0 +1,22 @@
+System.register(["foo"], function (_export) {
+ return {
+ setters: [function (_foo) {
+ var _exportObj = {};
+
+ for (var _key in _foo) {
+ if (_key !== "default") _exportObj[_key] = _foo[_key];
+ }
+
+ _exportObj.foo = _foo.foo;
+ _exportObj.foo = _foo.foo;
+ _exportObj.bar = _foo.bar;
+ _exportObj.bar = _foo.foo;
+ _exportObj.default = _foo.foo;
+ _exportObj.default = _foo.foo;
+ _exportObj.bar = _foo.bar;
+
+ _export(_exportObj);
+ }],
+ execute: function () {}
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/exports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/exports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-named/expected.js
new file mode 100644
index 0000000000..fa746cdbf5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-named/expected.js
@@ -0,0 +1,20 @@
+System.register([], function (_export) {
+ return {
+ setters: [],
+ execute: function () {
+ _export("foo", foo);
+
+ _export("foo", foo);
+
+ _export("bar", bar);
+
+ _export("bar", foo);
+
+ _export("default", foo);
+
+ _export("default", foo);
+
+ _export("bar", bar);
+ }
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/exports-variable/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-variable/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/exports-variable/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-variable/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-variable/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-variable/expected.js
new file mode 100644
index 0000000000..9cb480f5ab
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/exports-variable/expected.js
@@ -0,0 +1,40 @@
+System.register([], function (_export) {
+ return {
+ setters: [],
+ execute: function () {
+ var foo = 1;
+
+ _export("foo", foo);
+
+ var foo2 = function () {};
+
+ _export("foo2", foo2);
+
+ var foo3;
+
+ _export("foo3", foo3);
+
+ let foo4 = 2;
+
+ _export("foo4", foo4);
+
+ let foo5;
+
+ _export("foo5", foo5);
+
+ const foo6 = 3;
+
+ _export("foo6", foo6);
+
+ function foo7() {}
+
+ _export("foo7", foo7);
+
+ class foo8 {}
+
+ _export("foo8", foo8);
+
+ _export("foo3", foo3 = 5);
+ }
+ };
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/get-module-name-option/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/get-module-name-option/actual.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/get-module-name-option/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/get-module-name-option/expected.js
new file mode 100644
index 0000000000..0c17201579
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/get-module-name-option/expected.js
@@ -0,0 +1,6 @@
+System.register("my custom module name", [], function (_export) {
+ return {
+ setters: [],
+ execute: function () {}
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/get-module-name-option/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-system/get-module-name-option/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/get-module-name-option/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/get-module-name-option/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/hoist-function-exports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/hoist-function-exports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/hoist-function-exports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/hoist-function-exports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/hoist-function-exports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/hoist-function-exports/expected.js
new file mode 100644
index 0000000000..35ddbbb7e9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/hoist-function-exports/expected.js
@@ -0,0 +1,33 @@
+System.register(["./evens"], function (_export) {
+ var isEven, p, a, i, j, isOdd;
+ return {
+ setters: [function (_evens) {
+ isEven = _evens.isEven;
+ }],
+ execute: function () {
+ function nextOdd(n) {
+ return _export("p", p = isEven(n) ? n + 1 : n + 2);
+ }
+
+ _export("nextOdd", nextOdd);
+
+ _export("n", n);
+
+ _export("p", p = 5);
+
+ _export("p", p);
+
+ for (a in b);
+
+ for (i = 0, j = 0;;);
+
+ _export("isOdd", isOdd = (function (isEven) {
+ return function (n) {
+ return !isEven(n);
+ };
+ })(isEven));
+
+ _export("isOdd", isOdd);
+ }
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-default/expected.js
new file mode 100644
index 0000000000..00ac1f0867
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-default/expected.js
@@ -0,0 +1,10 @@
+System.register(["foo"], function (_export) {
+ var foo, foo2;
+ return {
+ setters: [function (_foo) {
+ foo = _foo.default;
+ foo2 = _foo.default;
+ }],
+ execute: function () {}
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-glob/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-glob/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-glob/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-glob/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-glob/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-glob/expected.js
new file mode 100644
index 0000000000..6a4654fdbb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-glob/expected.js
@@ -0,0 +1,9 @@
+System.register(["foo"], function (_export) {
+ var foo;
+ return {
+ setters: [function (_foo) {
+ foo = _foo;
+ }],
+ execute: function () {}
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-mixing/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-mixing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-mixing/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-mixing/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-mixing/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-mixing/expected.js
new file mode 100644
index 0000000000..989ca23802
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-mixing/expected.js
@@ -0,0 +1,10 @@
+System.register(["foo"], function (_export) {
+ var foo, xyz;
+ return {
+ setters: [function (_foo) {
+ foo = _foo.default;
+ xyz = _foo.baz;
+ }],
+ execute: function () {}
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/imports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-named/expected.js
new file mode 100644
index 0000000000..838f000f86
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports-named/expected.js
@@ -0,0 +1,14 @@
+System.register(["foo"], function (_export) {
+ var bar, bar2, baz, baz2, baz3, xyz;
+ return {
+ setters: [function (_foo) {
+ bar = _foo.bar;
+ bar2 = _foo.bar2;
+ baz = _foo.baz;
+ baz2 = _foo.bar;
+ baz3 = _foo.bar;
+ xyz = _foo.xyz;
+ }],
+ execute: function () {}
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/imports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/imports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/imports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports/expected.js
new file mode 100644
index 0000000000..afe4e38091
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/imports/expected.js
@@ -0,0 +1,6 @@
+System.register(["foo", "foo-bar", "./directory/foo-bar"], function (_export) {
+ return {
+ setters: [function (_foo) {}, function (_fooBar) {}, function (_directoryFooBar) {}],
+ execute: function () {}
+ };
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-system/options.json
new file mode 100644
index 0000000000..067fbec4b8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-modules-systemjs"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/overview/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/overview/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/overview/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/overview/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/overview/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/overview/expected.js
new file mode 100644
index 0000000000..73c7a8ee26
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/overview/expected.js
@@ -0,0 +1,20 @@
+System.register(["foo", "foo-bar", "./directory/foo-bar"], function (_export) {
+ var foo, foo2, bar, bar2, test2;
+ return {
+ setters: [function (_foo) {
+ foo = _foo.default;
+ foo2 = _foo;
+ bar = _foo.bar;
+ bar2 = _foo.foo;
+ }, function (_fooBar) {}, function (_directoryFooBar) {}],
+ execute: function () {
+ _export("test", test);
+
+ _export("test2", test2 = 5);
+
+ _export("test2", test2);
+
+ _export("default", test);
+ }
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/remap/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/remap/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/remap/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-system/remap/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-system/remap/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-system/remap/expected.js
new file mode 100644
index 0000000000..0df099b2a0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-system/remap/expected.js
@@ -0,0 +1,41 @@
+System.register([], function (_export) {
+ var test, a, b, d;
+ return {
+ setters: [],
+ execute: function () {
+ _export("test", test = 2);
+
+ _export("test", test);
+
+ _export("test", test = 5);
+
+ _export("test", test++);
+
+ (function () {
+ var test = 2;
+ test = 3;
+ test++;
+ })();
+
+ _export("a", a = 2);
+
+ _export("a", a);
+
+ _export("a", a = 3);
+
+ _export("c", b = 2);
+
+ _export("c", b);
+
+ _export("c", b = 3);
+
+ _export("f", _export("e", d = 3));
+
+ _export("e", d);
+
+ _export("f", d);
+
+ _export("f", _export("e", d = 4));
+ }
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/exports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/exports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-default/expected.js
new file mode 100644
index 0000000000..a84e598cfd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-default/expected.js
@@ -0,0 +1,37 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["exports"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(exports);
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod.exports);
+ global.actual = mod.exports;
+ }
+})(this, function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ exports.default = function () {};
+
+ exports.default = foo;
+ exports.default = 42;
+ exports.default = {};
+ exports.default = [];
+ exports.default = foo;
+ exports.default = class {};
+
+ function foo() {}
+
+ class Foo {}
+
+ exports.default = Foo;
+ exports.default = foo;
+
+ exports.default = (function () {
+ return "foo";
+ })();
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/exports-from/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-from/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/exports-from/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-from/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-from/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-from/expected.js
new file mode 100644
index 0000000000..d0b034fc04
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-from/expected.js
@@ -0,0 +1,70 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["exports", "foo"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(exports, require("foo"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod.exports, global.foo);
+ global.actual = mod.exports;
+ }
+})(this, function (exports, _foo) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ for (let _key in _foo) {
+ if (_key === "default") continue;
+ Object.defineProperty(exports, _key, {
+ enumerable: true,
+ get: function () {
+ return _foo[_key];
+ }
+ });
+ }
+
+ Object.defineProperty(exports, "foo", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "foo", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.bar;
+ }
+ });
+ Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return _foo.foo;
+ }
+ });
+ Object.defineProperty(exports, "bar", {
+ enumerable: true,
+ get: function () {
+ return _foo.bar;
+ }
+ });
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/exports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/exports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-named/expected.js
new file mode 100644
index 0000000000..0b7b3b94be
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-named/expected.js
@@ -0,0 +1,24 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["exports"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(exports);
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod.exports);
+ global.actual = mod.exports;
+ }
+})(this, function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.foo = foo;
+ exports.foo = foo;
+ exports.bar = bar;
+ exports.bar = foo;
+ exports.default = foo;
+ exports.default = foo;
+ exports.bar = bar;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/exports-variable/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-variable/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/exports-variable/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-variable/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-variable/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-variable/expected.js
new file mode 100644
index 0000000000..baeb2d58b4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/exports-variable/expected.js
@@ -0,0 +1,34 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["exports"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(exports);
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod.exports);
+ global.actual = mod.exports;
+ }
+})(this, function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.foo7 = foo7;
+ var foo = exports.foo = 1;
+ var foo = exports.foo = 1,
+ bar = exports.bar = 2;
+
+ var foo2 = exports.foo2 = function () {};
+
+ var foo3 = exports.foo3 = undefined;
+ let foo4 = exports.foo4 = 2;
+ let foo5 = exports.foo5 = undefined;
+ const foo6 = exports.foo6 = 3;
+
+ function foo7() {}
+
+ class foo8 {}
+
+ exports.foo8 = foo8;
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/get-module-name-option/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/get-module-name-option/actual.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/get-module-name-option/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/get-module-name-option/expected.js
new file mode 100644
index 0000000000..775365ff70
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/get-module-name-option/expected.js
@@ -0,0 +1,13 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("my custom module name", [], factory);
+ } else if (typeof exports !== "undefined") {
+ factory();
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory();
+ global.myCustomModuleName = mod.exports;
+ }
+})(this, function () {});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/get-module-name-option/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/get-module-name-option/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/get-module-name-option/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/get-module-name-option/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-ignore/hoist-function-exports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/hoist-function-exports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-ignore/hoist-function-exports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/hoist-function-exports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/hoist-function-exports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/hoist-function-exports/expected.js
new file mode 100644
index 0000000000..a53e4af635
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/hoist-function-exports/expected.js
@@ -0,0 +1,29 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["exports", "./evens"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(exports, require("./evens"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod.exports, global.evens);
+ global.actual = mod.exports;
+ }
+})(this, function (exports, _evens) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.isOdd = undefined;
+ exports.nextOdd = nextOdd;
+
+ function nextOdd(n) {
+ return (0, _evens.isEven)(n) ? n + 1 : n + 2;
+ }
+
+ var isOdd = exports.isOdd = (function (isEven) {
+ return function (n) {
+ return !isEven(n);
+ };
+ })(_evens.isEven);
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/imports-default/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/imports-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-default/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-default/expected.js
new file mode 100644
index 0000000000..e58e158cb5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-default/expected.js
@@ -0,0 +1,18 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["foo"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(require("foo"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(global.foo);
+ global.actual = mod.exports;
+ }
+})(this, function (_foo) {
+ var _foo2 = babelHelpers.interopRequireDefault(_foo);
+
+ _foo2.default;
+ _foo2.default;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/imports-glob/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-glob/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/imports-glob/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-glob/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-glob/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-glob/expected.js
new file mode 100644
index 0000000000..31de90105f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-glob/expected.js
@@ -0,0 +1,16 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["foo"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(require("foo"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(global.foo);
+ global.actual = mod.exports;
+ }
+})(this, function (_foo) {
+ var foo = babelHelpers.interopRequireWildcard(_foo);
+ foo;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/imports-mixing/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-mixing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/imports-mixing/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-mixing/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-mixing/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-mixing/expected.js
new file mode 100644
index 0000000000..b7d62c6ca0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-mixing/expected.js
@@ -0,0 +1,17 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["foo"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(require("foo"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(global.foo);
+ global.actual = mod.exports;
+ }
+})(this, function (_foo) {
+ var _foo2 = babelHelpers.interopRequireDefault(_foo);
+
+ _foo.baz;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/imports-named/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-named/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/imports-named/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-named/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-named/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-named/expected.js
new file mode 100644
index 0000000000..de8aef3f6c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports-named/expected.js
@@ -0,0 +1,20 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["foo"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(require("foo"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(global.foo);
+ global.actual = mod.exports;
+ }
+})(this, function (_foo) {
+ _foo.bar;
+ _foo.bar2;
+ _foo.baz;
+ _foo.bar;
+ _foo.bar;
+ _foo.xyz;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-system/imports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-system/imports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports/expected.js
new file mode 100644
index 0000000000..c35422d7b9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/imports/expected.js
@@ -0,0 +1,13 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["foo", "foo-bar", "./directory/foo-bar"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(require("foo"), require("foo-bar"), require("./directory/foo-bar"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(global.foo, global.fooBar, global.fooBar);
+ global.actual = mod.exports;
+ }
+})(this, function () {});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/module-id/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-id/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/module-id/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-id/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-id/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-id/expected.js
new file mode 100644
index 0000000000..2855ccd1ba
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-id/expected.js
@@ -0,0 +1,15 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("MyLib", [], factory);
+ } else if (typeof exports !== "undefined") {
+ factory();
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory();
+ global.MyLib = mod.exports;
+ }
+})(this, function () {
+ foobar();
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/module-id/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-id/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/module-id/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-id/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/module-name/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-name/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/module-name/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-name/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-name/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-name/expected.js
new file mode 100644
index 0000000000..2b7ca8878c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-name/expected.js
@@ -0,0 +1,15 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define("es6.modules-umd/module-name/expected", [], factory);
+ } else if (typeof exports !== "undefined") {
+ factory();
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory();
+ global.es6ModulesUmdModuleNameExpected = mod.exports;
+ }
+})(this, function () {
+ foobar();
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/module-name/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-name/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/module-name/options.json
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/module-name/options.json
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/non-default-imports/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/non-default-imports/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/non-default-imports/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/non-default-imports/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/non-default-imports/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/non-default-imports/expected.js
new file mode 100644
index 0000000000..8a80ab5648
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/non-default-imports/expected.js
@@ -0,0 +1,13 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["./lib/render"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(require("./lib/render"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(global.render);
+ global.actual = mod.exports;
+ }
+})(this, function (_render) {});
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/options.json b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/options.json
new file mode 100644
index 0000000000..634a04cf51
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-modules-umd"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/overview/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/overview/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/overview/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/overview/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/overview/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/overview/expected.js
new file mode 100644
index 0000000000..c66bd7da9f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/overview/expected.js
@@ -0,0 +1,24 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(exports, require("foo"), require("foo-bar"), require("./directory/foo-bar"));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod.exports, global.foo, global.fooBar, global.fooBar);
+ global.actual = mod.exports;
+ }
+})(this, function (exports, _foo) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.test2 = exports.test = undefined;
+ var foo2 = babelHelpers.interopRequireWildcard(_foo);
+ exports.test = test;
+ var test2 = exports.test2 = 5;
+ exports.default = test;
+ _foo.bar;
+ _foo.foo;
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.modules-umd/remap/actual.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/remap/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.modules-umd/remap/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.modules-umd/remap/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.modules-umd/remap/expected.js b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/remap/expected.js
new file mode 100644
index 0000000000..54aafe7c93
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.modules-umd/remap/expected.js
@@ -0,0 +1,37 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(["exports"], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(exports);
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod.exports);
+ global.actual = mod.exports;
+ }
+})(this, function (exports) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ var test = exports.test = 2;
+ exports.test = test = 5;
+ exports.test = test += 1;
+
+ (function () {
+ var test = 2;
+ test = 3;
+ test++;
+ })();
+
+ var a = 2;
+ exports.a = a;
+ exports.a = a = 3;
+ var b = 2;
+ exports.c = b;
+ exports.c = b = 3;
+ var d = 3;
+ exports.e = d;
+ exports.f = d;
+ exports.f = exports.e = d = 4;
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es6.object-super/options.json b/packages/babel-core/test/fixtures/transformation/es6.object-super/options.json
new file mode 100644
index 0000000000..717cf43d40
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.object-super/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-object-super"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.object-super/simple.js b/packages/babel-core/test/fixtures/transformation/es6.object-super/simple.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.object-super/simple.js
rename to packages/babel-core/test/fixtures/transformation/es6.object-super/simple.js
diff --git a/packages/babel/test/fixtures/transformation/es6.object-super/statically-bound/actual.js b/packages/babel-core/test/fixtures/transformation/es6.object-super/statically-bound/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.object-super/statically-bound/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.object-super/statically-bound/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.object-super/statically-bound/expected.js b/packages/babel-core/test/fixtures/transformation/es6.object-super/statically-bound/expected.js
new file mode 100644
index 0000000000..e2504935dd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.object-super/statically-bound/expected.js
@@ -0,0 +1,7 @@
+var _obj;
+
+var o = _obj = {
+ m() {
+ return babelHelpers.get(Object.getPrototypeOf(_obj), "x", this);
+ }
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/default-before-last/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-before-last/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/default-before-last/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/default-before-last/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/default-before-last/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-before-last/expected.js
new file mode 100644
index 0000000000..fd30010bce
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-before-last/expected.js
@@ -0,0 +1,4 @@
+function foo() {
+ var a = arguments.length <= 0 || arguments[0] === undefined ? "foo" : arguments[0];
+ var b = arguments[1];
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/default-destructuring/exec.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-destructuring/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/default-destructuring/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/default-destructuring/exec.js
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/default-eval/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-eval/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/default-eval/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/default-eval/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/default-eval/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-eval/expected.js
new file mode 100644
index 0000000000..7f93a0e21f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-eval/expected.js
@@ -0,0 +1,11 @@
+var x = "outside";
+function outer() {
+ var a = arguments.length <= 0 || arguments[0] === undefined ? function () {
+ return eval("x");
+ } : arguments[0];
+ return (function () {
+ var x = "inside";
+ return a();
+ })();
+}
+outer();
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/default-iife-1128/exec.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-iife-1128/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/default-iife-1128/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/default-iife-1128/exec.js
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/default-multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/default-multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/default-multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/default-multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-multiple/expected.js
new file mode 100644
index 0000000000..5d7a1b41e0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-multiple/expected.js
@@ -0,0 +1,12 @@
+var t = function () {
+ var e = arguments.length <= 0 || arguments[0] === undefined ? "foo" : arguments[0];
+ var f = arguments.length <= 1 || arguments[1] === undefined ? 5 : arguments[1];
+
+ return e + " bar " + f;
+};
+
+var a = function (e) {
+ var f = arguments.length <= 1 || arguments[1] === undefined ? 5 : arguments[1];
+
+ return e + " bar " + f;
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/default-single/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-single/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/default-single/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/default-single/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/default-single/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-single/expected.js
new file mode 100644
index 0000000000..61ee0102e3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/default-single/expected.js
@@ -0,0 +1,5 @@
+var t = function () {
+ var f = arguments.length <= 0 || arguments[0] === undefined ? "foo" : arguments[0];
+
+ return f + " bar";
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/options.json b/packages/babel-core/test/fixtures/transformation/es6.parameters/options.json
new file mode 100644
index 0000000000..0ce23fb256
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "syntax-flow", "transform-es2015-parameters", "transform-es2015-block-scoping", "transform-es2015-spread", "transform-es2015-classes", "transform-es2015-destructuring", "transform-es2015-arrow-functions", "syntax-async-functions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-arrow-functions/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-arrow-functions/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-arrow-functions/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-arrow-functions/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-arrow-functions/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-arrow-functions/expected.js
new file mode 100644
index 0000000000..62c2f6d931
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-arrow-functions/expected.js
@@ -0,0 +1,30 @@
+var concat = function () {
+ var x = arguments[0];
+ var y = arguments[1];
+};
+
+var somefun = function () {
+ var get2ndArg = function (a, b) {
+ var _b = arguments[2];
+ var somef = function (x, y, z) {
+ var _a = arguments[3];
+ };
+ var somefg = function (c, d, e, f) {
+ var _a = arguments[4];
+ };
+ var _d = arguments[3];
+ };
+ var get1stArg = function () {
+ return arguments[0];
+ };
+};
+
+function demo1() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return function (i) {
+ return args[i + 0];
+ };
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/expected.js
new file mode 100644
index 0000000000..80224dbe80
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-binding-deoptimisation/expected.js
@@ -0,0 +1,7 @@
+const deepAssign = function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return args = [];
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-deepest-common-ancestor-earliest-child/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-deepest-common-ancestor-earliest-child/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-deepest-common-ancestor-earliest-child/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-deepest-common-ancestor-earliest-child/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-deepest-common-ancestor-earliest-child/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-deepest-common-ancestor-earliest-child/expected.js
new file mode 100644
index 0000000000..320886f014
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-deepest-common-ancestor-earliest-child/expected.js
@@ -0,0 +1,101 @@
+// single referenes
+function r() {
+ if (noNeedToWork) return 0;
+
+ for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
+ rest[_key] = arguments[_key];
+ }
+
+ return rest;
+}
+
+// multiple references
+function r() {
+ if (noNeedToWork) return 0;
+
+ for (var _len2 = arguments.length, rest = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ rest[_key2] = arguments[_key2];
+ }
+
+ rest;
+ rest;
+}
+
+// multiple nested references
+function r() {
+ if (noNeedToWork) return 0;
+
+ for (var _len3 = arguments.length, rest = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ rest[_key3] = arguments[_key3];
+ }
+
+ if (true) {
+ return rest;
+ } else {
+ return rest;
+ }
+}
+
+// deeply nested
+function r() {
+ if (true) {
+ for (var _len4 = arguments.length, rest = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ rest[_key4] = arguments[_key4];
+ }
+
+ if (true) {
+ return rest;
+ } else {
+ return rest;
+ }
+ }
+}
+
+// nested reference with root reference
+function r() {
+ if (noNeedToWork) return 0;
+
+ for (var _len5 = arguments.length, rest = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ rest[_key5] = arguments[_key5];
+ }
+
+ if (lol) rest;
+ rest;
+}
+
+// nested functions
+function a() {
+ for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ return function () {
+ function b() {}
+
+ console.log("Shouldn't args be from a's scope?", args);
+ };
+}
+
+// loop
+function runQueue(queue) {
+ for (var _len7 = arguments.length, args = Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {
+ args[_key7 - 1] = arguments[_key7];
+ }
+
+ for (var i = 0; i < queue.length; i++) {
+ queue[i].apply(queue, args);
+ }
+}
+
+// nested loop
+function runQueue(queue) {
+ if (foo) {
+ for (var _len8 = arguments.length, args = Array(_len8 > 1 ? _len8 - 1 : 0), _key8 = 1; _key8 < _len8; _key8++) {
+ args[_key8 - 1] = arguments[_key8];
+ }
+
+ for (var i = 0; i < queue.length; i++) {
+ queue[i].apply(queue, args);
+ }
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-member-expression-deoptimisation/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-deoptimisation/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-member-expression-deoptimisation/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-deoptimisation/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-deoptimisation/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-deoptimisation/expected.js
new file mode 100644
index 0000000000..56bad87ea3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-deoptimisation/expected.js
@@ -0,0 +1,55 @@
+var x = function (foo) {
+ for (var _len = arguments.length, bar = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ bar[_key - 1] = arguments[_key];
+ }
+
+ console.log(bar);
+};
+
+var y = function (foo) {
+ for (var _len2 = arguments.length, bar = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ bar[_key2 - 1] = arguments[_key2];
+ }
+
+ var x = function z(bar) {
+ bar[1] = 5;
+ };
+};
+
+var b = function (x, y) {
+ for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
+ args[_key3 - 2] = arguments[_key3];
+ }
+
+ console.log(args[0]);
+ args.pop();
+ console.log(args[1]);
+};
+
+var z = function (foo) {
+ for (var _len4 = arguments.length, bar = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
+ bar[_key4 - 1] = arguments[_key4];
+ }
+
+ var x = function () {
+ bar[1] = 5;
+ };
+};
+
+var a = function (foo) {
+ for (var _len5 = arguments.length, bar = Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
+ bar[_key5 - 1] = arguments[_key5];
+ }
+
+ return bar.join(",");
+};
+
+var b = function (foo) {
+ var join = "join";
+
+ for (var _len6 = arguments.length, bar = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {
+ bar[_key6 - 1] = arguments[_key6];
+ }
+
+ return bar[join];
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-member-expression-optimisation/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-optimisation/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-member-expression-optimisation/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-optimisation/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-optimisation/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-optimisation/expected.js
new file mode 100644
index 0000000000..dbae1250ad
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-member-expression-optimisation/expected.js
@@ -0,0 +1,9 @@
+var t = function () {
+ var x = arguments[0];
+ var y = arguments[1];
+};
+
+function t() {
+ var x = arguments[0];
+ var y = arguments[1];
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-multiple/expected.js
new file mode 100644
index 0000000000..1975c117ba
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-multiple/expected.js
@@ -0,0 +1,11 @@
+var t = function (f) {
+ var x = f;
+ x = arguments[1];
+ x = arguments[2];
+};
+
+function t(f) {
+ var x = f;
+ x = arguments[1];
+ x = arguments[2];
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-nested-iife/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-nested-iife/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-nested-iife/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-nested-iife/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-nested-iife/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-nested-iife/expected.js
new file mode 100644
index 0000000000..a687304cae
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-nested-iife/expected.js
@@ -0,0 +1,20 @@
+function broken(x) {
+ if (true) {
+ var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).apply(this, arguments));
+ }
+
+ return Foo;
+ })(Bar);
+
+ for (var _len = arguments.length, foo = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ foo[_key - 1] = arguments[_key];
+ }
+
+ return hello.apply(undefined, foo);
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.parameters/rest-spread-optimisation/actual.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-spread-optimisation/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.parameters/rest-spread-optimisation/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.parameters/rest-spread-optimisation/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-spread-optimisation/expected.js b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-spread-optimisation/expected.js
new file mode 100644
index 0000000000..659c51c607
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.parameters/rest-spread-optimisation/expected.js
@@ -0,0 +1,32 @@
+// optimisation
+
+function foo() {
+ foo.apply(undefined, arguments);
+}
+
+// deoptimisation
+
+function foo(a) {
+ for (var _len = arguments.length, b = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ b[_key - 1] = arguments[_key];
+ }
+
+ foo.apply(undefined, b);
+}
+
+function foo() {
+ for (var _len2 = arguments.length, b = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ b[_key2] = arguments[_key2];
+ }
+
+ foo.apply(undefined, [1].concat(b));
+}
+
+function foo() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ args.pop();
+ foo.apply(undefined, args);
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/argument/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/argument/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/argument/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/argument/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/argument/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/argument/expected.js
new file mode 100644
index 0000000000..3d213b2a00
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/argument/expected.js
@@ -0,0 +1,3 @@
+var _foo;
+
+foo((_foo = {}, _foo[bar] = "foobar", _foo));
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/assignment/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/assignment/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/assignment/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/assignment/expected.js
new file mode 100644
index 0000000000..bd9d00ee91
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/assignment/expected.js
@@ -0,0 +1,3 @@
+var _foo;
+
+foo = (_foo = {}, _foo[bar] = "foobar", _foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/coerce/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/coerce/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/coerce/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/coerce/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/coerce/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/coerce/expected.js
new file mode 100644
index 0000000000..021d373f2d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/coerce/expected.js
@@ -0,0 +1,5 @@
+var _obj;
+
+var obj = (_obj = {
+ foo: "bar"
+}, _obj[bar] = "foo", _obj);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/ignore-symbol/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/ignore-symbol/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/ignore-symbol/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/ignore-symbol/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/ignore-symbol/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/ignore-symbol/expected.js
new file mode 100644
index 0000000000..39b056cf1e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/ignore-symbol/expected.js
@@ -0,0 +1,3 @@
+var _foo;
+
+var foo = (_foo = {}, _foo[Symbol.iterator] = "foobar", _foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/method/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/method/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/method/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/method/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/method/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/method/expected.js
new file mode 100644
index 0000000000..b4a01454cd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/method/expected.js
@@ -0,0 +1,5 @@
+var _obj;
+
+var obj = (_obj = {}, _obj[foobar] = function () {
+ return "foobar";
+}, _obj);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/mixed/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/mixed/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/mixed/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/mixed/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/mixed/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/mixed/expected.js
new file mode 100644
index 0000000000..486ccadcb4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/mixed/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+var obj = (_obj = {}, _obj["x" + foo] = "heh", _obj["y" + bar] = "noo", _obj.foo = "foo", _obj.bar = "bar", _obj);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/multiple/expected.js
new file mode 100644
index 0000000000..13145e4a26
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/multiple/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+var obj = (_obj = {}, _obj["x" + foo] = "heh", _obj["y" + bar] = "noo", _obj);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/options.json b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/options.json
new file mode 100644
index 0000000000..b42761be5e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", ["transform-es2015-computed-properties", { "loose": true }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/single/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/single/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/single/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/single/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/single/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/single/expected.js
new file mode 100644
index 0000000000..59f3248681
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/single/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+var obj = (_obj = {}, _obj["x" + foo] = "heh", _obj);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/this/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/this/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/this/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/this/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/this/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/this/expected.js
new file mode 100644
index 0000000000..b7059d21b4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/this/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+var obj = (_obj = {}, _obj["x" + foo.bar] = "heh", _obj);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/two/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/two/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/two/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/two/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/two/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/two/expected.js
new file mode 100644
index 0000000000..17be5789fa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/two/expected.js
@@ -0,0 +1,5 @@
+var _obj;
+
+var obj = (_obj = {
+ first: "first"
+}, _obj[second] = "second", _obj);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed-loose/variable/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/variable/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed-loose/variable/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/variable/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/variable/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/variable/expected.js
new file mode 100644
index 0000000000..48e3cc1437
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed-loose/variable/expected.js
@@ -0,0 +1,3 @@
+var _foo;
+
+var foo = (_foo = {}, _foo[bar] = "foobar", _foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/argument/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/argument/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/argument/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/argument/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/argument/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/argument/expected.js
new file mode 100644
index 0000000000..9fa59eebe3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/argument/expected.js
@@ -0,0 +1 @@
+foo(babelHelpers.defineProperty({}, bar, "foobar"));
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/assignment/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/assignment/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/assignment/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/assignment/expected.js
new file mode 100644
index 0000000000..f3a556fa0b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/assignment/expected.js
@@ -0,0 +1 @@
+foo = babelHelpers.defineProperty({}, bar, "foobar");
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/ignore-symbol/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/ignore-symbol/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/ignore-symbol/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/ignore-symbol/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/ignore-symbol/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/ignore-symbol/expected.js
new file mode 100644
index 0000000000..a2226f929b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/ignore-symbol/expected.js
@@ -0,0 +1 @@
+var foo = babelHelpers.defineProperty({}, Symbol.iterator, "foobar");
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/method/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/method/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/method/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/method/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/method/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/method/expected.js
new file mode 100644
index 0000000000..7388f306b9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/method/expected.js
@@ -0,0 +1,3 @@
+var obj = babelHelpers.defineProperty({}, foobar, function () {
+ return "foobar";
+});
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/mixed/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/mixed/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/mixed/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/mixed/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/mixed/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/mixed/expected.js
new file mode 100644
index 0000000000..edd2f74e58
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/mixed/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+var obj = (_obj = {}, babelHelpers.defineProperty(_obj, "x" + foo, "heh"), babelHelpers.defineProperty(_obj, "y" + bar, "noo"), babelHelpers.defineProperty(_obj, "foo", "foo"), babelHelpers.defineProperty(_obj, "bar", "bar"), _obj);
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/multiple/expected.js
new file mode 100644
index 0000000000..38b2b44309
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/multiple/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+var obj = (_obj = {}, babelHelpers.defineProperty(_obj, "x" + foo, "heh"), babelHelpers.defineProperty(_obj, "y" + bar, "noo"), _obj);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/options.json b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/options.json
new file mode 100644
index 0000000000..07ba347951
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-computed-properties"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/single/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/single/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/single/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/single/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/single/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/single/expected.js
new file mode 100644
index 0000000000..15bdcc4c0e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/single/expected.js
@@ -0,0 +1 @@
+var obj = babelHelpers.defineProperty({}, "x" + foo, "heh");
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/this/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/this/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/this/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/this/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/this/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/this/expected.js
new file mode 100644
index 0000000000..5763859300
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/this/expected.js
@@ -0,0 +1 @@
+var obj = babelHelpers.defineProperty({}, "x" + foo.bar, "heh");
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/two/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/two/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/two/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/two/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/two/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/two/expected.js
new file mode 100644
index 0000000000..2c8e1e09bd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/two/expected.js
@@ -0,0 +1,3 @@
+var obj = babelHelpers.defineProperty({
+ first: "first"
+}, "second", "second");
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.computed/variable/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/variable/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.computed/variable/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.computed/variable/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.computed/variable/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/variable/expected.js
new file mode 100644
index 0000000000..fa6b4554cf
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.computed/variable/expected.js
@@ -0,0 +1 @@
+var foo = babelHelpers.defineProperty({}, bar, "foobar");
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.shorthand/method-plain/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/method-plain/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.shorthand/method-plain/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/method-plain/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/method-plain/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/method-plain/expected.js
new file mode 100644
index 0000000000..874b21c6b9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/method-plain/expected.js
@@ -0,0 +1,5 @@
+var obj = {
+ method: function () {
+ return 5 + 5;
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/options.json b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/options.json
new file mode 100644
index 0000000000..ff6dc638d8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-shorthand-properties"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-comments/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-comments/actual.js
new file mode 100644
index 0000000000..26d4bae5c9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-comments/actual.js
@@ -0,0 +1,4 @@
+var A = "a";
+var o = {
+ A // comment
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-comments/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-comments/expected.js
new file mode 100644
index 0000000000..c5040d1fb3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-comments/expected.js
@@ -0,0 +1,4 @@
+var A = "a";
+var o = {
+ A: A // comment
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.shorthand/shorthand-mixed/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-mixed/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.shorthand/shorthand-mixed/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-mixed/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-mixed/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-mixed/expected.js
new file mode 100644
index 0000000000..128af922ca
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-mixed/expected.js
@@ -0,0 +1 @@
+var coords = { x: x, y: y, foo: "bar" };
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.shorthand/shorthand-multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.shorthand/shorthand-multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-multiple/expected.js
new file mode 100644
index 0000000000..aebd2a7bc7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-multiple/expected.js
@@ -0,0 +1 @@
+var coords = { x: x, y: y };
diff --git a/packages/babel/test/fixtures/transformation/es6.properties.shorthand/shorthand-single/actual.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-single/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.properties.shorthand/shorthand-single/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-single/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-single/expected.js b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-single/expected.js
new file mode 100644
index 0000000000..eb07f9597c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.properties.shorthand/shorthand-single/expected.js
@@ -0,0 +1 @@
+var coords = { x: x };
diff --git a/packages/babel/test/fixtures/transformation/es6.regex.sticky/basic/actual.js b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/basic/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.regex.sticky/basic/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.regex.sticky/basic/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/basic/expected.js b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/basic/expected.js
new file mode 100644
index 0000000000..46f0571570
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/basic/expected.js
@@ -0,0 +1 @@
+var re = new RegExp("o+", "y");
diff --git a/packages/babel/test/fixtures/transformation/es6.regex.sticky/ignore-non-sticky/actual.js b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/ignore-non-sticky/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.regex.sticky/ignore-non-sticky/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.regex.sticky/ignore-non-sticky/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/ignore-non-sticky/expected.js b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/ignore-non-sticky/expected.js
new file mode 100644
index 0000000000..8a861816fd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/ignore-non-sticky/expected.js
@@ -0,0 +1 @@
+var re = /o+/;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/options.json b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/options.json
new file mode 100644
index 0000000000..b27ac458ff
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.regex.sticky/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-sticky-regex"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.regex.unicode/basic/actual.js b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/basic/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.regex.unicode/basic/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.regex.unicode/basic/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/basic/expected.js b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/basic/expected.js
new file mode 100644
index 0000000000..4a89fc4bc4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/basic/expected.js
@@ -0,0 +1,2 @@
+var string = "foo💩bar";
+var match = string.match(/foo((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))bar/);
diff --git a/packages/babel/test/fixtures/transformation/es6.regex.unicode/ignore-non-unicode/actual.js b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/ignore-non-unicode/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.regex.unicode/ignore-non-unicode/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.regex.unicode/ignore-non-unicode/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/ignore-non-unicode/expected.js b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/ignore-non-unicode/expected.js
new file mode 100644
index 0000000000..3bf193d0ac
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/ignore-non-unicode/expected.js
@@ -0,0 +1,2 @@
+var string = "foo💩bar";
+var match = string.match(/foo(.)bar/);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/options.json b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/options.json
new file mode 100644
index 0000000000..f52777ef8c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.regex.unicode/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-unicode-regex"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.symbols/instanceof/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.symbols/instanceof/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.symbols/instanceof/exec.js b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.symbols/instanceof/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/expected.js
new file mode 100644
index 0000000000..5991efed09
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/instanceof/expected.js
@@ -0,0 +1 @@
+babelHelpers._instanceof(a, b);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/options.json b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/options.json
new file mode 100644
index 0000000000..81875a77af
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-typeof-symbol"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.symbols/typeof/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.symbols/typeof/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.symbols/typeof/exec.js b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.symbols/typeof/exec.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/expected.js
new file mode 100644
index 0000000000..50931cbb5f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.symbols/typeof/expected.js
@@ -0,0 +1,5 @@
+var s = Symbol("s");
+assert.ok((typeof s === "undefined" ? "undefined" : babelHelpers._typeof(s)) === "symbol");
+assert.equal(typeof s === "undefined" ? "undefined" : babelHelpers._typeof(s), "symbol");
+assert.equal(babelHelpers._typeof(babelHelpers._typeof(s.foo)), "symbol");
+typeof s === "string";
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/escape-quotes/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/escape-quotes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/escape-quotes/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/escape-quotes/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/escape-quotes/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/escape-quotes/expected.js
new file mode 100644
index 0000000000..287788efd9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/escape-quotes/expected.js
@@ -0,0 +1 @@
+var t = "'" + String(foo) + "' \"" + String(bar) + "\"";
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/functions/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/functions/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/functions/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/functions/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/functions/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/functions/expected.js
new file mode 100644
index 0000000000..9268305f36
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/functions/expected.js
@@ -0,0 +1 @@
+var foo = "test " + String(_.test(foo)) + " " + String(bar);
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/multiline/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiline/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/multiline/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiline/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiline/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiline/expected.js
new file mode 100644
index 0000000000..f679f38c70
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiline/expected.js
@@ -0,0 +1 @@
+var o = "wow\nthis is\nactually multiline!";
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiple/expected.js
new file mode 100644
index 0000000000..29a6093e5c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/multiple/expected.js
@@ -0,0 +1 @@
+var foo = "test " + String(foo) + " " + String(bar);
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/none/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/none/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/none/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/none/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/none/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/none/expected.js
new file mode 100644
index 0000000000..7768209432
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/none/expected.js
@@ -0,0 +1 @@
+var foo = "test";
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/only/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/only/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/only/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/only/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/only/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/only/expected.js
new file mode 100644
index 0000000000..eadb924d1d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/only/expected.js
@@ -0,0 +1 @@
+var foo = "" + String(test);
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/options.json b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/options.json
new file mode 100644
index 0000000000..f59495d3a0
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": [["transform-es2015-template-literals", { "spec": true }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/single/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/single/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/single/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/single/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/single/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/single/expected.js
new file mode 100644
index 0000000000..265332f7f2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/single/expected.js
@@ -0,0 +1 @@
+var foo = "test " + String(foo);
diff --git a/packages/babel/test/fixtures/transformation/es6.spec.template-literals/statement/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spec.template-literals/statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/statement/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/statement/expected.js
new file mode 100644
index 0000000000..7625842cc8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spec.template-literals/statement/expected.js
@@ -0,0 +1 @@
+var foo = "test " + String(foo + bar);
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/arguments-array/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-array/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/arguments-array/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/arguments-array/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-array/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-array/expected.js
new file mode 100644
index 0000000000..09da80138e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-array/expected.js
@@ -0,0 +1,9 @@
+function foo() {
+ return bar([].concat(Array.prototype.slice.call(arguments)));
+}
+
+function bar(one, two, three) {
+ return [one, two, three];
+}
+
+foo("foo", "bar");
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/arguments-concat/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-concat/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/arguments-concat/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/arguments-concat/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-concat/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-concat/expected.js
new file mode 100644
index 0000000000..ad88551bc6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments-concat/expected.js
@@ -0,0 +1,9 @@
+function foo() {
+ return bar.apply(undefined, ["test"].concat(Array.prototype.slice.call(arguments)));
+}
+
+function bar(one, two, three) {
+ return [one, two, three];
+}
+
+foo("foo", "bar");
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/arguments/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/arguments/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/arguments/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/arguments/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments/expected.js
new file mode 100644
index 0000000000..d45e71391e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/arguments/expected.js
@@ -0,0 +1,9 @@
+function foo() {
+ return bar.apply(undefined, arguments);
+}
+
+function bar(one, two, three) {
+ return [one, two, three];
+}
+
+foo("foo", "bar");
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/array-literal-first/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-first/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/array-literal-first/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-first/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-first/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-first/expected.js
new file mode 100644
index 0000000000..1da8c64e83
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-first/expected.js
@@ -0,0 +1 @@
+var lyrics = [].concat(babelHelpers.toConsumableArray(parts), ["head", "and", "toes"]);
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/array-literal-middle/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-middle/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/array-literal-middle/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-middle/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-middle/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-middle/expected.js
new file mode 100644
index 0000000000..76defd138b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-middle/expected.js
@@ -0,0 +1 @@
+var a = [b].concat(babelHelpers.toConsumableArray(c), [d]);
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/array-literal-multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/array-literal-multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-multiple/expected.js
new file mode 100644
index 0000000000..1d09cbb113
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literal-multiple/expected.js
@@ -0,0 +1 @@
+var a = [b].concat(babelHelpers.toConsumableArray(c), [d, e], babelHelpers.toConsumableArray(f));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/array-literals/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literals/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/array-literals/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/array-literals/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/array-literals/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literals/expected.js
new file mode 100644
index 0000000000..26f0d99de6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/array-literals/expected.js
@@ -0,0 +1 @@
+var lyrics = ["head", "and", "toes"].concat(babelHelpers.toConsumableArray(parts));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/contexted-computed-method-call-multiple-args/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-multiple-args/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/contexted-computed-method-call-multiple-args/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-multiple-args/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-multiple-args/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-multiple-args/expected.js
new file mode 100644
index 0000000000..7cb616ab7f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-multiple-args/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+(_obj = obj)[method].apply(_obj, [foo, bar].concat(babelHelpers.toConsumableArray(args)));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/contexted-computed-method-call-single-arg/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-single-arg/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/contexted-computed-method-call-single-arg/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-single-arg/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-single-arg/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-single-arg/expected.js
new file mode 100644
index 0000000000..3222c2d75d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-computed-method-call-single-arg/expected.js
@@ -0,0 +1,3 @@
+var _obj;
+
+(_obj = obj)[method].apply(_obj, babelHelpers.toConsumableArray(args));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/contexted-method-call-multiple-args/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-multiple-args/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/contexted-method-call-multiple-args/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-multiple-args/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-multiple-args/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-multiple-args/expected.js
new file mode 100644
index 0000000000..43d764258d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-multiple-args/expected.js
@@ -0,0 +1,4 @@
+var _foob, _foob$test;
+
+(_foob = foob).add.apply(_foob, [foo, bar].concat(babelHelpers.toConsumableArray(numbers)));
+(_foob$test = foob.test).add.apply(_foob$test, [foo, bar].concat(babelHelpers.toConsumableArray(numbers)));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/contexted-method-call-single-arg/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-single-arg/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/contexted-method-call-single-arg/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-single-arg/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-single-arg/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-single-arg/expected.js
new file mode 100644
index 0000000000..0738e9cbf1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/contexted-method-call-single-arg/expected.js
@@ -0,0 +1,4 @@
+var _foob, _foob$test;
+
+(_foob = foob).add.apply(_foob, babelHelpers.toConsumableArray(numbers));
+(_foob$test = foob.test).add.apply(_foob$test, babelHelpers.toConsumableArray(numbers));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/known-rest/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/known-rest/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/known-rest/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/known-rest/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/known-rest/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/known-rest/expected.js
new file mode 100644
index 0000000000..ef1a228a9f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/known-rest/expected.js
@@ -0,0 +1,7 @@
+function foo() {
+ for (var _len = arguments.length, bar = Array(_len), _key = 0; _key < _len; _key++) {
+ bar[_key] = arguments[_key];
+ }
+
+ return [].concat(bar);
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/method-call-array-literal/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-array-literal/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/method-call-array-literal/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/method-call-array-literal/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-array-literal/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-array-literal/expected.js
new file mode 100644
index 0000000000..c395b0f120
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-array-literal/expected.js
@@ -0,0 +1 @@
+f.apply(undefined, [1, 2, 3]);
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/method-call-first/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-first/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/method-call-first/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/method-call-first/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-first/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-first/expected.js
new file mode 100644
index 0000000000..7a10a2554e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-first/expected.js
@@ -0,0 +1 @@
+add.apply(undefined, babelHelpers.toConsumableArray(numbers).concat([foo, bar]));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/method-call-middle/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-middle/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/method-call-middle/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/method-call-middle/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-middle/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-middle/expected.js
new file mode 100644
index 0000000000..37fbf0e473
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-middle/expected.js
@@ -0,0 +1 @@
+add.apply(undefined, [foo].concat(babelHelpers.toConsumableArray(numbers), [bar]));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/method-call-multiple-args/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple-args/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/method-call-multiple-args/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple-args/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple-args/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple-args/expected.js
new file mode 100644
index 0000000000..7846105c95
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple-args/expected.js
@@ -0,0 +1 @@
+add.apply(undefined, [foo, bar].concat(babelHelpers.toConsumableArray(numbers)));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/method-call-multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/method-call-multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple/expected.js
new file mode 100644
index 0000000000..822019bdbd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-multiple/expected.js
@@ -0,0 +1 @@
+add.apply(undefined, [foo].concat(babelHelpers.toConsumableArray(numbers), [bar, what], babelHelpers.toConsumableArray(test)));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/method-call-single-arg/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-single-arg/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/method-call-single-arg/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/method-call-single-arg/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-single-arg/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-single-arg/expected.js
new file mode 100644
index 0000000000..c24e938c22
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/method-call-single-arg/expected.js
@@ -0,0 +1 @@
+add.apply(undefined, babelHelpers.toConsumableArray(numbers));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/new-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/new-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/new-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/new-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/new-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/new-expression/expected.js
new file mode 100644
index 0000000000..a1abd3d74d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/new-expression/expected.js
@@ -0,0 +1,2 @@
+new (Function.prototype.bind.apply(Numbers, [null].concat(babelHelpers.toConsumableArray(nums))))();
+new (Function.prototype.bind.apply(Numbers, [null].concat([1], babelHelpers.toConsumableArray(nums))))();
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/options.json b/packages/babel-core/test/fixtures/transformation/es6.spread/options.json
new file mode 100644
index 0000000000..d61e7807eb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-spread", "transform-es2015-parameters"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/single/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/single/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/single/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/single/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/single/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/single/expected.js
new file mode 100644
index 0000000000..9286e2ae99
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/single/expected.js
@@ -0,0 +1 @@
+[].concat(babelHelpers.toConsumableArray(foo));
diff --git a/packages/babel/test/fixtures/transformation/es6.spread/this-context/actual.js b/packages/babel-core/test/fixtures/transformation/es6.spread/this-context/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.spread/this-context/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.spread/this-context/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.spread/this-context/expected.js b/packages/babel-core/test/fixtures/transformation/es6.spread/this-context/expected.js
new file mode 100644
index 0000000000..eb82fafbd5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.spread/this-context/expected.js
@@ -0,0 +1,6 @@
+var obj = {
+ foo: function foo() {
+ this.bar.apply(this, arguments);
+ this.blah.apply(this, arguments);
+ }
+};
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/escape-quotes/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/escape-quotes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/escape-quotes/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/escape-quotes/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/escape-quotes/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/escape-quotes/expected.js
new file mode 100644
index 0000000000..67956e60ff
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/escape-quotes/expected.js
@@ -0,0 +1 @@
+var t = "'" + foo + "' \"" + bar + "\"";
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/expression-first/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/expression-first/actual.js
new file mode 100644
index 0000000000..0f3a53f8a1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/expression-first/actual.js
@@ -0,0 +1,9 @@
+var foo = 5;
+var bar = 10;
+var baz = 15;
+
+var example = `${"a"}`;
+var example2 = `${1}`;
+var example3 = 1 + `${foo}${bar}${baz}`;
+var example4 = 1 + `${foo}bar${baz}`;
+var example5 = `${""}`;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/expression-first/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/expression-first/expected.js
new file mode 100644
index 0000000000..801e7db5ad
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/expression-first/expected.js
@@ -0,0 +1,9 @@
+var foo = 5;
+var bar = 10;
+var baz = 15;
+
+var example = "a";
+var example2 = "" + 1;
+var example3 = 1 + ("" + foo + bar + baz);
+var example4 = 1 + (foo + "bar" + baz);
+var example5 = "";
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/functions/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/functions/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/functions/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/functions/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/functions/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/functions/expected.js
new file mode 100644
index 0000000000..027f457d3c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/functions/expected.js
@@ -0,0 +1 @@
+var foo = "test " + _.test(foo) + " " + bar;
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/multiline/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiline/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/multiline/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/multiline/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiline/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiline/expected.js
new file mode 100644
index 0000000000..f679f38c70
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiline/expected.js
@@ -0,0 +1 @@
+var o = "wow\nthis is\nactually multiline!";
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/multiple/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiple/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/multiple/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/multiple/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiple/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiple/expected.js
new file mode 100644
index 0000000000..cf7167ad71
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/multiple/expected.js
@@ -0,0 +1 @@
+var foo = "test " + foo + " " + bar;
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/none/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/none/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/none/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/none/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/none/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/none/expected.js
new file mode 100644
index 0000000000..7768209432
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/none/expected.js
@@ -0,0 +1 @@
+var foo = "test";
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/only/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/only/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/only/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/only/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/only/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/only/expected.js
new file mode 100644
index 0000000000..e7d47c4755
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/only/expected.js
@@ -0,0 +1 @@
+var foo = "" + test;
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/options.json b/packages/babel-core/test/fixtures/transformation/es6.template-literals/options.json
new file mode 100644
index 0000000000..341222f184
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-template-literals"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/single/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/single/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/single/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/single/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/single/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/single/expected.js
new file mode 100644
index 0000000000..dae1e8ea59
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/single/expected.js
@@ -0,0 +1 @@
+var foo = "test " + foo;
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/statement/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/statement/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/statement/expected.js
new file mode 100644
index 0000000000..4d5209dbd6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/statement/expected.js
@@ -0,0 +1 @@
+var foo = "test " + (foo + bar);
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/tag-loose/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/tag-loose/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/expected.js
new file mode 100644
index 0000000000..d8563b0301
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/expected.js
@@ -0,0 +1,9 @@
+var _templateObject = _taggedTemplateLiteralLoose(["wow\na", "b ", ""], ["wow\\na", "b ", ""]),
+ _templateObject2 = _taggedTemplateLiteralLoose(["wow\nab", " ", ""], ["wow\\nab", " ", ""]),
+ _templateObject3 = _taggedTemplateLiteralLoose(["wow\naB", " ", ""], ["wow\\naB", " ", ""]);
+
+function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
+
+var foo = bar(_templateObject, 42, _.foobar());
+var bar = bar(_templateObject2, 42, _.foobar());
+var bar = bar(_templateObject3, 42, _.baz());
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/options.json b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/options.json
new file mode 100644
index 0000000000..434ba0caa6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag-loose/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": [["transform-es2015-template-literals", { "loose": true }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/es6.template-literals/tag/actual.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es6.template-literals/tag/actual.js
rename to packages/babel-core/test/fixtures/transformation/es6.template-literals/tag/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag/expected.js b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag/expected.js
new file mode 100644
index 0000000000..947ec93f83
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es6.template-literals/tag/expected.js
@@ -0,0 +1,5 @@
+var _templateObject = _taggedTemplateLiteral(["wow\na", "b ", ""], ["wow\\na", "b ", ""]);
+
+function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
+
+var foo = bar(_templateObject, 42, _.foobar());
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration-exec/exec.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration-exec/exec.js
new file mode 100644
index 0000000000..6141a3f65e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration-exec/exec.js
@@ -0,0 +1,12 @@
+class Foo {
+ constructor() {
+ this.num = 1;
+ }
+
+ call constructor() {
+ return { num: 2 };
+ }
+}
+
+assert.equal(new Foo().num, 1);
+assert.equal(Foo().num, 2);
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration-exec/options.json b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration-exec/options.json
new file mode 100644
index 0000000000..37e52d209d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration-exec/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-class-constructor-call", "transform-es2015-classes", "transform-es2015-block-scoping", "transform-es2015-parameters"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration/actual.js
new file mode 100644
index 0000000000..1f8b64ef4a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration/actual.js
@@ -0,0 +1,5 @@
+class Foo {
+ call constructor() {
+ foo();
+ }
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration/expected.js
new file mode 100644
index 0000000000..32e55b668f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/declaration/expected.js
@@ -0,0 +1,16 @@
+let _Foo = class Foo {};
+
+var _FooCall = function () {
+ foo();
+};
+
+var Foo = function (...args) {
+ if (this instanceof Foo) {
+ return Reflect.construct(_Foo, args);
+ } else {
+ return _FooCall.apply(this, args);
+ }
+};
+
+Foo.__proto__ = _Foo;
+Foo;
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-completion-record/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-completion-record/actual.js
new file mode 100644
index 0000000000..0663cd8a88
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-completion-record/actual.js
@@ -0,0 +1,5 @@
+(class {
+ call constructor() {
+ foo();
+ }
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-completion-record/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-completion-record/expected.js
new file mode 100644
index 0000000000..5bedc84e65
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-completion-record/expected.js
@@ -0,0 +1,16 @@
+let _class2 = class {};
+
+var _classCall = function () {
+ foo();
+};
+
+var _class = function (...args) {
+ if (this instanceof _class) {
+ return Reflect.construct(_class2, args);
+ } else {
+ return _classCall.apply(this, args);
+ }
+};
+
+_class.__proto__ = _class2;
+_class;
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-exec/exec.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-exec/exec.js
new file mode 100644
index 0000000000..c276e23ab3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-exec/exec.js
@@ -0,0 +1,12 @@
+let Foo = class {
+ constructor() {
+ this.num = 1;
+ }
+
+ call constructor() {
+ return { num: 2 };
+ }
+};
+
+assert.equal(new Foo().num, 1);
+assert.equal(Foo().num, 2);
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-exec/options.json b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-exec/options.json
new file mode 100644
index 0000000000..37e52d209d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression-exec/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-class-constructor-call", "transform-es2015-classes", "transform-es2015-block-scoping", "transform-es2015-parameters"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression/actual.js
new file mode 100644
index 0000000000..0da72faf45
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression/actual.js
@@ -0,0 +1,5 @@
+let Foo = class {
+ call constructor() {
+ foo();
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression/expected.js
new file mode 100644
index 0000000000..07daf3dee2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/expression/expected.js
@@ -0,0 +1,18 @@
+let Foo = (function () {
+ let _class2 = class {};
+
+ var _classCall = function () {
+ foo();
+ };
+
+ var _class = function (...args) {
+ if (this instanceof _class) {
+ return Reflect.construct(_class2, args);
+ } else {
+ return _classCall.apply(this, args);
+ }
+ };
+
+ _class.__proto__ = _class2;
+ return _class;
+})();
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/options.json b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/options.json
new file mode 100644
index 0000000000..98dd15ca98
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-constructor-call/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-class-constructor-call"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/constructor-collision/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/constructor-collision/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/constructor-collision/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/constructor-collision/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/constructor-collision/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/constructor-collision/expected.js
new file mode 100644
index 0000000000..12af37359c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/constructor-collision/expected.js
@@ -0,0 +1,13 @@
+var foo = "bar";
+
+var Foo = function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+
+ _initialiseProps.call(this);
+
+ var foo = "foo";
+};
+
+var _initialiseProps = function () {
+ this.bar = foo;
+};
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/derived/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/derived/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/derived/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/derived/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/derived/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/derived/expected.js
new file mode 100644
index 0000000000..09a524f94c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/derived/expected.js
@@ -0,0 +1,12 @@
+var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo(...args) {
+ var _temp, _this;
+
+ babelHelpers.classCallCheck(this, Foo);
+ return babelHelpers.possibleConstructorReturn(_this, (_temp = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, ...args)), _this), _this.bar = "foo", _temp));
+ }
+
+ return Foo;
+})(Bar);
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/instance-undefined/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance-undefined/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/instance-undefined/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/instance-undefined/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance-undefined/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance-undefined/expected.js
new file mode 100644
index 0000000000..4f46d4a642
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance-undefined/expected.js
@@ -0,0 +1,3 @@
+var Foo = function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+};
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/instance/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/instance/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/instance/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance/expected.js
new file mode 100644
index 0000000000..f832ea3565
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/instance/expected.js
@@ -0,0 +1,4 @@
+var Foo = function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ this.bar = "foo";
+};
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/options.json b/packages/babel-core/test/fixtures/transformation/es7.class-properties/options.json
new file mode 100644
index 0000000000..68b5f03d73
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-class-properties", "transform-es2015-classes", "transform-es2015-block-scoping", "syntax-class-properties"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/static-undefined/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static-undefined/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/static-undefined/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/static-undefined/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/static-undefined/exec.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static-undefined/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/static-undefined/exec.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/static-undefined/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/static-undefined/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static-undefined/expected.js
new file mode 100644
index 0000000000..4f46d4a642
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static-undefined/expected.js
@@ -0,0 +1,3 @@
+var Foo = function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+};
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/static/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/static/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/static/actual.js
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/static/exec.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/static/exec.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/static/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/static/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static/expected.js
new file mode 100644
index 0000000000..4d0c09379d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/static/expected.js
@@ -0,0 +1,5 @@
+var Foo = function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+};
+
+Foo.bar = "foo";
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/super-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/super-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/super-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-expression/expected.js
new file mode 100644
index 0000000000..7eab2b7172
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-expression/expected.js
@@ -0,0 +1,14 @@
+var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo() {
+ var _temp, _this;
+
+ babelHelpers.classCallCheck(this, Foo);
+
+ foo((_temp = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this)), _this), _this.bar = "foo", _temp));
+ return _this;
+ }
+
+ return Foo;
+})(Bar);
diff --git a/packages/babel/test/fixtures/transformation/es7.class-properties/super-statement/actual.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.class-properties/super-statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.class-properties/super-statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-statement/expected.js b/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-statement/expected.js
new file mode 100644
index 0000000000..fa87f118f1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.class-properties/super-statement/expected.js
@@ -0,0 +1,14 @@
+var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+
+ var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this));
+
+ _this.bar = "foo";
+ return _this;
+ }
+
+ return Foo;
+})(Bar);
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/do-while.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/do-while.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/do-while.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/do-while.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/empty.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/empty.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/empty.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/empty.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/for-in.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/for-in.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/for-in.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/for-in.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/for.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/for.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/for.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/for.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/if-else-if.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/if-else-if.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/if-else-if.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/if-else-if.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/if-else.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/if-else.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/if-else.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/if-else.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/if.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/if.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/if.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/if.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.do-expressions/options.json b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/options.json
new file mode 100644
index 0000000000..72f5e34bb4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-do-expressions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/single-expression.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/single-expression.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/single-expression.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/single-expression.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/variable-declaration-end.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/variable-declaration-end.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/variable-declaration-end.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/variable-declaration-end.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/variable-declaration-start.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/variable-declaration-start.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/variable-declaration-start.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/variable-declaration-start.js
diff --git a/packages/babel/test/fixtures/transformation/es7.do-expressions/while.js b/packages/babel-core/test/fixtures/transformation/es7.do-expressions/while.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.do-expressions/while.js
rename to packages/babel-core/test/fixtures/transformation/es7.do-expressions/while.js
diff --git a/packages/babel/test/fixtures/transformation/es7.exponentian-operator/assignment/actual.js b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.exponentian-operator/assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/assignment/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/assignment/expected.js b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/assignment/expected.js
new file mode 100644
index 0000000000..f18ea2dc12
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/assignment/expected.js
@@ -0,0 +1,4 @@
+var num = 1;
+num = Math.pow(num, 2);
+
+;
diff --git a/packages/babel/test/fixtures/transformation/es7.exponentian-operator/binary/actual.js b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/binary/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.exponentian-operator/binary/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/binary/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/binary/expected.js b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/binary/expected.js
new file mode 100644
index 0000000000..00a73cfe37
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/binary/expected.js
@@ -0,0 +1 @@
+Math.pow(2, 2);
diff --git a/packages/babel/test/fixtures/transformation/es7.exponentian-operator/comprehensive/exec.js b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/comprehensive/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.exponentian-operator/comprehensive/exec.js
rename to packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/comprehensive/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/memoise-object/exec.js b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/memoise-object/exec.js
new file mode 100644
index 0000000000..140551313e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/memoise-object/exec.js
@@ -0,0 +1,10 @@
+var counters = 0;
+Object.defineProperty(global, "reader", {
+ get() {
+ counters += 1;
+ return { x: 2 };
+ },
+ configurable: true
+});
+reader.x **= 2;
+assert.ok(counters === 1);
diff --git a/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/options.json b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/options.json
new file mode 100644
index 0000000000..a6b3a4360b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.exponentian-operator/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-exponentiation-operator"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.export-extensions/default-compound-es6/actual.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-compound-es6/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.export-extensions/default-compound-es6/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-compound-es6/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-compound-es6/expected.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-compound-es6/expected.js
new file mode 100644
index 0000000000..45bc5549fd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-compound-es6/expected.js
@@ -0,0 +1,3 @@
+import _v from "mod";
+export { _v as v };
+export { x, y as w } from "mod";
diff --git a/packages/babel/test/fixtures/transformation/es7.export-extensions/default-commonjs/actual.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-es6/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.export-extensions/default-commonjs/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-es6/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-es6/expected.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-es6/expected.js
new file mode 100644
index 0000000000..076607d0d7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/default-es6/expected.js
@@ -0,0 +1,2 @@
+import _foo from "bar";
+export { _foo as foo };
diff --git a/packages/babel/test/fixtures/transformation/es7.export-extensions/namespace-compound-es6/actual.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-compound-es6/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.export-extensions/namespace-compound-es6/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-compound-es6/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-compound-es6/expected.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-compound-es6/expected.js
new file mode 100644
index 0000000000..4db1e64aa3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-compound-es6/expected.js
@@ -0,0 +1,4 @@
+import _v from "mod";
+export { _v as v };
+import * as _ns from "mod";
+export { _ns as ns };
diff --git a/packages/babel/test/fixtures/transformation/es7.export-extensions/namespace-commonjs/actual.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-es6/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.export-extensions/namespace-commonjs/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-es6/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-es6/expected.js b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-es6/expected.js
new file mode 100644
index 0000000000..2f4c84d761
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/namespace-es6/expected.js
@@ -0,0 +1,2 @@
+import * as _foo from "bar";
+export { _foo as foo };
diff --git a/packages/babel-core/test/fixtures/transformation/es7.export-extensions/options.json b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/options.json
new file mode 100644
index 0000000000..cd6d0b2f9e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.export-extensions/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-export-extensions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.function-bind/bind/actual.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/bind/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.function-bind/bind/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.function-bind/bind/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.function-bind/bind/expected.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/bind/expected.js
new file mode 100644
index 0000000000..a47fb151f3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.function-bind/bind/expected.js
@@ -0,0 +1,5 @@
+var _context;
+
+var f = (_context = ctx, ns.obj.func).bind(_context);
+var g = (_context = ns.obj).func.bind(_context);
+var h = (_context = new X(), y).bind(_context);
diff --git a/packages/babel/test/fixtures/transformation/es7.function-bind/call/actual.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/call/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.function-bind/call/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.function-bind/call/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.function-bind/call/expected.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/call/expected.js
new file mode 100644
index 0000000000..ccc091a886
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.function-bind/call/expected.js
@@ -0,0 +1,6 @@
+var _context;
+
+(_context = ctx, ns.obj.func).call(_context);
+(_context = ns.obj).func.call(_context);
+
+(_context = ns.obj2, ns.obj1.func).call(_context);
diff --git a/packages/babel/test/fixtures/transformation/es7.function-bind/complex-call/actual.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.function-bind/complex-call/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/exec.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/exec.js
new file mode 100644
index 0000000000..93ea455420
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/exec.js
@@ -0,0 +1,29 @@
+var operations = [];
+
+var lib = {};
+
+['f', 'g', 'h'].forEach(function (key) {
+ var func = function () {
+ return operations.push("lib." + key + "()");
+ };
+ Object.defineProperty(lib, key, {
+ get: function () {
+ operations.push("get lib." + key);
+ return func;
+ }
+ });
+});
+
+({prop:'value'})
+::lib.f()
+::lib.g()
+::lib.h();
+
+assert.deepEqual(operations, [
+ 'get lib.f',
+ 'lib.f()',
+ 'get lib.g',
+ 'lib.g()',
+ 'get lib.h',
+ 'lib.h()'
+]);
diff --git a/packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/expected.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/expected.js
new file mode 100644
index 0000000000..3a7acc97d3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.function-bind/complex-call/expected.js
@@ -0,0 +1,11 @@
+var _context;
+
+import { map, takeWhile, forEach } from "iterlib";
+
+(_context = (_context = (_context = getPlayers(), map).call(_context, function (x) {
+ return x.character();
+}), takeWhile).call(_context, function (x) {
+ return x.strength > 100;
+}), forEach).call(_context, function (x) {
+ return console.log(x);
+});
diff --git a/packages/babel-core/test/fixtures/transformation/es7.function-bind/options.json b/packages/babel-core/test/fixtures/transformation/es7.function-bind/options.json
new file mode 100644
index 0000000000..aa1fdfe370
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.function-bind/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-function-bind", "transform-es2015-arrow-functions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.function-bind/static-contexts/actual.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/static-contexts/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.function-bind/static-contexts/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.function-bind/static-contexts/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.function-bind/static-contexts/expected.js b/packages/babel-core/test/fixtures/transformation/es7.function-bind/static-contexts/expected.js
new file mode 100644
index 0000000000..191e73ffb8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.function-bind/static-contexts/expected.js
@@ -0,0 +1,5 @@
+var bar = function () {};
+bar.bind(foo);
+
+var foo = {};
+foo.bar.bind(foo);
diff --git a/packages/babel/test/fixtures/transformation/es7.object-spread/assignment/actual.js b/packages/babel-core/test/fixtures/transformation/es7.object-spread/assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.object-spread/assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.object-spread/assignment/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.object-spread/assignment/expected.js b/packages/babel-core/test/fixtures/transformation/es7.object-spread/assignment/expected.js
new file mode 100644
index 0000000000..5e42763fce
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.object-spread/assignment/expected.js
@@ -0,0 +1,3 @@
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+z = _extends({ x }, y);
diff --git a/packages/babel/test/fixtures/transformation/es7.object-spread/expression/actual.js b/packages/babel-core/test/fixtures/transformation/es7.object-spread/expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.object-spread/expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.object-spread/expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.object-spread/expression/expected.js b/packages/babel-core/test/fixtures/transformation/es7.object-spread/expression/expected.js
new file mode 100644
index 0000000000..b7f307cb75
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.object-spread/expression/expected.js
@@ -0,0 +1,3 @@
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+_extends({ x }, y, { a }, b, { c });
diff --git a/packages/babel-core/test/fixtures/transformation/es7.object-spread/options.json b/packages/babel-core/test/fixtures/transformation/es7.object-spread/options.json
new file mode 100644
index 0000000000..85af630bdd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.object-spread/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-object-rest-spread"]
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.object-spread/variable-declaration/actual.js b/packages/babel-core/test/fixtures/transformation/es7.object-spread/variable-declaration/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.object-spread/variable-declaration/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.object-spread/variable-declaration/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.object-spread/variable-declaration/expected.js b/packages/babel-core/test/fixtures/transformation/es7.object-spread/variable-declaration/expected.js
new file mode 100644
index 0000000000..da081be7b7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.object-spread/variable-declaration/expected.js
@@ -0,0 +1,3 @@
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var z = _extends({}, x);
diff --git a/packages/babel/test/fixtures/transformation/es7.trailing-function-commas/arrow-function/actual.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/arrow-function/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.trailing-function-commas/arrow-function/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/arrow-function/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/arrow-function/expected.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/arrow-function/expected.js
new file mode 100644
index 0000000000..5b8bd230b7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/arrow-function/expected.js
@@ -0,0 +1 @@
+(x, y) => {};
diff --git a/packages/babel/test/fixtures/transformation/es7.trailing-function-commas/call/actual.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/call/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.trailing-function-commas/call/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/call/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/call/expected.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/call/expected.js
new file mode 100644
index 0000000000..f7830fd7a7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/call/expected.js
@@ -0,0 +1 @@
+Math.max(1, 2, 3);
diff --git a/packages/babel/test/fixtures/transformation/es7.trailing-function-commas/declaration/actual.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/declaration/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.trailing-function-commas/declaration/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/declaration/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/declaration/expected.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/declaration/expected.js
new file mode 100644
index 0000000000..f52619513c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/declaration/expected.js
@@ -0,0 +1,3 @@
+function thisIsAFunctionWithAVeryLongNameAndWayTooManyParameters(thisIsTheFirstParameter, andThisOneIsRelatedToIt, butNotThisOne, andNeitherThis, inFactThereArentThatManyParameters) {
+ throw null;
+}
diff --git a/packages/babel/test/fixtures/transformation/es7.trailing-function-commas/new-expression/actual.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/new-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/es7.trailing-function-commas/new-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/new-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/new-expression/expected.js b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/new-expression/expected.js
new file mode 100644
index 0000000000..dbfd4d3267
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/new-expression/expected.js
@@ -0,0 +1 @@
+new Foo(a, b);
diff --git a/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/options.json b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/options.json
new file mode 100644
index 0000000000..db2590b82a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/es7.trailing-function-commas/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["syntax-trailing-function-commas"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/flow/options.json b/packages/babel-core/test/fixtures/transformation/flow/options.json
new file mode 100644
index 0000000000..445f44effc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/flow/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-flow-strip-types", "syntax-async-functions"]
+}
diff --git a/packages/babel/test/fixtures/generation/flow/array-types/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-array-types/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/array-types/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-array-types/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-array-types/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-array-types/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-array-types/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-array-types/expected.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-call-properties/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-call-properties/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-call-properties/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-call-properties/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-call-properties/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-call-properties/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-call-properties/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-call-properties/expected.js
diff --git a/packages/babel/test/fixtures/generation/flow/declare-module/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-declare-module/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/declare-module/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-declare-module/actual.js
diff --git a/packages/babel/test/fixtures/generation/flow/declare-statements/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-declare-statements/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/declare-statements/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-declare-statements/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-directive/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-directive/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-directive/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-directive/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-directive/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-directive/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-directive/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-directive/expected.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-interfaces-module-and-script/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-interfaces-module-and-script/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-interfaces-module-and-script/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-interfaces-module-and-script/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-interfaces-module-and-script/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-interfaces-module-and-script/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-interfaces-module-and-script/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-interfaces-module-and-script/expected.js
diff --git a/packages/babel/test/fixtures/generation/flow/qualified-generic-type/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-qualified-generic-type/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/qualified-generic-type/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-qualified-generic-type/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-qualified-generic-type/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-qualified-generic-type/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-qualified-generic-type/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-qualified-generic-type/expected.js
diff --git a/packages/babel/test/fixtures/generation/flow/string-literal-types/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-string-literal-types/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/string-literal-types/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-string-literal-types/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-string-literal-types/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-string-literal-types/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-string-literal-types/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-string-literal-types/expected.js
diff --git a/packages/babel/test/fixtures/generation/flow/tuples/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-tuples/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/tuples/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-tuples/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-tuples/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-tuples/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-tuples/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-tuples/expected.js
diff --git a/packages/babel/test/fixtures/generation/flow/type-alias/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-type-alias/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/type-alias/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-type-alias/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-type-annotations/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-type-annotations/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-type-annotations/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-type-annotations/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/flow/strip-type-annotations/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-type-annotations/expected.js
new file mode 100644
index 0000000000..62bf507aae
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/flow/strip-type-annotations/expected.js
@@ -0,0 +1,92 @@
+function foo(numVal) {}
+function foo(numVal) {}
+function foo(numVal, strVal) {}
+function foo(numVal, untypedVal) {}
+function foo(untypedVal, numVal) {}
+function foo(nullableNum) {}
+function foo(callback) {}
+function foo(callback) {}
+function foo(callback) {}
+function foo(callback) {}
+function foo(callback) {}
+function foo() {}
+function foo() {}
+function foo() {}
+function foo() {}
+function foo() {}
+function foo() {}
+function foo() {}
+a = function () {};
+a = { set fooProp(value) {} };
+a = { set fooProp(value) {} };
+a = { get fooProp() {} };
+a = { id(x) {} };
+a = { *id(x) {} };
+a = { async id(x) {} };
+a = { 123(x) {} };
+class Foo {
+ set fooProp(value) {}
+}
+class Foo2 {
+ set fooProp(value) {}
+}
+class Foo3 {
+ get fooProp() {}
+}
+var numVal;
+var numVal = otherNumVal;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a = [1, 2, 3];
+a = class Foo {};
+a = class Foo extends Bar {};
+class Foo4 {}
+class Foo5 extends Bar {}
+class Foo6 extends mixin(Bar) {}
+class Foo7 {
+ bar() {
+ return 42;
+ }
+}
+class Foo8 {
+ "bar"() {}
+}
+function foo(requiredParam, optParam) {}
+class Foo9 {}
+class Foo10 {}
+var x = 4;
+class Array {
+ concat(items) {}
+}
+var x = fn;
+var x = Y;
+var x = Y;
+var { x } = { x: "hello" };
+var { x } = { x: "hello" };
+var [x] = ["hello"];
+function foo({ x }) {}
+function foo([x]) {}
+function foo(...rest) {}
+(function (...rest) {});
+(...rest) => rest;
+var a;
+var a;
+var a;
+var a;
+var a;
+var a;
+var identity;
+var identity;
+
+import type from "foo";
+import type2, { foo3 } from "bar";
diff --git a/packages/babel/test/fixtures/generation/flow/typecasts/actual.js b/packages/babel-core/test/fixtures/transformation/flow/strip-typecasts/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/generation/flow/typecasts/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-typecasts/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/strip-typecasts/expected.js b/packages/babel-core/test/fixtures/transformation/flow/strip-typecasts/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/strip-typecasts/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/strip-typecasts/expected.js
diff --git a/packages/babel/test/fixtures/transformation/flow/type-comments/actual.js b/packages/babel-core/test/fixtures/transformation/flow/type-comments/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/type-comments/actual.js
rename to packages/babel-core/test/fixtures/transformation/flow/type-comments/actual.js
diff --git a/packages/babel/test/fixtures/transformation/flow/type-comments/expected.js b/packages/babel-core/test/fixtures/transformation/flow/type-comments/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/flow/type-comments/expected.js
rename to packages/babel-core/test/fixtures/transformation/flow/type-comments/expected.js
diff --git a/packages/babel/test/fixtures/transformation/jscript/arrow-function/exec.js b/packages/babel-core/test/fixtures/transformation/jscript/arrow-function/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/jscript/arrow-function/exec.js
rename to packages/babel-core/test/fixtures/transformation/jscript/arrow-function/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/jscript/options.json b/packages/babel-core/test/fixtures/transformation/jscript/options.json
new file mode 100644
index 0000000000..2a83077952
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/jscript/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-block-scoping", "transform-es2015-classes", "transform-jscript"]
+}
diff --git a/packages/babel/test/fixtures/transformation/jscript/simple-class/actual.js b/packages/babel-core/test/fixtures/transformation/jscript/simple-class/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/jscript/simple-class/actual.js
rename to packages/babel-core/test/fixtures/transformation/jscript/simple-class/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/jscript/simple-class/expected.js b/packages/babel-core/test/fixtures/transformation/jscript/simple-class/expected.js
new file mode 100644
index 0000000000..9a9dc38685
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/jscript/simple-class/expected.js
@@ -0,0 +1,7 @@
+var Test = (function () {
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ }
+
+ return Test;
+})();
diff --git a/packages/babel/test/fixtures/transformation/jscript/var-named-function-expression/actual.js b/packages/babel-core/test/fixtures/transformation/jscript/var-named-function-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/jscript/var-named-function-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/jscript/var-named-function-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/jscript/var-named-function-expression/expected.js b/packages/babel-core/test/fixtures/transformation/jscript/var-named-function-expression/expected.js
new file mode 100644
index 0000000000..cc2a8c592d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/jscript/var-named-function-expression/expected.js
@@ -0,0 +1,13 @@
+var IdenticalName = (function () {
+ function IdenticalName(x) {
+ return x;
+ }
+
+ return IdenticalName;
+})();
+
+(function () {
+ function foo() {}
+
+ return foo;
+})();
diff --git a/packages/babel/test/fixtures/transformation/minification.member-expression-literals/invalid-identifiers/actual.js b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/invalid-identifiers/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.member-expression-literals/invalid-identifiers/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/invalid-identifiers/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/invalid-identifiers/expected.js b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/invalid-identifiers/expected.js
new file mode 100644
index 0000000000..235484a7f1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/invalid-identifiers/expected.js
@@ -0,0 +1,2 @@
+foo["default"];
+foo["import"];
diff --git a/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/options.json b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/options.json
new file mode 100644
index 0000000000..3abfb3103d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-member-expression-literals"]
+}
diff --git a/packages/babel/test/fixtures/transformation/minification.member-expression-literals/valid-identifiers/actual.js b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/valid-identifiers/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.member-expression-literals/valid-identifiers/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/valid-identifiers/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/valid-identifiers/expected.js b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/valid-identifiers/expected.js
new file mode 100644
index 0000000000..8bf601550c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.member-expression-literals/valid-identifiers/expected.js
@@ -0,0 +1,4 @@
+foo.bar;
+foo.foo;
+foo.bar;
+foo.foo;
diff --git a/packages/babel/test/fixtures/transformation/minification.property-literals/invalid-identifiers/actual.js b/packages/babel-core/test/fixtures/transformation/minification.property-literals/invalid-identifiers/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.property-literals/invalid-identifiers/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.property-literals/invalid-identifiers/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.property-literals/invalid-identifiers/expected.js b/packages/babel-core/test/fixtures/transformation/minification.property-literals/invalid-identifiers/expected.js
new file mode 100644
index 0000000000..4ba2280c31
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.property-literals/invalid-identifiers/expected.js
@@ -0,0 +1,4 @@
+({
+ "default": null,
+ "import": null
+});
diff --git a/packages/babel-core/test/fixtures/transformation/minification.property-literals/options.json b/packages/babel-core/test/fixtures/transformation/minification.property-literals/options.json
new file mode 100644
index 0000000000..8d7765616d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.property-literals/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-property-literals"]
+}
diff --git a/packages/babel/test/fixtures/transformation/minification.property-literals/valid-identifiers/actual.js b/packages/babel-core/test/fixtures/transformation/minification.property-literals/valid-identifiers/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.property-literals/valid-identifiers/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.property-literals/valid-identifiers/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.property-literals/valid-identifiers/expected.js b/packages/babel-core/test/fixtures/transformation/minification.property-literals/valid-identifiers/expected.js
new file mode 100644
index 0000000000..4b9c5e9c49
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.property-literals/valid-identifiers/expected.js
@@ -0,0 +1,4 @@
+var obj = {
+ foo: "foo",
+ bar: "bar"
+};
diff --git a/packages/babel/test/fixtures/transformation/minification.remove-console/expression-nested/actual.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-nested/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.remove-console/expression-nested/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-nested/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-nested/expected.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-nested/expected.js
new file mode 100644
index 0000000000..236d6f7326
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-nested/expected.js
@@ -0,0 +1,4 @@
+function foo() {
+ true;
+ blah();
+}
diff --git a/packages/babel/test/fixtures/transformation/minification.remove-console/expression-top-level/actual.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-top-level/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.remove-console/expression-top-level/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-top-level/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-top-level/expected.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-top-level/expected.js
new file mode 100644
index 0000000000..7c38c1eed4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.remove-console/expression-top-level/expected.js
@@ -0,0 +1,2 @@
+true;
+blah();
diff --git a/packages/babel-core/test/fixtures/transformation/minification.remove-console/options.json b/packages/babel-core/test/fixtures/transformation/minification.remove-console/options.json
new file mode 100644
index 0000000000..95459c1ad8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.remove-console/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-remove-console"]
+}
diff --git a/packages/babel/test/fixtures/transformation/minification.remove-console/statement-nested/actual.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-nested/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.remove-console/statement-nested/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-nested/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-nested/expected.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-nested/expected.js
new file mode 100644
index 0000000000..3b71ef2bfa
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-nested/expected.js
@@ -0,0 +1,3 @@
+function foo() {
+ blah();
+}
diff --git a/packages/babel/test/fixtures/transformation/minification.remove-console/statement-top-level/actual.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-top-level/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/minification.remove-console/statement-top-level/actual.js
rename to packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-top-level/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-top-level/expected.js b/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-top-level/expected.js
new file mode 100644
index 0000000000..2eec0afbb9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/minification.remove-console/statement-top-level/expected.js
@@ -0,0 +1 @@
+blah();
diff --git a/packages/babel/test/fixtures/transformation/misc/enforce-newline-modules-blacklist/actual.js b/packages/babel-core/test/fixtures/transformation/misc/enforce-newline-modules-blacklist/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/enforce-newline-modules-blacklist/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/enforce-newline-modules-blacklist/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/enforce-newline-modules-blacklist/expected.js b/packages/babel-core/test/fixtures/transformation/misc/enforce-newline-modules-blacklist/expected.js
new file mode 100644
index 0000000000..2a6c93164c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/enforce-newline-modules-blacklist/expected.js
@@ -0,0 +1,3 @@
+export function foo() {}
+
+export function bar() {}
diff --git a/packages/babel-core/test/fixtures/transformation/misc/options.json b/packages/babel-core/test/fixtures/transformation/misc/options.json
new file mode 100644
index 0000000000..a6a12735e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2"]
+}
diff --git a/packages/babel/test/fixtures/transformation/misc/regression-1130/actual.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1130/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/regression-1130/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/regression-1130/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1130/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1130/expected.js
new file mode 100644
index 0000000000..165d31d24a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1130/expected.js
@@ -0,0 +1,7 @@
+function A() {
+ var a = undefined;
+}
+
+function B() {
+ var a = undefined;
+}
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1130/options.json b/packages/babel-core/test/fixtures/transformation/misc/regression-1130/options.json
new file mode 100644
index 0000000000..014f199cef
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1130/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/transformation/misc/regression-1149/actual.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1149/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/regression-1149/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/regression-1149/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1149/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1149/expected.js
new file mode 100644
index 0000000000..a2fe1a1436
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1149/expected.js
@@ -0,0 +1,3 @@
+function foo(bar) {
+ var bar = bar[0];
+}
diff --git a/packages/babel/test/fixtures/transformation/misc/regression-1155/actual.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1155/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/regression-1155/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/regression-1155/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1155/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1155/expected.js
new file mode 100644
index 0000000000..52cba9f323
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1155/expected.js
@@ -0,0 +1,15 @@
+var Foo = (function (_Bar) {
+ babelHelpers.inherits(Foo, _Bar);
+
+ function Foo(options) {
+ babelHelpers.classCallCheck(this, Foo);
+
+ var parentOptions = {};
+ parentOptions.init = function () {
+ this;
+ };
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, parentOptions));
+ }
+
+ return Foo;
+})(Bar);
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1155/options.json b/packages/babel-core/test/fixtures/transformation/misc/regression-1155/options.json
new file mode 100644
index 0000000000..9bf63fbd84
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1155/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-classes", "external-helpers-2", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/transformation/misc/regression-1168/actual.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1168/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/regression-1168/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/regression-1168/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1168/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1168/expected.js
new file mode 100644
index 0000000000..b16d3772ed
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1168/expected.js
@@ -0,0 +1,5 @@
+function test() {
+ var x = arguments.length <= 0 || arguments[0] === undefined ? "hi" : arguments[0];
+
+ return x;
+}
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1168/options.json b/packages/babel-core/test/fixtures/transformation/misc/regression-1168/options.json
new file mode 100644
index 0000000000..bf2c8e1456
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1168/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["syntax-flow", "transform-flow-strip-types", "transform-es2015-parameters", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel/test/fixtures/transformation/misc/regression-1169/actual.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1169/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/regression-1169/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/regression-1169/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1169/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1169/expected.js
new file mode 100644
index 0000000000..52350f484a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1169/expected.js
@@ -0,0 +1,32 @@
+function foo() {
+ var input = ['a', 'b', 'c'];
+ var output = {};
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var c = _step.value;
+
+ var name = c;
+ output[name] = name;
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ return output;
+}
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1169/options.json b/packages/babel-core/test/fixtures/transformation/misc/regression-1169/options.json
new file mode 100644
index 0000000000..f3f0e39508
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1169/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-block-scoping", "transform-es2015-for-of"]
+}
diff --git a/packages/babel/test/fixtures/transformation/misc/regression-1199/actual.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1199/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/regression-1199/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/regression-1199/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-1199/expected.js b/packages/babel-core/test/fixtures/transformation/misc/regression-1199/expected.js
new file mode 100644
index 0000000000..7d278a3a8c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/regression-1199/expected.js
@@ -0,0 +1,8 @@
+const bug = 1;
+
+function foo() {}
+
+function bar() {
+ var bug;
+ bug = 2;
+}
diff --git a/packages/babel/test/fixtures/transformation/misc/shebang/actual.js b/packages/babel-core/test/fixtures/transformation/misc/shebang/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/misc/shebang/actual.js
rename to packages/babel-core/test/fixtures/transformation/misc/shebang/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/misc/shebang/expected.js b/packages/babel-core/test/fixtures/transformation/misc/shebang/expected.js
new file mode 100644
index 0000000000..bbfcec5998
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/misc/shebang/expected.js
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+
+foobar();
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/children/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/children/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/children/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/children/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/children/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/children/expected.js
new file mode 100644
index 0000000000..9f725b28e8
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/children/expected.js
@@ -0,0 +1,9 @@
+var _ref = ;
+
+var Foo = React.createClass({
+ render: function () {
+ return
+ {_ref}
+
;
+ }
+});
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/constructor/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/constructor/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/constructor/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/constructor/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/constructor/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/constructor/expected.js
new file mode 100644
index 0000000000..e3e86ae68d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/constructor/expected.js
@@ -0,0 +1,7 @@
+var Foo = require("Foo");
+
+var _ref = ;
+
+function render() {
+ return _ref;
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/deep-constant-violation/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/deep-constant-violation/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/deep-constant-violation/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/deep-constant-violation/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/deep-constant-violation/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/deep-constant-violation/expected.js
new file mode 100644
index 0000000000..325f0daf7c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/deep-constant-violation/expected.js
@@ -0,0 +1,13 @@
+var _ref = ;
+
+var _ref2 = ;
+
+function render() {
+ var children = _ref;
+
+ if (someCondition) {
+ children = _ref2;
+ }
+
+ return {children}
;
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/dont-hoist-to-same-function/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/dont-hoist-to-same-function/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/dont-hoist-to-same-function/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/dont-hoist-to-same-function/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/dont-hoist-to-same-function/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/dont-hoist-to-same-function/expected.js
new file mode 100644
index 0000000000..7fd9783447
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/dont-hoist-to-same-function/expected.js
@@ -0,0 +1,7 @@
+function renderSome(a, b) {
+ if (a) {
+ return {b}
;
+ } else {
+ return {b} ;
+ }
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/function-parameter/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/function-parameter/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/function-parameter/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/function-parameter/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/function-parameter/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/function-parameter/expected.js
new file mode 100644
index 0000000000..0e737624da
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/function-parameter/expected.js
@@ -0,0 +1,17 @@
+function render(text) {
+ var _ref = {text} ;
+
+ return function () {
+ return _ref;
+ };
+}
+
+var Foo2 = require("Foo");
+
+function createComponent(text) {
+ var _ref2 = {text} ;
+
+ return function render() {
+ return _ref2;
+ };
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/global-reference/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/global-reference/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/global-reference/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/global-reference/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/global-reference/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/global-reference/expected.js
new file mode 100644
index 0000000000..2bfa9cf8e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/global-reference/expected.js
@@ -0,0 +1,7 @@
+var _ref =
;
+
+var Foo = React.createClass({
+ render: function render() {
+ return _ref;
+ }
+});
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/html-element/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/html-element/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/html-element/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/html-element/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/html-element/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/html-element/expected.js
new file mode 100644
index 0000000000..7ec3220a51
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/html-element/expected.js
@@ -0,0 +1,11 @@
+var _ref = ;
+
+function render() {
+ return _ref;
+}
+
+var _ref2 =
;
+
+function render() {
+ return _ref2;
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/expected.js
new file mode 100644
index 0000000000..3b37338633
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/expected.js
@@ -0,0 +1,30 @@
+var _typeofReactElement = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 0xeac7;
+
+var _ref = {
+ $$typeof: _typeofReactElement,
+ type: "foo",
+ key: null,
+ ref: null,
+ props: {},
+ _owner: null
+};
+function render() {
+ return _ref;
+}
+
+function render() {
+ var text = getText();
+ var _ref2 = {
+ $$typeof: _typeofReactElement,
+ type: "foo",
+ key: null,
+ ref: null,
+ props: {
+ children: text
+ },
+ _owner: null
+ };
+ return function () {
+ return _ref2;
+ };
+}
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/options.json b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/options.json
new file mode 100644
index 0000000000..533a4539e5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inline-elements/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-react-constant-elements", "transform-react-inline-elements", "syntax-jsx"]
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/inner-declaration/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inner-declaration/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/inner-declaration/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inner-declaration/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inner-declaration/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inner-declaration/expected.js
new file mode 100644
index 0000000000..b0e2cde1ad
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/inner-declaration/expected.js
@@ -0,0 +1,9 @@
+function render() {
+ var text = getText();
+
+ var _ref = {text} ;
+
+ return function () {
+ return _ref;
+ };
+}
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/options.json b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/options.json
new file mode 100644
index 0000000000..dddce77e97
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["syntax-jsx", "transform-react-constant-elements"]
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/parameter-reference/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/parameter-reference/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/parameter-reference/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/parameter-reference/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/parameter-reference/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/parameter-reference/expected.js
new file mode 100644
index 0000000000..bec3e34993
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/parameter-reference/expected.js
@@ -0,0 +1,13 @@
+function render(text) {
+ var _ref = {text}
;
+
+ return function () {
+ return _ref;
+ };
+}
+
+function render() {
+ return function (text) {
+ return {text}
;
+ };
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/reassignment/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/reassignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/reassignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/reassignment/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/reassignment/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/reassignment/expected.js
new file mode 100644
index 0000000000..9eb9d792f1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/reassignment/expected.js
@@ -0,0 +1,9 @@
+function render(text) {
+ text += "yes";
+
+ var _ref = {text}
;
+
+ return function () {
+ return _ref;
+ };
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/ref-deopt/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/ref-deopt/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/ref-deopt/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/ref-deopt/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/ref-deopt/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/ref-deopt/expected.js
new file mode 100644
index 0000000000..21806690b6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/ref-deopt/expected.js
@@ -0,0 +1,3 @@
+function render() {
+ return ;
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/spread-deopt/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/spread-deopt/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.constant-elements/spread-deopt/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/spread-deopt/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/spread-deopt/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/spread-deopt/expected.js
new file mode 100644
index 0000000000..baeabc5749
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.constant-elements/spread-deopt/expected.js
@@ -0,0 +1,3 @@
+function render() {
+ return ;
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/component-with-props/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component-with-props/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/component-with-props/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component-with-props/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component-with-props/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component-with-props/expected.js
new file mode 100644
index 0000000000..83084ab60d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component-with-props/expected.js
@@ -0,0 +1,10 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Baz,
+ key: null,
+ ref: null,
+ props: babelHelpers.defaultProps(Baz.defaultProps, {
+ foo: "bar"
+ }),
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/component/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/component/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component/expected.js
new file mode 100644
index 0000000000..ecdf28d80c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/component/expected.js
@@ -0,0 +1,8 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Baz,
+ key: null,
+ ref: null,
+ props: babelHelpers.defaultProps(Baz.defaultProps, {}),
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/html-element-with-props/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element-with-props/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/html-element-with-props/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element-with-props/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element-with-props/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element-with-props/expected.js
new file mode 100644
index 0000000000..ebca291106
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element-with-props/expected.js
@@ -0,0 +1,10 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: "foo",
+ key: null,
+ ref: null,
+ props: {
+ bar: "foo"
+ },
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/html-element/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/html-element/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element/expected.js
new file mode 100644
index 0000000000..ddeb8c32e4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/html-element/expected.js
@@ -0,0 +1,8 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: "foo",
+ key: null,
+ ref: null,
+ props: {},
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/key/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/key/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/key/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/key/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/key/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/key/expected.js
new file mode 100644
index 0000000000..bd4e4b0ae2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/key/expected.js
@@ -0,0 +1,8 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Foo,
+ key: "foo",
+ ref: null,
+ props: babelHelpers.defaultProps(Foo.defaultProps, {}),
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/nested-components/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-components/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/nested-components/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-components/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-components/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-components/expected.js
new file mode 100644
index 0000000000..ad2ed9f4e5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-components/expected.js
@@ -0,0 +1,18 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Foo,
+ key: null,
+ ref: null,
+ props: babelHelpers.defaultProps(Foo.defaultProps, {
+ children: [bar, {
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Baz,
+ key: "baz",
+ ref: null,
+ props: babelHelpers.defaultProps(Baz.defaultProps, {}),
+ _owner: null
+ }],
+ className: "foo"
+ }),
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/nested-html-elements/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-html-elements/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/nested-html-elements/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-html-elements/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-html-elements/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-html-elements/expected.js
new file mode 100644
index 0000000000..729c3ca5d3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested-html-elements/expected.js
@@ -0,0 +1,11 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: "div",
+ key: null,
+ ref: null,
+ props: {
+ children: bar,
+ className: "foo"
+ },
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/nested/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/nested/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested/expected.js
new file mode 100644
index 0000000000..c95b63f592
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/nested/expected.js
@@ -0,0 +1,18 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: "div",
+ key: null,
+ ref: null,
+ props: {
+ children: [bar, {
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Baz,
+ key: "baz",
+ ref: null,
+ props: babelHelpers.defaultProps(Baz.defaultProps, {}),
+ _owner: null
+ }],
+ className: "foo"
+ },
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/options.json b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/options.json
new file mode 100644
index 0000000000..96327e4a5c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "syntax-jsx", "transform-react-inline-elements", "transform-react-jsx"]
+}
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/ref-deopt/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/ref-deopt/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/ref-deopt/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/ref-deopt/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/ref-deopt/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/ref-deopt/expected.js
new file mode 100644
index 0000000000..87e7e615df
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/ref-deopt/expected.js
@@ -0,0 +1 @@
+React.createElement(Foo, { ref: "bar" });
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component-with-props/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component-with-props/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component-with-props/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component-with-props/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component-with-props/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component-with-props/expected.js
new file mode 100644
index 0000000000..83084ab60d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component-with-props/expected.js
@@ -0,0 +1,10 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Baz,
+ key: null,
+ ref: null,
+ props: babelHelpers.defaultProps(Baz.defaultProps, {
+ foo: "bar"
+ }),
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component/expected.js
new file mode 100644
index 0000000000..ecdf28d80c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-component/expected.js
@@ -0,0 +1,8 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Baz,
+ key: null,
+ ref: null,
+ props: babelHelpers.defaultProps(Baz.defaultProps, {}),
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element-with-props/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element-with-props/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element-with-props/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element-with-props/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element-with-props/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element-with-props/expected.js
new file mode 100644
index 0000000000..ebca291106
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element-with-props/expected.js
@@ -0,0 +1,10 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: "foo",
+ key: null,
+ ref: null,
+ props: {
+ bar: "foo"
+ },
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element/expected.js
new file mode 100644
index 0000000000..ddeb8c32e4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/self-closing-html-element/expected.js
@@ -0,0 +1,8 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: "foo",
+ key: null,
+ ref: null,
+ props: {},
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/shorthand-attributes/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/shorthand-attributes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/shorthand-attributes/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/shorthand-attributes/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/shorthand-attributes/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/shorthand-attributes/expected.js
new file mode 100644
index 0000000000..ce4365ed6d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/shorthand-attributes/expected.js
@@ -0,0 +1,10 @@
+({
+ $$typeof: babelHelpers.typeofReactElement,
+ type: Foo,
+ key: null,
+ ref: null,
+ props: babelHelpers.defaultProps(Foo.defaultProps, {
+ bar: true
+ }),
+ _owner: null
+});
\ No newline at end of file
diff --git a/packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/spread-deopt/actual.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/spread-deopt/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/optimisation.react.inline-elements/spread-deopt/actual.js
rename to packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/spread-deopt/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/spread-deopt/expected.js b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/spread-deopt/expected.js
new file mode 100644
index 0000000000..5672885bad
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/optimisation.react.inline-elements/spread-deopt/expected.js
@@ -0,0 +1 @@
+React.createElement(Foo, bar);
diff --git a/packages/babel/test/fixtures/transformation/react-compat/convert-component/actual.js b/packages/babel-core/test/fixtures/transformation/react-compat/convert-component/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react-compat/convert-component/actual.js
rename to packages/babel-core/test/fixtures/transformation/react-compat/convert-component/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react-compat/convert-component/expected.js b/packages/babel-core/test/fixtures/transformation/react-compat/convert-component/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react-compat/convert-component/expected.js
rename to packages/babel-core/test/fixtures/transformation/react-compat/convert-component/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react-compat/convert-tags/actual.js b/packages/babel-core/test/fixtures/transformation/react-compat/convert-tags/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react-compat/convert-tags/actual.js
rename to packages/babel-core/test/fixtures/transformation/react-compat/convert-tags/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react-compat/convert-tags/expected.js b/packages/babel-core/test/fixtures/transformation/react-compat/convert-tags/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react-compat/convert-tags/expected.js
rename to packages/babel-core/test/fixtures/transformation/react-compat/convert-tags/expected.js
diff --git a/packages/babel-core/test/fixtures/transformation/react-compat/options.json b/packages/babel-core/test/fixtures/transformation/react-compat/options.json
new file mode 100644
index 0000000000..3874dc9e0b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react-compat/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["syntax-jsx", "transform-react-jsx-compat"]
+}
diff --git a/packages/babel/test/fixtures/transformation/react/optimisation.react.constant-elements/actual.js b/packages/babel-core/test/fixtures/transformation/react/.optimisation.react.constant-elements/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/optimisation.react.constant-elements/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/.optimisation.react.constant-elements/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/optimisation.react.constant-elements/expected.js b/packages/babel-core/test/fixtures/transformation/react/.optimisation.react.constant-elements/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/optimisation.react.constant-elements/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/.optimisation.react.constant-elements/expected.js
diff --git a/packages/babel-core/test/fixtures/transformation/react/.optimisation.react.constant-elements/options.json b/packages/babel-core/test/fixtures/transformation/react/.optimisation.react.constant-elements/options.json
new file mode 100644
index 0000000000..8c93671dc7
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react/.optimisation.react.constant-elements/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-react-constant-elements", "transform-es2015-classes", "syntax-jsx"]
+}
diff --git a/packages/babel/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/actual.js b/packages/babel-core/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/expected.js b/packages/babel-core/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-not-strip-nbsp-even-coupled-with-other-whitespace/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/actual.js b/packages/babel-core/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/expected.js b/packages/babel-core/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-not-strip-tags-with-a-single-child-of-nbsp/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/actual.js b/packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/expected.js b/packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-adjacent-to-children/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/actual.js b/packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/expected.js b/packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/.should-properly-handle-comments-between-props/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/actual.js b/packages/babel-core/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/expected.js b/packages/babel-core/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/adds-appropriate-newlines-when-using-spread-attribute/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/arrow-functions/actual.js b/packages/babel-core/test/fixtures/transformation/react/arrow-functions/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/arrow-functions/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/arrow-functions/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/react/arrow-functions/expected.js b/packages/babel-core/test/fixtures/transformation/react/arrow-functions/expected.js
new file mode 100644
index 0000000000..dc9fe71161
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react/arrow-functions/expected.js
@@ -0,0 +1,15 @@
+var foo = function () {
+ var _this = this;
+
+ return function () {
+ return React.createElement(_this, null);
+ };
+};
+
+var bar = function () {
+ var _this2 = this;
+
+ return function () {
+ return React.createElement(_this2.foo, null);
+ };
+};
diff --git a/packages/babel/test/fixtures/transformation/react/concatenates-adjacent-string-literals/actual.js b/packages/babel-core/test/fixtures/transformation/react/concatenates-adjacent-string-literals/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/concatenates-adjacent-string-literals/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/concatenates-adjacent-string-literals/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/concatenates-adjacent-string-literals/expected.js b/packages/babel-core/test/fixtures/transformation/react/concatenates-adjacent-string-literals/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/concatenates-adjacent-string-literals/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/concatenates-adjacent-string-literals/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-assignment-expression/actual.js b/packages/babel-core/test/fixtures/transformation/react/display-name-assignment-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-assignment-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-assignment-expression/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-assignment-expression/expected.js b/packages/babel-core/test/fixtures/transformation/react/display-name-assignment-expression/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-assignment-expression/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-assignment-expression/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-export-default/actual.js b/packages/babel-core/test/fixtures/transformation/react/display-name-export-default/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-export-default/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-export-default/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/react/display-name-export-default/expected.js b/packages/babel-core/test/fixtures/transformation/react/display-name-export-default/expected.js
new file mode 100644
index 0000000000..e46141e8be
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react/display-name-export-default/expected.js
@@ -0,0 +1,7 @@
+export default React.createClass({
+ displayName: "actual",
+
+ render: function render() {
+ return null;
+ }
+});
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-if-missing/actual.js b/packages/babel-core/test/fixtures/transformation/react/display-name-if-missing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-if-missing/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-if-missing/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-if-missing/expected.js b/packages/babel-core/test/fixtures/transformation/react/display-name-if-missing/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-if-missing/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-if-missing/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-object-declaration/actual.js b/packages/babel-core/test/fixtures/transformation/react/display-name-object-declaration/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-object-declaration/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-object-declaration/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-object-declaration/expected.js b/packages/babel-core/test/fixtures/transformation/react/display-name-object-declaration/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-object-declaration/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-object-declaration/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-property-assignment/actual.js b/packages/babel-core/test/fixtures/transformation/react/display-name-property-assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-property-assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-property-assignment/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-property-assignment/expected.js b/packages/babel-core/test/fixtures/transformation/react/display-name-property-assignment/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-property-assignment/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-property-assignment/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-variable-declaration/actual.js b/packages/babel-core/test/fixtures/transformation/react/display-name-variable-declaration/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-variable-declaration/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-variable-declaration/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/display-name-variable-declaration/expected.js b/packages/babel-core/test/fixtures/transformation/react/display-name-variable-declaration/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/display-name-variable-declaration/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/display-name-variable-declaration/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/dont-coerce-expression-containers/actual.js b/packages/babel-core/test/fixtures/transformation/react/dont-coerce-expression-containers/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/dont-coerce-expression-containers/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/dont-coerce-expression-containers/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/dont-coerce-expression-containers/expected.js b/packages/babel-core/test/fixtures/transformation/react/dont-coerce-expression-containers/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/dont-coerce-expression-containers/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/dont-coerce-expression-containers/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/actual.js b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js
diff --git a/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/options.json b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/options.json
new file mode 100644
index 0000000000..f668e3e74e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": [["transform-react-jsx", "foo.bar"]]
+}
diff --git a/packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment/actual.js b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment/expected.js b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/honor-custom-jsx-comment/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-comment/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/actual.js b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/expected.js b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/expected.js
diff --git a/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/options.json b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/options.json
new file mode 100644
index 0000000000..2aae85c034
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react/honor-custom-jsx-pragma-option/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": [["transform-react-jsx", { "pragma": "dom" }]]
+}
diff --git a/packages/babel/test/fixtures/transformation/react/jsx-with-retainlines-option/actual.js b/packages/babel-core/test/fixtures/transformation/react/jsx-with-retainlines-option/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/jsx-with-retainlines-option/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/jsx-with-retainlines-option/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/jsx-with-retainlines-option/expected.js b/packages/babel-core/test/fixtures/transformation/react/jsx-with-retainlines-option/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/jsx-with-retainlines-option/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/jsx-with-retainlines-option/expected.js
diff --git a/packages/babel/test/fixtures/generation/comments/block-line-comment-with-retainlines-option/options.json b/packages/babel-core/test/fixtures/transformation/react/jsx-with-retainlines-option/options.json
similarity index 100%
rename from packages/babel/test/fixtures/generation/comments/block-line-comment-with-retainlines-option/options.json
rename to packages/babel-core/test/fixtures/transformation/react/jsx-with-retainlines-option/options.json
diff --git a/packages/babel/test/fixtures/transformation/react/jsx-without-retainlines-option/actual.js b/packages/babel-core/test/fixtures/transformation/react/jsx-without-retainlines-option/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/jsx-without-retainlines-option/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/jsx-without-retainlines-option/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/jsx-without-retainlines-option/expected.js b/packages/babel-core/test/fixtures/transformation/react/jsx-without-retainlines-option/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/jsx-without-retainlines-option/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/jsx-without-retainlines-option/expected.js
diff --git a/packages/babel-core/test/fixtures/transformation/react/options.json b/packages/babel-core/test/fixtures/transformation/react/options.json
new file mode 100644
index 0000000000..9d0456293a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "syntax-jsx", "transform-react-jsx", "transform-react-display-name", "transform-es2015-arrow-functions"]
+}
diff --git a/packages/babel/test/fixtures/transformation/react/should-allow-constructor-as-prop/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-allow-constructor-as-prop/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-allow-constructor-as-prop/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-allow-constructor-as-prop/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-allow-constructor-as-prop/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-allow-constructor-as-prop/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-allow-constructor-as-prop/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-allow-constructor-as-prop/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-allow-deeper-js-namespacing/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-allow-js-namespacing/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-allow-js-namespacing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-allow-js-namespacing/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-allow-js-namespacing/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-allow-js-namespacing/blacklist.js b/packages/babel-core/test/fixtures/transformation/react/should-allow-js-namespacing/blacklist.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-allow-js-namespacing/blacklist.js
rename to packages/babel-core/test/fixtures/transformation/react/should-allow-js-namespacing/blacklist.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-allow-js-namespacing/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-allow-js-namespacing/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-allow-js-namespacing/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-allow-js-namespacing/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-convert-simple-tags/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-convert-simple-tags/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-convert-simple-tags/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-convert-simple-tags/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-convert-simple-tags/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-convert-simple-tags/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-convert-simple-tags/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-convert-simple-tags/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-convert-simple-text/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-convert-simple-text/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-convert-simple-text/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-convert-simple-text/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-convert-simple-text/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-convert-simple-text/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-convert-simple-text/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-convert-simple-text/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-disallow-xml-namespacing/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-disallow-xml-namespacing/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-disallow-xml-namespacing/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-disallow-xml-namespacing/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-disallow-xml-namespacing/options.json b/packages/babel-core/test/fixtures/transformation/react/should-disallow-xml-namespacing/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-disallow-xml-namespacing/options.json
rename to packages/babel-core/test/fixtures/transformation/react/should-disallow-xml-namespacing/options.json
diff --git a/packages/babel/test/fixtures/transformation/react/should-handle-attributed-elements/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-handle-attributed-elements/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-handle-attributed-elements/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-handle-attributed-elements/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/react/should-handle-attributed-elements/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-handle-attributed-elements/expected.js
new file mode 100644
index 0000000000..eb1dca46ea
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/react/should-handle-attributed-elements/expected.js
@@ -0,0 +1,18 @@
+var HelloMessage = React.createClass({
+ displayName: "HelloMessage",
+
+ render: function () {
+ return React.createElement(
+ "div",
+ null,
+ "Hello ",
+ this.props.name
+ );
+ }
+});
+
+React.render(React.createElement(HelloMessage, { name: React.createElement(
+ "span",
+ null,
+ "Sebastian"
+ ) }), mountNode);
diff --git a/packages/babel/test/fixtures/transformation/react/should-handle-has-own-property-correctly/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-handle-has-own-property-correctly/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-handle-has-own-property-correctly/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-handle-has-own-property-correctly/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-handle-has-own-property-correctly/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-handle-has-own-property-correctly/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-handle-has-own-property-correctly/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-handle-has-own-property-correctly/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-have-correct-comma-in-nested-children/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-insert-commas-after-expressions-before-whitespace/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/actual.js b/packages/babel-core/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/expected.js b/packages/babel-core/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/should-transform-known-hyphenated-tags/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/actual.js b/packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/expected.js b/packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-first-spread-attributes/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/actual.js b/packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/expected.js b/packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-last-spread-attributes/expected.js
diff --git a/packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/actual.js b/packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/actual.js
rename to packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/actual.js
diff --git a/packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/expected.js b/packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/expected.js
rename to packages/babel-core/test/fixtures/transformation/react/wraps-props-in-react-spread-for-middle-spread-attributes/expected.js
diff --git a/packages/babel/test/fixtures/transformation/regenerator/default-parameters/exec.js b/packages/babel-core/test/fixtures/transformation/regenerator/default-parameters/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/regenerator/default-parameters/exec.js
rename to packages/babel-core/test/fixtures/transformation/regenerator/default-parameters/exec.js
diff --git a/packages/babel/test/fixtures/transformation/regenerator/destructuring-parameters/exec.js b/packages/babel-core/test/fixtures/transformation/regenerator/destructuring-parameters/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/regenerator/destructuring-parameters/exec.js
rename to packages/babel-core/test/fixtures/transformation/regenerator/destructuring-parameters/exec.js
diff --git a/packages/babel/test/fixtures/transformation/regenerator/destructuring/exec.js b/packages/babel-core/test/fixtures/transformation/regenerator/destructuring/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/regenerator/destructuring/exec.js
rename to packages/babel-core/test/fixtures/transformation/regenerator/destructuring/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/regenerator/options.json b/packages/babel-core/test/fixtures/transformation/regenerator/options.json
new file mode 100644
index 0000000000..6e83ffcc45
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/regenerator/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-destructuring", "transform-es2015-parameters", "transform-es2015-block-scoping", "transform-regenerator"]
+}
diff --git a/packages/babel/test/fixtures/transformation/regenerator/rest-parameters/exec.js b/packages/babel-core/test/fixtures/transformation/regenerator/rest-parameters/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/regenerator/rest-parameters/exec.js
rename to packages/babel-core/test/fixtures/transformation/regenerator/rest-parameters/exec.js
diff --git a/packages/babel/test/fixtures/transformation/runtime/aliased-constructors/actual.js b/packages/babel-core/test/fixtures/transformation/runtime/aliased-constructors/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/runtime/aliased-constructors/actual.js
rename to packages/babel-core/test/fixtures/transformation/runtime/aliased-constructors/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/aliased-constructors/expected.js b/packages/babel-core/test/fixtures/transformation/runtime/aliased-constructors/expected.js
new file mode 100644
index 0000000000..af27e0f321
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/aliased-constructors/expected.js
@@ -0,0 +1,10 @@
+import _Map from "babel-runtime/core-js/map";
+import _Symbol from "babel-runtime/core-js/symbol";
+import _Promise from "babel-runtime/core-js/promise";
+obj.constructor === Object;
+obj.constructor === _Promise;
+
+_Symbol();
+_Symbol("test");
+
+new _Map();
diff --git a/packages/babel/test/fixtures/transformation/runtime/catch-all/actual.js b/packages/babel-core/test/fixtures/transformation/runtime/catch-all/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/runtime/catch-all/actual.js
rename to packages/babel-core/test/fixtures/transformation/runtime/catch-all/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/catch-all/expected.js b/packages/babel-core/test/fixtures/transformation/runtime/catch-all/expected.js
new file mode 100644
index 0000000000..97b8bf8e3b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/catch-all/expected.js
@@ -0,0 +1,2 @@
+import _Promise from "babel-runtime/core-js/promise";
+_Promise.resolve;
diff --git a/packages/babel/test/fixtures/transformation/runtime/es6-for-of/actual.js b/packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/runtime/es6-for-of/actual.js
rename to packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/expected.js b/packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/expected.js
new file mode 100644
index 0000000000..6ad474d512
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/expected.js
@@ -0,0 +1,23 @@
+import _getIterator from "babel-runtime/core-js/get-iterator";
+var _iteratorNormalCompletion = true;
+var _didIteratorError = false;
+var _iteratorError = undefined;
+
+try {
+ for (var _iterator = _getIterator(arr), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var i = _step.value;
+ }
+} catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+} finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+}
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/options.json b/packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/options.json
new file mode 100644
index 0000000000..439eb3f913
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/es6-for-of/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-for-of", "transform-runtime"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/full/actual.js b/packages/babel-core/test/fixtures/transformation/runtime/full/actual.js
new file mode 100644
index 0000000000..0340999129
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/full/actual.js
@@ -0,0 +1,9 @@
+import foo, * as bar from "someModule";
+
+export const myWord = Symbol("abc");
+export function* giveWord () {
+ yield myWord;
+}
+
+foo;
+bar;
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/full/expected.js b/packages/babel-core/test/fixtures/transformation/runtime/full/expected.js
new file mode 100644
index 0000000000..f6aaa4e30b
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/full/expected.js
@@ -0,0 +1,24 @@
+import _regeneratorRuntime from "babel-runtime/regenerator";
+import _Symbol from "babel-runtime/core-js/symbol";
+
+var _marked = [giveWord].map(_regeneratorRuntime.mark);
+
+import foo, * as bar from "someModule";
+
+export const myWord = _Symbol("abc");
+export function giveWord() {
+ return regeneratorRuntime.wrap(function giveWord$(_context) {
+ while (1) switch (_context.prev = _context.next) {
+ case 0:
+ _context.next = 2;
+ return myWord;
+
+ case 2:
+ case "end":
+ return _context.stop();
+ }
+ }, _marked[0], this);
+}
+
+foo;
+bar;
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/options.json b/packages/babel-core/test/fixtures/transformation/runtime/options.json
new file mode 100644
index 0000000000..b987a67bba
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-runtime", "transform-regenerator"]
+}
diff --git a/packages/babel/test/fixtures/transformation/runtime/regenerator-runtime/actual.js b/packages/babel-core/test/fixtures/transformation/runtime/regenerator-runtime/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/runtime/regenerator-runtime/actual.js
rename to packages/babel-core/test/fixtures/transformation/runtime/regenerator-runtime/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/regenerator-runtime/expected.js b/packages/babel-core/test/fixtures/transformation/runtime/regenerator-runtime/expected.js
new file mode 100644
index 0000000000..3ba21d10de
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/regenerator-runtime/expected.js
@@ -0,0 +1,10 @@
+import _regeneratorRuntime from "babel-runtime/regenerator";
+void _regeneratorRuntime.mark(function _callee() {
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) switch (_context.prev = _context.next) {
+ case 0:
+ case "end":
+ return _context.stop();
+ }
+ }, _callee, this);
+});
diff --git a/packages/babel/test/fixtures/transformation/runtime/symbol-iterator-in/actual.js b/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator-in/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/runtime/symbol-iterator-in/actual.js
rename to packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator-in/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator-in/expected.js b/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator-in/expected.js
new file mode 100644
index 0000000000..3468aae656
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator-in/expected.js
@@ -0,0 +1,2 @@
+import _isIterable from "babel-runtime/core-js/is-iterable";
+_isIterable(Object(arr));
diff --git a/packages/babel/test/fixtures/transformation/runtime/symbol-iterator/actual.js b/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/runtime/symbol-iterator/actual.js
rename to packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator/expected.js b/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator/expected.js
new file mode 100644
index 0000000000..5b72708826
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/runtime/symbol-iterator/expected.js
@@ -0,0 +1,2 @@
+import _Symbol$iterator from "babel-runtime/core-js/symbol/iterator";
+_Symbol$iterator;
diff --git a/packages/babel/test/fixtures/transformation/source-maps/arrow-function/actual.js b/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/source-maps/arrow-function/actual.js
rename to packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/expected.js b/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/expected.js
new file mode 100644
index 0000000000..2224cf6e05
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/expected.js
@@ -0,0 +1,3 @@
+var t = function t(x) {
+ return x * x;
+};
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/options.json b/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/options.json
new file mode 100644
index 0000000000..d594536c39
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-arrow-functions", "transform-es2015-function-name"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/source-mappings.json b/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/source-mappings.json
new file mode 100644
index 0000000000..a1d1d31e4a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/arrow-function/source-mappings.json
@@ -0,0 +1,10 @@
+[{
+ "original": {
+ "line": 1,
+ "column": 14
+ },
+ "generated": {
+ "line": 2,
+ "column": 10
+ }
+}]
diff --git a/packages/babel/test/fixtures/transformation/source-maps/class/actual.js b/packages/babel-core/test/fixtures/transformation/source-maps/class/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/source-maps/class/actual.js
rename to packages/babel-core/test/fixtures/transformation/source-maps/class/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/class/expected.js b/packages/babel-core/test/fixtures/transformation/source-maps/class/expected.js
new file mode 100644
index 0000000000..2a5d6b6276
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/class/expected.js
@@ -0,0 +1,16 @@
+var Test = (function () {
+ function Test() {
+ babelHelpers.classCallCheck(this, Test);
+ }
+
+ babelHelpers.createClass(Test, [{
+ key: "bar",
+ get: function () {
+ throw new Error("wow");
+ }
+ }]);
+ return Test;
+})();
+
+var test = new Test();
+test.bar;
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/class/options.json b/packages/babel-core/test/fixtures/transformation/source-maps/class/options.json
new file mode 100644
index 0000000000..2fa2857263
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/class/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-classes", "transform-es2015-block-scoping"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/class/source-mappings.json b/packages/babel-core/test/fixtures/transformation/source-maps/class/source-mappings.json
new file mode 100644
index 0000000000..16239daa2c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/class/source-mappings.json
@@ -0,0 +1,10 @@
+[{
+ "original": {
+ "line": 3,
+ "column": 10
+ },
+ "generated": {
+ "line": 9,
+ "column": 15
+ }
+}]
diff --git a/packages/babel/test/fixtures/transformation/source-maps/full/actual.js b/packages/babel-core/test/fixtures/transformation/source-maps/full/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/source-maps/full/actual.js
rename to packages/babel-core/test/fixtures/transformation/source-maps/full/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/full/expected.js b/packages/babel-core/test/fixtures/transformation/source-maps/full/expected.js
new file mode 100644
index 0000000000..e2bcfeb4cd
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/full/expected.js
@@ -0,0 +1,3 @@
+arr.map(function (x) {
+ return x * x;
+});
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/full/options.json b/packages/babel-core/test/fixtures/transformation/source-maps/full/options.json
new file mode 100644
index 0000000000..fc3d742263
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/full/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-es2015-arrow-functions"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/full/source-map.json b/packages/babel-core/test/fixtures/transformation/source-maps/full/source-map.json
new file mode 100644
index 0000000000..b2b351d8bb
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/full/source-map.json
@@ -0,0 +1,8 @@
+{
+ "version": 3,
+ "file": "source-maps/full/expected.js",
+ "sources": ["source-maps/full/actual.js"],
+ "names": [],
+ "mappings": "AAAA,GAAG,CAAC,GAAG,CAAC,UAAA,CAAC;SAAI,CAAC,GAAG,CAAC;CAAA,CAAC,CAAC",
+ "sourcesContent": ["arr.map(x => x * x);"]
+}
diff --git a/packages/babel/test/fixtures/transformation/source-maps/inline/actual.js b/packages/babel-core/test/fixtures/transformation/source-maps/inline/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/source-maps/inline/actual.js
rename to packages/babel-core/test/fixtures/transformation/source-maps/inline/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/inline/expected.js b/packages/babel-core/test/fixtures/transformation/source-maps/inline/expected.js
new file mode 100644
index 0000000000..f93d2fbb34
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/inline/expected.js
@@ -0,0 +1,4 @@
+arr.map(function (x) {
+ return x * x;
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNvdXJjZS1tYXBzL2lubGluZS9hY3R1YWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUM7U0FBSSxDQUFDLEdBQUcsQ0FBQztDQUFBLENBQUMsQ0FBQyIsImZpbGUiOiJzb3VyY2UtbWFwcy9pbmxpbmUvZXhwZWN0ZWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJhcnIubWFwKHggPT4geCAqIHgpOyJdfQ==
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/inline/options.json b/packages/babel-core/test/fixtures/transformation/source-maps/inline/options.json
new file mode 100644
index 0000000000..3113ddc9e9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/inline/options.json
@@ -0,0 +1,4 @@
+{
+ "plugins": ["transform-es2015-arrow-functions"],
+ "sourceMap": "inline"
+}
diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/options.json b/packages/babel-core/test/fixtures/transformation/source-maps/options.json
new file mode 100644
index 0000000000..a6a12735e6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/source-maps/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/.smoke/exec.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/.smoke/exec.js
new file mode 100644
index 0000000000..179d59d7e5
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/.smoke/exec.js
@@ -0,0 +1,23 @@
+var foo = function () {};
+assert.equal(foo.name, "foo");
+
+var obj = { foo: function () {} };
+assert.equal(obj.foo.name, "foo");
+
+var obj = { "foo": function () {} };
+assert.equal(obj.foo.name, "foo");
+
+var obj = { foo() {} };
+assert.equal(obj.foo.name, "foo");
+
+var obj = { "foo"() {} };
+assert.equal(obj.foo.name, "foo");
+
+function noop() {}
+
+var obj = { @noop foo() {} };
+assert.equal(obj.foo.name, "foo");
+
+
+var obj = { @noop foo: function () { return "foo"; } };
+assert.equal(obj.foo.name, "foo");
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/.smoke/options.json b/packages/babel-core/test/fixtures/transformation/spec.function-name/.smoke/options.json
new file mode 100644
index 0000000000..56d51a7788
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/.smoke/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-decorators"]
+}
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/assignment/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/assignment/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/assignment/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/assignment/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/assignment/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/assignment/expected.js
new file mode 100644
index 0000000000..f4919f370a
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/assignment/expected.js
@@ -0,0 +1,9 @@
+var _i = function i() {
+ _i = 5;
+};
+
+var _j = function j() {
+ ({ j: _j } = 5);
+ ({ y: _j } = 5);
+ ;
+};
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/basic/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/basic/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/basic/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/basic/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/basic/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/basic/expected.js
new file mode 100644
index 0000000000..59f9d9ea37
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/basic/expected.js
@@ -0,0 +1,3 @@
+var g = function g() {
+ doSmth();
+};
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/class-method/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/class-method/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/class-method/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/class-method/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/class-method/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/class-method/expected.js
new file mode 100644
index 0000000000..b437bcd715
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/class-method/expected.js
@@ -0,0 +1,13 @@
+let Foo = (function () {
+ function Foo() {
+ babelHelpers.classCallCheck(this, Foo);
+ }
+
+ babelHelpers.createClass(Foo, [{
+ key: "t",
+ value: function t(_t) {
+ return _t;
+ }
+ }]);
+ return Foo;
+})();
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/collisions/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/collisions/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/collisions/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/collisions/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/collisions/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/collisions/expected.js
new file mode 100644
index 0000000000..5fbe7cfa81
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/collisions/expected.js
@@ -0,0 +1,9 @@
+var obj = {
+ search: function search({ search: _search }) {
+ console.log(_search);
+ }
+};
+
+function search({ search }) {
+ console.log(search);
+}
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/eval/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/eval/actual.js
new file mode 100644
index 0000000000..0a00dbf31d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/eval/actual.js
@@ -0,0 +1,5 @@
+var a = {
+ eval: function () {
+ return eval;
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/eval/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/eval/expected.js
new file mode 100644
index 0000000000..bef73fc81d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/eval/expected.js
@@ -0,0 +1,5 @@
+var a = {
+ eval: function _eval() {
+ return eval;
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/export/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/export/actual.js
new file mode 100644
index 0000000000..e1a034b8e1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/export/actual.js
@@ -0,0 +1,19 @@
+export var foo = "yes", foob = "no";
+
+export function whatever() {}
+
+export default function wowzers() {}
+
+var bar = {
+ foo: function () {
+ foo;
+ },
+
+ whatever: function () {
+ whatever;
+ },
+
+ wowzers: function () {
+ wowzers;
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/export/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/export/expected.js
new file mode 100644
index 0000000000..0d53fa7d4c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/export/expected.js
@@ -0,0 +1,23 @@
+export { _whatever as whatever };
+export { _wowzers as default };
+var _foo = "yes",
+ foob = "no";
+
+export { _foo as foo, foob };
+function _whatever() {}
+
+function _wowzers() {}
+
+var bar = {
+ foo: function foo() {
+ _foo;
+ },
+
+ whatever: function whatever() {
+ _whatever;
+ },
+
+ wowzers: function wowzers() {
+ _wowzers;
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/function-collision/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/function-collision/actual.js
new file mode 100644
index 0000000000..7f00f96e17
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/function-collision/actual.js
@@ -0,0 +1,19 @@
+function f() {
+ f;
+}
+
+{
+ let obj = {
+ f: function () {
+ f;
+ }
+ };
+}
+
+(function b() {
+ var obj = {
+ b: function () {
+ b;
+ }
+ };
+});
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/function-collision/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/function-collision/expected.js
new file mode 100644
index 0000000000..974eed70f6
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/function-collision/expected.js
@@ -0,0 +1,19 @@
+function _f() {
+ _f;
+}
+
+{
+ let obj = {
+ f: function f() {
+ _f;
+ }
+ };
+}
+
+(function _b() {
+ var obj = {
+ b: function b() {
+ _b;
+ }
+ };
+});
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/global/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/global/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/global/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/global/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/global/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/global/expected.js
new file mode 100644
index 0000000000..79cdf12923
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/global/expected.js
@@ -0,0 +1,15 @@
+var test = {
+ setInterval: (function (_setInterval) {
+ function setInterval(_x, _x2) {
+ return _setInterval.apply(this, arguments);
+ }
+
+ setInterval.toString = function () {
+ return _setInterval.toString();
+ };
+
+ return setInterval;
+ })(function (fn, ms) {
+ setInterval(fn, ms);
+ })
+};
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/modules-2/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/modules-2/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/expected.js
new file mode 100644
index 0000000000..cbb70ef1c4
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/expected.js
@@ -0,0 +1,27 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _last2 = require("lodash/array/last");
+
+var _last3 = babelHelpers.interopRequireDefault(_last2);
+
+let Container = (function () {
+ function Container() {
+ babelHelpers.classCallCheck(this, Container);
+ }
+
+ babelHelpers.createClass(Container, [{
+ key: "last",
+ value: function last(key) {
+ if (!this.has(key)) {
+ return;
+ }
+
+ return (0, _last3.default)(this.tokens.get(key));
+ }
+ }]);
+ return Container;
+})();
+
+exports.default = Container;
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/options.json b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/options.json
new file mode 100644
index 0000000000..f6575957b3
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-2/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-function-name", "transform-es2015-classes", "transform-decorators", "transform-es2015-modules-commonjs"]
+}
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/modules-3/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/modules-3/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/expected.js
new file mode 100644
index 0000000000..75097d561c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/expected.js
@@ -0,0 +1,24 @@
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _store = require("./store");
+
+let Login = (function (_React$Component) {
+ babelHelpers.inherits(Login, _React$Component);
+
+ function Login() {
+ babelHelpers.classCallCheck(this, Login);
+ return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Login).apply(this, arguments));
+ }
+
+ babelHelpers.createClass(Login, [{
+ key: "getForm",
+ value: function getForm() {
+ return (0, _store.getForm)().toJS();
+ }
+ }]);
+ return Login;
+})(React.Component);
+
+exports.default = Login;
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/options.json b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/options.json
new file mode 100644
index 0000000000..1b2b7e4ef1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-3/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-function-name", "transform-es2015-modules-commonjs", "transform-es2015-classes", "transform-decorators"]
+}
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/modules/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/modules/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/modules/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules/expected.js
new file mode 100644
index 0000000000..82cdf7a485
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules/expected.js
@@ -0,0 +1,19 @@
+var _events2 = require("events");
+
+var _events3 = babelHelpers.interopRequireDefault(_events2);
+
+let Template = (function () {
+ function Template() {
+ babelHelpers.classCallCheck(this, Template);
+ }
+
+ babelHelpers.createClass(Template, [{
+ key: "events",
+ value: function events() {
+ return _events3.default;
+ }
+ }]);
+ return Template;
+})();
+
+console.log(new Template().events());
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules/options.json b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules/options.json
new file mode 100644
index 0000000000..1b2b7e4ef1
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-function-name", "transform-es2015-modules-commonjs", "transform-es2015-classes", "transform-decorators"]
+}
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/object/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/object/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/object/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/object/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/object/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/object/expected.js
new file mode 100644
index 0000000000..d154a50f8e
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/object/expected.js
@@ -0,0 +1,25 @@
+var obj = {
+ f: function f() {
+ (function f() {
+ console.log(f);
+ })();
+ },
+
+ h: (function (_h) {
+ function h() {
+ return _h.apply(this, arguments);
+ }
+
+ h.toString = function () {
+ return _h.toString();
+ };
+
+ return h;
+ })(function () {
+ console.log(h);
+ }),
+
+ m: function m() {
+ doSmth();
+ }
+};
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/options.json b/packages/babel-core/test/fixtures/transformation/spec.function-name/options.json
new file mode 100644
index 0000000000..3f503942ab
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-es2015-function-name", "transform-es2015-classes", "transform-decorators"]
+}
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/own-bindings/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/own-bindings/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/own-bindings/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/own-bindings/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/own-bindings/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/own-bindings/expected.js
new file mode 100644
index 0000000000..d01187db68
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/own-bindings/expected.js
@@ -0,0 +1,13 @@
+var f = function f() {
+ var f = 2;
+};
+
+var g = function g(_g) {
+ _g;
+};
+
+var obj = {
+ f: function f(_f) {
+ _f;
+ }
+};
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/self-reference/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/self-reference/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/self-reference/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/self-reference/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/self-reference/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/self-reference/expected.js
new file mode 100644
index 0000000000..09a8c202ec
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/self-reference/expected.js
@@ -0,0 +1,5 @@
+var _f = function f() {
+ console.log(_f, g);
+};
+
+_f = null;
diff --git a/packages/babel/test/fixtures/transformation/spec.function-name/shorthand-property/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/shorthand-property/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.function-name/shorthand-property/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.function-name/shorthand-property/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/shorthand-property/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/shorthand-property/expected.js
new file mode 100644
index 0000000000..3ef494a094
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/shorthand-property/expected.js
@@ -0,0 +1,20 @@
+var Utils = {
+ get: function get() {}
+};
+
+var { get: _get } = Utils;
+
+var bar = {
+ get: function get(arg) {
+ _get(arg, "baz");
+ }
+};
+
+var f = function f({ foo: _foo = "bar" }) {
+ var obj = {
+ // same name as parameter
+ foo: function foo() {
+ _foo;
+ }
+ };
+};
diff --git a/packages/babel/test/fixtures/transformation/spec.proto-to-assign/assignment-expression/actual.js b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.proto-to-assign/assignment-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-expression/expected.js b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-expression/expected.js
new file mode 100644
index 0000000000..5455d9de29
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-expression/expected.js
@@ -0,0 +1,7 @@
+var _foo, _foo$bar, _foo$bar2;
+
+console.log((_foo = foo, babelHelpers.defaults(_foo, bar), _foo));
+
+console.log((_foo$bar = foo[bar], babelHelpers.defaults(_foo$bar, bar), _foo$bar));
+
+console.log((_foo$bar2 = foo[bar()], babelHelpers.defaults(_foo$bar2, bar), _foo$bar2));
diff --git a/packages/babel/test/fixtures/transformation/spec.proto-to-assign/assignment-statement/actual.js b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-statement/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.proto-to-assign/assignment-statement/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-statement/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-statement/expected.js b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-statement/expected.js
new file mode 100644
index 0000000000..f5be00561f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/assignment-statement/expected.js
@@ -0,0 +1 @@
+babelHelpers.defaults(obj, bar);
diff --git a/packages/babel/test/fixtures/transformation/spec.proto-to-assign/object-literal/actual.js b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/object-literal/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.proto-to-assign/object-literal/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/object-literal/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/object-literal/expected.js b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/object-literal/expected.js
new file mode 100644
index 0000000000..66c96c814c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/object-literal/expected.js
@@ -0,0 +1,9 @@
+var foo = babelHelpers._extends({}, bar);
+
+var foo = babelHelpers._extends({}, bar, {
+ bar: "foo"
+});
+
+var foo = babelHelpers._extends({}, bar, {
+ bar: "foo"
+});
diff --git a/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/options.json b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/options.json
new file mode 100644
index 0000000000..607b8f984c
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.proto-to-assign/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["external-helpers-2", "transform-proto-to-assign"]
+}
diff --git a/packages/babel/test/fixtures/transformation/spec.undefined-to-void/basic/actual.js b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/basic/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.undefined-to-void/basic/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/basic/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/basic/expected.js b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/basic/expected.js
new file mode 100644
index 0000000000..db9a1a5eef
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/basic/expected.js
@@ -0,0 +1,2 @@
+var foo;
+foo === void 0;
diff --git a/packages/babel/test/fixtures/transformation/spec.undefined-to-void/member-expression/actual.js b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/member-expression/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/spec.undefined-to-void/member-expression/actual.js
rename to packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/member-expression/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/member-expression/expected.js b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/member-expression/expected.js
new file mode 100644
index 0000000000..6f8747573d
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/member-expression/expected.js
@@ -0,0 +1,2 @@
+var foo;
+foo === (void 0).foo;
diff --git a/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/options.json b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/options.json
new file mode 100644
index 0000000000..5b234d5334
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/spec.undefined-to-void/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-undefined-to-void"]
+}
diff --git a/packages/babel-core/test/fixtures/transformation/strict/leading-comments-with-existing/actual.js b/packages/babel-core/test/fixtures/transformation/strict/leading-comments-with-existing/actual.js
new file mode 100644
index 0000000000..22c2f1d2ff
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/leading-comments-with-existing/actual.js
@@ -0,0 +1,2 @@
+// comments
+module.exports = {};
diff --git a/packages/babel-core/test/fixtures/transformation/strict/leading-comments-with-existing/expected.js b/packages/babel-core/test/fixtures/transformation/strict/leading-comments-with-existing/expected.js
new file mode 100644
index 0000000000..b7b3a6dec2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/leading-comments-with-existing/expected.js
@@ -0,0 +1,4 @@
+"use strict";
+
+// comments
+module.exports = {};
diff --git a/packages/babel/test/fixtures/transformation/strict/leading-comments/actual.js b/packages/babel-core/test/fixtures/transformation/strict/leading-comments/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/leading-comments/actual.js
rename to packages/babel-core/test/fixtures/transformation/strict/leading-comments/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/strict/leading-comments/expected.js b/packages/babel-core/test/fixtures/transformation/strict/leading-comments/expected.js
new file mode 100644
index 0000000000..569e4c24fc
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/leading-comments/expected.js
@@ -0,0 +1,5 @@
+"use strict";
+
+// comments
+
+module.exports = {};
diff --git a/packages/babel-core/test/fixtures/transformation/strict/options.json b/packages/babel-core/test/fixtures/transformation/strict/options.json
new file mode 100644
index 0000000000..51bfaafbee
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["transform-strict-mode", "transform-es2015-modules-commonjs"]
+}
diff --git a/packages/babel/test/fixtures/transformation/strict/undefined-this-arrow-function/actual.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-arrow-function/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/undefined-this-arrow-function/actual.js
rename to packages/babel-core/test/fixtures/transformation/strict/undefined-this-arrow-function/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/strict/undefined-this-arrow-function/expected.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-arrow-function/expected.js
new file mode 100644
index 0000000000..10d0543e43
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-arrow-function/expected.js
@@ -0,0 +1,3 @@
+"use strict";
+
+var foo = () => undefined;
diff --git a/packages/babel/test/fixtures/transformation/strict/undefined-this-root-call/actual.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-call/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/undefined-this-root-call/actual.js
rename to packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-call/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-call/expected.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-call/expected.js
new file mode 100644
index 0000000000..d6cbc49983
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-call/expected.js
@@ -0,0 +1,3 @@
+"use strict";
+
+undefined.foo();
diff --git a/packages/babel/test/fixtures/transformation/strict/undefined-this-root-declaration/actual.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-declaration/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/undefined-this-root-declaration/actual.js
rename to packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-declaration/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-declaration/expected.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-declaration/expected.js
new file mode 100644
index 0000000000..1d38c9f2b9
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-declaration/expected.js
@@ -0,0 +1,3 @@
+"use strict";
+
+var self = undefined;
diff --git a/packages/babel/test/fixtures/transformation/strict/undefined-this-root-reference/actual.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-reference/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/undefined-this-root-reference/actual.js
rename to packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-reference/actual.js
diff --git a/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-reference/expected.js b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-reference/expected.js
new file mode 100644
index 0000000000..ca6800354f
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/undefined-this-root-reference/expected.js
@@ -0,0 +1,3 @@
+"use strict";
+
+undefined;
diff --git a/packages/babel/test/fixtures/transformation/strict/use-strict-add/actual.js b/packages/babel-core/test/fixtures/transformation/strict/use-strict-add/actual.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/use-strict-add/actual.js
rename to packages/babel-core/test/fixtures/transformation/strict/use-strict-add/actual.js
diff --git a/packages/babel/test/fixtures/transformation/strict/use-strict-add/expected.js b/packages/babel-core/test/fixtures/transformation/strict/use-strict-add/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/use-strict-add/expected.js
rename to packages/babel-core/test/fixtures/transformation/strict/use-strict-add/expected.js
diff --git a/packages/babel-core/test/fixtures/transformation/strict/use-strict-exists/actual.js b/packages/babel-core/test/fixtures/transformation/strict/use-strict-exists/actual.js
new file mode 100644
index 0000000000..efbccabf76
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/strict/use-strict-exists/actual.js
@@ -0,0 +1,2 @@
+"use strict";
+foo();
diff --git a/packages/babel/test/fixtures/transformation/strict/use-strict-exists/expected.js b/packages/babel-core/test/fixtures/transformation/strict/use-strict-exists/expected.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/strict/use-strict-exists/expected.js
rename to packages/babel-core/test/fixtures/transformation/strict/use-strict-exists/expected.js
diff --git a/packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/declared/exec.js b/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/declared/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/declared/exec.js
rename to packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/declared/exec.js
diff --git a/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/options.json b/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/options.json
new file mode 100644
index 0000000000..9aad0a18e2
--- /dev/null
+++ b/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["undeclared-variables-check"]
+}
diff --git a/packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/exec.js b/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/exec.js
rename to packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/exec.js
diff --git a/packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/options.json b/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/options.json
rename to packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared-shorthand-property/options.json
diff --git a/packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/exec.js b/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/exec.js
similarity index 100%
rename from packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/exec.js
rename to packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/exec.js
diff --git a/packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/options.json b/packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/options.json
similarity index 100%
rename from packages/babel/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/options.json
rename to packages/babel-core/test/fixtures/transformation/validation.undeclared-variable-check/undeclared/options.json
diff --git a/packages/babel-core/test/path.js b/packages/babel-core/test/path.js
new file mode 100644
index 0000000000..0bff81c7bd
--- /dev/null
+++ b/packages/babel-core/test/path.js
@@ -0,0 +1,22 @@
+var transform = require("../lib/transformation");
+var Plugin = require("../lib/transformation/plugin");
+var babel = require("../lib/api/node");
+var chai = require("chai");
+
+suite("traversal path", function () {
+ test("replaceWithSourceString", function () {
+ var expectCode = "function foo() {}";
+
+ var actualCode = transform(expectCode, {
+ plugins: [new Plugin({
+ visitor: {
+ FunctionDeclaration: function (path) {
+ path.replaceWithSourceString("console.whatever()");
+ }
+ }
+ })]
+ }).code;
+
+ chai.expect(actualCode).to.be.equal("console.whatever();");
+ });
+});
diff --git a/packages/babel/test/traceur.js b/packages/babel-core/test/traceur.js
similarity index 77%
rename from packages/babel/test/traceur.js
rename to packages/babel-core/test/traceur.js
index 740629fb1b..c3a2071df8 100644
--- a/packages/babel/test/traceur.js
+++ b/packages/babel-core/test/traceur.js
@@ -6,29 +6,11 @@ require("./_transformation-helper").run("traceur", {
// weird environmental issue make these hard to test
"Modules",
- // not supported
- "ProperTailCalls",
-
// uses the old async generator proposal
"AsyncGenerators",
-
- // these are all internal traceur tests or non-standard features
- "ObjectMixin",
- "Annotations",
- "TestRunner",
- "Tools",
- "TempVarTransformer",
- "AtScript",
- "FreeVariableChecker",
- "TypeAssertions",
- "MemberVariables",
- "Types"
],
ignoreTasks: [
- // non-standard
- "ObjectMixin",
-
// Node 0.10 doesn't like these
"Symbol/Object",
"Symbol/ObjectModel",
@@ -40,6 +22,11 @@ require("./_transformation-helper").run("traceur", {
"Yield/ObjectModel",
"Yield/ReturnGenerator",
+ // yield as an identifier
+ "Yield/YieldIdentifier",
+ "Syntax/StrictKeywords",
+ "Syntax/IsValidSimpleAssignmentTarget",
+
// TODO: core-js fails these
"Collections/Map",
"Collections/Set",
@@ -52,9 +39,6 @@ require("./_transformation-helper").run("traceur", {
// this tests pollutes Object.prototype which messes things up
"StringExtras/StartsWith",
- // TODO
- "Syntax/IsValidSimpleAssignmentTarget",
-
// babel has no way to check these :( TODO: add to caveats
"TemplateLiterals/TemplateObjectCaching.module",
@@ -68,7 +52,6 @@ require("./_transformation-helper").run("traceur", {
// these are the responsibility of core-js
"Spread/Type",
- "Symbol/Inherited",
"Spread/NoIterator",
"Destructuring/Rest",
"Destructuring/Empty",
@@ -90,16 +73,15 @@ require("./_transformation-helper").run("traceur", {
"ArrayComprehension/Simple",
"GeneratorComprehension/Simple",
- // yield has been added as a keyword in ES6
+ // TODO
"Syntax/StrictKeywordsInPattern",
- "Yield/YieldIdentifier",
- "Syntax/StrictKeywords"
]
}, {
- optional: ["es6.spec.symbols", "es6.spec.templateLiterals"],
- stage: 0
+
}, function (opts, task) {
- if (!_.contains(task.exec.loc, "module.js")) {
- opts.blacklist = ["strict"];
+ if (_.contains(task.exec.loc, "module.js")) {
+ opts.plugins.push("transform-es2015-modules-commonjs");
+ } else {
+ opts.sourceType = "script";
}
});
diff --git a/packages/babel/test/transformation.js b/packages/babel-core/test/transformation.js
similarity index 100%
rename from packages/babel/test/transformation.js
rename to packages/babel-core/test/transformation.js
diff --git a/packages/babel-core/test/util.js b/packages/babel-core/test/util.js
new file mode 100644
index 0000000000..729eb7361f
--- /dev/null
+++ b/packages/babel-core/test/util.js
@@ -0,0 +1,108 @@
+var assert = require("assert");
+var util = require("../lib/util");
+var parse = require("../lib/helpers/parse");
+var t = require("babel-types");
+
+suite("util", function () {
+ test("canCompile", function () {
+ assert.ok(util.canCompile("test.js"));
+ assert.ok(util.canCompile("/test.js"));
+ assert.ok(util.canCompile("/scripts/test.js"));
+
+ assert.ok(util.canCompile("test.es6"));
+ assert.ok(util.canCompile("/test.es6"));
+ assert.ok(util.canCompile("/scripts/test.es6"));
+
+ assert.ok(util.canCompile("test.es"));
+ assert.ok(util.canCompile("/test.es"));
+ assert.ok(util.canCompile("/scripts/test.es"));
+
+ assert.ok(util.canCompile("test.jsx"));
+ assert.ok(util.canCompile("/test.jsx"));
+ assert.ok(util.canCompile("/scripts/test.jsx"));
+
+ assert.ok(!util.canCompile("test"));
+ assert.ok(!util.canCompile("test.css"));
+ assert.ok(!util.canCompile("/test.css"));
+ assert.ok(!util.canCompile("/scripts/test.css"));
+ });
+
+ test("list", function () {
+ assert.deepEqual(util.list(undefined), []);
+ assert.deepEqual(util.list(false), []);
+ assert.deepEqual(util.list(null), []);
+ assert.deepEqual(util.list(""), []);
+ assert.deepEqual(util.list("foo"), ["foo"]);
+ assert.deepEqual(util.list("foo,bar"), ["foo", "bar"]);
+ assert.deepEqual(util.list(["foo", "bar"]), ["foo", "bar"]);
+ assert.deepEqual(util.list(/foo/), [/foo/]);
+
+ var date = new Date;
+ assert.deepEqual(util.list(date), [date]);
+ });
+
+ test("arrayify", function () {
+ assert.deepEqual(util.arrayify(undefined), []);
+ assert.deepEqual(util.arrayify(false), []);
+ assert.deepEqual(util.arrayify(null), []);
+ assert.deepEqual(util.arrayify(""), []);
+ assert.deepEqual(util.arrayify("foo"), ["foo"]);
+ assert.deepEqual(util.arrayify("foo,bar"), ["foo", "bar"]);
+ assert.deepEqual(util.arrayify(["foo", "bar"]), ["foo", "bar"]);
+ assert.deepEqual(util.arrayify({ foo: "bar" }), [{ foo: "bar" }]);
+ assert.deepEqual(util.arrayify(function () { return "foo"; })[0](), "foo");
+ });
+
+ test("regexify", function () {
+ assert.deepEqual(util.regexify(undefined), /.^/);
+ assert.deepEqual(util.regexify(false), /.^/);
+ assert.deepEqual(util.regexify(null), /.^/);
+ assert.deepEqual(util.regexify(""), /.^/);
+ assert.deepEqual(util.regexify(["foo", "bar"]), /\x66oo|\x62ar/i);
+ assert.deepEqual(util.regexify("foobar"), /(?:(?=.)foobar)/i);
+ assert.deepEqual(util.regexify(/foobar/), /foobar/);
+
+ assert.ok(util.regexify("foo/bar").test("bar/foo/bar"));
+ assert.ok(util.regexify("foo/*").test("foo/bar.js"));
+ assert.ok(util.regexify("*.js").test("bar.js"));
+ assert.ok(util.regexify("./foo").test("foo"));
+ assert.ok(util.regexify("./foo/bar.js").test("foo/bar.js"));
+ assert.ok(util.regexify("foobar").test("foobar"));
+
+ assert.throws(function () {
+ util.regexify({});
+ }, /illegal type for regexify/);
+ });
+
+ test("booleanify", function () {
+ assert.strictEqual(util.booleanify("true"), true);
+ assert.strictEqual(util.booleanify("false"), false);
+ assert.strictEqual(util.booleanify("inline"), "inline");
+ });
+
+ test("toIdentifier", function () {
+ assert.equal(t.toIdentifier("swag-lord"), "swagLord");
+ });
+
+ test("shouldIgnore", function () {
+ var reIgnore = /\-reIgnore\.js/;
+ var fnIgnore = function (src) {
+ if (src.indexOf("fnIgnore") > 0) {
+ return true;
+ }
+ };
+
+ assert.equal(util.shouldIgnore("test.js", []), false);
+ assert.equal(util.shouldIgnore("test-reIgnore.js", [fnIgnore]), false);
+ assert.equal(util.shouldIgnore("test-reIgnore.js", [reIgnore]), true);
+
+ assert.equal(util.shouldIgnore("test-fnIgnore.js", [fnIgnore]), true);
+ assert.equal(util.shouldIgnore("test-fnIgnore.js", [reIgnore]), false);
+
+ assert.equal(util.shouldIgnore("test-reIgnore.js", [], [fnIgnore]), true);
+ assert.equal(util.shouldIgnore("test-reIgnore.js", [], [reIgnore]), false);
+
+ assert.equal(util.shouldIgnore("test-fnIgnore.js", [], [fnIgnore]), false);
+ assert.equal(util.shouldIgnore("test-fnIgnore.js", [], [reIgnore]), true);
+ });
+});
diff --git a/packages/babel-generator/.npmignore b/packages/babel-generator/.npmignore
new file mode 100644
index 0000000000..a57582cc39
--- /dev/null
+++ b/packages/babel-generator/.npmignore
@@ -0,0 +1 @@
+/src
diff --git a/packages/babel-generator/README.md b/packages/babel-generator/README.md
new file mode 100644
index 0000000000..a71b28d699
--- /dev/null
+++ b/packages/babel-generator/README.md
@@ -0,0 +1 @@
+# babel-generator
diff --git a/packages/babel-generator/package.json b/packages/babel-generator/package.json
new file mode 100644
index 0000000000..9a2ca06a2a
--- /dev/null
+++ b/packages/babel-generator/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "babel-generator",
+ "version": "6.0.2",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "lib/index.js",
+ "dependencies": {
+ "babel-messages": "^6.0.2",
+ "babel-runtime": "^6.0.2",
+ "babel-types": "^6.0.2",
+ "detect-indent": "^3.0.1",
+ "is-integer": "^1.0.4",
+ "lodash": "^3.10.1",
+ "repeating": "^1.1.3",
+ "source-map": "^0.4.4",
+ "trim-right": "^1.0.1"
+ },
+ "devDependencies": {
+ "babel-helper-fixtures": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel/src/generation/buffer.js b/packages/babel-generator/src/buffer.js
similarity index 77%
rename from packages/babel/src/generation/buffer.js
rename to packages/babel-generator/src/buffer.js
index 959b631bde..a0a0a7b550 100644
--- a/packages/babel/src/generation/buffer.js
+++ b/packages/babel-generator/src/buffer.js
@@ -1,21 +1,40 @@
+/* @flow */
+
+import type Position from "./position";
import repeating from "repeating";
import trimRight from "trim-right";
-import isBoolean from "lodash/lang/isBoolean";
-import includes from "lodash/collection/includes";
-import isNumber from "lodash/lang/isNumber";
/**
* Buffer for collecting generated output.
*/
export default class Buffer {
- constructor(position, format) {
+ constructor(position: Position, format: Object) {
+ this.printedCommentStarts = {};
this.parenPushNewlineState = null;
-
this.position = position;
- this._indent = format.indent.base;
- this.format = format;
- this.buf = "";
+ this._indent = format.indent.base;
+ this.format = format;
+ this.buf = "";
+ }
+
+ parenPushNewlineState: ?Object;
+ buf: string;
+ position: Position;
+ _indent: number;
+ format: Object;
+
+ /**
+ * Description
+ */
+
+ catchUp(node) {
+ // catch up to this nodes newline if we're behind
+ if (node.loc && this.format.retainLines && this.buf) {
+ while (this.position.line < node.loc.start.line) {
+ this._push("\n");
+ }
+ }
}
/**
@@ -92,7 +111,7 @@ export default class Buffer {
* Add a keyword to the buffer.
*/
- keyword(name) {
+ keyword(name: string) {
this.push(name);
this.space();
}
@@ -101,7 +120,7 @@ export default class Buffer {
* Add a space to the buffer unless it is compact (override with force).
*/
- space(force?) {
+ space(force?: boolean) {
if (!force && this.format.compact) return;
if (force || this.buf && !this.isLast(" ") && !this.isLast("\n")) {
@@ -113,12 +132,12 @@ export default class Buffer {
* Remove the last character.
*/
- removeLast(cha) {
+ removeLast(cha: string) {
if (this.format.compact) return;
return this._removeLast(cha);
}
- _removeLast(cha) {
+ _removeLast(cha: string) {
if (!this._isLast(cha)) return;
this.buf = this.buf.substr(0, this.buf.length - 1);
this.position.unshift(cha);
@@ -140,7 +159,7 @@ export default class Buffer {
* `undefined` will be returned and not `foo` due to the terminator.
*/
- startTerminatorless() {
+ startTerminatorless(): Object {
return this.parenPushNewlineState = {
printed: false
};
@@ -150,7 +169,7 @@ export default class Buffer {
* Print an ending parentheses if a starting one has been printed.
*/
- endTerminatorless(state) {
+ endTerminatorless(state: Object) {
if (state.printed) {
this.dedent();
this.newline();
@@ -163,8 +182,8 @@ export default class Buffer {
* Strips multiple newlines if removeLast is true.
*/
- newline(i, removeLast) {
- if (this.format.compact || this.format.retainLines) return;
+ newline(i?: boolean | number, removeLast?: boolean) {
+ if (this.format.retainLines || this.format.compact) return;
if (this.format.concise) {
this.space();
@@ -173,7 +192,7 @@ export default class Buffer {
removeLast = removeLast || false;
- if (isNumber(i)) {
+ if (typeof i === "number") {
i = Math.min(2, i);
if (this.endsWith("{\n") || this.endsWith(":\n")) i--;
@@ -186,7 +205,7 @@ export default class Buffer {
return;
}
- if (isBoolean(i)) {
+ if (typeof i === "boolean") {
removeLast = i;
}
@@ -197,7 +216,7 @@ export default class Buffer {
* Adds a newline unless there is already two previous newlines.
*/
- _newline(removeLast) {
+ _newline(removeLast?: boolean) {
// never allow more than two lines
if (this.endsWith("\n\n")) return;
@@ -214,12 +233,12 @@ export default class Buffer {
*/
_removeSpacesAfterLastNewline() {
- var lastNewlineIndex = this.buf.lastIndexOf("\n");
+ let lastNewlineIndex = this.buf.lastIndexOf("\n");
if (lastNewlineIndex === -1) {
return;
}
- var index = this.buf.length - 1;
+ let index = this.buf.length - 1;
while (index > lastNewlineIndex) {
if (this.buf[index] !== " ") {
break;
@@ -237,10 +256,10 @@ export default class Buffer {
* Push a string to the buffer, maintaining indentation and newlines.
*/
- push(str, noIndent) {
+ push(str: string, noIndent?: boolean) {
if (!this.format.compact && this._indent && !noIndent && str !== "\n") {
// we have an indent level and we aren't pushing a newline
- var indent = this.getIndent();
+ let indent = this.getIndent();
// replace all newlines with newlines with the indentation
str = str.replace(/\n/g, `\n${indent}`);
@@ -258,10 +277,10 @@ export default class Buffer {
_push(str) {
// see startTerminatorless() instance method
- var parenPushNewlineState = this.parenPushNewlineState;
+ let parenPushNewlineState = this.parenPushNewlineState;
if (parenPushNewlineState) {
- for (var i = 0; i < str.length; i++) {
- var cha = str[i];
+ for (let i = 0; i < str.length; i++) {
+ let cha = str[i];
// we can ignore spaces since they wont interupt a terminatorless separator
if (cha === " ") continue;
@@ -288,7 +307,7 @@ export default class Buffer {
* Test if the buffer ends with a string.
*/
- endsWith(str, buf = this.buf) {
+ endsWith(str: string, buf: string = this.buf): boolean {
if (str.length === 1) {
return buf[buf.length - 1] === str;
} else {
@@ -300,17 +319,17 @@ export default class Buffer {
* Test if a character is last in the buffer.
*/
- isLast(cha) {
+ isLast(cha: string) {
if (this.format.compact) return false;
return this._isLast(cha);
}
- _isLast(cha) {
- var buf = this.buf;
- var last = buf[buf.length - 1];
+ _isLast(cha: string) {
+ let buf = this.buf;
+ let last = buf[buf.length - 1];
if (Array.isArray(cha)) {
- return includes(cha, last);
+ return cha.indexOf(last) >= 0;
} else {
return cha === last;
}
diff --git a/packages/babel-generator/src/generators/base.js b/packages/babel-generator/src/generators/base.js
new file mode 100644
index 0000000000..d9f9ea2664
--- /dev/null
+++ b/packages/babel-generator/src/generators/base.js
@@ -0,0 +1,42 @@
+/* @flow */
+
+export function File(node: Object) {
+ this.print(node.program, node);
+}
+
+export function Program(node: Object) {
+ this.printInnerComments(node, false);
+
+ this.printSequence(node.directives, node);
+ if (node.directives && node.directives.length) this.newline();
+
+ this.printSequence(node.body, node);
+}
+
+export function BlockStatement(node: Object) {
+ this.push("{");
+ this.printInnerComments(node);
+ if (node.body.length) {
+ this.newline();
+
+ this.printSequence(node.directives, node, { indent: true });
+ if (node.directives && node.directives.length) this.newline();
+
+ this.printSequence(node.body, node, { indent: true });
+ if (!this.format.retainLines) this.removeLast("\n");
+ this.rightBrace();
+ } else {
+ this.push("}");
+ }
+}
+
+export function Noop() {}
+
+export function Directive(node: Object) {
+ this.print(node.value, node);
+ this.semicolon();
+}
+
+export function DirectiveLiteral(node: Object) {
+ this.push(this._stringLiteral(node.value));
+}
diff --git a/packages/babel-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js
new file mode 100644
index 0000000000..c1bb4cf0f3
--- /dev/null
+++ b/packages/babel-generator/src/generators/classes.js
@@ -0,0 +1,74 @@
+/* @flow */
+
+export function ClassDeclaration(node: Object) {
+ this.printJoin(node.decorators, node, { separator: "" });
+ this.push("class");
+
+ if (node.id) {
+ this.push(" ");
+ this.print(node.id, node);
+ }
+
+ this.print(node.typeParameters, node);
+
+ if (node.superClass) {
+ this.push(" extends ");
+ this.print(node.superClass, node);
+ this.print(node.superTypeParameters, node);
+ }
+
+ if (node.implements) {
+ this.push(" implements ");
+ this.printJoin(node.implements, node, { separator: ", " });
+ }
+
+ this.space();
+ this.print(node.body, node);
+}
+
+export { ClassDeclaration as ClassExpression };
+
+export function ClassBody(node: Object) {
+ this.push("{");
+ this.printInnerComments(node);
+ if (node.body.length === 0) {
+ this.push("}");
+ } else {
+ this.newline();
+
+ this.indent();
+ this.printSequence(node.body, node);
+ this.dedent();
+
+ this.rightBrace();
+ }
+}
+
+export function ClassProperty(node: Object) {
+ this.printJoin(node.decorators, node, { separator: "" });
+
+ if (node.static) this.push("static ");
+ this.print(node.key, node);
+ this.print(node.typeAnnotation, node);
+ if (node.value) {
+ this.space();
+ this.push("=");
+ this.space();
+ this.print(node.value, node);
+ }
+ this.semicolon();
+}
+
+export function ClassMethod(node: Object) {
+ this.printJoin(node.decorators, node, { separator: "" });
+
+ if (node.static) {
+ this.push("static ");
+ }
+
+ if (node.kind === "constructorCall") {
+ this.push("call ");
+ }
+
+ this._method(node);
+}
diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js
new file mode 100644
index 0000000000..b3c1052335
--- /dev/null
+++ b/packages/babel-generator/src/generators/expressions.js
@@ -0,0 +1,225 @@
+/* @flow */
+
+import isInteger from "is-integer";
+import isNumber from "lodash/lang/isNumber";
+import * as t from "babel-types";
+import n from "../node";
+
+const SCIENTIFIC_NOTATION = /e/i;
+
+export function UnaryExpression(node: Object) {
+ let needsSpace = /[a-z]$/.test(node.operator);
+ let arg = node.argument;
+
+ if (t.isUpdateExpression(arg) || t.isUnaryExpression(arg)) {
+ needsSpace = true;
+ }
+
+ if (t.isUnaryExpression(arg) && arg.operator === "!") {
+ needsSpace = false;
+ }
+
+ this.push(node.operator);
+ if (needsSpace) this.push(" ");
+ this.print(node.argument, node);
+}
+
+export function DoExpression(node: Object) {
+ this.push("do");
+ this.space();
+ this.print(node.body, node);
+}
+
+export function ParenthesizedExpression(node: Object) {
+ this.push("(");
+ this.print(node.expression, node);
+ this.push(")");
+}
+
+export function UpdateExpression(node: Object) {
+ if (node.prefix) {
+ this.push(node.operator);
+ this.print(node.argument, node);
+ } else {
+ this.print(node.argument, node);
+ this.push(node.operator);
+ }
+}
+
+export function ConditionalExpression(node: Object) {
+ this.print(node.test, node);
+ this.space();
+ this.push("?");
+ this.space();
+ this.print(node.consequent, node);
+ this.space();
+ this.push(":");
+ this.space();
+ this.print(node.alternate, node);
+}
+
+export function NewExpression(node: Object) {
+ this.push("new ");
+ this.print(node.callee, node);
+ this.push("(");
+ this.printList(node.arguments, node);
+ this.push(")");
+}
+
+export function SequenceExpression(node: Object) {
+ this.printList(node.expressions, node);
+}
+
+export function ThisExpression() {
+ this.push("this");
+}
+
+export function Super() {
+ this.push("super");
+}
+
+export function Decorator(node: Object) {
+ this.push("@");
+ this.print(node.expression, node);
+ this.newline();
+}
+
+export function CallExpression(node: Object) {
+ this.print(node.callee, node);
+
+ this.push("(");
+
+ let isPrettyCall = node._prettyCall && !this.format.retainLines && !this.format.compact;
+
+ let separator;
+ if (isPrettyCall) {
+ separator = ",\n";
+ this.newline();
+ this.indent();
+ }
+
+ this.printList(node.arguments, node, { separator });
+
+ if (isPrettyCall) {
+ this.newline();
+ this.dedent();
+ }
+
+ this.push(")");
+}
+
+function buildYieldAwait(keyword: string) {
+ return function (node: Object) {
+ this.push(keyword);
+
+ if (node.delegate || node.all) {
+ this.push("*");
+ }
+
+ if (node.argument) {
+ this.push(" ");
+ let terminatorState = this.startTerminatorless();
+ this.print(node.argument, node);
+ this.endTerminatorless(terminatorState);
+ }
+ };
+}
+
+export let YieldExpression = buildYieldAwait("yield");
+export let AwaitExpression = buildYieldAwait("await");
+
+export function EmptyStatement() {
+ this.semicolon();
+}
+
+export function ExpressionStatement(node: Object) {
+ this.print(node.expression, node);
+ this.semicolon();
+}
+
+export function AssignmentPattern(node: Object) {
+ this.print(node.left, node);
+ this.push(" = ");
+ this.print(node.right, node);
+}
+
+export function AssignmentExpression(node: Object, parent: Object) {
+ // Somewhere inside a for statement `init` node but doesn't usually
+ // needs a paren except for `in` expressions: `for (a in b ? a : b;;)`
+ let parens = this._inForStatementInit && node.operator === "in" &&
+ !n.needsParens(node, parent);
+
+ if (parens) {
+ this.push("(");
+ }
+
+ this.print(node.left, node);
+
+ let spaces = !this.format.compact || node.operator === "in" || node.operator === "instanceof";
+ spaces = true; // todo: https://github.com/babel/babel/issues/1835
+ if (spaces) this.push(" ");
+
+ this.push(node.operator);
+
+ if (!spaces) {
+ // space is mandatory to avoid outputting 0) {
+ try {
+ if (n === 3) {
+ raise(error);
+ }
+ } finally {
+ yield n;
+ }
+ }
+ }
+
+ check(outer(3), [0, 2, 1, 0, 1, 4]);
+ check(outer(5), [0, 4, 3, "thrown", 4]);
+ });
+
+ it("should dispatch .thrown exceptions correctly", function() {
+ var count = 0;
+
+ function *gen() {
+ yield* inner();
+ try {
+ yield* inner();
+ } catch (err) {
+ // pass
+ }
+ return yield* inner();
+ }
+
+ function *inner() {
+ return yield count++;
+ }
+
+ var g = gen();
+
+ assert.deepEqual(g.next(), {
+ value: 0,
+ done: false
+ });
+
+ assert.deepEqual(g.next(), {
+ value: 1,
+ done: false
+ });
+
+ assert.deepEqual(g.throw(new Error("lol")), {
+ value: 2,
+ done: false,
+ });
+
+ assert.deepEqual(g.next("sent"), {
+ value: "sent",
+ done: true
+ });
+ });
+
+ it("should call .return methods of delegate iterators", function() {
+ var throwee = new Error("argument to gen.throw");
+ var thrownFromThrow = new Error("thrown from throw method");
+ var thrownFromReturn = new Error("thrown from return method");
+
+ function *gen(delegate) {
+ try {
+ return yield* delegate;
+ } catch (err) {
+ return err;
+ }
+ }
+
+ function check(throwMethod, returnMethod) {
+ var throwCalled = false;
+ var returnCalled = false;
+ var count = 0;
+ var iterator = {
+ next: function() {
+ return { value: count++, done: false };
+ }
+ };
+
+ iterator[iteratorSymbol] = function() {
+ return this;
+ };
+
+ if (throwMethod) {
+ iterator["throw"] = function() {
+ throwCalled = true;
+ return throwMethod.apply(this, arguments);
+ };
+ }
+
+ if (returnMethod) {
+ iterator["return"] = function() {
+ returnCalled = true;
+ return returnMethod.apply(this, arguments);
+ };
+ }
+
+ var g = gen(iterator);
+
+ assert.deepEqual(g.next(), { value: 0, done: false });
+ assert.deepEqual(g.next(), { value: 1, done: false });
+ assert.deepEqual(g.next(), { value: 2, done: false });
+ assert.deepEqual(g.next(), { value: 3, done: false });
+
+ assert.strictEqual(throwCalled, false);
+ assert.strictEqual(returnCalled, false);
+
+ var result = {};
+
+ result.throwResult = g.throw(throwee);
+ result.throwCalled = throwCalled;
+ result.returnCalled = returnCalled;
+
+ return result;
+ }
+
+ var checkResult = check(undefined, function() {
+ throw thrownFromReturn;
+ });
+ if (runningInTranslation) {
+ // BUG: Node v0.11 and v0.12 neglect to call .return here.
+ assert.strictEqual(checkResult.throwResult.value, thrownFromReturn);
+ } else {
+ // This is the TypeError that results from trying to call the
+ // undefined .throw method of the iterator.
+ assert.ok(checkResult.throwResult.value instanceof TypeError);
+ }
+ assert.strictEqual(checkResult.throwResult.done, true);
+ assert.strictEqual(checkResult.throwCalled, false);
+ // BUG: Node v0.11 and v0.12 neglect to call .return here.
+ assert.strictEqual(checkResult.returnCalled, runningInTranslation);
+
+ checkResult = check(undefined, function() {
+ return { value: "from return", done: true };
+ });
+ assert.notStrictEqual(checkResult.throwResult.value, throwee);
+ // This is the TypeError that results from trying to call the
+ // undefined .throw method of the iterator.
+ assert.ok(checkResult.throwResult.value instanceof TypeError);
+ assert.strictEqual(checkResult.throwResult.done, true);
+ assert.strictEqual(checkResult.throwCalled, false);
+ // BUG: Node v0.11 and v0.12 neglect to call .return here.
+ assert.strictEqual(checkResult.returnCalled, runningInTranslation);
+
+ var checkResult = check(function(thrown) {
+ return { value: "from throw", done: true };
+ }, function() {
+ throw thrownFromReturn;
+ });
+ assert.strictEqual(checkResult.throwResult.value, "from throw");
+ assert.strictEqual(checkResult.throwResult.done, true);
+ assert.strictEqual(checkResult.throwCalled, true);
+ assert.strictEqual(checkResult.returnCalled, false);
+
+ var checkResult = check(function(thrown) {
+ throw thrownFromThrow;
+ }, function() {
+ throw thrownFromReturn;
+ });
+ assert.strictEqual(checkResult.throwResult.value, thrownFromThrow);
+ assert.strictEqual(checkResult.throwResult.done, true);
+ assert.strictEqual(checkResult.throwCalled, true);
+ assert.strictEqual(checkResult.returnCalled, false);
+
+ var checkResult = check(undefined, undefined);
+ assert.notStrictEqual(checkResult.throwResult.value, throwee);
+ // This is the TypeError that results from trying to call the
+ // undefined .throw method of the iterator.
+ assert.ok(checkResult.throwResult.value instanceof TypeError);
+ assert.strictEqual(checkResult.throwResult.done, true);
+ assert.strictEqual(checkResult.throwCalled, false);
+ assert.strictEqual(checkResult.returnCalled, false);
+ });
+
+ it("should not be required to have a .return method", function() {
+ function *gen(delegate) {
+ return yield* delegate;
+ }
+
+ var inner = range(5);
+ var iterator = { next: inner.next.bind(inner) };
+ iterator[iteratorSymbol] = function() {
+ return this;
+ };
+
+ var g = gen(iterator);
+ assert.deepEqual(g.next(), { value: 0, done: false });
+ assert.deepEqual(g.next(), { value: 1, done: false });
+ assert.deepEqual(g.next(), { value: 2, done: false });
+
+ if (typeof g.return === "function") {
+ assert.deepEqual(g.return(-1), { value: -1, done: true });
+ assert.deepEqual(g.next(), { value: void 0, done: true });
+ }
+ });
+
+ (runningInTranslation ? it : xit)
+ ("should support any iterable argument", function() {
+ function *gen() {
+ yield 0;
+ yield* [
+ yield "one",
+ yield "two",
+ yield "three"
+ ];
+ yield 5;
+ }
+
+ check(gen(), [0, "one", "two", "three", 2, 3, 4, 5]);
+
+ function *string() {
+ return yield* "asdf";
+ }
+
+ check(string(), ["a", "s", "d", "f"]);
+ });
+
+ it("should evaluate to the return value of the delegate", function() {
+ function *inner() {
+ yield 1;
+ return 2;
+ }
+
+ function *outer(delegate) {
+ return yield* delegate;
+ }
+
+ check(outer(inner()), [1], 2);
+
+ var arrayDelegate = [3, 4];
+ if (!runningInTranslation) {
+ // Node v0.11 doesn't know how to turn arrays into iterators over
+ // their elements without a little help.
+ arrayDelegate = regeneratorRuntime.values(arrayDelegate);
+ }
+ check(outer(arrayDelegate), [3, 4], void 0); // See issue #143.
+
+ if (!runningInTranslation) {
+ return;
+ }
+
+ check(outer({
+ next: function() {
+ return { value: "oyez", done: true };
+ }
+ }), [], "oyez");
+ });
+
+ it("should work as a subexpression", function() {
+ function *inner(arg) {
+ return arg;
+ }
+
+ function *gen(delegate) {
+ // Unfortunately these parentheses appear to be necessary.
+ return 1 + (yield* delegate);
+ }
+
+ check(gen(inner(2)), [], 3);
+ check(gen(inner(3)), [], 4);
+
+ if (!runningInTranslation) {
+ return;
+ }
+
+ check(gen({
+ next: function() {
+ return { value: "foo", done: true };
+ }
+ }), [], "1foo");
+ });
+});
+
+describe("function declaration hoisting", function() {
+ it("should work even if the declarations are out of order", function() {
+ function *gen(n) {
+ yield increment(n);
+
+ function increment(x) {
+ return x + 1;
+ }
+
+ if (n % 2) {
+ yield halve(decrement(n));
+
+ function halve(x) {
+ return x >> 1;
+ }
+
+ function decrement(x) {
+ return x - 1;
+ }
+ } else {
+ // The behavior of function declarations nested inside conditional
+ // blocks is notoriously underspecified, and in V8 it appears the
+ // halve function is still defined when we take this branch, so
+ // "undefine" it for consistency with regenerator semantics.
+ halve = void 0;
+ }
+
+ yield typeof halve;
+
+ yield increment(increment(n));
+ }
+
+ check(gen(3), [4, 1, "function", 5]);
+ check(gen(4), [5, "undefined", 6]);
+ });
+
+ it("should work for nested generator function declarations", function() {
+ function *outer(n) {
+ yield 0;
+ assert.ok(regeneratorRuntime.isGeneratorFunction(inner));
+ return yield* inner(n);
+
+ // Note that this function declaration comes after everything else
+ // in the outer function, but needs to be fully available above.
+ function *inner(n) {
+ yield n - 1;
+ yield n;
+ return yield n + 1;
+ }
+ }
+
+ check(outer(2), [0, 1, 2, 3], 4);
+ });
+
+ it("should not interfere with function rebinding", function() {
+ function rebindTo(value) {
+ var oldValue = toBeRebound;
+ toBeRebound = value;
+ return oldValue;
+ }
+
+ function *toBeRebound() {
+ var originalValue = toBeRebound;
+ yield toBeRebound;
+ assert.strictEqual(rebindTo(42), originalValue);
+ yield toBeRebound;
+ assert.strictEqual(rebindTo("asdf"), 42);
+ yield toBeRebound;
+ }
+
+ var original = toBeRebound;
+ check(toBeRebound(), [original, 42, "asdf"]);
+
+ function attemptToRebind(value) {
+ var oldValue = safe;
+ safe = value;
+ return oldValue;
+ }
+
+ var safe = function *safe() {
+ var originalValue = safe;
+ yield safe;
+ assert.strictEqual(attemptToRebind(42), originalValue);
+ yield safe;
+ assert.strictEqual(attemptToRebind("asdf"), 42);
+ yield safe;
+ }
+
+ original = safe;
+ check(safe(), [safe, safe, safe]);
+ });
+});
+
+describe("the arguments object", function() {
+ it("should work in simple variadic functions", function() {
+ function *sum() {
+ var result = 0;
+
+ for (var i = 0; i < arguments.length; ++i) {
+ yield result += arguments[i];
+ }
+
+ return result;
+ }
+
+ check(sum(1, 2, 3), [1, 3, 6], 6);
+ check(sum(9, -5, 3, 0, 2), [9, 4, 7, 7, 9], 9);
+ });
+
+ it("should alias function parameters", function() {
+ function *gen(x, y) {
+ yield x;
+ ++arguments[0];
+ yield x;
+
+ yield y;
+ --arguments[1];
+ yield y;
+
+ var temp = y;
+ y = x;
+ x = temp;
+
+ yield x;
+ yield y;
+ }
+
+ check(gen(3, 7), [3, 4, 7, 6, 6, 4]);
+ check(gen(10, -5), [10, 11, -5, -6, -6, 11]);
+ });
+
+ it("should be shadowable by explicit declarations", function() {
+ function *asParameter(x, arguments) {
+ arguments = arguments + 1;
+ yield x + arguments;
+ }
+
+ check(asParameter(4, 5), [10]);
+ check(asParameter("asdf", "zxcv"), ["asdfzxcv1"]);
+
+ function *asVariable(x) {
+ // TODO References to arguments before the variable declaration
+ // seem to see the object instead of the undefined value.
+ var arguments = x + 1;
+ yield arguments;
+ }
+
+ check(asVariable(4), [5]);
+ check(asVariable("asdf"), ["asdf1"]);
+ });
+
+ it("should not get confused by properties", function() {
+ function *gen(args) {
+ var obj = { arguments: args };
+ yield obj.arguments;
+ obj.arguments = "oyez";
+ yield obj;
+ }
+
+ check(gen(42), [42, { arguments: "oyez" }]);
+ });
+
+ it("supports .callee", function() {
+ function *gen(doYield) {
+ yield 1;
+ if (doYield) {
+ yield 2;
+ } else {
+ yield 3
+ yield* arguments.callee(true);
+ yield 4
+ }
+ yield 5;
+ }
+
+ check(gen(false), [1, 3, 1, 2, 5, 4, 5]);
+ });
+});
+
+describe("catch parameter shadowing", function() {
+ it("should leave outer variables unmodified", function() {
+ function *gen(x) {
+ var y = x + 1;
+ try {
+ throw x + 2;
+ } catch (x) {
+ yield x;
+ x += 1;
+ yield x;
+ }
+ yield x;
+ try {
+ throw x + 3;
+ } catch (y) {
+ yield y;
+ y *= 2;
+ yield y;
+ }
+ yield y;
+ }
+
+ check(gen(1), [3, 4, 1, 4, 8, 2]);
+ check(gen(2), [4, 5, 2, 5, 10, 3]);
+ });
+
+ it("should not replace variables defined in inner scopes", function() {
+ function *gen(x) {
+ try {
+ throw x;
+ } catch (x) {
+ yield x;
+
+ yield (function(x) {
+ return x += 1;
+ }(x + 1));
+
+ yield (function() {
+ var x = arguments[0];
+ return x * 2;
+ }(x + 2));
+
+ yield (function() {
+ function notCalled(x) {
+ throw x;
+ }
+
+ x >>= 1;
+ return x;
+ }());
+
+ yield x -= 1;
+ }
+
+ yield x;
+ }
+
+ check(gen(10), [10, 12, 24, 5, 4, 10]);
+ check(gen(11), [11, 13, 26, 5, 4, 11]);
+ });
+
+ it("should allow nested catch parameters of the same name", function() {
+ function *gen() {
+ try {
+ raise("e1");
+ } catch (e) {
+ yield e;
+ try {
+ raise("e2");
+ } catch (e) {
+ yield e;
+ }
+ yield e;
+ }
+ }
+
+ check(gen(), ["e1", "e2", "e1"]);
+ });
+
+ it("should not interfere with non-referential identifiers", function() {
+ function *gen() {
+ try {
+ yield 1;
+ raise(new Error("oyez"));
+ yield 2;
+ } catch (e) {
+ yield 3;
+ e.e = "e.e";
+ e[e.message] = "e.oyez";
+ return {
+ e: e,
+ identity: function(x) {
+ var e = x;
+ return e;
+ }
+ };
+ }
+ yield 4;
+ }
+
+ var g = gen();
+ assert.deepEqual(g.next(), { value: 1, done: false });
+ assert.deepEqual(g.next(), { value: 3, done: false });
+
+ var info = g.next();
+ assert.strictEqual(info.done, true);
+ assert.strictEqual(info.value.e.message, "oyez");
+ assert.strictEqual(info.value.e.e, "e.e");
+ assert.strictEqual(info.value.e.oyez, "e.oyez");
+ assert.strictEqual(info.value.identity("same"), "same");
+ });
+});
+
+describe("empty while loops", function() {
+ it("should be preserved in generated code", function() {
+ function *gen(x) {
+ while (x) {
+ // empty while loop
+ }
+
+ do {
+ // empty do-while loop
+ } while (x);
+
+ return gen.toString();
+ }
+
+ var info = gen(false).next();
+ assert.strictEqual(info.done, true);
+ assert.ok(/empty while loop/.test(info.value));
+ assert.ok(/empty do-while loop/.test(info.value));
+ });
+});
+
+describe("object literals with multiple yields", function() {
+ it("should receive different sent values", function() {
+ function *gen(fn) {
+ return {
+ a: yield "a",
+ b: yield "b",
+ c: fn(yield "c", yield "d"),
+ d: [yield "e", yield "f"]
+ };
+ }
+
+ check(gen(function sum(x, y) {
+ return x + y;
+ }), ["a", "b", "c", "d", "e", "f"], {
+ a: 1,
+ b: 2,
+ c: 3 + 4,
+ d: [5, 6]
+ });
+ });
+});
+
+describe("generator .throw method", function() {
+ (runningInTranslation ? it : xit)("should complete generator", function() {
+ function *gen(x) {
+ yield 2;
+ throw 1;
+ }
+
+ var u = gen();
+
+ u.next();
+
+ try {
+ u.throw(2);
+ } catch (err) {
+ assert.strictEqual(err, 2);
+ }
+
+ assertAlreadyFinished(u);
+ });
+
+ it("should work after the final call to .next", function() {
+ function *gen() {
+ yield 1;
+ }
+
+ var g = gen();
+ assert.deepEqual(g.next(), { value: 1, done: false });
+
+ var exception = new Error("unhandled exception");
+ try {
+ g.throw(exception);
+ assert.ok(false, "should have thrown an exception");
+ } catch (err) {
+ assert.strictEqual(err, exception);
+ }
+ });
+
+ it("should immediately complete a new-born generator", function() {
+ var began = false;
+
+ function *gen() {
+ began = true;
+ yield 1;
+ }
+
+ var g = gen();
+ var exception = new Error("unhandled exception");
+ try {
+ g.throw(exception);
+ assert.ok(false, "should have thrown an exception");
+ } catch (err) {
+ assert.strictEqual(err, exception);
+ assert.strictEqual(began, false);
+ }
+ });
+
+ it("should not propagate errors handled inside a delegate", function() {
+ function *outer() {
+ try {
+ yield* inner();
+ } catch (err) {
+ return -1;
+ }
+ return 1;
+ }
+
+ function *inner() {
+ try {
+ yield void 0;
+ } catch (e) {
+ return;
+ }
+ }
+
+ var g = outer();
+ g.next();
+ assert.equal(g.throw(new Error('foo')).value, 1);
+ });
+
+ it("should propagate errors unhandled inside a delegate", function() {
+ function *outer() {
+ try {
+ yield* inner();
+ } catch (err) {
+ return -1;
+ }
+ return 1;
+ }
+
+ function *inner() {
+ yield void 0;
+ }
+
+ var g = outer();
+ g.next();
+ assert.equal(g.throw(new Error('foo')).value, -1);
+ });
+});
+
+describe("unqualified function calls", function() {
+ it("should have a global `this` object", function() {
+ function getThis() {
+ return this;
+ }
+
+ // This is almost certainly the global object, but there's a chance it
+ // might be null or undefined (in strict mode).
+ var unqualifiedThis = getThis();
+
+ function *invoke() {
+ // It seems like a bug in the ES6 spec that we have to yield an
+ // argument instead of just calling (yield)().
+ return (yield "dummy")();
+ }
+
+ var g = invoke();
+ var info = g.next();
+
+ assert.deepEqual(info, { value: "dummy", done: false });
+
+ info = g.next(getThis);
+
+ // Avoid using assert.strictEqual when the arguments might equal the
+ // global object, since JSON.stringify chokes on circular structures.
+ assert.ok(info.value === unqualifiedThis);
+
+ assert.strictEqual(info.done, true);
+ });
+});
+
+describe("yield* expression results", function () {
+ it("have correct values", function () {
+ function* foo() {
+ yield 0;
+ return yield* bar();
+ }
+
+ function* bar() {
+ yield 1;
+ return 2;
+ }
+
+ check(foo(), [0, 1], 2);
+ });
+
+ it("can be used in complex expressions", function () {
+ function pumpNumber(gen) {
+ var n = 0;
+
+ while (true) {
+ var res = n > 0 ? gen.next(n) : gen.next();
+ n = res.value;
+ if (res.done) {
+ return n;
+ }
+ }
+ }
+
+ function* foo() {
+ return (yield* bar()) + (yield* bar());
+ }
+
+ function* bar() {
+ return (yield 2) + (yield 3);
+ }
+
+ assert.strictEqual(pumpNumber(bar()), 5);
+ assert.strictEqual(pumpNumber(foo()), 10);
+ });
+});
+
+describe("isGeneratorFunction", function() {
+ it("should work for function declarations", function() {
+ // Do the assertions up here to make sure the generator function is
+ // marked at the beginning of the block the function is declared in.
+ assert.strictEqual(
+ regeneratorRuntime.isGeneratorFunction(genFun),
+ true
+ );
+
+ assert.strictEqual(
+ regeneratorRuntime.isGeneratorFunction(normalFun),
+ false
+ );
+
+ function normalFun() {
+ return 0;
+ }
+
+ function *genFun() {
+ yield 0;
+ }
+ });
+
+ it("should work for function expressions", function() {
+ assert.strictEqual(
+ regeneratorRuntime.isGeneratorFunction(function *genFun() {
+ yield 0;
+ }),
+ true
+ );
+
+ assert.strictEqual(
+ regeneratorRuntime.isGeneratorFunction(function normalFun() {
+ return 0;
+ }),
+ false
+ );
+ });
+});
+
+describe("new expressions", function() {
+ it("should be able to contain yield sub-expressions", function() {
+ function A(first, second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ function *gen() {
+ return yield new (yield 0)(yield 1, yield 2);
+ }
+
+ var g = gen();
+
+ assert.deepEqual(g.next(), { value: 0, done: false });
+ assert.deepEqual(g.next(A), { value: 1, done: false });
+ assert.deepEqual(g.next("asdf"), { value: 2, done: false });
+
+ var info = g.next("zxcv");
+ assert.strictEqual(info.done, false);
+ assert.ok(info.value instanceof A);
+ assert.strictEqual(info.value.first, "asdf");
+ assert.strictEqual(info.value.second, "zxcv");
+
+ assert.deepEqual(g.next("qwer"), { value: "qwer", done: true });
+ });
+});
+
+describe("block binding", function() {
+ it("should translate block binding correctly", function() {
+ "use strict";
+
+ function *gen() {
+ var a$0 = 0, a$1 = 1;
+
+ let a = 3;
+
+ {
+ let a = 1;
+ yield a + a$0;
+ }
+
+ {
+ let a = 2;
+ yield a - 1 + a$1;
+ }
+
+ yield a;
+ }
+
+ var g = gen();
+
+ assert.deepEqual(g.next(), { value: 1, done: false });
+ assert.deepEqual(g.next(), { value: 2, done: false });
+ assert.deepEqual(g.next(), { value: 3, done: false });
+ assert.deepEqual(g.next(), { value: void 0, done: true });
+ });
+
+ it("should translate block binding with iife correctly", function() {
+ "use strict";
+
+ function *gen() {
+ let arr = [];
+
+ for (let x = 0; x < 3; x++) {
+ let y = x;
+ arr.push(function() { return y; });
+ }
+
+ {
+ let x;
+ while( x = arr.pop() ) {
+ yield x;
+ }
+ }
+ }
+
+ var g = gen();
+
+ assert.equal(g.next().value(), 2);
+ assert.equal(g.next().value(), 1);
+ assert.equal(g.next().value(), 0);
+ assert.deepEqual(g.next(), { value: void 0, done: true });
+ });
+});
+
+describe("newborn generators", function() {
+ it("should be able to yield* non-newborn generators", function() {
+ function *inner() {
+ return [yield 1, yield 2];
+ }
+
+ function *outer(delegate) {
+ return yield* delegate;
+ }
+
+ var n = inner();
+
+ assert.deepEqual(n.next(), {
+ value: 1,
+ done: false
+ });
+
+ var g = outer(n);
+
+ // I would really like to be able to pass 3 to g.next here, but V8
+ // ignores values sent to newborn generators, and SpiderMonkey throws
+ // a TypeError.
+ assert.deepEqual(g.next(), {
+ value: 2,
+ done: false
+ });
+
+ assert.deepEqual(g.next(4), {
+ value: [void 0, 4],
+ done: true
+ });
+ });
+
+ it("should support the ignore-initial-yield wrapper idiom", function() {
+ var markers = [];
+
+ function *inner() {
+ markers.push(0);
+ var sent1 = yield 1;
+ markers.push(2);
+ var sent2 = yield 2;
+ markers.push(3);
+ return [sent1, sent2];
+ }
+
+ function wrapper(delegate) {
+ var gen = (function*() {
+ // This yield is the "initial yield" whose argument we ignore.
+ var sent = yield "ignored", info;
+
+ markers.push(1);
+
+ while (!(info = delegate.next(sent)).done) {
+ sent = yield info.value;
+ }
+
+ markers.push(4);
+
+ return info.value;
+ })();
+
+ // Ensure that gen is not newborn and that the next invocation of
+ // gen.next(value) can send value to the initial yield expression.
+ gen.next();
+
+ return gen;
+ }
+
+ var n = inner();
+
+ assert.deepEqual(n.next(), {
+ value: 1,
+ done: false
+ });
+
+ var g = wrapper(n);
+
+ // Unlike in the previous spec, it's fine to pass 3 to g.next here,
+ // because g is not newborn, because g.next was already called once
+ // before g was returned from the wrapper function.
+ assert.deepEqual(g.next(3), {
+ value: 2,
+ done: false
+ });
+
+ assert.deepEqual(g.next(4), {
+ value: [3, 4],
+ done: true
+ });
+
+ // Ensure we encountered the marker points in the expected order.
+ assert.deepEqual(markers, [0, 1, 2, 3, 4]);
+ });
+
+ it("should allow chaining newborn and non-newborn generators", function() {
+ function *range(n) {
+ for (var i = 0; i < n; ++i) {
+ yield i;
+ }
+ }
+
+ function *chain(a, b) {
+ yield* a;
+ yield* b;
+ }
+
+ check(chain(range(3), range(5)), [0, 1, 2, 0, 1, 2, 3, 4]);
+
+ function *y3(x) {
+ return yield yield yield x;
+ }
+
+ function *y5(x) {
+ return yield yield yield yield yield x;
+ }
+
+ check(
+ chain(y3("foo"), y5("bar")),
+ ["foo", 1, 2, "bar", 4, 5, 6, 7]
+ );
+
+ var g3 = y3("three");
+ assert.deepEqual(g3.next(), {
+ value: "three",
+ done: false
+ });
+
+ var g5 = y5("five");
+ assert.deepEqual(g5.next(), {
+ value: "five",
+ done: false
+ });
+
+ var undef; // A little easier to read than void 0.
+ check(chain(g3, g5), [undef, 1, undef, 3, 4, 5]);
+ });
+});
+
+describe("labeled break and continue statements", function() {
+ it("should be able to exit multiple try statements", function() {
+ var e1 = "first";
+ var e2 = "second";
+ var e3 = "third";
+ var e4 = "fourth";
+
+ function *gen(n, which) {
+ try {
+ yield 0;
+ raise(e1);
+
+ } finally {
+ yield 1;
+
+ loop:
+ for (var i = 0; i < n; ++i) {
+ yield i;
+
+ try {
+ raise(e2);
+ } finally {
+ yield 2;
+
+ try {
+ raise(e3);
+ } finally {
+ yield 3;
+
+ try {
+ raise(e4);
+ } finally {
+ yield 4;
+
+ if (which === "break") {
+ yield "breaking";
+ break loop;
+ }
+
+ if (which === "continue") {
+ yield "continuing";
+ continue loop;
+ }
+
+ yield 5;
+ }
+ }
+ }
+ }
+
+ yield 6;
+ }
+ }
+
+ try {
+ check(gen(1, "break"), [
+ 0, 1, 0, 2, 3, 4, "breaking", 6
+ ]);
+ assert.ok(false, "should have thrown an exception");
+ } catch (err) {
+ assert.strictEqual(err, e1);
+ }
+
+ try {
+ check(gen(3, "continue"), [
+ 0, 1, 0, 2, 3, 4, "continuing",
+ 1, 2, 3, 4, "continuing",
+ 2, 2, 3, 4, "continuing",
+ 6 // Loop finished naturally.
+ ]);
+ assert.ok(false, "should have thrown an exception");
+ } catch (err) {
+ assert.strictEqual(err, e1);
+ }
+
+ try {
+ check(gen(3, "neither"), [
+ 0, 1, 0, 2, 3, 4, 5
+ ]);
+ assert.ok(false, "should have thrown an exception");
+ } catch (err) {
+ assert.strictEqual(err, e4);
+ }
+ });
+
+ it("should allow breaking from any labeled statement", function() {
+ function* gen(limit) {
+ yield 0;
+
+ for (var i = 0; i < limit; ++i) {
+ yield 1;
+
+ label1: {
+ yield 2;
+ break label1;
+ yield 3;
+ }
+
+ label2:
+ if (limit === 3) label3: {
+ yield 4;
+ if (i === 0) break label2;
+ yield 5;
+ if (i === 1) break label3;
+ label4: yield 6;
+ // This should break from the for-loop.
+ if (i === 2) xxx: break;
+ yield 7;
+ }
+
+ // This should be a no-op.
+ xxx: break xxx;
+
+ yield 8
+ }
+
+ yield 9;
+ }
+
+ check(gen(0), [0, 9]);
+ check(gen(1), [0, 1, 2, 8, 9]);
+ check(gen(2), [0, 1, 2, 8, 1, 2, 8, 9]);
+ check(gen(3), [0, 1, 2, 4, 8, 1, 2, 4, 5, 8, 1, 2, 4, 5, 6, 9]);
+ });
+});
+
+describe("for loop with var decl and no update expression", function() {
+ // https://github.com/facebook/regenerator/issues/103
+ function *range() {
+ for (var i = 0; false; ) {
+ }
+ }
+
+ it("should compile and run", function() {
+ check(range(), []);
+ });
+});
+
+describe("generator function prototype", function() {
+ function getProto(obj) {
+ return Object.getPrototypeOf
+ ? Object.getPrototypeOf(obj)
+ : obj.__proto__;
+ }
+
+ it("should follow the expected object model", function() {
+ var GeneratorFunctionPrototype = getProto(f);
+ var GeneratorFunction = GeneratorFunctionPrototype.constructor;
+
+ assert.strictEqual(GeneratorFunction.name, 'GeneratorFunction');
+ assert.strictEqual(GeneratorFunction.prototype,
+ GeneratorFunctionPrototype);
+ assert.strictEqual(GeneratorFunctionPrototype.prototype.constructor,
+ GeneratorFunctionPrototype);
+ assert.strictEqual(GeneratorFunctionPrototype.prototype,
+ getProto(f.prototype));
+ assert.strictEqual(getProto(GeneratorFunctionPrototype),
+ Function.prototype);
+
+ if (typeof process === "undefined" ||
+ process.version.slice(1, 3) === "0.") {
+ // Node version strings start with 0.
+ assert.strictEqual(GeneratorFunctionPrototype.name,
+ "GeneratorFunctionPrototype");
+ } else if (process.version.slice(1, 3) === "1.") {
+ // iojs version strings start with 1., and iojs gets this .name
+ // property wrong. TODO report this?
+ assert.strictEqual(GeneratorFunctionPrototype.name, "");
+ }
+
+ assert.strictEqual(typeof f2, "function");
+ assert.strictEqual(f2.constructor, GeneratorFunction);
+ assert.ok(f2 instanceof GeneratorFunction);
+ assert.strictEqual(f2.name, "f2");
+
+ var g = f();
+ assert.ok(g instanceof f);
+ assert.strictEqual(getProto(g), f.prototype);
+
+ assert.deepEqual([], Object.getOwnPropertyNames(f.prototype));
+ // assert.deepEqual([], Object.getOwnPropertyNames(g));
+
+ f.prototype.x = 42;
+
+ var g2 = f();
+ assert.strictEqual(g2.x, 42);
+
+ var g3 = new f();
+ assert.strictEqual(g3.x, 42);
+
+ function* f2() {
+ yield 1;
+ }
+
+ assert.strictEqual(getProto(f), getProto(f2));
+ assert.strictEqual(f.hasOwnProperty('constructor'), false);
+ assert.strictEqual(getProto(f).constructor.name, 'GeneratorFunction');
+
+ // Intentionally at the end to test hoisting.
+ function* f() {
+ yield this;
+ }
+
+ function* f() {
+ yield 1;
+ }
+
+ var f2 = f;
+ f = 42;
+ var g = f2();
+
+ assert.deepEqual(g.next(), { value: 1, done: false });
+ assert.deepEqual(g.next(), { value: void 0, done: true });
+ assert.ok(g instanceof f2);
+ });
+});
+
+describe("for-of loops", function() {
+ (runningInTranslation ? it : xit)
+ ("should work for Arrays", function() {
+ var sum = 0;
+ for (var x of [1, 2].concat(3)) {
+ sum += x;
+ }
+ assert.strictEqual(sum, 6);
+ });
+
+ it("should work for generators", function() {
+ var value, values = [];
+ for (value of range(3))
+ values.push(value);
+ assert.deepEqual(values, [0, 1, 2]);
+ });
+
+ it("should work inside of generators", function() {
+ function *yieldPermutations(list) {
+ if (list.length < 2) {
+ yield list;
+ return 1;
+ }
+
+ var count = 0;
+ var first = list.slice(0, 1);
+ var genRest = yieldPermutations(list.slice(1));
+
+ for (var perm of genRest) {
+ for (var i = 0; i < list.length; ++i) {
+ var prefix = perm.slice(0, i);
+ var suffix = perm.slice(i);
+ yield prefix.concat(first, suffix);
+ }
+
+ count += i;
+ }
+
+ return count;
+ }
+
+ var count = 0;
+ for (var perm of yieldPermutations([])) {
+ assert.deepEqual(perm, []);
+ ++count;
+ }
+ assert.strictEqual(count, 1);
+
+ check(yieldPermutations([1]), [[1]], 1);
+
+ check(yieldPermutations([2, 1]), [
+ [2, 1],
+ [1, 2]
+ ], 2);
+
+ check(yieldPermutations([1,3,2]), [
+ [1, 3, 2],
+ [3, 1, 2],
+ [3, 2, 1],
+ [1, 2, 3],
+ [2, 1, 3],
+ [2, 3, 1]
+ ], 6);
+ });
+});
+
+describe("generator return method", function() {
+ if (!runningInTranslation) {
+ // The return method has not been specified or implemented natively,
+ // yet, so these tests need only pass in translation.
+ return;
+ }
+
+ it("should work with newborn generators", function() {
+ function *gen() {
+ yield 0;
+ }
+
+ var g = gen();
+
+ assert.deepEqual(g.return("argument"), {
+ value: "argument",
+ done: true
+ });
+
+ assertAlreadyFinished(g);
+ });
+
+ it("should behave as if generator actually returned", function() {
+ var executedFinally = false;
+
+ function *gen() {
+ try {
+ yield 0;
+ } catch (err) {
+ assert.ok(false, "should not have executed the catch handler");
+ } finally {
+ executedFinally = true;
+ }
+ }
+
+ var g = gen();
+ assert.deepEqual(g.next(), { value: 0, done: false });
+
+ assert.deepEqual(g.return("argument"), {
+ value: "argument",
+ done: true
+ });
+
+ assert.strictEqual(executedFinally, true);
+ assertAlreadyFinished(g);
+ });
+
+ it("should return both delegate and delegator", function() {
+ var checkpoints = [];
+
+ function* callee(errorToThrow) {
+ try {
+ yield 1;
+ yield 2;
+ } finally {
+ checkpoints.push("callee finally");
+ if (errorToThrow) {
+ throw errorToThrow;
+ }
+ }
+ }
+
+ function* caller(errorToThrow) {
+ try {
+ yield 0;
+ yield* callee(errorToThrow);
+ yield 3;
+ } finally {
+ checkpoints.push("caller finally");
+ }
+ }
+
+ var g1 = caller();
+
+ assert.deepEqual(g1.next(), { value: 0, done: false });
+ assert.deepEqual(g1.next(), { value: 1, done: false });
+ assert.deepEqual(g1.return(-1), { value: -1, done: true });
+ assert.deepEqual(checkpoints, [
+ "callee finally",
+ "caller finally"
+ ]);
+
+ var error = new Error("thrown from callee");
+ var g2 = caller(error);
+
+ assert.deepEqual(g2.next(), { value: 0, done: false });
+ assert.deepEqual(g2.next(), { value: 1, done: false });
+
+ try {
+ g2.return(-1);
+ assert.ok(false, "should have thrown an exception");
+ } catch (thrown) {
+ assert.strictEqual(thrown, error);
+ }
+
+ assert.deepEqual(checkpoints, [
+ "callee finally",
+ "caller finally",
+ "callee finally",
+ "caller finally"
+ ]);
+ });
+});
+
+describe("expressions containing yield subexpressions", function() {
+ it("should evaluate all subexpressions before yielding", function() {
+ function *gen(x) {
+ return x * (yield (function(y) { x = y }));
+ }
+
+ var g = gen(2);
+ var result = g.next();
+ assert.strictEqual(result.done, false);
+
+ result.value(5);
+
+ assert.deepEqual(g.next(5), {
+ value: 10,
+ done: true
+ });
+ });
+
+ it("should work even with getter member expressions", function() {
+ function *gen() {
+ return a.b + (yield "asdf");
+ }
+
+ var a = {};
+ var b = 0;
+
+ Object.defineProperty(a, "b", {
+ get: function() {
+ return ++b;
+ }
+ });
+
+ var g = gen();
+
+ assert.strictEqual(a.b, 1);
+
+ assert.deepEqual(g.next(), {
+ value: "asdf",
+ done: false
+ });
+
+ assert.strictEqual(a.b, 3);
+
+ assert.deepEqual(g.next(2), {
+ value: 4,
+ done: true
+ });
+ });
+
+ it("should evaluate all array elements before yielding", function() {
+ function *gen() {
+ return [a, yield "asdf", a];
+ }
+
+ var a = 1;
+ var g = gen();
+
+ assert.deepEqual(g.next(), {
+ value: "asdf",
+ done: false
+ });
+
+ a = 3;
+
+ assert.deepEqual(g.next(2), {
+ value: [1, 2, 3],
+ done: true
+ });
+ });
+
+ it("should handle callee member expressions correctly", function() {
+ function *gen() {
+ a = a.slice(0).concat(yield "asdf");
+ return a;
+ }
+
+ var a = [];
+ var g = gen();
+
+ assert.deepEqual(g.next(), {
+ value: "asdf",
+ done: false
+ });
+
+ a.push(1);
+
+ assert.deepEqual(g.next(2), {
+ value: [2],
+ done: true
+ });
+ });
+
+ it("should handle implicit stringification correctly", function() {
+ function *gen() {
+ return a + (yield "asdf");
+ }
+
+ var a = [1, 2];
+ var g = gen();
+
+ assert.deepEqual(g.next(), {
+ value: "asdf",
+ done: false
+ });
+
+ a = [4,5];
+
+ assert.deepEqual(g.next(",3"), {
+ value: "1,2,3",
+ done: true
+ });
+ });
+});
diff --git a/packages/babel-plugin-transform-regenerator/.test/tests.transform.js b/packages/babel-plugin-transform-regenerator/.test/tests.transform.js
new file mode 100644
index 0000000000..e67e1d9569
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/.test/tests.transform.js
@@ -0,0 +1,47 @@
+var regenerator = require("..");
+var babylon = require("babylon");
+var assert = require("assert");
+var babel = require("babel-core");
+var t = require("babel-types");
+
+describe("_blockHoist nodes", function() {
+ it("should be hoisted to the outer body", function() {
+ var foo;
+ var names = [];
+ var ast = babylon.parse([
+ "function *foo(doNotHoistMe, hoistMe) {",
+ " var sent = yield doNotHoistMe();",
+ " hoistMe();",
+ " names.push(sent);",
+ " return 123;",
+ "}"
+ ].join("\n"));
+
+ var hoistMeStmt = ast.program.body[0].body.body[1];
+ t.assertExpressionStatement(hoistMeStmt);
+ t.assertCallExpression(hoistMeStmt.expression);
+ t.assertIdentifier(hoistMeStmt.expression.callee);
+ assert.strictEqual(hoistMeStmt.expression.callee.name, "hoistMe");
+
+ hoistMeStmt._blockHoist = 1;
+
+ eval(babel.transformFromAst(ast, null, { plugins: [regenerator] }).code);
+
+ assert.strictEqual(typeof foo, "function");
+ assert.ok(regeneratorRuntime.isGeneratorFunction(foo));
+ assert.strictEqual(names.length, 0);
+
+ var g = foo(function doNotHoistMe() {
+ names.push("doNotHoistMe");
+ return "yielded";
+ }, function hoistMe() {
+ names.push("hoistMe");
+ });
+
+ assert.deepEqual(names, ["hoistMe"]);
+ assert.deepEqual(g.next(), { value: "yielded", done: false });
+ assert.deepEqual(names, ["hoistMe", "doNotHoistMe"]);
+ assert.deepEqual(g.next("oyez"), { value: 123, done: true });
+ assert.deepEqual(names, ["hoistMe", "doNotHoistMe", "oyez"]);
+ });
+});
diff --git a/packages/babel-plugin-transform-regenerator/.travis.yml b/packages/babel-plugin-transform-regenerator/.travis.yml
new file mode 100644
index 0000000000..928d48bb5c
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/.travis.yml
@@ -0,0 +1,11 @@
+language: node_js
+node_js:
+ - "4.0"
+ - "iojs"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.8"
+before_install:
+ - npm install -g npm@1.4.28
+sudo: false
diff --git a/packages/babel-plugin-transform-regenerator/CONTRIBUTING.md b/packages/babel-plugin-transform-regenerator/CONTRIBUTING.md
new file mode 100644
index 0000000000..a4ad349e65
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/CONTRIBUTING.md
@@ -0,0 +1,80 @@
+# Contributing to Regenerator
+
+Regenerator uses GitHub as its sole source of truth. Everything happens
+here. Facebook employees who contribute to Regenerator are expected to do
+so in the same way as everyone else. In other words, this document applies
+equally to all contributors.
+
+### `master` is unsafe
+
+We will do our best to keep `master` in good shape, with tests passing at
+all times. But in order to move fast, we will make API changes that your
+application might not be compatible with. We will do our best to
+communicate these changes and always version appropriately so you can lock
+into a specific version if need be.
+
+### Pull Requests
+
+In case you've never submitted a pull request (PR) via GitHub before,
+please read [this short
+tutorial](https://help.github.com/articles/creating-a-pull-request). If
+you've submitted a PR before, there should be nothing surprising about our
+procedures for Regenerator.
+
+*Before* submitting a pull request, please make sure the following is done…
+
+1. Fork the repo and create your branch from `master`.
+2. If you've added code that should be tested, add tests!
+3. Ensure the test suite passes (`npm test`).
+4. If you haven't already, complete the CLA.
+5. Submit a pull request via GitHub.
+6. Check that Travis CI tests pass (pull request turns green).
+
+### Contributor License Agreement ("CLA")
+
+In order to accept your pull request, we need you to submit a CLA. You
+only need to do this once, so if you've done this for another Facebook
+open source project, you're good to go. If you are submitting a pull
+request for the first time, just let us know that you have completed the
+CLA and we can cross-check with your GitHub username.
+
+Complete your CLA here:
+
+## Bugs
+
+### Where to Find Known Issues
+
+We will be using GitHub Issues for all bugs. Before filing a new issue,
+please try to make sure your problem doesn't already exist. If you think
+your issue is more general than one that already exists, our preference is
+still to modify the original issue to reflect the underlying problem more
+faithfully.
+
+### Reporting New Issues
+
+The best way to get a bug fixed is to provide a reduced test case, and the
+easiest way to reduce a testcase is to edit it in [the
+sandbox](http://facebook.github.io/regenerator/) until you're satisfied
+and then click the "report a bug" link (the new issue will be populated
+automatically with your code).
+
+### Security Bugs
+
+Facebook has a [bounty program](https://www.facebook.com/whitehat/) for
+the safe disclosure of security bugs. With that in mind, please do not
+file public issues and go through the process outlined on that page.
+
+## Coding Style
+
+* Use semicolons;
+* Commas last,
+* 2 spaces for indentation (no tabs).
+* Prefer `"` over `'`
+* 80 character line length
+* Match surrounding coding style.
+* Less code is better code.
+
+## License
+
+By contributing to Regenerator, you agree that your contributions will be
+licensed under the [BSD License](LICENSE).
diff --git a/packages/babel-plugin-transform-regenerator/LICENSE b/packages/babel-plugin-transform-regenerator/LICENSE
new file mode 100644
index 0000000000..187bfe283d
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/LICENSE
@@ -0,0 +1,14 @@
+BSD License
+
+For "regenerator" software
+
+Copyright (c) 2014, Facebook, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packages/babel-plugin-transform-regenerator/PATENTS b/packages/babel-plugin-transform-regenerator/PATENTS
new file mode 100644
index 0000000000..a2bd67d0db
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/PATENTS
@@ -0,0 +1,33 @@
+Additional Grant of Patent Rights Version 2
+
+"Software" means the Regenerator software distributed by Facebook, Inc.
+
+Facebook, Inc. ("Facebook") hereby grants to each recipient of the Software
+("you") a perpetual, worldwide, royalty-free, non-exclusive, irrevocable
+(subject to the termination provision below) license under any Necessary
+Claims, to make, have made, use, sell, offer to sell, import, and otherwise
+transfer the Software. For avoidance of doubt, no license is granted under
+Facebook's rights in any patent claims that are infringed by (i) modifications
+to the Software made by you or any third party or (ii) the Software in
+combination with any software or other technology.
+
+The license granted hereunder will terminate, automatically and without notice,
+if you (or any of your subsidiaries, corporate affiliates or agents) initiate
+directly or indirectly, or take a direct financial interest in, any Patent
+Assertion: (i) against Facebook or any of its subsidiaries or corporate
+affiliates, (ii) against any party if such Patent Assertion arises in whole or
+in part from any software, technology, product or service of Facebook or any of
+its subsidiaries or corporate affiliates, or (iii) against any party relating
+to the Software. Notwithstanding the foregoing, if Facebook or any of its
+subsidiaries or corporate affiliates files a lawsuit alleging patent
+infringement against you in the first instance, and you respond by filing a
+patent infringement counterclaim in that lawsuit against that party that is
+unrelated to the Software, the license granted hereunder will not terminate
+under section (i) of this paragraph due to such counterclaim.
+
+A "Necessary Claim" is a claim of a patent owned by Facebook that is
+necessarily infringed by the Software standing alone.
+
+A "Patent Assertion" is any lawsuit or other action alleging direct, indirect,
+or contributory infringement or inducement to infringe any patent, including a
+cross-claim or counterclaim.
diff --git a/packages/babel-plugin-transform-regenerator/README.md b/packages/babel-plugin-transform-regenerator/README.md
new file mode 100644
index 0000000000..c220dba788
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/README.md
@@ -0,0 +1,74 @@
+regenerator [](https://travis-ci.org/facebook/regenerator)
+===
+
+This package implements a fully-functional source transformation that
+takes the proposed syntax for generators/`yield` from future versions of
+JS ([ECMAScript6 or ES6](http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts), experimentally implemented in Node.js v0.11) and
+spits out efficient JS-of-today (ES5) that behaves the same way.
+
+A small runtime library (less than 1KB compressed) is required to provide the
+`wrapGenerator` function. You can install it either as a CommonJS module
+or as a standalone .js file, whichever you prefer.
+
+Installation
+---
+
+From NPM:
+```sh
+npm install -g regenerator
+```
+
+From GitHub:
+```sh
+cd path/to/node_modules
+git clone git://github.com/facebook/regenerator.git
+cd regenerator
+npm install .
+npm test
+```
+
+Usage
+---
+
+You have several options for using this module.
+
+Simplest usage:
+```sh
+regenerator es6.js > es5.js # Just the transform.
+regenerator --include-runtime es6.js > es5.js # Add the runtime too.
+regenerator src lib # Transform every .js file in src and output to lib.
+```
+
+Programmatic usage:
+```js
+var es5Source = require("regenerator").compile(es6Source).code;
+var es5SourceWithRuntime = require("regenerator").compile(es6Source, {
+ includeRuntime: true
+}).code;
+```
+
+Babel plugin:
+```js
+var babel = require("babel-core");
+var code = babel.transform(es6Source, {
+ plugins: [require("generator")]
+}).code;
+```
+
+How can you get involved?
+---
+
+The easiest way to get involved is to look for buggy examples using [the
+sandbox](http://facebook.github.io/regenerator/), and when you find
+something strange just click the "report a bug" link (the new issue form
+will be populated automatically with the problematic code).
+
+Alternatively, you can
+[fork](https://github.com/facebook/regenerator/fork) the repository,
+create some failing tests cases in [test/tests.es6.js](test/tests.es6.js),
+and send pull requests for me to fix.
+
+If you're feeling especially brave, you are more than welcome to dive into
+the transformer code and fix the bug(s) yourself, but I must warn you that
+the code could really benefit from [better implementation
+comments](https://github.com/facebook/regenerator/issues/7).
diff --git a/packages/babel-plugin-transform-regenerator/bin/regenerator b/packages/babel-plugin-transform-regenerator/bin/regenerator
new file mode 100755
index 0000000000..88a4e27c12
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/bin/regenerator
@@ -0,0 +1,17 @@
+#!/usr/bin/env node
+// -*- mode: js -*-
+
+var compile = require("../main").compile;
+
+require("commoner").version(
+ require("../package.json").version
+).resolve(function(id) {
+ return this.readModuleP(id);
+}).option(
+ "-r, --include-runtime",
+ "Prepend the runtime to the output."
+).process(function(id, source) {
+ return compile(source, {
+ includeRuntime: this.options.includeRuntime
+ }).code;
+});
diff --git a/packages/babel-plugin-transform-regenerator/main.js b/packages/babel-plugin-transform-regenerator/main.js
new file mode 100644
index 0000000000..2272f35859
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/main.js
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2014, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
+ * additional grant of patent rights can be found in the PATENTS file in
+ * the same directory.
+ */
+
+var asyncFunctionSyntax = require("babel-plugin-syntax-async-functions");
+var blockScopingPlugin = require("babel-plugin-transform-es2015-block-scoping");
+var forOfPlugin = require("babel-plugin-transform-es2015-for-of");
+var babel = require("babel-core");
+
+var regenerator = module.exports = function() {
+ return require("./lib/visit");
+};
+
+regenerator.compile = function(code, opts) {
+ // todo: includeRuntime
+ return babel.transform(code, buildBabelOptions(opts));
+};
+
+regenerator.transform = function (ast, opts) {
+ return babel.transformFromAst(ast, null, buildBabelOptions(opts));
+};
+
+function buildBabelOptions(opts) {
+ return {
+ plugins: [regenerator, blockScopingPlugin, asyncFunctionSyntax, forOfPlugin],
+ sourceType: "script"
+ };
+}
diff --git a/packages/babel-plugin-transform-regenerator/package.json b/packages/babel-plugin-transform-regenerator/package.json
new file mode 100644
index 0000000000..8cf845e18e
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/package.json
@@ -0,0 +1,51 @@
+{
+ "author": "Ben Newman ",
+ "name": "babel-plugin-transform-regenerator",
+ "description": "Source transformer enabling ECMAScript 6 generator functions (yield) in JavaScript-of-today (ES5)",
+ "keywords": [
+ "generator",
+ "yield",
+ "coroutine",
+ "rewriting",
+ "transformation",
+ "syntax",
+ "codegen",
+ "rewriting",
+ "refactoring",
+ "transpiler",
+ "desugaring",
+ "ES6"
+ ],
+ "version": "6.0.10",
+ "homepage": "http://github.com/facebook/regenerator",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/facebook/regenerator.git"
+ },
+ "main": "main.js",
+ "bin": "bin/regenerator",
+ "scripts": {
+ "test": "node test/run.js"
+ },
+ "dependencies": {
+ "commoner": "~0.10.3",
+ "babel-plugin-transform-es2015-block-scoping": "^6.0.0",
+ "babel-plugin-syntax-async-functions": "^6.0.0",
+ "babel-plugin-transform-es2015-for-of": "^6.0.0",
+ "babel-core": "^6.0.0",
+ "babel-traverse": "^6.0.0",
+ "babel-types": "^6.0.0",
+ "babylon": "^6.0.0",
+ "private": "~0.1.5",
+ "through": "~2.3.8"
+ },
+ "devDependencies": {
+ "mocha": "~2.3.3",
+ "promise": "~7.0.4",
+ "semver": "~5.0.3"
+ },
+ "license": "BSD",
+ "engines": {
+ "node": ">= 0.6"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-transform-regenerator/runtime-module.js b/packages/babel-plugin-transform-regenerator/runtime-module.js
new file mode 100644
index 0000000000..8e7e2e4c1e
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/runtime-module.js
@@ -0,0 +1,31 @@
+// This method of obtaining a reference to the global object needs to be
+// kept identical to the way it is obtained in runtime.js
+var g =
+ typeof global === "object" ? global :
+ typeof window === "object" ? window :
+ typeof self === "object" ? self : this;
+
+// Use `getOwnPropertyNames` because not all browsers support calling
+// `hasOwnProperty` on the global `self` object in a worker. See #183.
+var hadRuntime = g.regeneratorRuntime &&
+ Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
+
+// Save the old regeneratorRuntime in case it needs to be restored later.
+var oldRuntime = hadRuntime && g.regeneratorRuntime;
+
+// Force reevalutation of runtime.js.
+g.regeneratorRuntime = undefined;
+
+module.exports = require("./runtime");
+
+if (hadRuntime) {
+ // Restore the original runtime.
+ g.regeneratorRuntime = oldRuntime;
+} else {
+ // Remove the global property added by runtime.js.
+ try {
+ delete g.regeneratorRuntime;
+ } catch(e) {
+ g.regeneratorRuntime = undefined;
+ }
+}
diff --git a/packages/babel-plugin-transform-regenerator/runtime.js b/packages/babel-plugin-transform-regenerator/runtime.js
new file mode 100644
index 0000000000..911a077b89
--- /dev/null
+++ b/packages/babel-plugin-transform-regenerator/runtime.js
@@ -0,0 +1,656 @@
+/**
+ * Copyright (c) 2014, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
+ * additional grant of patent rights can be found in the PATENTS file in
+ * the same directory.
+ */
+
+!(function(global) {
+ "use strict";
+
+ var hasOwn = Object.prototype.hasOwnProperty;
+ var undefined; // More compressible than void 0.
+ var iteratorSymbol =
+ typeof Symbol === "function" && Symbol.iterator || "@@iterator";
+
+ var inModule = typeof module === "object";
+ var runtime = global.regeneratorRuntime;
+ if (runtime) {
+ if (inModule) {
+ // If regeneratorRuntime is defined globally and we're in a module,
+ // make the exports object identical to regeneratorRuntime.
+ module.exports = runtime;
+ }
+ // Don't bother evaluating the rest of this file if the runtime was
+ // already defined globally.
+ return;
+ }
+
+ // Define the runtime globally (as expected by generated code) as either
+ // module.exports (if we're in a module) or a new, empty object.
+ runtime = global.regeneratorRuntime = inModule ? module.exports : {};
+
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided, then outerFn.prototype instanceof Generator.
+ var generator = Object.create((outerFn || Generator).prototype);
+ var context = new Context(tryLocsList || []);
+
+ // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+ generator._invoke = makeInvokeMethod(innerFn, self, context);
+
+ return generator;
+ }
+ runtime.wrap = wrap;
+
+ // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+ function tryCatch(fn, obj, arg) {
+ try {
+ return { type: "normal", arg: fn.call(obj, arg) };
+ } catch (err) {
+ return { type: "throw", arg: err };
+ }
+ }
+
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed";
+
+ // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+ var ContinueSentinel = {};
+
+ // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+ function Generator() {}
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+
+ var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunction.displayName = "GeneratorFunction";
+
+ // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function(method) {
+ prototype[method] = function(arg) {
+ return this._invoke(method, arg);
+ };
+ });
+ }
+
+ runtime.isGeneratorFunction = function(genFun) {
+ var ctor = typeof genFun === "function" && genFun.constructor;
+ return ctor
+ ? ctor === GeneratorFunction ||
+ // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) === "GeneratorFunction"
+ : false;
+ };
+
+ runtime.mark = function(genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ }
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ };
+
+ // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `value instanceof AwaitArgument` to determine if the yielded value is
+ // meant to be awaited. Some may consider the name of this method too
+ // cutesy, but they are curmudgeons.
+ runtime.awrap = function(arg) {
+ return new AwaitArgument(arg);
+ };
+
+ function AwaitArgument(arg) {
+ this.arg = arg;
+ }
+
+ function AsyncIterator(generator) {
+ // This invoke function is written in a style that assumes some
+ // calling function (or Promise) will handle exceptions.
+ function invoke(method, arg) {
+ var result = generator[method](arg);
+ var value = result.value;
+ return value instanceof AwaitArgument
+ ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)
+ : Promise.resolve(value).then(function(unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration. If the Promise is rejected, however, the
+ // result for this iteration will be rejected with the same
+ // reason. Note that rejections of yielded Promises are not
+ // thrown back into the generator function, as is the case
+ // when an awaited Promise is rejected. This difference in
+ // behavior between yield and await is important, because it
+ // allows the consumer to decide what to do with the yielded
+ // rejection (swallow it and continue, manually .throw it back
+ // into the generator, abandon iteration, whatever). With
+ // await, by contrast, there is no opportunity to examine the
+ // rejection reason outside the generator function, so the
+ // only option is to throw it from the await expression, and
+ // let the generator function handle the exception.
+ result.value = unwrapped;
+ return result;
+ });
+ }
+
+ if (typeof process === "object" && process.domain) {
+ invoke = process.domain.bind(invoke);
+ }
+
+ var invokeNext = invoke.bind(generator, "next");
+ var invokeThrow = invoke.bind(generator, "throw");
+ var invokeReturn = invoke.bind(generator, "return");
+ var previousPromise;
+
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return invoke(method, arg);
+ }
+
+ return previousPromise =
+ // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise ? previousPromise.then(
+ callInvokeWithMethodAndArg,
+ // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg
+ ) : new Promise(function (resolve) {
+ resolve(callInvokeWithMethodAndArg());
+ });
+ }
+
+ // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+ this._invoke = enqueue;
+ }
+
+ defineIteratorMethods(AsyncIterator.prototype);
+
+ // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+ runtime.async = function(innerFn, outerFn, self, tryLocsList) {
+ var iter = new AsyncIterator(
+ wrap(innerFn, outerFn, self, tryLocsList)
+ );
+
+ return runtime.isGeneratorFunction(outerFn)
+ ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function(result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
+
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
+
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ }
+
+ // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+ return doneResult();
+ }
+
+ while (true) {
+ var delegate = context.delegate;
+ if (delegate) {
+ if (method === "return" ||
+ (method === "throw" && delegate.iterator[method] === undefined)) {
+ // A return or throw (when the delegate iterator has no throw
+ // method) always terminates the yield* loop.
+ context.delegate = null;
+
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ var returnMethod = delegate.iterator["return"];
+ if (returnMethod) {
+ var record = tryCatch(returnMethod, delegate.iterator, arg);
+ if (record.type === "throw") {
+ // If the return method threw an exception, let that
+ // exception prevail over the original return or throw.
+ method = "throw";
+ arg = record.arg;
+ continue;
+ }
+ }
+
+ if (method === "return") {
+ // Continue with the outer return, now that the delegate
+ // iterator has been terminated.
+ continue;
+ }
+ }
+
+ var record = tryCatch(
+ delegate.iterator[method],
+ delegate.iterator,
+ arg
+ );
+
+ if (record.type === "throw") {
+ context.delegate = null;
+
+ // Like returning generator.throw(uncaught), but without the
+ // overhead of an extra function call.
+ method = "throw";
+ arg = record.arg;
+ continue;
+ }
+
+ // Delegate generator ran and handled its own exceptions so
+ // regardless of what the method was, we continue as if it is
+ // "next" with an undefined arg.
+ method = "next";
+ arg = undefined;
+
+ var info = record.arg;
+ if (info.done) {
+ context[delegate.resultName] = info.value;
+ context.next = delegate.nextLoc;
+ } else {
+ state = GenStateSuspendedYield;
+ return info;
+ }
+
+ context.delegate = null;
+ }
+
+ if (method === "next") {
+ if (state === GenStateSuspendedYield) {
+ context.sent = arg;
+ } else {
+ context.sent = undefined;
+ }
+
+ } else if (method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw arg;
+ }
+
+ if (context.dispatchException(arg)) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ method = "next";
+ arg = undefined;
+ }
+
+ } else if (method === "return") {
+ context.abrupt("return", arg);
+ }
+
+ state = GenStateExecuting;
+
+ var record = tryCatch(innerFn, self, context);
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done
+ ? GenStateCompleted
+ : GenStateSuspendedYield;
+
+ var info = {
+ value: record.arg,
+ done: context.done
+ };
+
+ if (record.arg === ContinueSentinel) {
+ if (context.delegate && method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ arg = undefined;
+ }
+ } else {
+ return info;
+ }
+
+ } else if (record.type === "throw") {
+ state = GenStateCompleted;
+ // Dispatch the exception by looping back around to the
+ // context.dispatchException(arg) call above.
+ method = "throw";
+ arg = record.arg;
+ }
+ }
+ };
+ }
+
+ // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+ defineIteratorMethods(Gp);
+
+ Gp[iteratorSymbol] = function() {
+ return this;
+ };
+
+ Gp.toString = function() {
+ return "[object Generator]";
+ };
+
+ function pushTryEntry(locs) {
+ var entry = { tryLoc: locs[0] };
+
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
+
+ this.tryEntries.push(entry);
+ }
+
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
+
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{ tryLoc: "root" }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+
+ runtime.keys = function(object) {
+ var keys = [];
+ for (var key in object) {
+ keys.push(key);
+ }
+ keys.reverse();
+
+ // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ }
+
+ // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+ next.done = true;
+ return next;
+ };
+ };
+
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
+
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
+
+ if (!isNaN(iterable.length)) {
+ var i = -1, next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
+
+ next.value = undefined;
+ next.done = true;
+
+ return next;
+ };
+
+ return next.next = next;
+ }
+ }
+
+ // Return an iterator with no values.
+ return { next: doneResult };
+ }
+ runtime.values = values;
+
+ function doneResult() {
+ return { value: undefined, done: true };
+ }
+
+ Context.prototype = {
+ constructor: Context,
+
+ reset: function(skipTempReset) {
+ this.prev = 0;
+ this.next = 0;
+ this.sent = undefined;
+ this.done = false;
+ this.delegate = null;
+
+ this.tryEntries.forEach(resetTryEntry);
+
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (name.charAt(0) === "t" &&
+ hasOwn.call(this, name) &&
+ !isNaN(+name.slice(1))) {
+ this[name] = undefined;
+ }
+ }
+ }
+ },
+
+ stop: function() {
+ this.done = true;
+
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
+
+ return this.rval;
+ },
+
+ dispatchException: function(exception) {
+ if (this.done) {
+ throw exception;
+ }
+
+ var context = this;
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
+ return !!caught;
+ }
+
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
+ }
+
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
+
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else {
+ throw new Error("try statement without catch or finally");
+ }
+ }
+ }
+ },
+
+ abrupt: function(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc <= this.prev &&
+ hasOwn.call(entry, "finallyLoc") &&
+ this.prev < entry.finallyLoc) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
+
+ if (finallyEntry &&
+ (type === "break" ||
+ type === "continue") &&
+ finallyEntry.tryLoc <= arg &&
+ arg <= finallyEntry.finallyLoc) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
+
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
+
+ if (finallyEntry) {
+ this.next = finallyEntry.finallyLoc;
+ } else {
+ this.complete(record);
+ }
+
+ return ContinueSentinel;
+ },
+
+ complete: function(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (record.type === "break" ||
+ record.type === "continue") {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = record.arg;
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
+ },
+
+ finish: function(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
+ }
+ }
+ },
+
+ "catch": function(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+ return thrown;
+ }
+ }
+
+ // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+ throw new Error("illegal catch attempt");
+ },
+
+ delegateYield: function(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ return ContinueSentinel;
+ }
+ };
+})(
+ // Among the various tricks for obtaining a reference to the global
+ // object, this seems to be the most reliable technique that does not
+ // use indirect eval (which violates Content Security Policy).
+ typeof global === "object" ? global :
+ typeof window === "object" ? window :
+ typeof self === "object" ? self : this
+);
diff --git a/packages/babel-plugin-transform-regenerator/src/.gitkeep b/packages/babel-plugin-transform-regenerator/src/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/babel-plugin-transform-remove-console/.npmignore b/packages/babel-plugin-transform-remove-console/.npmignore
new file mode 100644
index 0000000000..cace0d6ddc
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-console/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+*.log
+src
diff --git a/packages/babel-plugin-transform-remove-console/README.md b/packages/babel-plugin-transform-remove-console/README.md
new file mode 100644
index 0000000000..98fd9297bf
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-console/README.md
@@ -0,0 +1,35 @@
+# babel-plugin-transform-remove-console
+
+Remove console.* calls
+
+## Installation
+
+```sh
+$ npm install babel-plugin-transform-remove-console
+```
+
+## Usage
+
+### Via `.babelrc` (Recommended)
+
+**.babelrc**
+
+```json
+{
+ "plugins": ["transform-remove-console"]
+}
+```
+
+### Via CLI
+
+```sh
+$ babel --plugins transform-remove-console script.js
+```
+
+### Via Node API
+
+```javascript
+require("babel-core").transform("code", {
+ plugins: ["transform-remove-console"]
+});
+```
diff --git a/packages/babel-plugin-transform-remove-console/package.json b/packages/babel-plugin-transform-remove-console/package.json
new file mode 100644
index 0000000000..171d928312
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-console/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "babel-plugin-transform-remove-console",
+ "version": "6.0.2",
+ "description": "Remove console.* calls",
+ "repository": "babel/babel",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "keywords": [
+ "babel-plugin"
+ ],
+ "dependencies": {
+ "babel-runtime": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-transform-remove-console/src/index.js b/packages/babel-plugin-transform-remove-console/src/index.js
new file mode 100644
index 0000000000..3f8caa5738
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-console/src/index.js
@@ -0,0 +1,11 @@
+export default function () {
+ return {
+ visitor: {
+ CallExpression(path) {
+ if (path.get("callee").matchesPattern("console", true)) {
+ path.remove();
+ }
+ }
+ }
+ };
+}
diff --git a/packages/babel-plugin-transform-remove-debugger/.npmignore b/packages/babel-plugin-transform-remove-debugger/.npmignore
new file mode 100644
index 0000000000..cace0d6ddc
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-debugger/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+*.log
+src
diff --git a/packages/babel-plugin-transform-remove-debugger/README.md b/packages/babel-plugin-transform-remove-debugger/README.md
new file mode 100644
index 0000000000..094c5a0be5
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-debugger/README.md
@@ -0,0 +1,35 @@
+# babel-plugin-transform-remove-debugger
+
+Remove debugger statements
+
+## Installation
+
+```sh
+$ npm install babel-plugin-transform-remove-debugger
+```
+
+## Usage
+
+### Via `.babelrc` (Recommended)
+
+**.babelrc**
+
+```json
+{
+ "plugins": ["transform-remove-debugger"]
+}
+```
+
+### Via CLI
+
+```sh
+$ babel --plugins transform-remove-debugger script.js
+```
+
+### Via Node API
+
+```javascript
+require("babel-core").transform("code", {
+ plugins: ["transform-remove-debugger"]
+});
+```
diff --git a/packages/babel-plugin-transform-remove-debugger/package.json b/packages/babel-plugin-transform-remove-debugger/package.json
new file mode 100644
index 0000000000..f672724be0
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-debugger/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "babel-plugin-transform-remove-debugger",
+ "version": "6.0.2",
+ "description": "Remove debugger statements",
+ "repository": "babel/babel",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "keywords": [
+ "babel-plugin"
+ ],
+ "dependencies": {
+ "babel-runtime": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-transform-remove-debugger/src/index.js b/packages/babel-plugin-transform-remove-debugger/src/index.js
new file mode 100644
index 0000000000..d869cc76b6
--- /dev/null
+++ b/packages/babel-plugin-transform-remove-debugger/src/index.js
@@ -0,0 +1,9 @@
+export default function () {
+ return {
+ visitor: {
+ DebuggerStatement(path) {
+ path.remove();
+ }
+ }
+ };
+}
diff --git a/packages/babel-plugin-transform-runtime/.npmignore b/packages/babel-plugin-transform-runtime/.npmignore
new file mode 100644
index 0000000000..cace0d6ddc
--- /dev/null
+++ b/packages/babel-plugin-transform-runtime/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+*.log
+src
diff --git a/packages/babel-plugin-transform-runtime/README.md b/packages/babel-plugin-transform-runtime/README.md
new file mode 100644
index 0000000000..700676dee6
--- /dev/null
+++ b/packages/babel-plugin-transform-runtime/README.md
@@ -0,0 +1,35 @@
+# babel-plugin-transform-runtime
+
+Externalise references to helpers and builtins, automatically polyfilling your code without polluting globals
+
+## Installation
+
+```sh
+$ npm install babel-plugin-transform-runtime
+```
+
+## Usage
+
+### Via `.babelrc` (Recommended)
+
+**.babelrc**
+
+```json
+{
+ "plugins": ["transform-runtime"]
+}
+```
+
+### Via CLI
+
+```sh
+$ babel --plugins transform-runtime script.js
+```
+
+### Via Node API
+
+```javascript
+require("babel-core").transform("code", {
+ plugins: ["transform-runtime"]
+});
+```
diff --git a/packages/babel-plugin-transform-runtime/package.json b/packages/babel-plugin-transform-runtime/package.json
new file mode 100644
index 0000000000..63dc83df84
--- /dev/null
+++ b/packages/babel-plugin-transform-runtime/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "babel-plugin-transform-runtime",
+ "version": "6.0.2",
+ "description": "Externalise references to helpers and builtins, automatically polyfilling your code without polluting globals",
+ "repository": "babel/babel",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "keywords": [
+ "babel-plugin"
+ ],
+ "dependencies": {
+ "babel-runtime": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-transform-runtime/src/definitions.json b/packages/babel-plugin-transform-runtime/src/definitions.json
new file mode 100644
index 0000000000..51ba8dd801
--- /dev/null
+++ b/packages/babel-plugin-transform-runtime/src/definitions.json
@@ -0,0 +1,167 @@
+{
+ "builtins": {
+ "Symbol": "symbol",
+ "Promise": "promise",
+ "Map": "map",
+ "WeakMap": "weak-map",
+ "Set": "set",
+ "WeakSet": "weak-set"
+ },
+
+ "methods": {
+ "Array": {
+ "concat": "array/concat",
+ "copyWithin": "array/copy-within",
+ "entries": "array/entries",
+ "every": "array/every",
+ "fill": "array/fill",
+ "filter": "array/filter",
+ "findIndex": "array/find-index",
+ "find": "array/find",
+ "forEach": "array/for-each",
+ "from": "array/from",
+ "includes": "array/includes",
+ "indexOf": "array/index-of",
+ "join": "array/join",
+ "keys": "array/keys",
+ "lastIndexOf": "array/last-index-of",
+ "map": "array/map",
+ "of": "array/of",
+ "pop": "array/pop",
+ "push": "array/push",
+ "reduceRight": "array/reduce-right",
+ "reduce": "array/reduce",
+ "reverse": "array/reverse",
+ "shift": "array/shift",
+ "slice": "array/slice",
+ "some": "array/some",
+ "sort": "array/sort",
+ "splice": "array/splice",
+ "unshift": "array/unshift",
+ "values": "array/values"
+ },
+
+ "Object": {
+ "assign": "object/assign",
+ "classof": "object/classof",
+ "create": "object/create",
+ "define": "object/define",
+ "defineProperties": "object/define-properties",
+ "defineProperty": "object/define-property",
+ "entries": "object/entries",
+ "freeze": "object/freeze",
+ "getOwnPropertyDescriptor": "object/get-own-property-descriptor",
+ "getOwnPropertyDescriptors": "object/get-own-property-descriptors",
+ "getOwnPropertyNames": "object/get-own-property-names",
+ "getOwnPropertySymbols": "object/get-own-property-symbols",
+ "getPrototypePf": "object/get-prototype-of",
+ "index": "object/index",
+ "isExtensible": "object/is-extensible",
+ "isFrozen": "object/is-frozen",
+ "isObject": "object/is-object",
+ "isSealed": "object/is-sealed",
+ "is": "object/is",
+ "keys": "object/keys",
+ "make": "object/make",
+ "preventExtensions": "object/prevent-extensions",
+ "seal": "object/seal",
+ "setPrototypeOf": "object/set-prototype-of",
+ "values": "object/values"
+ },
+
+ "RegExp": {
+ "escape": "regexp/escape"
+ },
+
+ "Function": {
+ "only": "function/only",
+ "part": "function/part"
+ },
+
+ "Math": {
+ "acosh": "math/acosh",
+ "asinh": "math/asinh",
+ "atanh": "math/atanh",
+ "cbrt": "math/cbrt",
+ "clz32": "math/clz32",
+ "cosh": "math/cosh",
+ "expm1": "math/expm1",
+ "fround": "math/fround",
+ "hypot": "math/hypot",
+ "pot": "math/pot",
+ "imul": "math/imul",
+ "log10": "math/log10",
+ "log1p": "math/log1p",
+ "log2": "math/log2",
+ "sign": "math/sign",
+ "sinh": "math/sinh",
+ "tanh": "math/tanh",
+ "trunc": "math/trunc"
+ },
+
+ "Date": {
+ "addLocale": "date/add-locale",
+ "formatUTC": "date/format-utc",
+ "format": "date/format"
+ },
+
+ "Symbol": {
+ "for": "symbol/for",
+ "hasInstance": "symbol/has-instance",
+ "is-concat-spreadable": "symbol/is-concat-spreadable",
+ "iterator": "symbol/iterator",
+ "keyFor": "symbol/key-for",
+ "match": "symbol/match",
+ "replace": "symbol/replace",
+ "search": "symbol/search",
+ "species": "symbol/species",
+ "split": "symbol/split",
+ "toPrimitive": "symbol/to-primitive",
+ "toStringTag": "symbol/to-string-tag",
+ "unscopables": "symbol/unscopables"
+ },
+
+ "String": {
+ "at": "string/at",
+ "codePointAt": "string/code-point-at",
+ "endsWith": "string/ends-with",
+ "escapeHTML": "string/escape-html",
+ "fromCodePoint": "string/from-code-point",
+ "includes": "string/includes",
+ "raw": "string/raw",
+ "repeat": "string/repeat",
+ "startsWith": "string/starts-with",
+ "unescapeHTML": "string/unescape-html"
+ },
+
+ "Number": {
+ "EPSILON": "number/epsilon",
+ "isFinite": "number/is-finite",
+ "isInteger": "number/is-integer",
+ "isNaN": "number/is-nan",
+ "isSafeInteger": "number/is-safe-integer",
+ "MAX_SAFE_INTEGER": "number/max-safe-integer",
+ "MIN_SAFE_INTEGER": "number/min-safe-integer",
+ "parseFloat": "number/parse-float",
+ "parseInt": "number/parse-int",
+ "random": "number/random"
+ },
+
+ "Reflect": {
+ "apply": "reflect/apply",
+ "construct": "reflect/construct",
+ "defineProperty": "reflect/define-property",
+ "deleteProperty": "reflect/delete-property",
+ "enumerate": "reflect/enumerate",
+ "getOwnPropertyDescriptor": "reflect/get-own-property-descriptor",
+ "getPrototypeOf": "reflect/get-prototype-of",
+ "get": "reflect/get",
+ "has": "reflect/has",
+ "isExtensible": "reflect/is-extensible",
+ "ownKeys": "reflect/own-keys",
+ "preventExtensions": "reflect/prevent-extensions",
+ "setPrototypeOf": "reflect/set-prototype-of",
+ "set": "reflect/set"
+ }
+ }
+}
diff --git a/packages/babel-plugin-transform-runtime/src/index.js b/packages/babel-plugin-transform-runtime/src/index.js
new file mode 100644
index 0000000000..235a1bb51d
--- /dev/null
+++ b/packages/babel-plugin-transform-runtime/src/index.js
@@ -0,0 +1,134 @@
+import definitions from "./definitions";
+
+export default function ({ types: t }) {
+ const RUNTIME_MODULE_NAME = "babel-runtime";
+
+ function has(obj, key) {
+ return Object.prototype.hasOwnProperty.call(obj, key);
+ }
+
+ return {
+ pre(file, state) {
+ state.set("helperGenerator", function (name) {
+ return state.addImport(`${RUNTIME_MODULE_NAME}/helpers/${name}`, "default", name);
+ });
+
+ state.setDynamic("regeneratorIdentifier", function () {
+ return state.addImport(`${RUNTIME_MODULE_NAME}/regenerator`, "default", "regeneratorRuntime");
+ });
+ },
+
+ visitor: {
+ ReferencedIdentifier(path, state) {
+ let { node, parent, scope } = path;
+
+ if (node.name === "regeneratorRuntime") {
+ path.replaceWith(state.get("regeneratorIdentifier"));
+ return;
+ }
+
+ if (t.isMemberExpression(parent)) return;
+ if (!has(definitions.builtins, node.name)) return;
+ if (scope.getBindingIdentifier(node.name)) return;
+
+ // Symbol() -> _core.Symbol(); new Promise -> new _core.Promise
+ path.replaceWith(state.addImport(
+ `${RUNTIME_MODULE_NAME}/core-js/${definitions.builtins[node.name]}`,
+ "default",
+ node.name
+ ));
+ },
+
+ CallExpression(path, state) {
+ // arr[Symbol.iterator]() -> _core.$for.getIterator(arr)
+
+ // we can't compile this
+ if (path.node.arguments.length) return;
+
+ let callee = path.node.callee;
+ if (!t.isMemberExpression(callee)) return;
+ if (!callee.computed) return;
+ if (!path.get("callee.property").matchesPattern("Symbol.iterator")) return;
+
+ path.replaceWith(t.callExpression(
+ state.addImport(
+ `${RUNTIME_MODULE_NAME}/core-js/get-iterator`,
+ "default",
+ "getIterator"
+ ),
+ [callee.object]
+ ));
+ },
+
+ BinaryExpression(path, state) {
+ // Symbol.iterator in arr -> core.$for.isIterable(arr)
+
+ if (path.node.operator !== "in") return;
+ if (!path.get("left").matchesPattern("Symbol.iterator")) return;
+
+ path.replaceWith(t.callExpression(
+ state.addImport(
+ `${RUNTIME_MODULE_NAME}/core-js/is-iterable`,
+ "default",
+ "isIterable"
+ ),
+ [path.node.right]
+ ));
+ },
+
+ MemberExpression: {
+ enter(path, state) {
+ if (!path.isReferenced()) return;
+
+ // Array.from -> _core.Array.from
+
+ let { node } = path;
+ let obj = node.object;
+ let prop = node.property;
+
+ if (!t.isReferenced(obj, node)) return;
+ if (node.computed) return;
+ if (!has(definitions.methods, obj.name)) return;
+
+ let methods = definitions.methods[obj.name];
+ if (!has(methods, prop.name)) return;
+
+ // doesn't reference the global
+ if (path.scope.getBindingIdentifier(obj.name)) return;
+
+ // special case Object.defineProperty to not use core-js when using string keys
+ if (obj.name === "Object" && prop.name === "defineProperty" && path.parentPath.isCallExpression()) {
+ let call = path.parentPath.node;
+ if (call.arguments.length === 3 && t.isLiteral(call.arguments[1])) return;
+ }
+
+ path.replaceWith(state.addImport(
+ `${RUNTIME_MODULE_NAME}/core-js/${methods[prop.name]}`,
+ "default",
+ `${obj.name}$${prop.name}`
+ ));
+ },
+
+ exit(path, state) {
+ if (!path.isReferenced()) return;
+
+ let { node } = path;
+ let obj = node.object;
+
+ if (!has(definitions.builtins, obj.name)) return;
+ if (path.scope.getBindingIdentifier(obj.name)) return;
+
+ path.replaceWith(t.memberExpression(
+ state.addImport(
+ `${RUNTIME_MODULE_NAME}/core-js/${definitions.builtins[obj.name]}`,
+ "default",
+ obj.name
+ ),
+ node.property,
+ node.computed
+ ));
+ }
+ }
+ }
+ };
+}
diff --git a/packages/babel-plugin-transform-simplify-comparison-operators/.npmignore b/packages/babel-plugin-transform-simplify-comparison-operators/.npmignore
new file mode 100644
index 0000000000..cace0d6ddc
--- /dev/null
+++ b/packages/babel-plugin-transform-simplify-comparison-operators/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+*.log
+src
diff --git a/packages/babel-plugin-transform-simplify-comparison-operators/README.md b/packages/babel-plugin-transform-simplify-comparison-operators/README.md
new file mode 100644
index 0000000000..01ad108046
--- /dev/null
+++ b/packages/babel-plugin-transform-simplify-comparison-operators/README.md
@@ -0,0 +1,49 @@
+# babel-plugin-transform-simplify-comparison-operators
+
+Convert `===` and `!==` to `==` and `!=` if their types are inferred to be the same.
+
+## Example
+
+**In**
+
+```javascript
+typeof foo === "object";
+```
+
+**Out**
+
+```javascript
+typeof foo == "object";
+```
+
+## Installation
+
+```sh
+$ npm install babel-plugin-transform-simplify-comparison-operators
+```
+
+## Usage
+
+### Via `.babelrc` (Recommended)
+
+**.babelrc**
+
+```json
+{
+ "plugins": ["transform-simplify-comparison-operators"]
+}
+```
+
+### Via CLI
+
+```sh
+$ babel --plugins transform-simplify-comparison-operators script.js
+```
+
+### Via Node API
+
+```javascript
+require("babel-core").transform("code", {
+ plugins: ["transform-simplify-comparison-operators"]
+});
+```
diff --git a/packages/babel-plugin-transform-simplify-comparison-operators/package.json b/packages/babel-plugin-transform-simplify-comparison-operators/package.json
new file mode 100644
index 0000000000..87879f657c
--- /dev/null
+++ b/packages/babel-plugin-transform-simplify-comparison-operators/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "babel-plugin-transform-simplify-comparison-operators",
+ "version": "6.0.2",
+ "description": "Convert === and !== to == and != if their types are inferred to be the same.",
+ "repository": "babel/babel",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "keywords": [
+ "babel-plugin"
+ ],
+ "dependencies": {
+ "babel-runtime": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-transform-simplify-comparison-operators/src/index.js b/packages/babel-plugin-transform-simplify-comparison-operators/src/index.js
new file mode 100644
index 0000000000..e50122cafd
--- /dev/null
+++ b/packages/babel-plugin-transform-simplify-comparison-operators/src/index.js
@@ -0,0 +1,16 @@
+export default function () {
+ return {
+ visitor: {
+ BinaryExpression(node) {
+ let op = node.operator;
+ if (op !== "===" && op !== "!==") return;
+
+ let left = this.get("left");
+ let right = this.get("right");
+ if (left.baseTypeStrictlyMatches(right)) {
+ node.operator = node.operator.slice(0, -1);
+ }
+ }
+ }
+ };
+}
diff --git a/packages/babel-plugin-transform-strict-mode/README.md b/packages/babel-plugin-transform-strict-mode/README.md
new file mode 100644
index 0000000000..a47e06aa94
--- /dev/null
+++ b/packages/babel-plugin-transform-strict-mode/README.md
@@ -0,0 +1,35 @@
+# babel-plugin-transform-strict-mode
+
+TODO
+
+## Installation
+
+```sh
+$ npm install babel-plugin-transform-strict-mode
+```
+
+## Usage
+
+### Via `.babelrc` (Recommended)
+
+**.babelrc**
+
+```json
+{
+ "plugins": ["transform-strict-mode"]
+}
+```
+
+### Via CLI
+
+```sh
+$ babel --plugins transform-strict-mode script.js
+```
+
+### Via Node API
+
+```javascript
+require("babel-core").transform("code", {
+ plugins: ["transform-strict-mode"]
+});
+```
diff --git a/packages/babel-plugin-transform-strict-mode/package.json b/packages/babel-plugin-transform-strict-mode/package.json
new file mode 100644
index 0000000000..9cdd59e4c6
--- /dev/null
+++ b/packages/babel-plugin-transform-strict-mode/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "babel-plugin-transform-strict-mode",
+ "version": "6.0.2",
+ "description": "TODO",
+ "repository": "babel/babel",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "keywords": [
+ "babel-plugin"
+ ],
+ "dependencies": {
+ "babel-runtime": "^6.0.2",
+ "babel-types": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-transform-strict-mode/src/index.js b/packages/babel-plugin-transform-strict-mode/src/index.js
new file mode 100644
index 0000000000..1c694818cb
--- /dev/null
+++ b/packages/babel-plugin-transform-strict-mode/src/index.js
@@ -0,0 +1,17 @@
+import * as t from "babel-types";
+
+export default function () {
+ return {
+ visitor: {
+ Program(path) {
+ let { node } = path;
+
+ for (let directive of (node.directives: Array)) {
+ if (directive.value.value === "use strict") return;
+ }
+
+ path.unshiftContainer("directives", t.directive(t.directiveLiteral("use strict")));
+ }
+ }
+ };
+}
diff --git a/packages/babel-plugin-transform-undefined-to-void/.npmignore b/packages/babel-plugin-transform-undefined-to-void/.npmignore
new file mode 100644
index 0000000000..cace0d6ddc
--- /dev/null
+++ b/packages/babel-plugin-transform-undefined-to-void/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+*.log
+src
diff --git a/packages/babel-plugin-transform-undefined-to-void/README.md b/packages/babel-plugin-transform-undefined-to-void/README.md
new file mode 100644
index 0000000000..4ad6f53b5e
--- /dev/null
+++ b/packages/babel-plugin-transform-undefined-to-void/README.md
@@ -0,0 +1,53 @@
+# babel-plugin-transform-undefined-to-void
+
+Some JavaScript implementations allow `undefined` to be overwritten, this
+may lead to peculiar bugs that are extremely hard to track down.
+
+This plugin transforms `undefined` into `void 0` which returns `undefined`
+regardless of if it's been reassigned.
+
+## Example
+
+**In**
+
+```javascript
+foo === undefined;
+```
+
+**Out**
+
+```javascript
+foo === void 0;
+```
+
+## Installation
+
+```sh
+$ npm install babel-plugin-transform-undefined-to-void
+```
+
+## Usage
+
+### Via `.babelrc` (Recommended)
+
+**.babelrc**
+
+```json
+{
+ "plugins": ["transform-undefined-to-void"]
+}
+```
+
+### Via CLI
+
+```sh
+$ babel --plugins transform-undefined-to-void script.js
+```
+
+### Via Node API
+
+```javascript
+require("babel-core").transform("code", {
+ plugins: ["transform-undefined-to-void"]
+});
+```
diff --git a/packages/babel-plugin-transform-undefined-to-void/package.json b/packages/babel-plugin-transform-undefined-to-void/package.json
new file mode 100644
index 0000000000..f23d678d43
--- /dev/null
+++ b/packages/babel-plugin-transform-undefined-to-void/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "babel-plugin-transform-undefined-to-void",
+ "version": "6.0.2",
+ "description": "Replace references to `undefined` with `void 0`",
+ "repository": "babel/babel",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "keywords": [
+ "babel-plugin"
+ ],
+ "dependencies": {
+ "babel-runtime": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-transform-undefined-to-void/src/index.js b/packages/babel-plugin-transform-undefined-to-void/src/index.js
new file mode 100644
index 0000000000..37266769e9
--- /dev/null
+++ b/packages/babel-plugin-transform-undefined-to-void/src/index.js
@@ -0,0 +1,11 @@
+export default function ({ types: t }) {
+ return {
+ visitor: {
+ ReferencedIdentifier(path) {
+ if (path.node.name === "undefined") {
+ path.replaceWith(t.unaryExpression("void", t.numberLiteral(0), true));
+ }
+ }
+ }
+ };
+}
diff --git a/packages/babel-plugin-undeclared-variables-check/.npmignore b/packages/babel-plugin-undeclared-variables-check/.npmignore
new file mode 100644
index 0000000000..cace0d6ddc
--- /dev/null
+++ b/packages/babel-plugin-undeclared-variables-check/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+*.log
+src
diff --git a/packages/babel-plugin-undeclared-variables-check/README.md b/packages/babel-plugin-undeclared-variables-check/README.md
new file mode 100644
index 0000000000..8051e67a12
--- /dev/null
+++ b/packages/babel-plugin-undeclared-variables-check/README.md
@@ -0,0 +1,35 @@
+# babel-plugin-undeclared-variables-check
+
+Throw a compile-time error on references to undeclared variables
+
+## Installation
+
+```sh
+$ npm install babel-plugin-undeclared-variables-check
+```
+
+## Usage
+
+### Via `.babelrc` (Recommended)
+
+**.babelrc**
+
+```json
+{
+ "plugins": ["undeclared-variables-check"]
+}
+```
+
+### Via CLI
+
+```sh
+$ babel --plugins undeclared-variables-check script.js
+```
+
+### Via Node API
+
+```javascript
+require("babel-core").transform("code", {
+ plugins: ["undeclared-variables-check"]
+});
+```
diff --git a/packages/babel-plugin-undeclared-variables-check/package.json b/packages/babel-plugin-undeclared-variables-check/package.json
new file mode 100644
index 0000000000..8e48e6a930
--- /dev/null
+++ b/packages/babel-plugin-undeclared-variables-check/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "babel-plugin-undeclared-variables-check",
+ "version": "6.0.2",
+ "description": "Throw a compile-time error on references to undeclared variables",
+ "repository": "babel/babel",
+ "license": "MIT",
+ "main": "lib/index.js",
+ "keywords": [
+ "babel-plugin"
+ ],
+ "dependencies": {
+ "babel-runtime": "^6.0.2",
+ "leven": "^1.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-plugin-undeclared-variables-check/src/index.js b/packages/babel-plugin-undeclared-variables-check/src/index.js
new file mode 100644
index 0000000000..a6400dd8c7
--- /dev/null
+++ b/packages/babel-plugin-undeclared-variables-check/src/index.js
@@ -0,0 +1,46 @@
+import leven from "leven";
+
+export default function ({ messages }) {
+ return {
+ visitor: {
+ ReferencedIdentifier(path) {
+ let { node, scope } = path;
+
+ let binding = scope.getBinding(node.name);
+ if (binding && binding.kind === "type" && !path.parentPath.isFlow()) {
+ throw path.buildCodeFrameError(messages.get("undeclaredVariableType", node.name), ReferenceError);
+ }
+
+ if (scope.hasBinding(node.name)) return;
+
+ // get the closest declaration to offer as a suggestion
+ // the variable name may have just been mistyped
+
+ let bindings = scope.getAllBindings();
+
+ let closest;
+ let shortest = -1;
+
+ for (let name in bindings) {
+ let distance = leven(node.name, name);
+ if (distance <= 0 || distance > 3) continue;
+ if (distance <= shortest) continue;
+
+ closest = name;
+ shortest = distance;
+ }
+
+ let msg;
+ if (closest) {
+ msg = messages.get("undeclaredVariableSuggestion", node.name, closest);
+ } else {
+ msg = messages.get("undeclaredVariable", node.name);
+ }
+
+ //
+
+ throw path.buildCodeFrameError(msg, ReferenceError);
+ }
+ }
+ };
+}
diff --git a/packages/babel-polyfill/.npmignore b/packages/babel-polyfill/.npmignore
new file mode 100644
index 0000000000..a57582cc39
--- /dev/null
+++ b/packages/babel-polyfill/.npmignore
@@ -0,0 +1 @@
+/src
diff --git a/packages/babel-polyfill/README.md b/packages/babel-polyfill/README.md
new file mode 100644
index 0000000000..9cb41082ad
--- /dev/null
+++ b/packages/babel-polyfill/README.md
@@ -0,0 +1 @@
+# babel-polyfill
diff --git a/packages/babel-polyfill/package.json b/packages/babel-polyfill/package.json
new file mode 100644
index 0000000000..81cc7be7e3
--- /dev/null
+++ b/packages/babel-polyfill/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "babel-polyfill",
+ "version": "6.0.2",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "lib/index.js",
+ "dependencies": {
+ "core-js": "^1.0.1",
+ "regenerator": "^0.8.36",
+ "babel-runtime": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-polyfill/scripts/build-dist.sh b/packages/babel-polyfill/scripts/build-dist.sh
new file mode 100755
index 0000000000..38f8477688
--- /dev/null
+++ b/packages/babel-polyfill/scripts/build-dist.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+set -ex
+
+BROWSERIFY_CMD="../../node_modules/browserify/bin/cmd.js"
+UGLIFY_CMD="../../node_modules/uglify-js/bin/uglifyjs"
+
+mkdir -p dist
+
+node $BROWSERIFY_CMD lib/index.js \
+ --insert-global-vars 'global' \
+ --plugin bundle-collapser/plugin \
+ --plugin derequire/plugin \
+ >dist/polyfill.js
+node $UGLIFY_CMD dist/polyfill.js \
+ --compress warnings=false \
+ --mangle \
+ >dist/polyfill.min.js
diff --git a/packages/babel-polyfill/scripts/postpublish.js b/packages/babel-polyfill/scripts/postpublish.js
new file mode 100644
index 0000000000..7c9c8098fb
--- /dev/null
+++ b/packages/babel-polyfill/scripts/postpublish.js
@@ -0,0 +1 @@
+rm(__dirname + "/../browser.js");
diff --git a/packages/babel-polyfill/scripts/prepublish.js b/packages/babel-polyfill/scripts/prepublish.js
new file mode 100644
index 0000000000..bb37fec285
--- /dev/null
+++ b/packages/babel-polyfill/scripts/prepublish.js
@@ -0,0 +1,5 @@
+function relative(loc) {
+ return __dirname + "/../" + loc;
+}
+
+cp(relative("dist/polyfill.min.js"), relative("browser.js"));
diff --git a/packages/babel/src/polyfill.js b/packages/babel-polyfill/src/index.js
similarity index 100%
rename from packages/babel/src/polyfill.js
rename to packages/babel-polyfill/src/index.js
diff --git a/packages/babel-preset-es2015/index.js b/packages/babel-preset-es2015/index.js
new file mode 100644
index 0000000000..c085fa188b
--- /dev/null
+++ b/packages/babel-preset-es2015/index.js
@@ -0,0 +1,24 @@
+module.exports = {
+ plugins: [
+ require("babel-plugin-transform-es2015-template-literals"),
+ require("babel-plugin-transform-es2015-literals"),
+ require("babel-plugin-transform-es2015-function-name"),
+ require("babel-plugin-transform-es2015-arrow-functions"),
+ require("babel-plugin-transform-es2015-block-scoped-functions"),
+ require("babel-plugin-transform-es2015-classes"),
+ require("babel-plugin-transform-es2015-object-super"),
+ require("babel-plugin-transform-es2015-shorthand-properties"),
+ require("babel-plugin-transform-es2015-computed-properties"),
+ require("babel-plugin-transform-es2015-for-of"),
+ require("babel-plugin-transform-es2015-sticky-regex"),
+ require("babel-plugin-transform-es2015-unicode-regex"),
+ require("babel-plugin-transform-es2015-constants"),
+ require("babel-plugin-transform-es2015-spread"),
+ require("babel-plugin-transform-es2015-parameters"),
+ require("babel-plugin-transform-es2015-destructuring"),
+ require("babel-plugin-transform-es2015-block-scoping"),
+ require("babel-plugin-transform-es2015-typeof-symbol"),
+ require("babel-plugin-transform-es2015-modules-commonjs"),
+ require("babel-plugin-transform-regenerator"),
+ ]
+};
diff --git a/packages/babel-preset-es2015/package.json b/packages/babel-preset-es2015/package.json
new file mode 100644
index 0000000000..f9e8099e12
--- /dev/null
+++ b/packages/babel-preset-es2015/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "babel-preset-es2015",
+ "version": "6.0.11",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "index.js",
+ "dependencies": {
+ "babel-plugin-transform-es2015-template-literals": "^6.0.2",
+ "babel-plugin-transform-es2015-literals": "^6.0.2",
+ "babel-plugin-transform-es2015-function-name": "^6.0.2",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.0.2",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.0.2",
+ "babel-plugin-transform-es2015-classes": "^6.0.8",
+ "babel-plugin-transform-es2015-object-super": "^6.0.2",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.0.2",
+ "babel-plugin-transform-es2015-computed-properties": "^6.0.2",
+ "babel-plugin-transform-es2015-for-of": "^6.0.2",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.0.2",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.0.2",
+ "babel-plugin-transform-es2015-constants": "^6.0.2",
+ "babel-plugin-transform-es2015-spread": "^6.0.2",
+ "babel-plugin-transform-es2015-parameters": "^6.0.2",
+ "babel-plugin-transform-es2015-destructuring": "^6.0.2",
+ "babel-plugin-transform-es2015-block-scoping": "^6.0.2",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.0.2",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.0.2",
+ "babel-plugin-transform-regenerator": "^6.0.8"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-preset-react/index.js b/packages/babel-preset-react/index.js
new file mode 100644
index 0000000000..b488ccb658
--- /dev/null
+++ b/packages/babel-preset-react/index.js
@@ -0,0 +1,8 @@
+module.exports = {
+ plugins: [
+ require("babel-plugin-transform-react-jsx"),
+ require("babel-plugin-transform-flow-strip-types"),
+ require("babel-plugin-syntax-flow"),
+ require("babel-plugin-syntax-jsx"),
+ ]
+};
diff --git a/packages/babel-preset-react/package.json b/packages/babel-preset-react/package.json
new file mode 100644
index 0000000000..331bb84bc6
--- /dev/null
+++ b/packages/babel-preset-react/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "babel-preset-react",
+ "version": "6.0.2",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "index.js",
+ "dependencies": {
+ "babel-plugin-syntax-flow": "^6.0.2",
+ "babel-plugin-syntax-jsx": "^6.0.2",
+ "babel-plugin-transform-react-jsx": "^6.0.2",
+ "babel-plugin-transform-flow-strip-types": "^6.0.2"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-runtime/README.md b/packages/babel-runtime/README.md
index bde5507297..f063c2fdf8 100644
--- a/packages/babel-runtime/README.md
+++ b/packages/babel-runtime/README.md
@@ -1,5 +1 @@
# babel-runtime
-
-Babel self-contained runtime
-
-For more information please look at [babel](https://github.com/babel/babel).
diff --git a/packages/babel-runtime/package.json b/packages/babel-runtime/package.json
index 945a368e05..97f37bdcd3 100644
--- a/packages/babel-runtime/package.json
+++ b/packages/babel-runtime/package.json
@@ -1,6 +1,6 @@
{
"name": "babel-runtime",
- "version": "5.8.29",
+ "version": "6.0.8",
"description": "babel selfContained runtime",
"license": "MIT",
"repository": "babel/babel",
@@ -9,7 +9,9 @@
"core-js": "^1.0.0"
},
"devDependencies": {
- "babel-plugin-runtime": "^1.0.7",
+ "babel-helpers": "^6.0.2",
+ "babel-plugin-transform-runtime": "^1.0.7",
+ "babel-template": "^6.0.2",
"regenerator": "^0.8.34"
}
}
\ No newline at end of file
diff --git a/packages/babel-runtime/scripts/build-dist.js b/packages/babel-runtime/scripts/build-dist.js
index 755e40455a..3c78e00d2e 100644
--- a/packages/babel-runtime/scripts/build-dist.js
+++ b/packages/babel-runtime/scripts/build-dist.js
@@ -1,10 +1,11 @@
var outputFile = require("output-file-sync");
-var transform = require("../../babel/lib/transformation");
+var template = require("babel-template");
+var helpers = require("babel-helpers");
+var babel = require("../../babel-core");
var each = require("lodash/collection/each");
-var File = require("../../babel/lib/transformation/file");
-var util = require("../../babel/lib/util");
+var util = require("../../babel-core/lib/util");
var fs = require("fs");
-var t = require("../../babel/lib/types");
+var t = require("../../babel-types");
var _ = require("lodash");
function relative(filename) {
@@ -31,30 +32,38 @@ function writeRootFile(filename, content) {
outputFile(filename, content);
}
+var buildHelperHead = template("exports.default = HELPER; exports.__esModule = true;");
function writeFile(filename, content) {
return writeRootFile(filename, content);
}
+var transformOpts = {
+ presets: [
+ require("../../babel-preset-es2015")
+ ],
+
+ plugins: [
+ require("../../babel-plugin-transform-runtime"),
+ require("../../babel-plugin-transform-es2015-modules-commonjs")
+ ]
+};
+
function selfContainify(code) {
- return transform(code, {
- optional: ["runtime"]
- }).code;
+ return babel.transform(code, transformOpts).code;
}
function buildHelper(helperName) {
var tree = t.program(
- util.template("self-contained-helpers-head", {
- HELPER: util.template("helper-" + helperName)
+ buildHelperHead({
+ HELPER: helpers.get(helperName)
})
);
- return transform.fromAst(tree, null, {
- optional: ["runtime"]
- }).code;
+ return babel.transformFromAst(tree, null, transformOpts).code;
}
-each(File.helpers, function (helperName) {
+each(helpers.list, function (helperName) {
writeFile("helpers/" + helperName + ".js", buildHelper(helperName));
});
@@ -62,7 +71,7 @@ writeFile("regenerator/index.js", readFile("regenerator/runtime-module", true));
writeFile("regenerator/runtime.js", selfContainify(readFile("regenerator/runtime")));
-var coreDefinitions = require("babel-plugin-runtime/lib/definitions");
+var coreDefinitions = require("babel-plugin-transform-runtime/lib/definitions");
var paths = ["is-iterable", "get-iterator"];
diff --git a/packages/babel-template/package.json b/packages/babel-template/package.json
new file mode 100644
index 0000000000..d3d64d2e7b
--- /dev/null
+++ b/packages/babel-template/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "babel-template",
+ "version": "6.0.2",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "lib/index.js",
+ "dependencies": {
+ "babylon": "^6.0.2",
+ "babel-traverse": "^6.0.2",
+ "babel-types": "^6.0.2",
+ "babel-runtime": "^6.0.2",
+ "lodash": "^3.10.1"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-template/src/index.js b/packages/babel-template/src/index.js
new file mode 100644
index 0000000000..c011d71fac
--- /dev/null
+++ b/packages/babel-template/src/index.js
@@ -0,0 +1,94 @@
+/* @flow */
+
+import cloneDeep from "lodash/lang/cloneDeep";
+import has from "lodash/object/has";
+import traverse from "babel-traverse";
+import * as babylon from "babylon";
+import * as t from "babel-types";
+
+let TEMPLATE_SKIP = Symbol();
+
+export default function (code: string): Function {
+ // since we lazy parse the template, we get the current stack so we have the
+ // original stack to append if it errors when parsing
+ let stack = new Error().stack.split("\n").slice(1).join("\n");
+
+ let getAst = function () {
+ let ast;
+
+ try {
+ ast = babylon.parse(code, {
+ allowReturnOutsideFunction: true,
+ allowSuperOutsideMethod: true
+ });
+
+ ast = traverse.removeProperties(ast);
+ } catch (err) {
+ err.stack = `${err.stack}from\n${stack}`;
+ throw err;
+ }
+
+ getAst = function () {
+ return ast;
+ };
+
+ return ast;
+ };
+
+ return function (...args) {
+ return useTemplate(getAst(), args);
+ };
+}
+
+function useTemplate(ast, nodes?: Array) {
+ ast = cloneDeep(ast);
+ let { program } = ast;
+
+ if (nodes.length) {
+ traverse(ast, templateVisitor, null, nodes);
+ }
+
+ if (program.body.length > 1) {
+ return program.body;
+ } else {
+ return program.body[0];
+ }
+}
+
+let templateVisitor = {
+ // 360
+ noScope: true,
+
+ enter(path, args) {
+ let { node } = path;
+ if (node[TEMPLATE_SKIP]) return path.skip();
+
+ if (t.isExpressionStatement(node)) {
+ node = node.expression;
+ }
+
+ let replacement;
+
+ if (t.isIdentifier(node)) {
+ if (has(args[0], node.name)) {
+ replacement = args[0][node.name];
+ } else if (node.name[0] === "$") {
+ let i = +node.name.slice(1);
+ if (args[i]) replacement = args[i];
+ }
+ }
+
+ if (replacement === null) {
+ path.remove();
+ }
+
+ if (replacement) {
+ replacement[TEMPLATE_SKIP] = true;
+ path.replaceInline(replacement);
+ }
+ },
+
+ exit({ node }) {
+ traverse.clearNode(node);
+ }
+};
diff --git a/packages/babel-traverse/.npmignore b/packages/babel-traverse/.npmignore
new file mode 100644
index 0000000000..a57582cc39
--- /dev/null
+++ b/packages/babel-traverse/.npmignore
@@ -0,0 +1 @@
+/src
diff --git a/packages/babel-traverse/README.md b/packages/babel-traverse/README.md
new file mode 100644
index 0000000000..6addc10651
--- /dev/null
+++ b/packages/babel-traverse/README.md
@@ -0,0 +1 @@
+# babel-traverse
diff --git a/packages/babel-traverse/package.json b/packages/babel-traverse/package.json
new file mode 100644
index 0000000000..769e1e70ca
--- /dev/null
+++ b/packages/babel-traverse/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "babel-traverse",
+ "version": "6.0.2",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "lib/index.js",
+ "dependencies": {
+ "babel-code-frame": "^6.0.2",
+ "babel-messages": "^6.0.2",
+ "babel-runtime": "^6.0.2",
+ "babel-types": "^6.0.2",
+ "babylon": "^6.0.2",
+ "globals": "^8.3.0",
+ "invariant": "^2.1.0",
+ "lodash": "^3.10.1",
+ "repeating": "^1.1.3"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel-traverse/src/context.js b/packages/babel-traverse/src/context.js
new file mode 100644
index 0000000000..ea9f1e56dc
--- /dev/null
+++ b/packages/babel-traverse/src/context.js
@@ -0,0 +1,148 @@
+/* @flow */
+
+import NodePath from "./path";
+import * as t from "babel-types";
+
+let testing = process.env.NODE_ENV === "test";
+
+export default class TraversalContext {
+ constructor(scope, opts, state, parentPath) {
+ this.parentPath = parentPath;
+ this.scope = scope;
+ this.state = state;
+ this.opts = opts;
+ }
+
+ parentPath: NodePath;
+ scope;
+ state;
+ opts;
+ queue: ?Array = null;
+
+ /**
+ * This method does a simple check to determine whether or not we really need to attempt
+ * visit a node. This will prevent us from constructing a NodePath.
+ */
+
+ shouldVisit(node): boolean {
+ let opts = this.opts;
+ if (opts.enter || opts.exit) return true;
+
+ // check if we have a visitor for this node
+ if (opts[node.type]) return true;
+
+ // check if we're going to traverse into this node
+ let keys: ?Array = t.VISITOR_KEYS[node.type];
+ if (!keys || !keys.length) return false;
+
+ // we need to traverse into this node so ensure that it has children to traverse into!
+ for (let key of keys) {
+ if (node[key]) return true;
+ }
+
+ return false;
+ }
+
+ create(node, obj, key, listKey): NodePath {
+ return NodePath.get({
+ parentPath: this.parentPath,
+ parent: node,
+ container: obj,
+ key: key,
+ listKey
+ });
+ }
+
+ maybeQueue(path) {
+ if (this.trap) {
+ throw new Error("Infinite cycle detected");
+ }
+
+ if (this.queue) {
+ this.priorityQueue.push(path);
+ }
+ }
+
+ visitMultiple(container, parent, listKey) {
+ // nothing to traverse!
+ if (container.length === 0) return false;
+
+ let queue = [];
+
+ // build up initial queue
+ for (let key = 0; key < container.length; key++) {
+ let node = container[key];
+ if (node && this.shouldVisit(node)) {
+ queue.push(this.create(parent, container, key, listKey));
+ }
+ }
+
+ return this.visitQueue(queue);
+ }
+
+ visitSingle(node, key): boolean {
+ if (this.shouldVisit(node[key])) {
+ return this.visitQueue([
+ this.create(node, node, key)
+ ]);
+ } else {
+ return false;
+ }
+ }
+
+ visitQueue(queue: Array) {
+ // set queue
+ this.queue = queue;
+ this.priorityQueue = [];
+
+ let visited = [];
+ let stop = false;
+
+ // visit the queue
+ for (let path of queue) {
+ path.resync();
+ path.pushContext(this);
+
+ if (testing && queue.length >= 1000) {
+ this.trap = true;
+ }
+
+ // ensure we don't visit the same node twice
+ if (visited.indexOf(path.node) >= 0) continue;
+ visited.push(path.node);
+
+ if (path.visit()) {
+ stop = true;
+ break;
+ }
+
+ if (this.priorityQueue.length) {
+ stop = this.visitQueue(this.priorityQueue);
+ this.priorityQueue = [];
+ this.queue = queue;
+ if (stop) break;
+ }
+ }
+
+ // clear queue
+ for (let path of queue) {
+ path.popContext();
+ }
+
+ // clear queue
+ this.queue = null;
+
+ return stop;
+ }
+
+ visit(node, key) {
+ let nodes = node[key];
+ if (!nodes) return false;
+
+ if (Array.isArray(nodes)) {
+ return this.visitMultiple(nodes, node, key);
+ } else {
+ return this.visitSingle(node, key);
+ }
+ }
+}
diff --git a/packages/babel-traverse/src/hub.js b/packages/babel-traverse/src/hub.js
new file mode 100644
index 0000000000..9c204d5e54
--- /dev/null
+++ b/packages/babel-traverse/src/hub.js
@@ -0,0 +1,8 @@
+/* @flow */
+
+export default class Hub {
+ constructor(file, options) {
+ this.file = file;
+ this.options = options;
+ }
+}
diff --git a/packages/babel-traverse/src/index.js b/packages/babel-traverse/src/index.js
new file mode 100644
index 0000000000..1f058919c3
--- /dev/null
+++ b/packages/babel-traverse/src/index.js
@@ -0,0 +1,118 @@
+/* @flow */
+
+import TraversalContext from "./context";
+import * as visitors from "./visitors";
+import * as messages from "babel-messages";
+import includes from "lodash/collection/includes";
+import * as t from "babel-types";
+
+export { default as NodePath } from "./path";
+export { default as Scope } from "./scope";
+export { default as Hub } from "./hub";
+export { visitors };
+
+export default function traverse(
+ parent: Object | Array,
+ opts?: Object,
+ scope?: Object,
+ state: Object,
+ parentPath: Object,
+) {
+ if (!parent) return;
+ if (!opts) opts = {};
+
+ if (!opts.noScope && !scope) {
+ if (parent.type !== "Program" && parent.type !== "File") {
+ throw new Error(messages.get("traverseNeedsParent", parent.type));
+ }
+ }
+
+ visitors.explode(opts);
+
+ traverse.node(parent, opts, scope, state, parentPath);
+}
+
+traverse.visitors = visitors;
+traverse.verify = visitors.verify;
+traverse.explode = visitors.explode;
+
+traverse.NodePath = require("./path");
+traverse.Scope = require("./scope");
+traverse.Hub = require("./hub");
+
+traverse.cheap = function (node, enter) {
+ if (!node) return;
+
+ let keys = t.VISITOR_KEYS[node.type];
+ if (!keys) return;
+
+ enter(node);
+
+ for (let key of keys) {
+ let subNode = node[key];
+
+ if (Array.isArray(subNode)) {
+ for (let node of subNode) {
+ traverse.cheap(node, enter);
+ }
+ } else {
+ traverse.cheap(subNode, enter);
+ }
+ }
+};
+
+traverse.node = function (node: Object, opts: Object, scope: Object, state: Object, parentPath: Object, skipKeys?) {
+ let keys: Array = t.VISITOR_KEYS[node.type];
+ if (!keys) return;
+
+ let context = new TraversalContext(scope, opts, state, parentPath);
+ for (let key of keys) {
+ if (skipKeys && skipKeys[key]) continue;
+ if (context.visit(node, key)) return;
+ }
+};
+
+const CLEAR_KEYS: Array = t.COMMENT_KEYS.concat([
+ "_scopeInfo", "_paths",
+ "tokens", "comments",
+ "start", "end", "loc",
+ "raw", "rawValue"
+]);
+
+traverse.clearNode = function (node) {
+ for (let key of CLEAR_KEYS) {
+ if (node[key] != null) node[key] = undefined;
+ }
+};
+
+traverse.removeProperties = function (tree) {
+ traverse.cheap(tree, traverse.clearNode);
+ return tree;
+};
+
+function hasBlacklistedType(path, state) {
+ if (path.node.type === state.type) {
+ state.has = true;
+ path.skip();
+ }
+}
+
+traverse.hasType = function (tree: Object, scope: Object, type: Object, blacklistTypes: Array): boolean {
+ // the node we're searching in is blacklisted
+ if (includes(blacklistTypes, tree.type)) return false;
+
+ // the type we're looking for is the same as the passed node
+ if (tree.type === type) return true;
+
+ let state = {
+ has: false,
+ type: type
+ };
+
+ traverse(tree, {
+ blacklist: blacklistTypes,
+ enter: hasBlacklistedType
+ }, scope, state);
+
+ return state.has;
+};
diff --git a/packages/babel/src/traversal/path/ancestry.js b/packages/babel-traverse/src/path/ancestry.js
similarity index 79%
rename from packages/babel/src/traversal/path/ancestry.js
rename to packages/babel-traverse/src/path/ancestry.js
index 734a3cf515..0b0ade4048 100644
--- a/packages/babel/src/traversal/path/ancestry.js
+++ b/packages/babel-traverse/src/path/ancestry.js
@@ -1,4 +1,8 @@
-import * as t from "../../types";
+/* @flow */
+
+// This file contains that retrieve or validate anything related to the current paths ancestry.
+
+import * as t from "babel-types";
import NodePath from "./index";
/**
@@ -7,13 +11,25 @@ import NodePath from "./index";
*/
export function findParent(callback) {
- var path = this;
+ let path = this;
while (path = path.parentPath) {
if (callback(path)) return path;
}
return null;
}
+/**
+ * Description
+ */
+
+export function find(callback) {
+ let path = this;
+ do {
+ if (callback(path)) return path;
+ } while (path = path.parentPath);
+ return null;
+}
+
/**
* Get the parent function of the current path.
*/
@@ -27,7 +43,7 @@ export function getFunctionParent() {
*/
export function getStatementParent() {
- var path = this;
+ let path = this;
do {
if (Array.isArray(path.container)) {
return path;
@@ -45,11 +61,11 @@ export function getStatementParent() {
export function getEarliestCommonAncestorFrom(paths: Array): NodePath {
return this.getDeepestCommonAncestorFrom(paths, function (deepest, i, ancestries) {
- var earliest;
- var keys = t.VISITOR_KEYS[deepest.type];
+ let earliest;
+ let keys = t.VISITOR_KEYS[deepest.type];
- for (var ancestry of (ancestries: Array)) {
- var path = ancestry[i + 1];
+ for (let ancestry of (ancestries: Array)) {
+ let path = ancestry[i + 1];
// first path
if (!earliest) {
@@ -67,8 +83,8 @@ export function getEarliestCommonAncestorFrom(paths: Array): NodePath
}
// handle keys
- var earliestKeyIndex = keys.indexOf(earliest.parentKey);
- var currentKeyIndex = keys.indexOf(path.parentKey);
+ let earliestKeyIndex = keys.indexOf(earliest.parentKey);
+ let currentKeyIndex = keys.indexOf(path.parentKey);
if (earliestKeyIndex > currentKeyIndex) {
// key appears before so it's earlier
earliest = path;
@@ -95,14 +111,14 @@ export function getDeepestCommonAncestorFrom(paths: Array, filter?: Fu
}
// minimum depth of the tree so we know the highest node
- var minDepth = Infinity;
+ let minDepth = Infinity;
// last common ancestor
- var lastCommonIndex, lastCommon;
+ let lastCommonIndex, lastCommon;
// get the ancestors of the path, breaking when the parent exceeds ourselves
- var ancestries = paths.map((path) => {
- var ancestry = [];
+ let ancestries = paths.map((path) => {
+ let ancestry = [];
do {
ancestry.unshift(path);
@@ -117,13 +133,13 @@ export function getDeepestCommonAncestorFrom(paths: Array, filter?: Fu
});
// get the first ancestry so we have a seed to assess all other ancestries with
- var first = ancestries[0];
+ let first = ancestries[0];
// check ancestor equality
- depthLoop: for (var i = 0; i < minDepth; i++) {
- var shouldMatch = first[i];
+ depthLoop: for (let i = 0; i < minDepth; i++) {
+ let shouldMatch = first[i];
- for (var ancestry of (ancestries: Array)) {
+ for (let ancestry of (ancestries: Array)) {
if (ancestry[i] !== shouldMatch) {
// we've hit a snag
break depthLoop;
@@ -153,22 +169,18 @@ export function getDeepestCommonAncestorFrom(paths: Array, filter?: Fu
*/
export function getAncestry() {
- var path = this;
- var paths = [];
+ let path = this;
+ let paths = [];
do {
paths.push(path);
} while(path = path.parentPath);
return paths;
}
-/**
- * [Please add a description.]
- */
-
export function inType() {
- var path = this;
+ let path = this;
while (path) {
- for (var type of (arguments: Array)) {
+ for (let type of (arguments: Array)) {
if (path.node.type === type) return true;
}
path = path.parentPath;
@@ -182,10 +194,10 @@ export function inType() {
*/
export function inShadow(key?) {
- var path = this;
+ let path = this;
do {
if (path.isFunction()) {
- var shadow = path.node.shadow;
+ let shadow = path.node.shadow;
if (shadow) {
// this is because sometimes we may have a `shadow` value of:
//
diff --git a/packages/babel-traverse/src/path/comments.js b/packages/babel-traverse/src/path/comments.js
new file mode 100644
index 0000000000..06159832c1
--- /dev/null
+++ b/packages/babel-traverse/src/path/comments.js
@@ -0,0 +1,51 @@
+/* @flow */
+
+// This file contains methods responsible for dealing with comments.
+
+/**
+ * Share comments amongst siblings.
+ */
+
+export function shareCommentsWithSiblings() {
+ let node = this.node;
+ if (!node) return;
+
+ let trailing = node.trailingComments;
+ let leading = node.leadingComments;
+ if (!trailing && !leading) return;
+
+ let prev = this.getSibling(this.key - 1);
+ let next = this.getSibling(this.key + 1);
+
+ if (!prev.node) prev = next;
+ if (!next.node) next = prev;
+
+ prev.addComments("trailing", leading);
+ next.addComments("leading", trailing);
+}
+
+export function addComment(type, content, line?) {
+ this.addComments(type, [{
+ type: line ? "CommentLine" : "CommentBlock",
+ value: content
+ }]);
+}
+
+/**
+ * Give node `comments` of the specified `type`.
+ */
+
+export function addComments(type: string, comments: Array) {
+ if (!comments) return;
+
+ let node = this.node;
+ if (!node) return;
+
+ let key = `${type}Comments`;
+
+ if (node[key]) {
+ node[key] = node[key].concat(comments);
+ } else {
+ node[key] = comments;
+ }
+}
diff --git a/packages/babel-traverse/src/path/constants.js b/packages/babel-traverse/src/path/constants.js
new file mode 100644
index 0000000000..11431edfe4
--- /dev/null
+++ b/packages/babel-traverse/src/path/constants.js
@@ -0,0 +1 @@
+export const PATH_CACHE_KEY = "_paths"; //Symbol();
diff --git a/packages/babel-traverse/src/path/context.js b/packages/babel-traverse/src/path/context.js
new file mode 100644
index 0000000000..c50f875f1e
--- /dev/null
+++ b/packages/babel-traverse/src/path/context.js
@@ -0,0 +1,215 @@
+/* @flow */
+
+// This file contains methods responsible for maintaining a TraversalContext.
+
+import traverse from "../index";
+
+export function call(key): boolean {
+ let opts = this.opts;
+
+ if (this.node) {
+ if (this._call(opts[key])) return true;
+ }
+
+ if (this.node) {
+ return this._call(opts[this.node.type] && opts[this.node.type][key]);
+ }
+
+ return false;
+}
+
+export function _call(fns?: Array): boolean {
+ if (!fns) return false;
+
+ for (let fn of fns) {
+ if (!fn) continue;
+
+ let node = this.node;
+ if (!node) return true;
+
+ let ret = fn.call(this.state, this, this.state);
+ if (ret) throw new Error("Unexpected return value from visitor method " + fn);
+
+ // node has been replaced, it will have been requeued
+ if (this.node !== node) return true;
+
+ if (this.shouldStop || this.shouldSkip || this.removed) return true;
+ }
+
+ return false;
+}
+
+export function isBlacklisted(): boolean {
+ let blacklist = this.opts.blacklist;
+ return blacklist && blacklist.indexOf(this.node.type) > -1;
+}
+
+export function visit(): boolean {
+ if (!this.node) {
+ return false;
+ }
+
+ if (this.isBlacklisted()) {
+ return false;
+ }
+
+ if (this.opts.shouldSkip && this.opts.shouldSkip(this)) {
+ return false;
+ }
+
+ if (this.call("enter") || this.shouldSkip) {
+ return this.shouldStop;
+ }
+
+ traverse.node(this.node, this.opts, this.scope, this.state, this, this.skipKeys);
+
+ this.call("exit");
+
+ return this.shouldStop;
+}
+
+export function skip() {
+ this.shouldSkip = true;
+}
+
+export function skipKey(key) {
+ this.skipKeys[key] = true;
+}
+
+export function stop() {
+ this.shouldStop = true;
+ this.shouldSkip = true;
+}
+
+export function setScope() {
+ if (this.opts && this.opts.noScope) return;
+
+ let target = this.context && this.context.scope;
+
+ if (!target) {
+ let path = this.parentPath;
+ while (path && !target) {
+ if (path.opts && path.opts.noScope) return;
+
+ target = path.scope;
+ path = path.parentPath;
+ }
+ }
+
+ this.scope = this.getScope(target);
+ if (this.scope) this.scope.init();
+}
+
+export function setContext(context) {
+ this.shouldSkip = false;
+ this.shouldStop = false;
+ this.removed = false;
+ this.skipKeys = {};
+
+ if (context) {
+ this.context = context;
+ this.state = context.state;
+ this.opts = context.opts;
+ }
+
+ this.setScope();
+
+ return this;
+}
+
+/**
+ * Here we resync the node paths `key` and `container`. If they've changed according
+ * to what we have stored internally then we attempt to resync by crawling and looking
+ * for the new values.
+ */
+
+export function resync() {
+ if (this.removed) return;
+
+ this._resyncParent();
+ this._resyncList();
+ this._resyncKey();
+ //this._resyncRemoved();
+}
+
+export function _resyncParent() {
+ if (this.parentPath) {
+ this.parent = this.parentPath.node;
+ }
+}
+
+export function _resyncKey() {
+ if (!this.container) return;
+
+ if (this.node === this.container[this.key]) return;
+
+ // grrr, path key is out of sync. this is likely due to a modification to the AST
+ // not done through our path APIs
+
+ if (Array.isArray(this.container)) {
+ for (let i = 0; i < this.container.length; i++) {
+ if (this.container[i] === this.node) {
+ return this.setKey(i);
+ }
+ }
+ } else {
+ for (let key in this.container) {
+ if (this.container[key] === this.node) {
+ return this.setKey(key);
+ }
+ }
+ }
+
+ // ¯\_(ツ)_/¯ who knows where it's gone lol
+ this.key = null;
+}
+
+export function _resyncList() {
+ if (!this.parent || !this.inList) return;
+
+ let newContainer = this.parent[this.listKey];
+ if (this.container === newContainer) return;
+
+ // container is out of sync. this is likely the result of it being reassigned
+ this.container = newContainer || null;
+}
+
+export function _resyncRemoved() {
+ if (this.key == null || !this.container || this.container[this.key] !== this.node) {
+ this._markRemoved();
+ }
+}
+
+export function popContext() {
+ this.contexts.pop();
+ this.setContext(this.contexts[this.contexts.length - 1]);
+}
+
+export function pushContext(context) {
+ this.contexts.push(context);
+ this.setContext(context);
+}
+
+export function setup(parentPath, container, listKey, key) {
+ this.inList = !!listKey;
+ this.listKey = listKey;
+ this.parentKey = listKey || key;
+ this.container = container;
+
+ this.parentPath = parentPath || this.parentPath;
+ this.setKey(key);
+}
+
+export function setKey(key) {
+ this.key = key;
+ this.node = this.container[this.key];
+ this.type = this.node && this.node.type;
+}
+
+export function requeue(path = this) {
+ if (path.removed) return;
+
+ for (let context of this.contexts) {
+ context.maybeQueue(path);
+ }
+}
diff --git a/packages/babel-traverse/src/path/conversion.js b/packages/babel-traverse/src/path/conversion.js
new file mode 100644
index 0000000000..7ebc7d646c
--- /dev/null
+++ b/packages/babel-traverse/src/path/conversion.js
@@ -0,0 +1,40 @@
+/* @flow */
+
+// This file contains methods that convert the path node into another node or some other type of data.
+
+import * as t from "babel-types";
+
+export function toComputedKey(): Object {
+ let node = this.node;
+
+ let key;
+ if (this.isMemberExpression()) {
+ key = node.property;
+ } else if (this.isProperty() || this.isMethod()) {
+ key = node.key;
+ } else {
+ throw new ReferenceError("todo");
+ }
+
+ if (!node.computed) {
+ if (t.isIdentifier(key)) key = t.stringLiteral(key.name);
+ }
+
+ return key;
+}
+
+export function ensureBlock() {
+ return t.ensureBlock(this.node);
+}
+
+export function arrowFunctionToShadowed() {
+ // todo: maybe error
+ if (!this.isArrowFunctionExpression()) return;
+
+ this.ensureBlock();
+
+ let { node } = this;
+ node.expression = false;
+ node.type = "FunctionExpression";
+ node.shadow = node.shadow || true;
+}
diff --git a/packages/babel-traverse/src/path/evaluation.js b/packages/babel-traverse/src/path/evaluation.js
new file mode 100644
index 0000000000..d03f824c53
--- /dev/null
+++ b/packages/babel-traverse/src/path/evaluation.js
@@ -0,0 +1,289 @@
+/* @flow */
+
+import type NodePath from "./index";
+
+// This file contains Babels metainterpreter that can evaluate static code.
+
+/* eslint eqeqeq: 0 */
+
+const VALID_CALLEES = ["String", "Number", "Math"];
+const INVALID_METHODS = ["random"];
+
+/**
+ * Walk the input `node` and statically evaluate if it's truthy.
+ *
+ * Returning `true` when we're sure that the expression will evaluate to a
+ * truthy value, `false` if we're sure that it will evaluate to a falsy
+ * value and `undefined` if we aren't sure. Because of this please do not
+ * rely on coercion when using this method and check with === if it's false.
+ *
+ * For example do:
+ *
+ * if (t.evaluateTruthy(node) === false) falsyLogic();
+ *
+ * **AND NOT**
+ *
+ * if (!t.evaluateTruthy(node)) falsyLogic();
+ *
+ */
+
+export function evaluateTruthy(): boolean {
+ let res = this.evaluate();
+ if (res.confident) return !!res.value;
+}
+
+/**
+ * Walk the input `node` and statically evaluate it.
+ *
+ * Returns an object in the form `{ confident, value }`. `confident` indicates
+ * whether or not we had to drop out of evaluating the expression because of
+ * hitting an unknown node that we couldn't confidently find the value of.
+ *
+ * Example:
+ *
+ * t.evaluate(parse("5 + 5")) // { confident: true, value: 10 }
+ * t.evaluate(parse("!true")) // { confident: true, value: false }
+ * t.evaluate(parse("foo + foo")) // { confident: false, value: undefined }
+ *
+ */
+
+export function evaluate(): { confident: boolean; value: any } {
+ let confident = true;
+ let deoptPath: ?NodePath;
+
+ function deopt(path) {
+ if (!confident) return;
+ deoptPath = path;
+ confident = false;
+ }
+
+ let value = evaluate(this);
+ if (!confident) value = undefined;
+ return {
+ confident: confident,
+ deopt: deoptPath,
+ value: value
+ };
+
+ function evaluate(path) {
+ if (!confident) return;
+
+ let { node } = path;
+
+ if (path.isSequenceExpression()) {
+ let exprs = path.get("expressions");
+ return evaluate(exprs[exprs.length - 1]);
+ }
+
+ if (path.isStringLiteral() || path.isNumberLiteral() || path.isBooleanLiteral()) {
+ return node.value;
+ }
+
+ if (path.isNullLiteral()) {
+ return null;
+ }
+
+ if (path.isTemplateLiteral()) {
+ let str = "";
+
+ let i = 0;
+ let exprs = path.get("expressions");
+
+ for (let elem of (node.quasis: Array)) {
+ // not confident, evaluated an expression we don't like
+ if (!confident) break;
+
+ // add on cooked element
+ str += elem.value.cooked;
+
+ // add on interpolated expression if it's present
+ let expr = exprs[i++];
+ if (expr) str += String(evaluate(expr));
+ }
+
+ if (confident) return str;
+ }
+
+ if (path.isConditionalExpression()) {
+ if (evaluate(path.get("test"))) {
+ return evaluate(path.get("consequent"));
+ } else {
+ return evaluate(path.get("alternate"));
+ }
+ }
+
+ if (path.isExpressionWrapper()) { // TypeCastExpression, ExpressionStatement etc
+ return evaluate(path.get("expression"));
+ }
+
+ // "foo".length
+ if (path.isMemberExpression() && !path.parentPath.isCallExpression({ callee: node })) {
+ let property = path.get("property");
+ let object = path.get("object");
+
+ if (object.isLiteral() && property.isIdentifier()) {
+ let value = object.node.value;
+ let type = typeof value;
+ if (type === "number" || type === "string") {
+ return value[property.node.name];
+ }
+ }
+ }
+
+ if (path.isReferencedIdentifier()) {
+ let binding = path.scope.getBinding(node.name);
+ if (binding && binding.hasValue) {
+ return binding.value;
+ } else {
+ if (node.name === "undefined") {
+ return undefined;
+ } else if (node.name === "Infinity") {
+ return Infinity;
+ } else if (node.name === "NaN") {
+ return NaN;
+ }
+
+ let resolved = path.resolve();
+ if (resolved === path) {
+ return deopt(path);
+ } else {
+ return evaluate(resolved);
+ }
+ }
+ }
+
+ if (path.isUnaryExpression({ prefix: true })) {
+ if (node.operator === "void") {
+ // we don't need to evaluate the argument to know what this will return
+ return undefined;
+ }
+
+ let argument = path.get("argument");
+ if (node.operator === "typeof" && (argument.isFunction() || argument.isClass())) {
+ return "function";
+ }
+
+ let arg = evaluate(argument);
+ switch (node.operator) {
+ case "!": return !arg;
+ case "+": return +arg;
+ case "-": return -arg;
+ case "~": return ~arg;
+ case "typeof": return typeof arg;
+ }
+ }
+
+ if (path.isArrayExpression()) {
+ let arr = [];
+ let elems: Array = path.get("elements");
+ for (let elem of elems) {
+ elem = elem.evaluate();
+
+ if (elem.confident) {
+ arr.push(elem.value);
+ } else {
+ return deopt(elem);
+ }
+ }
+ return arr;
+ }
+
+ if (path.isObjectExpression()) {
+ // todo
+ }
+
+ if (path.isLogicalExpression()) {
+ // If we are confident that one side of an && is false, or one side of
+ // an || is true, we can be confident about the entire expression
+ let wasConfident = confident;
+ let left = evaluate(path.get("left"));
+ let leftConfident = confident;
+ confident = wasConfident;
+ let right = evaluate(path.get("right"));
+ let rightConfident = confident;
+ let uncertain = leftConfident !== rightConfident;
+ confident = leftConfident && rightConfident;
+
+ switch (node.operator) {
+ case "||":
+ if ((left || right) && uncertain) {
+ confident = true;
+ }
+ return left || right;
+ case "&&":
+ if ((!left && leftConfident) || (!right && rightConfident)) {
+ confident = true;
+ }
+ return left && right;
+ }
+ }
+
+ if (path.isBinaryExpression()) {
+ let left = evaluate(path.get("left"));
+ let right = evaluate(path.get("right"));
+
+ switch (node.operator) {
+ case "-": return left - right;
+ case "+": return left + right;
+ case "/": return left / right;
+ case "*": return left * right;
+ case "%": return left % right;
+ case "**": return left ** right;
+ case "<": return left < right;
+ case ">": return left > right;
+ case "<=": return left <= right;
+ case ">=": return left >= right;
+ case "==": return left == right;
+ case "!=": return left != right;
+ case "===": return left === right;
+ case "!==": return left !== right;
+ case "|": return left | right;
+ case "&": return left & right;
+ case "^": return left ^ right;
+ case "<<": return left << right;
+ case ">>": return left >> right;
+ case ">>>": return left >>> right;
+ }
+ }
+
+ if (path.isCallExpression()) {
+ let callee = path.get("callee");
+ let context;
+ let func;
+
+ // Number(1);
+ if (callee.isIdentifier() && !path.scope.getBinding(callee.node.name, true) && VALID_CALLEES.indexOf(callee.node.name) >= 0) {
+ func = global[node.callee.name];
+ }
+
+ if (callee.isMemberExpression()) {
+ let object = callee.get("object");
+ let property = callee.get("property");
+
+ // Math.min(1, 2)
+ if (object.isIdentifier() && property.isIdentifier() && VALID_CALLEES.indexOf(object.node.name) >= 0 && INVALID_METHODS.indexOf(property.node.name) < 0) {
+ context = global[object.node.name];
+ func = context[property.node.name];
+ }
+
+ // "abc".charCodeAt(4)
+ if (object.isLiteral() && property.isIdentifier()) {
+ let type = typeof object.node.value;
+ if (type === "string" || type === "number") {
+ context = object.node.value;
+ func = context[property.node.name];
+ }
+ }
+ }
+
+ if (func) {
+ let args = path.get("arguments").map(evaluate);
+ if (!confident) return;
+
+ return func.apply(context, args);
+ }
+ }
+
+ deopt(path);
+ }
+}
diff --git a/packages/babel/src/traversal/path/family.js b/packages/babel-traverse/src/path/family.js
similarity index 82%
rename from packages/babel/src/traversal/path/family.js
rename to packages/babel-traverse/src/path/family.js
index 8c04562006..02e862ed49 100644
--- a/packages/babel/src/traversal/path/family.js
+++ b/packages/babel-traverse/src/path/family.js
@@ -1,13 +1,13 @@
+/* @flow */
+
+// This file contains methods responsible for dealing with/retrieving children or siblings.
+
import type TraversalContext from "../index";
import NodePath from "./index";
-import * as t from "../../types";
-
-/**
- * [Please add a description.]
- */
+import * as t from "babel-types";
export function getStatementParent(): ?NodePath {
- var path = this;
+ let path = this;
do {
if (!path.parentPath || (Array.isArray(path.container) && path.isStatement())) {
@@ -24,10 +24,6 @@ export function getStatementParent(): ?NodePath {
return path;
}
-/**
- * [Please add a description.]
- */
-
export function getOpposite() {
if (this.key === "left") {
return this.getSibling("right");
@@ -36,14 +32,10 @@ export function getOpposite() {
}
}
-/**
- * [Please add a description.]
- */
-
export function getCompletionRecords(): Array {
- var paths = [];
+ let paths = [];
- var add = function (path) {
+ let add = function (path) {
if (path) paths = paths.concat(path.getCompletionRecords());
};
@@ -67,10 +59,6 @@ export function getCompletionRecords(): Array {
return paths;
}
-/**
- * [Please add a description.]
- */
-
export function getSibling(key) {
return NodePath.get({
parentPath: this.parentPath,
@@ -81,13 +69,9 @@ export function getSibling(key) {
});
}
-/**
- * [Please add a description.]
- */
-
export function get(key: string, context?: boolean | TraversalContext): NodePath {
if (context === true) context = this.context;
- var parts = key.split(".");
+ let parts = key.split(".");
if (parts.length === 1) { // "foo"
return this._getKey(key, context);
} else { // "foo.bar"
@@ -95,13 +79,9 @@ export function get(key: string, context?: boolean | TraversalContext): NodePath
}
}
-/**
- * [Please add a description.]
- */
-
export function _getKey(key, context?) {
- var node = this.node;
- var container = node[key];
+ let node = this.node;
+ let container = node[key];
if (Array.isArray(container)) {
// requested a container so give them all the paths
@@ -124,13 +104,9 @@ export function _getKey(key, context?) {
}
}
-/**
- * [Please add a description.]
- */
-
export function _getPattern(parts, context) {
- var path = this;
- for (var part of (parts: Array)) {
+ let path = this;
+ for (let part of (parts: Array)) {
if (part === ".") {
path = path.parentPath;
} else {
@@ -144,10 +120,6 @@ export function _getPattern(parts, context) {
return path;
}
-/**
- * [Please add a description.]
- */
-
export function getBindingIdentifiers(duplicates?) {
return t.getBindingIdentifiers(this.node, duplicates);
}
diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js
new file mode 100644
index 0000000000..1469becd39
--- /dev/null
+++ b/packages/babel-traverse/src/path/index.js
@@ -0,0 +1,182 @@
+/* @flow */
+
+import type Hub from "../hub";
+import type TraversalContext from "../context";
+import * as virtualTypes from "./lib/virtual-types";
+import { PATH_CACHE_KEY } from "./constants";
+import invariant from "invariant";
+import traverse from "../index";
+import assign from "lodash/object/assign";
+import Scope from "../scope";
+import * as t from "babel-types";
+
+export default class NodePath {
+ constructor(hub: Hub, parent: Object) {
+ this.parent = parent;
+ this.hub = hub;
+ this.contexts = [];
+ this.data = {};
+ this.shouldSkip = false;
+ this.shouldStop = false;
+ this.removed = false;
+ this.state = null;
+ this.opts = null;
+ this.skipKeys = null;
+ this.parentPath = null;
+ this.context = null;
+ this.container = null;
+ this.listKey = null;
+ this.inList = false;
+ this.parentKey = null;
+ this.key = null;
+ this.node = null;
+ this.scope = null;
+ this.type = null;
+ this.typeAnnotation = null;
+ }
+
+ parent: Object;
+ hub: Hub;
+ contexts: Array;
+ data: Object;
+ shouldSkip: boolean;
+ shouldStop: boolean;
+ removed: boolean;
+ state: any;
+ opts: ?Object;
+ skipKeys: ?Object;
+ parentPath: ?NodePath;
+ context: TraversalContext;
+ container: ?Object | Array;
+ listKey: ?string;
+ inList: boolean;
+ parentKey: ?string;
+ key: ?string;
+ node: ?Object;
+ scope: Scope;
+ type: ?string;
+ typeAnnotation: ?Object;
+
+ static get({ hub, parentPath, parent, container, listKey, key }): NodePath {
+ if (!hub && parentPath) {
+ hub = parentPath.hub;
+ }
+
+ invariant(parent, "To get a node path the parent needs to exist");
+
+ let targetNode = container[key];
+
+ let paths = parent[PATH_CACHE_KEY] = parent[PATH_CACHE_KEY] || [];
+ let path;
+
+ for (let i = 0; i < paths.length; i++) {
+ let pathCheck = paths[i];
+ if (pathCheck.node === targetNode) {
+ path = pathCheck;
+ break;
+ }
+ }
+
+ if (!path) {
+ path = new NodePath(hub, parent);
+ paths.push(path);
+ }
+
+ if (!(path instanceof NodePath)) {
+ throw new Error("We found a path that isn't a NodePath instance");
+ }
+
+ path.setup(parentPath, container, listKey, key);
+
+ return path;
+ }
+
+ getScope(scope: Scope) {
+ let ourScope = scope;
+
+ // we're entering a new scope so let's construct it!
+ if (this.isScope()) {
+ ourScope = new Scope(this, scope);
+ }
+
+ return ourScope;
+ }
+
+ setData(key: string, val: any): any {
+ return this.data[key] = val;
+ }
+
+ getData(key: string, def?: any): any {
+ let val = this.data[key];
+ if (!val && def) val = this.data[key] = def;
+ return val;
+ }
+
+ buildCodeFrameError(msg: string, Error: typeof Error = SyntaxError): Error {
+ return this.hub.file.buildCodeFrameError(this.node, msg, Error);
+ }
+
+ traverse(visitor: Object, state?: any) {
+ traverse(this.node, visitor, this.scope, state, this);
+ }
+
+ mark(type: string, message: string) {
+ this.hub.file.metadata.marked.push({
+ type,
+ message,
+ loc: this.node.loc
+ });
+ }
+
+ set(key: string, node: Object) {
+ t.validate(this.node, key, node);
+ this.node[key] = node;
+ }
+
+ dump() {
+ let parts = [];
+ let path = this;
+ do {
+ let key = path.key;
+ if (path.inList) key = `${path.listKey}[${key}]`;
+ parts.unshift(key);
+ } while(path = path.parentPath);
+ console.log(parts.join("."));
+ }
+}
+
+assign(NodePath.prototype, require("./ancestry"));
+assign(NodePath.prototype, require("./inference"));
+assign(NodePath.prototype, require("./replacement"));
+assign(NodePath.prototype, require("./evaluation"));
+assign(NodePath.prototype, require("./conversion"));
+assign(NodePath.prototype, require("./introspection"));
+assign(NodePath.prototype, require("./context"));
+assign(NodePath.prototype, require("./removal"));
+assign(NodePath.prototype, require("./modification"));
+assign(NodePath.prototype, require("./family"));
+assign(NodePath.prototype, require("./comments"));
+
+for (let type of (t.TYPES: Array)) {
+ let typeKey = `is${type}`;
+ NodePath.prototype[typeKey] = function (opts) {
+ return t[typeKey](this.node, opts);
+ };
+
+ NodePath.prototype[`assert${type}`] = function (opts) {
+ if (!this[typeKey](opts)) {
+ throw new TypeError(`Expected node path of type ${type}`);
+ }
+ };
+}
+
+for (let type in virtualTypes) {
+ if (type[0] === "_") continue;
+ if (t.TYPES.indexOf(type) < 0) t.TYPES.push(type);
+
+ let virtualType = virtualTypes[type];
+
+ NodePath.prototype[`is${type}`] = function (opts) {
+ return virtualType.checkPath(this, opts);
+ };
+}
diff --git a/packages/babel-traverse/src/path/inference/index.js b/packages/babel-traverse/src/path/inference/index.js
new file mode 100644
index 0000000000..40e5c75606
--- /dev/null
+++ b/packages/babel-traverse/src/path/inference/index.js
@@ -0,0 +1,117 @@
+/* @flow */
+
+import type NodePath from "./index";
+import * as inferers from "./inferers";
+import * as t from "babel-types";
+
+/**
+ * Infer the type of the current `NodePath`.
+ */
+
+export function getTypeAnnotation(): Object {
+ if (this.typeAnnotation) return this.typeAnnotation;
+
+ let type = this._getTypeAnnotation() || t.anyTypeAnnotation();
+ if (t.isTypeAnnotation(type)) type = type.typeAnnotation;
+ return this.typeAnnotation = type;
+}
+
+/**
+ * todo: split up this method
+ */
+
+export function _getTypeAnnotation(): ?Object {
+ let node = this.node;
+
+ if (!node) {
+ // handle initializerless variables, add in checks for loop initializers too
+ if (this.key === "init" && this.parentPath.isVariableDeclarator()) {
+ let declar = this.parentPath.parentPath;
+ let declarParent = declar.parentPath;
+
+ // for (let NODE in bar) {}
+ if (declar.key === "left" && declarParent.isForInStatement()) {
+ return t.stringTypeAnnotation();
+ }
+
+ // for (let NODE of bar) {}
+ if (declar.key === "left" && declarParent.isForOfStatement()) {
+ return t.anyTypeAnnotation();
+ }
+
+ return t.voidTypeAnnotation();
+ } else {
+ return;
+ }
+ }
+
+ if (node.typeAnnotation) {
+ return node.typeAnnotation;
+ }
+
+ let inferer = inferers[node.type];
+ if (inferer) {
+ return inferer.call(this, node);
+ }
+
+ inferer = inferers[this.parentPath.type];
+ if (inferer && inferer.validParent) {
+ return this.parentPath.getTypeAnnotation();
+ }
+}
+
+export function isBaseType(baseName: string, soft?: boolean): boolean {
+ return _isBaseType(baseName, this.getTypeAnnotation(), soft);
+}
+
+function _isBaseType(baseName: string, type?, soft?): boolean {
+ if (baseName === "string") {
+ return t.isStringTypeAnnotation(type);
+ } else if (baseName === "number") {
+ return t.isNumberTypeAnnotation(type);
+ } else if (baseName === "boolean") {
+ return t.isBooleanTypeAnnotation(type);
+ } else if (baseName === "any") {
+ return t.isAnyTypeAnnotation(type);
+ } else if (baseName === "mixed") {
+ return t.isMixedTypeAnnotation(type);
+ } else if (baseName === "void") {
+ return t.isVoidTypeAnnotation(type);
+ } else {
+ if (soft) {
+ return false;
+ } else {
+ throw new Error(`Unknown base type ${baseName}`);
+ }
+ }
+}
+
+export function couldBeBaseType(name: string): boolean {
+ let type = this.getTypeAnnotation();
+ if (t.isAnyTypeAnnotation(type)) return true;
+
+ if (t.isUnionTypeAnnotation(type)) {
+ for (let type2 of (type.types: Array)) {
+ if (t.isAnyTypeAnnotation(type2) || _isBaseType(name, type2, true)) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ return _isBaseType(name, type, true);
+ }
+}
+
+export function baseTypeStrictlyMatches(right: NodePath) {
+ let left = this.getTypeAnnotation();
+ right = right.getTypeAnnotation();
+
+ if (!t.isAnyTypeAnnotation(left) && t.isFlowBaseAnnotation(left)) {
+ return right.type === left.type;
+ }
+}
+
+export function isGenericType(genericName: string): boolean {
+ let type = this.getTypeAnnotation();
+ return t.isGenericTypeAnnotation(type) && t.isIdentifier(type.id, { name: genericName });
+}
diff --git a/packages/babel-traverse/src/path/inference/inferer-reference.js b/packages/babel-traverse/src/path/inference/inferer-reference.js
new file mode 100644
index 0000000000..f3258ffde5
--- /dev/null
+++ b/packages/babel-traverse/src/path/inference/inferer-reference.js
@@ -0,0 +1,190 @@
+/* @flow */
+
+import type NodePath from "../index";
+import * as t from "babel-types";
+
+export default function (node: Object) {
+ if (!this.isReferenced()) return;
+
+ // check if a binding exists of this value and if so then return a union type of all
+ // possible types that the binding could be
+ let binding = this.scope.getBinding(node.name);
+ if (binding) {
+ if (binding.identifier.typeAnnotation) {
+ return binding.identifier.typeAnnotation;
+ } else {
+ return getTypeAnnotationBindingConstantViolations(this, node.name);
+ }
+ }
+
+ // built-in values
+ if (node.name === "undefined") {
+ return t.voidTypeAnnotation();
+ } else if (node.name === "NaN" || node.name === "Infinity") {
+ return t.numberTypeAnnotation();
+ } else if (node.name === "arguments") {
+ // todo
+ }
+}
+
+function getTypeAnnotationBindingConstantViolations(path, name) {
+ let binding = path.scope.getBinding(name);
+
+ let types = [];
+ path.typeAnnotation = t.unionTypeAnnotation(types);
+
+ let functionConstantViolations = [];
+ let constantViolations = getConstantViolationsBefore(binding, path, functionConstantViolations);
+
+ let testType = getConditionalAnnotation(path, name);
+ if (testType) {
+ let testConstantViolations = getConstantViolationsBefore(binding, testType.ifStatement);
+
+ // remove constant violations observed before the IfStatement
+ constantViolations = constantViolations.filter((path) => testConstantViolations.indexOf(path) < 0);
+
+ // clear current types and add in observed test type
+ types.push(testType.typeAnnotation);
+ }
+
+ if (constantViolations.length) {
+ // pick one constant from each scope which will represent the last possible
+ // control flow path that it could've taken/been
+ let rawConstantViolations = constantViolations.reverse();
+ let visitedScopes = [];
+ constantViolations = [];
+ for (let violation of (rawConstantViolations: Array)) {
+ let violationScope = violation.scope;
+ if (visitedScopes.indexOf(violationScope) >= 0) continue;
+
+ visitedScopes.push(violationScope);
+ constantViolations.push(violation);
+
+ if (violationScope === path.scope) {
+ constantViolations = [violation];
+ break;
+ }
+ }
+
+ // add back on function constant violations since we can't track calls
+ constantViolations = constantViolations.concat(functionConstantViolations);
+
+ // push on inferred types of violated paths
+ for (let violation of (constantViolations: Array)) {
+ types.push(violation.getTypeAnnotation());
+ }
+ }
+
+ if (types.length) {
+ return t.createUnionTypeAnnotation(types);
+ }
+}
+
+function getConstantViolationsBefore(binding, path, functions) {
+ let violations = binding.constantViolations.slice();
+ violations.unshift(binding.path);
+ return violations.filter((violation) => {
+ violation = violation.resolve();
+ let status = violation._guessExecutionStatusRelativeTo(path);
+ if (functions && status === "function") functions.push(violation);
+ return status === "before";
+ });
+}
+
+function inferAnnotationFromBinaryExpression(name, path) {
+ let operator = path.node.operator;
+
+ let right = path.get("right").resolve();
+ let left = path.get("left").resolve();
+
+ let target;
+ if (left.isIdentifier({ name })) {
+ target = right;
+ } else if (right.isIdentifier({ name })) {
+ target = left;
+ }
+ if (target) {
+ if (operator === "===") {
+ return target.getTypeAnnotation();
+ } else if (t.BOOLEAN_NUMBER_BINARY_OPERATORS.indexOf(operator) >= 0) {
+ return t.numberTypeAnnotation();
+ } else {
+ return;
+ }
+ } else {
+ if (operator !== "===") return;
+ }
+
+ //
+ let typeofPath;
+ let typePath;
+ if (left.isUnaryExpression({ operator: "typeof" })) {
+ typeofPath = left;
+ typePath = right;
+ } else if (right.isUnaryExpression({ operator: "typeof" })) {
+ typeofPath = right;
+ typePath = left;
+ }
+ if (!typePath && !typeofPath) return;
+
+ // ensure that the type path is a Literal
+ typePath = typePath.resolve();
+ if (!typePath.isLiteral()) return;
+
+ // and that it's a string so we can infer it
+ let typeValue = typePath.node.value;
+ if (typeof typeValue !== "string") return;
+
+ // and that the argument of the typeof path references us!
+ if (!typeofPath.get("argument").isIdentifier({ name })) return;
+
+ // turn type value into a type annotation
+ return t.createTypeAnnotationBasedOnTypeof(typePath.node.value);
+}
+
+function getParentConditionalPath(path) {
+ let parentPath;
+ while (parentPath = path.parentPath) {
+ if (parentPath.isIfStatement() || parentPath.isConditionalExpression()) {
+ if (path.key === "test") {
+ return;
+ } else {
+ return parentPath;
+ }
+ } else {
+ path = parentPath;
+ }
+ }
+}
+
+function getConditionalAnnotation(path, name) {
+ let ifStatement = getParentConditionalPath(path);
+ if (!ifStatement) return;
+
+ let test = ifStatement.get("test");
+ let paths = [test];
+ let types = [];
+
+ do {
+ let path = paths.shift().resolve();
+
+ if (path.isLogicalExpression()) {
+ paths.push(path.get("left"));
+ paths.push(path.get("right"));
+ }
+
+ if (path.isBinaryExpression()) {
+ let type = inferAnnotationFromBinaryExpression(name, path);
+ if (type) types.push(type);
+ }
+ } while(paths.length);
+
+ if (types.length) {
+ return {
+ typeAnnotation: t.createUnionTypeAnnotation(types),
+ ifStatement
+ };
+ } else {
+ return getConditionalAnnotation(ifStatement, name);
+ }
+}
diff --git a/packages/babel-traverse/src/path/inference/inferers.js b/packages/babel-traverse/src/path/inference/inferers.js
new file mode 100644
index 0000000000..2925d9797e
--- /dev/null
+++ b/packages/babel-traverse/src/path/inference/inferers.js
@@ -0,0 +1,170 @@
+/* @flow */
+
+import * as t from "babel-types";
+
+export { default as Identifier } from "./inferer-reference";
+
+export function VariableDeclarator() {
+ let id = this.get("id");
+
+ if (id.isIdentifier()) {
+ return this.get("init").getTypeAnnotation();
+ } else {
+ return;
+ }
+}
+
+export function TypeCastExpression(node) {
+ return node.typeAnnotation;
+}
+
+TypeCastExpression.validParent = true;
+
+export function NewExpression(node) {
+ if (this.get("callee").isIdentifier()) {
+ // only resolve identifier callee
+ return t.genericTypeAnnotation(node.callee);
+ }
+}
+
+export function TemplateLiteral() {
+ return t.stringTypeAnnotation();
+}
+
+export function UnaryExpression(node) {
+ let operator = node.operator;
+
+ if (operator === "void") {
+ return t.voidTypeAnnotation();
+ } else if (t.NUMBER_UNARY_OPERATORS.indexOf(operator) >= 0) {
+ return t.numberTypeAnnotation();
+ } else if (t.STRING_UNARY_OPERATORS.indexOf(operator) >= 0) {
+ return t.stringTypeAnnotation();
+ } else if (t.BOOLEAN_UNARY_OPERATORS.indexOf(operator) >= 0) {
+ return t.booleanTypeAnnotation();
+ }
+}
+
+export function BinaryExpression(node) {
+ let operator = node.operator;
+
+ if (t.NUMBER_BINARY_OPERATORS.indexOf(operator) >= 0) {
+ return t.numberTypeAnnotation();
+ } else if (t.BOOLEAN_BINARY_OPERATORS.indexOf(operator) >= 0) {
+ return t.booleanTypeAnnotation();
+ } else if (operator === "+") {
+ let right = this.get("right");
+ let left = this.get("left");
+
+ if (left.isBaseType("number") && right.isBaseType("number")) {
+ // both numbers so this will be a number
+ return t.numberTypeAnnotation();
+ } else if (left.isBaseType("string") || right.isBaseType("string")) {
+ // one is a string so the result will be a string
+ return t.stringTypeAnnotation();
+ }
+
+ // unsure if left and right are strings or numbers so stay on the safe side
+ return t.unionTypeAnnotation([
+ t.stringTypeAnnotation(),
+ t.numberTypeAnnotation()
+ ]);
+ }
+}
+
+export function LogicalExpression() {
+ return t.createUnionTypeAnnotation([
+ this.get("left").getTypeAnnotation(),
+ this.get("right").getTypeAnnotation()
+ ]);
+}
+
+export function ConditionalExpression() {
+ return t.createUnionTypeAnnotation([
+ this.get("consequent").getTypeAnnotation(),
+ this.get("alternate").getTypeAnnotation()
+ ]);
+}
+
+export function SequenceExpression() {
+ return this.get("expressions").pop().getTypeAnnotation();
+}
+
+export function AssignmentExpression() {
+ return this.get("right").getTypeAnnotation();
+}
+
+export function UpdateExpression(node) {
+ let operator = node.operator;
+ if (operator === "++" || operator === "--") {
+ return t.numberTypeAnnotation();
+ }
+}
+
+export function StringLiteral() {
+ return t.stringTypeAnnotation();
+}
+
+export function NumberLiteral() {
+ return t.numberTypeAnnotation();
+}
+
+export function BooleanLiteral() {
+ return t.booleanTypeAnnotation();
+}
+
+export function NullLiteral() {
+ return t.voidTypeAnnotation();
+}
+
+export function RegexLiteral() {
+ return t.genericTypeAnnotation(t.identifier("RegExp"));
+}
+
+export function ObjectExpression() {
+ return t.genericTypeAnnotation(t.identifier("Object"));
+}
+
+export function ArrayExpression() {
+ return t.genericTypeAnnotation(t.identifier("Array"));
+}
+
+export function RestElement() {
+ return ArrayExpression();
+}
+
+RestElement.validParent = true;
+
+function Func() {
+ return t.genericTypeAnnotation(t.identifier("Function"));
+}
+
+export { Func as Function, Func as Class };
+
+export function CallExpression() {
+ return resolveCall(this.get("callee"));
+}
+
+export function TaggedTemplateExpression() {
+ return resolveCall(this.get("tag"));
+}
+
+function resolveCall(callee) {
+ callee = callee.resolve();
+
+ if (callee.isFunction()) {
+ if (callee.is("async")) {
+ if (callee.is("generator")) {
+ return t.genericTypeAnnotation(t.identifier("AsyncIterator"));
+ } else {
+ return t.genericTypeAnnotation(t.identifier("Promise"));
+ }
+ } else {
+ if (callee.node.returnType) {
+ return callee.node.returnType;
+ } else {
+ // todo: get union type of all return arguments
+ }
+ }
+ }
+}
diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js
new file mode 100644
index 0000000000..a333a49ab9
--- /dev/null
+++ b/packages/babel-traverse/src/path/introspection.js
@@ -0,0 +1,395 @@
+/* @flow */
+
+// This file contains methods responsible for introspecting the current path for certain values.
+
+import type NodePath from "./index";
+import includes from "lodash/collection/includes";
+import * as t from "babel-types";
+
+/**
+ * Match the current node if it matches the provided `pattern`.
+ *
+ * For example, given the match `React.createClass` it would match the
+ * parsed nodes of `React.createClass` and `React["createClass"]`.
+ */
+
+export function matchesPattern(pattern: string, allowPartial?: boolean): boolean {
+ // not a member expression
+ if (!this.isMemberExpression()) return false;
+
+ let parts = pattern.split(".");
+ let search = [this.node];
+ let i = 0;
+
+ function matches(name) {
+ let part = parts[i];
+ return part === "*" || name === part;
+ }
+
+ while (search.length) {
+ let node = search.shift();
+
+ if (allowPartial && i === parts.length) {
+ return true;
+ }
+
+ if (t.isIdentifier(node)) {
+ // this part doesn't match
+ if (!matches(node.name)) return false;
+ } else if (t.isLiteral(node)) {
+ // this part doesn't match
+ if (!matches(node.value)) return false;
+ } else if (t.isMemberExpression(node)) {
+ if (node.computed && !t.isLiteral(node.property)) {
+ // we can't deal with this
+ return false;
+ } else {
+ search.unshift(node.property);
+ search.unshift(node.object);
+ continue;
+ }
+ } else if (t.isThisExpression(node)) {
+ if (!matches("this")) return false;
+ } else {
+ // we can't deal with this
+ return false;
+ }
+
+ // too many parts
+ if (++i > parts.length) {
+ return false;
+ }
+ }
+
+ return i === parts.length;
+}
+
+/**
+ * Check whether we have the input `key`. If the `key` references an array then we check
+ * if the array has any items, otherwise we just check if it's falsy.
+ */
+
+export function has(key): boolean {
+ let val = this.node[key];
+ if (val && Array.isArray(val)) {
+ return !!val.length;
+ } else {
+ return !!val;
+ }
+}
+
+/**
+ * Description
+ */
+
+export function isStatic() {
+ return this.scope.isStatic(this.node);
+}
+
+/**
+ * Alias of `has`.
+ */
+
+export let is = has;
+
+/**
+ * Opposite of `has`.
+ */
+
+export function isnt(key): boolean {
+ return !this.has(key);
+}
+
+/**
+ * Check whether the path node `key` strict equals `value`.
+ */
+
+export function equals(key, value): boolean {
+ return this.node[key] === value;
+}
+
+/**
+ * Check the type against our stored internal type of the node. This is handy when a node has
+ * been removed yet we still internally know the type and need it to calculate node replacement.
+ */
+
+export function isNodeType(type: string): boolean {
+ return t.isType(this.type, type);
+}
+
+/**
+ * This checks whether or now we're in one of the following positions:
+ *
+ * for (KEY in right);
+ * for (KEY;;);
+ *
+ * This is because these spots allow VariableDeclarations AND normal expressions so we need
+ * to tell the path replacement that it's ok to replace this with an expression.
+ */
+
+ export function canHaveVariableDeclarationOrExpression() {
+ return (this.key === "init" || this.key === "left") && this.parentPath.isFor();
+ }
+
+/**
+ * Check whether the current path references a completion record
+ */
+
+export function isCompletionRecord(allowInsideFunction?) {
+ let path = this;
+ let first = true;
+
+ do {
+ let container = path.container;
+
+ // we're in a function so can't be a completion record
+ if (path.isFunction() && !first) {
+ return !!allowInsideFunction;
+ }
+
+ first = false;
+
+ // check to see if we're the last item in the container and if we are
+ // we're a completion record!
+ if (Array.isArray(container) && path.key !== container.length - 1) {
+ return false;
+ }
+ } while ((path = path.parentPath) && !path.isProgram());
+
+ return true;
+}
+
+/**
+ * Check whether or not the current `key` allows either a single statement or block statement
+ * so we can explode it if necessary.
+ */
+
+export function isStatementOrBlock() {
+ if (this.parentPath.isLabeledStatement() || t.isBlockStatement(this.container)) {
+ return false;
+ } else {
+ return includes(t.STATEMENT_OR_BLOCK_KEYS, this.key);
+ }
+}
+
+/**
+ * Check if the currently assigned path references the `importName` of `moduleSource`.
+ */
+
+export function referencesImport(moduleSource, importName) {
+ if (!this.isReferencedIdentifier()) return false;
+
+ let binding = this.scope.getBinding(this.node.name);
+ if (!binding || binding.kind !== "module") return false;
+
+ let path = binding.path;
+ let parent = path.parentPath;
+ if (!parent.isImportDeclaration()) return false;
+
+ // check moduleSource
+ if (parent.node.source.value === moduleSource) {
+ if (!importName) return true;
+ } else {
+ return false;
+ }
+
+ if (path.isImportDefaultSpecifier() && importName === "default") {
+ return true;
+ }
+
+ if (path.isImportNamespaceSpecifier() && importName === "*") {
+ return true;
+ }
+
+ if (path.isImportSpecifier() && path.node.imported.name === importName) {
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Get the source code associated with this node.
+ */
+
+export function getSource() {
+ let node = this.node;
+ if (node.end) {
+ return this.hub.file.code.slice(node.start, node.end);
+ } else {
+ return "";
+ }
+}
+
+export function willIMaybeExecuteBefore(target) {
+ return this._guessExecutionStatusRelativeTo(target) !== "after";
+}
+
+/**
+ * Given a `target` check the execution status of it relative to the current path.
+ *
+ * "Execution status" simply refers to where or not we **think** this will execuete
+ * before or after the input `target` element.
+ */
+
+export function _guessExecutionStatusRelativeTo(target) {
+ // check if the two paths are in different functions, we can't track execution of these
+ let targetFuncParent = target.scope.getFunctionParent();
+ let selfFuncParent = this.scope.getFunctionParent();
+
+ if (targetFuncParent !== selfFuncParent) {
+ let status = this._guessExecutionStatusRelativeToDifferentFunctions(targetFuncParent);
+ if (status) {
+ return status;
+ } else {
+ target = targetFuncParent.path;
+ }
+ }
+
+ let targetPaths = target.getAncestry();
+ if (targetPaths.indexOf(this) >= 0) return "after";
+
+ let selfPaths = this.getAncestry();
+
+ // get ancestor where the branches intersect
+ let commonPath;
+ let targetIndex;
+ let selfIndex;
+ for (selfIndex = 0; selfIndex < selfPaths.length; selfIndex++) {
+ let selfPath = selfPaths[selfIndex];
+ targetIndex = targetPaths.indexOf(selfPath);
+ if (targetIndex >= 0) {
+ commonPath = selfPath;
+ break;
+ }
+ }
+ if (!commonPath) {
+ return "before";
+ }
+
+ // get the relationship paths that associate these nodes to their common ancestor
+ let targetRelationship = targetPaths[targetIndex - 1];
+ let selfRelationship = selfPaths[selfIndex - 1];
+ if (!targetRelationship || !selfRelationship) {
+ return "before";
+ }
+
+ // container list so let's see which one is after the other
+ if (targetRelationship.listKey && targetRelationship.container === selfRelationship.container) {
+ return targetRelationship.key > selfRelationship.key ? "before" : "after";
+ }
+
+ // otherwise we're associated by a parent node, check which key comes before the other
+ let targetKeyPosition = t.VISITOR_KEYS[targetRelationship.type].indexOf(targetRelationship.key);
+ let selfKeyPosition = t.VISITOR_KEYS[selfRelationship.type].indexOf(selfRelationship.key);
+ return targetKeyPosition > selfKeyPosition ? "before" : "after";
+}
+
+export function _guessExecutionStatusRelativeToDifferentFunctions(targetFuncParent) {
+ let targetFuncPath = targetFuncParent.path;
+ if (!targetFuncPath.isFunctionDeclaration()) return;
+
+ // so we're in a completely different function, if this is a function declaration
+ // then we can be a bit smarter and handle cases where the function is either
+ // a. not called at all (part of an export)
+ // b. called directly
+ let binding = targetFuncPath.scope.getBinding(targetFuncPath.node.id.name);
+
+ // no references!
+ if (!binding.references) return "before";
+
+ let referencePaths: Array = binding.referencePaths;
+
+ // verify that all of the references are calls
+ for (let path of referencePaths) {
+ if (path.key !== "callee" || !path.parentPath.isCallExpression()) {
+ return;
+ }
+ }
+
+ let allStatus;
+
+ // verify that all the calls have the same execution status
+ for (let path of referencePaths) {
+ let status = this._guessExecutionStatusRelativeTo(path);
+ if (allStatus) {
+ if (allStatus !== status) return;
+ } else {
+ allStatus = status;
+ }
+ }
+
+ return allStatus;
+}
+
+/**
+ * Resolve a "pointer" `NodePath` to it's absolute path.
+ */
+
+export function resolve(dangerous, resolved) {
+ return this._resolve(dangerous, resolved) || this;
+}
+
+export function _resolve(dangerous?, resolved?): ?NodePath {
+ // detect infinite recursion
+ // todo: possibly have a max length on this just to be safe
+ if (resolved && resolved.indexOf(this) >= 0) return;
+
+ // we store all the paths we've "resolved" in this array to prevent infinite recursion
+ resolved = resolved || [];
+ resolved.push(this);
+
+ if (this.isVariableDeclarator()) {
+ if (this.get("id").isIdentifier()) {
+ return this.get("init").resolve(dangerous, resolved);
+ } else {
+ // otherwise it's a request for a pattern and that's a bit more tricky
+ }
+ } else if (this.isReferencedIdentifier()) {
+ let binding = this.scope.getBinding(this.node.name);
+ if (!binding) return;
+
+ // reassigned so we can't really resolve it
+ if (!binding.constant) return;
+
+ // todo - lookup module in dependency graph
+ if (binding.kind === "module") return;
+
+ if (binding.path !== this) {
+ return binding.path.resolve(dangerous, resolved);
+ }
+ } else if (this.isTypeCastExpression()) {
+ return this.get("expression").resolve(dangerous, resolved);
+ } else if (dangerous && this.isMemberExpression()) {
+ // this is dangerous, as non-direct target assignments will mutate it's state
+ // making this resolution inaccurate
+
+ let targetKey = this.toComputedKey();
+ if (!t.isLiteral(targetKey)) return;
+
+ let targetName = targetKey.value;
+
+ let target = this.get("object").resolve(dangerous, resolved);
+
+ if (target.isObjectExpression()) {
+ let props = target.get("properties");
+ for (let prop of (props: Array)) {
+ if (!prop.isProperty()) continue;
+
+ let key = prop.get("key");
+
+ // { foo: obj }
+ let match = prop.isnt("computed") && key.isIdentifier({ name: targetName });
+
+ // { "foo": "obj" } or { ["foo"]: "obj" }
+ match = match || key.isLiteral({ value: targetName });
+
+ if (match) return prop.get("value").resolve(dangerous, resolved);
+ }
+ } else if (target.isArrayExpression() && !isNaN(+targetName)) {
+ let elems = target.get("elements");
+ let elem = elems[targetName];
+ if (elem) return elem.resolve(dangerous, resolved);
+ }
+ }
+}
diff --git a/packages/babel-traverse/src/path/lib/hoister.js b/packages/babel-traverse/src/path/lib/hoister.js
new file mode 100644
index 0000000000..669f4f0f79
--- /dev/null
+++ b/packages/babel-traverse/src/path/lib/hoister.js
@@ -0,0 +1,135 @@
+/* @flow */
+
+import { react } from "babel-types";
+import * as t from "babel-types";
+
+let referenceVisitor = {
+ ReferencedIdentifier(path, state) {
+ if (path.isJSXIdentifier() && react.isCompatTag(path.node.name)) {
+ return;
+ }
+
+ // direct references that we need to track to hoist this to the highest scope we can
+ let binding = path.scope.getBinding(path.node.name);
+ if (!binding) return;
+
+ // this binding isn't accessible from the parent scope so we can safely ignore it
+ // eg. it's in a closure etc
+ if (binding !== state.scope.getBinding(path.node.name)) return;
+
+ if (binding.constant) {
+ state.bindings[path.node.name] = binding;
+ } else {
+ for (let violationPath of (binding.constantViolations: Array)) {
+ state.breakOnScopePaths = state.breakOnScopePaths.concat(violationPath.getAncestry());
+ }
+ }
+ }
+};
+
+export default class PathHoister {
+ constructor(path, scope) {
+ this.breakOnScopePaths = [];
+ this.bindings = {};
+ this.scopes = [];
+ this.scope = scope;
+ this.path = path;
+ }
+
+ isCompatibleScope(scope) {
+ for (let key in this.bindings) {
+ let binding = this.bindings[key];
+ if (!scope.bindingIdentifierEquals(key, binding.identifier)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ getCompatibleScopes() {
+ let scope = this.path.scope;
+ do {
+ if (this.isCompatibleScope(scope)) {
+ this.scopes.push(scope);
+ } else {
+ break;
+ }
+
+ if (this.breakOnScopePaths.indexOf(scope.path) >= 0) {
+ break;
+ }
+ } while(scope = scope.parent);
+ }
+
+ getAttachmentPath() {
+ let scopes = this.scopes;
+
+ let scope = scopes.pop();
+ if (!scope) return;
+
+ if (scope.path.isFunction()) {
+ if (this.hasOwnParamBindings(scope)) {
+ // should ignore this scope since it's ourselves
+ if (this.scope === scope) return;
+
+ // needs to be attached to the body
+ return scope.path.get("body").get("body")[0];
+ } else {
+ // doesn't need to be be attached to this scope
+ return this.getNextScopeStatementParent();
+ }
+ } else if (scope.path.isProgram()) {
+ return this.getNextScopeStatementParent();
+ }
+ }
+
+ getNextScopeStatementParent() {
+ let scope = this.scopes.pop();
+ if (scope) return scope.path.getStatementParent();
+ }
+
+ hasOwnParamBindings(scope) {
+ for (let name in this.bindings) {
+ if (!scope.hasOwnBinding(name)) continue;
+
+ let binding = this.bindings[name];
+ if (binding.kind === "param") return true;
+ }
+ return false;
+ }
+
+ run() {
+ let node = this.path.node;
+ if (node._hoisted) return;
+ node._hoisted = true;
+
+ this.path.traverse(referenceVisitor, this);
+
+ this.getCompatibleScopes();
+
+ let attachTo = this.getAttachmentPath();
+ if (!attachTo) return;
+
+ // don't bother hoisting to the same function as this will cause multiple branches to be evaluated more than once leading to a bad optimisation
+ if (attachTo.getFunctionParent() === this.path.getFunctionParent()) return;
+
+ let uid = attachTo.scope.generateUidIdentifier("ref");
+
+ attachTo.insertBefore([
+ t.variableDeclaration("var", [
+ t.variableDeclarator(uid, this.path.node)
+ ])
+ ]);
+
+ let parent = this.path.parentPath;
+
+ if (parent.isJSXElement() && this.path.container === parent.node.children) {
+ // turning the `span` in `
` to an expression so we need to wrap it with
+ // an expression container
+ uid = t.JSXExpressionContainer(uid);
+ }
+
+ this.path.replaceWith(uid);
+ }
+}
diff --git a/packages/babel-traverse/src/path/lib/removal-hooks.js b/packages/babel-traverse/src/path/lib/removal-hooks.js
new file mode 100644
index 0000000000..eb51a0123e
--- /dev/null
+++ b/packages/babel-traverse/src/path/lib/removal-hooks.js
@@ -0,0 +1,70 @@
+/* @flow */
+
+// this file contains hooks that handle ancestry cleanup of parent nodes when removing children
+
+/**
+ * Pre hooks should be used for either rejecting removal or delegating removal
+ */
+
+export let hooks = [
+ function (self, parent) {
+ if (self.key === "body" && parent.isArrowFunctionExpression()) {
+ self.replaceWith(self.scope.buildUndefinedNode());
+ return true;
+ }
+ },
+
+ function (self, parent) {
+ let removeParent = false;
+
+ // while (NODE);
+ // removing the test of a while/switch, we can either just remove it entirely *or* turn the `test` into `true`
+ // unlikely that the latter will ever be what's wanted so we just remove the loop to avoid infinite recursion
+ removeParent = removeParent || (self.key === "test" && (parent.isWhile() || parent.isSwitchCase()));
+
+ // export NODE;
+ // just remove a declaration for an export as this is no longer valid
+ removeParent = removeParent || (self.key === "declaration" && parent.isExportDeclaration());
+
+ // label: NODE
+ // stray labeled statement with no body
+ removeParent = removeParent || (self.key === "body" && parent.isLabeledStatement());
+
+ // let NODE;
+ // remove an entire declaration if there are no declarators left
+ removeParent = removeParent || (self.listKey === "declarations" && parent.isVariableDeclaration() && parent.node.declarations.length === 1);
+
+ // NODE;
+ // remove the entire expression statement if there's no expression
+ removeParent = removeParent || (self.key === "expression" && parent.isExpressionStatement());
+
+ if (removeParent) {
+ parent.remove();
+ return true;
+ }
+ },
+
+ function (self, parent) {
+ if (parent.isSequenceExpression() && parent.node.expressions.length === 1) {
+ // (node, NODE);
+ // we've just removed the second element of a sequence expression so let's turn that sequence
+ // expression into a regular expression
+ parent.replaceWith(parent.node.expressions[0]);
+ return true;
+ }
+ },
+
+ function (self, parent) {
+ if (parent.isBinary()) {
+ // left + NODE;
+ // NODE + right;
+ // we're in a binary expression, better remove it and replace it with the last expression
+ if (self.key === "left") {
+ parent.replaceWith(parent.node.right);
+ } else { // key === "right"
+ parent.replaceWith(parent.node.left);
+ }
+ return true;
+ }
+ }
+];
diff --git a/packages/babel-traverse/src/path/lib/virtual-types.js b/packages/babel-traverse/src/path/lib/virtual-types.js
new file mode 100644
index 0000000000..ce92ed1276
--- /dev/null
+++ b/packages/babel-traverse/src/path/lib/virtual-types.js
@@ -0,0 +1,122 @@
+/* @flow */
+
+import type NodePath from "../index";
+import { react } from "babel-types";
+import * as t from "babel-types";
+
+export let ReferencedIdentifier = {
+ types: ["Identifier", "JSXIdentifier"],
+ checkPath({ node, parent }: NodePath, opts?: Object): boolean {
+ if (!t.isIdentifier(node, opts)) {
+ if (t.isJSXIdentifier(node, opts)) {
+ if (react.isCompatTag(node.name)) return false;
+ } else {
+ // not a JSXIdentifier or an Identifier
+ return false;
+ }
+ }
+
+ // check if node is referenced
+ return t.isReferenced(node, parent);
+ }
+};
+
+export let ReferencedMemberExpression = {
+ types: ["MemberExpression"],
+ checkPath({ node, parent }) {
+ return t.isMemberExpression(node) && t.isReferenced(node, parent);
+ }
+};
+
+export let BindingIdentifier = {
+ types: ["Identifier"],
+ checkPath({ node, parent }: NodePath): boolean {
+ return t.isIdentifier(node) && t.isBinding(node, parent);
+ }
+};
+
+export let Statement = {
+ types: ["Statement"],
+ checkPath({ node, parent }: NodePath): boolean {
+ if (t.isStatement(node)) {
+ if (t.isVariableDeclaration(node)) {
+ if (t.isForXStatement(parent, { left: node })) return false;
+ if (t.isForStatement(parent, { init: node })) return false;
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+};
+
+export let Expression = {
+ types: ["Expression"],
+ checkPath(path: NodePath): boolean {
+ if (path.isIdentifier()) {
+ return path.isReferencedIdentifier();
+ } else {
+ return t.isExpression(path.node);
+ }
+ }
+};
+
+export let Scope = {
+ types: ["Scopable"],
+ checkPath(path) {
+ return t.isScope(path.node, path.parent);
+ }
+};
+
+export let Referenced = {
+ checkPath(path: NodePath): boolean {
+ return t.isReferenced(path.node, path.parent);
+ }
+};
+
+export let BlockScoped = {
+ checkPath(path: NodePath): boolean {
+ return t.isBlockScoped(path.node);
+ }
+};
+
+export let Var = {
+ types: ["VariableDeclaration"],
+ checkPath(path: NodePath): boolean {
+ return t.isVar(path.node);
+ }
+};
+
+export let User = {
+ checkPath(path: NodePath): boolean {
+ return path.node && !!path.node.loc;
+ }
+};
+
+export let Generated = {
+ checkPath(path: NodePath): boolean {
+ return !path.isUser();
+ }
+};
+
+export let Pure = {
+ checkPath(path: NodePath, opts?): boolean {
+ return path.scope.isPure(path.node, opts);
+ }
+};
+
+export let Flow = {
+ types: ["Flow", "ImportDeclaration", "ExportDeclaration"],
+ checkPath({ node }: NodePath): boolean {
+ if (t.isFlow(node)) {
+ return true;
+ } else if (t.isImportDeclaration(node)) {
+ return node.importKind === "type" || node.importKind === "typeof";
+ } else if (t.isExportDeclaration(node)) {
+ return node.exportKind === "type";
+ } else {
+ return false;
+ }
+ }
+};
diff --git a/packages/babel/src/traversal/path/modification.js b/packages/babel-traverse/src/path/modification.js
similarity index 75%
rename from packages/babel/src/traversal/path/modification.js
rename to packages/babel-traverse/src/path/modification.js
index 9048b64339..d05b9f2b56 100644
--- a/packages/babel/src/traversal/path/modification.js
+++ b/packages/babel-traverse/src/path/modification.js
@@ -1,6 +1,11 @@
+/* @flow */
+
+// This file contains methods that modify the path/node in some ways.
+
+import { PATH_CACHE_KEY } from "./constants";
import PathHoister from "./lib/hoister";
import NodePath from "./index";
-import * as t from "../../types";
+import * as t from "babel-types";
/**
* Insert the provided nodes before the current one.
@@ -22,7 +27,7 @@ export function insertBefore(nodes) {
return this._containerInsertBefore(nodes);
} else if (this.isStatementOrBlock()) {
if (this.node) nodes.push(this.node);
- this.node = this.container[this.key] = t.blockStatement(nodes);
+ this._replaceWith(t.blockStatement(nodes));
} else {
throw new Error("We don't know what to do with this node type. We were previously a Statement but we can't fit in here?");
}
@@ -31,24 +36,19 @@ export function insertBefore(nodes) {
return [this];
}
-/**
- * [Please add a description.]
- */
-
export function _containerInsert(from, nodes) {
this.updateSiblingKeys(from, nodes.length);
- var paths = [];
+ let paths = [];
- for (var i = 0; i < nodes.length; i++) {
- var to = from + i;
- var node = nodes[i];
+ for (let i = 0; i < nodes.length; i++) {
+ let to = from + i;
+ let node = nodes[i];
this.container.splice(to, 0, node);
if (this.context) {
- var path = this.context.create(this.parent, this.container, to, this.listKey);
+ let path = this.context.create(this.parent, this.container, to, this.listKey);
paths.push(path);
- this.queueNode(path);
} else {
paths.push(NodePath.get({
parentPath: this,
@@ -60,32 +60,37 @@ export function _containerInsert(from, nodes) {
}
}
+ let contexts = this.contexts;
+ let path = this;
+ while (!contexts.length) {
+ path = path.parentPath;
+ contexts = path.contexts;
+ }
+
+ for (let path of paths) {
+ path.setScope();
+
+ for (let context of contexts) {
+ context.maybeQueue(path);
+ }
+ }
+
return paths;
}
-/**
- * [Please add a description.]
- */
-
export function _containerInsertBefore(nodes) {
return this._containerInsert(this.key, nodes);
}
-/**
- * [Please add a description.]
- */
-
export function _containerInsertAfter(nodes) {
return this._containerInsert(this.key + 1, nodes);
}
-/**
- * [Please add a description.]
- */
-
export function _maybePopFromStatements(nodes) {
- var last = nodes[nodes.length - 1];
- if (t.isExpressionStatement(last) && t.isIdentifier(last.expression) && !this.isCompletionRecord()) {
+ let last = nodes[nodes.length - 1];
+ let isIdentifier = t.isIdentifier(last) || (t.isExpressionStatement(last) && t.isIdentifier(last.expression));
+
+ if (isIdentifier && !this.isCompletionRecord()) {
nodes.pop();
}
}
@@ -104,7 +109,7 @@ export function insertAfter(nodes) {
return this.parentPath.insertAfter(nodes);
} else if (this.isNodeType("Expression") || (this.parentPath.isForStatement() && this.key === "init")) {
if (this.node) {
- var temp = this.scope.generateDeclaredUidIdentifier();
+ let temp = this.scope.generateDeclaredUidIdentifier();
nodes.unshift(t.expressionStatement(t.assignmentExpression("=", temp, this.node)));
nodes.push(t.expressionStatement(temp));
}
@@ -115,7 +120,7 @@ export function insertAfter(nodes) {
return this._containerInsertAfter(nodes);
} else if (this.isStatementOrBlock()) {
if (this.node) nodes.unshift(this.node);
- this.node = this.container[this.key] = t.blockStatement(nodes);
+ this._replaceWith(t.blockStatement(nodes));
} else {
throw new Error("We don't know what to do with this node type. We were previously a Statement but we can't fit in here?");
}
@@ -129,8 +134,10 @@ export function insertAfter(nodes) {
*/
export function updateSiblingKeys(fromIndex, incrementBy) {
- var paths = this.parent._paths;
- for (var i = 0; i < paths.length; i++) {
+ if (!this.parent) return;
+
+ let paths = this.parent[PATH_CACHE_KEY];
+ for (let i = 0; i < paths.length; i++) {
let path = paths[i];
if (path.key >= fromIndex) {
path.key += incrementBy;
@@ -138,17 +145,17 @@ export function updateSiblingKeys(fromIndex, incrementBy) {
}
}
-/**
- * [Please add a description.]
- */
-
export function _verifyNodeList(nodes) {
+ if (!nodes) {
+ return [];
+ }
+
if (nodes.constructor !== Array) {
nodes = [nodes];
}
- for (var i = 0; i < nodes.length; i++) {
- var node = nodes[i];
+ for (let i = 0; i < nodes.length; i++) {
+ let node = nodes[i];
if (!node) {
throw new Error(`Node list has falsy node with the index of ${i}`);
} else if (typeof node !== "object") {
@@ -163,10 +170,6 @@ export function _verifyNodeList(nodes) {
return nodes;
}
-/**
- * [Please add a description.]
- */
-
export function unshiftContainer(listKey, nodes) {
this._assertUnremoved();
@@ -174,12 +177,10 @@ export function unshiftContainer(listKey, nodes) {
// get the first path and insert our nodes before it, if it doesn't exist then it
// doesn't matter, our nodes will be inserted anyway
-
- var container = this.node[listKey];
- var path = NodePath.get({
+ let path = NodePath.get({
parentPath: this,
parent: this.node,
- container: container,
+ container: this.node[listKey],
listKey,
key: 0
});
@@ -187,10 +188,6 @@ export function unshiftContainer(listKey, nodes) {
return path.insertBefore(nodes);
}
-/**
- * [Please add a description.]
- */
-
export function pushContainer(listKey, nodes) {
this._assertUnremoved();
@@ -199,17 +196,16 @@ export function pushContainer(listKey, nodes) {
// get an invisible path that represents the last node + 1 and replace it with our
// nodes, effectively inlining it
- var container = this.node[listKey];
- var i = container.length;
- var path = NodePath.get({
+ let container = this.node[listKey];
+ let path = NodePath.get({
parentPath: this,
parent: this.node,
container: container,
listKey,
- key: i
+ key: container.length
});
- return path.replaceWith(nodes, true);
+ return path.replaceWithMultiple(nodes);
}
/**
@@ -218,6 +214,6 @@ export function pushContainer(listKey, nodes) {
*/
export function hoist(scope = this.scope) {
- var hoister = new PathHoister(this, scope);
+ let hoister = new PathHoister(this, scope);
return hoister.run();
}
diff --git a/packages/babel-traverse/src/path/removal.js b/packages/babel-traverse/src/path/removal.js
new file mode 100644
index 0000000000..3e654a3a67
--- /dev/null
+++ b/packages/babel-traverse/src/path/removal.js
@@ -0,0 +1,47 @@
+/* @flow */
+
+// This file contains methods responsible for removing a node.
+
+import { hooks } from "./lib/removal-hooks";
+
+export function remove() {
+ this._assertUnremoved();
+
+ this.resync();
+
+ if (this._callRemovalHooks()) {
+ this._markRemoved();
+ return;
+ }
+
+ this.shareCommentsWithSiblings();
+ this._remove();
+ this._markRemoved();
+}
+
+export function _callRemovalHooks() {
+ for (let fn of (hooks: Array)) {
+ if (fn(this, this.parentPath)) return true;
+ }
+}
+
+export function _remove() {
+ if (Array.isArray(this.container)) {
+ this.container.splice(this.key, 1);
+ this.updateSiblingKeys(this.key, -1);
+ } else {
+ this._replaceWith(null);
+ }
+}
+
+export function _markRemoved() {
+ this.shouldSkip = true;
+ this.removed = true;
+ this.node = null;
+}
+
+export function _assertUnremoved() {
+ if (this.removed) {
+ throw this.buildCodeFrameError("NodePath has been removed so is read-only.");
+ }
+}
diff --git a/packages/babel-traverse/src/path/replacement.js b/packages/babel-traverse/src/path/replacement.js
new file mode 100644
index 0000000000..fca7bd27f2
--- /dev/null
+++ b/packages/babel-traverse/src/path/replacement.js
@@ -0,0 +1,241 @@
+/* @flow */
+
+// This file contains methods responsible for replacing a node with another.
+
+import codeFrame from "babel-code-frame";
+import traverse from "../index";
+import NodePath from "./index";
+import { parse } from "babylon";
+import * as t from "babel-types";
+
+let hoistVariablesVisitor = {
+ Function(path) {
+ path.skip();
+ },
+
+ VariableDeclaration(path) {
+ if (path.node.kind !== "var") return;
+
+ let bindings = path.getBindingIdentifiers();
+ for (let key in bindings) {
+ path.scope.push({ id: bindings[key] });
+ }
+
+ let exprs = [];
+
+ for (let declar of (path.node.declarations: Array)) {
+ if (declar.init) {
+ exprs.push(t.expressionStatement(
+ t.assignmentExpression("=", declar.id, declar.init)
+ ));
+ }
+ }
+
+ path.replaceWithMultiple(exprs);
+ }
+};
+
+/**
+ * Replace a node with an array of multiple. This method performs the following steps:
+ *
+ * - Inherit the comments of first provided node with that of the current node.
+ * - Insert the provided nodes after the current node.
+ * - Remove the current node.
+ */
+
+export function replaceWithMultiple(nodes: Array) {
+ this.resync();
+
+ nodes = this._verifyNodeList(nodes);
+ t.inheritLeadingComments(nodes[0], this.node);
+ t.inheritTrailingComments(nodes[nodes.length - 1], this.node);
+ this.node = this.container[this.key] = null;
+ this.insertAfter(nodes);
+
+ if (this.node) {
+ this.requeue();
+ } else {
+ this.remove();
+ }
+}
+
+/**
+ * Parse a string as an expression and replace the current node with the result.
+ *
+ * NOTE: This is typically not a good idea to use. Building source strings when
+ * transforming ASTs is an antipattern and SHOULD NOT be encouraged. Even if it's
+ * easier to use, your transforms will be extremely brittle.
+ */
+
+export function replaceWithSourceString(replacement) {
+ this.resync();
+
+ try {
+ replacement = `(${replacement})`;
+ replacement = parse(replacement);
+ } catch (err) {
+ let loc = err.loc;
+ if (loc) {
+ err.message += " - make sure this is an expression.";
+ err.message += "\n" + codeFrame(replacement, loc.line, loc.column + 1);
+ }
+ throw err;
+ }
+
+ replacement = replacement.program.body[0].expression;
+ traverse.removeProperties(replacement);
+ return this.replaceWith(replacement);
+}
+
+/**
+ * Replace the current node with another.
+ */
+
+export function replaceWith(replacement) {
+ this.resync();
+
+ if (this.removed) {
+ throw new Error("You can't replace this node, we've already removed it");
+ }
+
+ if (replacement instanceof NodePath) {
+ replacement = replacement.node;
+ }
+
+ if (!replacement) {
+ throw new Error("You passed `path.replaceWith()` a falsy node, use `path.remove()` instead");
+ }
+
+ if (this.node === replacement) {
+ return;
+ }
+
+ if (this.isProgram() && !t.isProgram(replacement)) {
+ throw new Error("You can only replace a Program root node with another Program node");
+ }
+
+ if (Array.isArray(replacement)) {
+ throw new Error("Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`");
+ }
+
+ if (typeof replacement === "string") {
+ throw new Error("Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`");
+ }
+
+ // replacing a statement with an expression so wrap it in an expression statement
+ if (this.isNodeType("Statement") && t.isExpression(replacement) && !this.canHaveVariableDeclarationOrExpression()) {
+ replacement = t.expressionStatement(replacement);
+ }
+
+ // replacing an expression with a statement so let's explode it
+ if (this.isNodeType("Expression") && t.isStatement(replacement)) {
+ return this.replaceExpressionWithStatements([replacement]);
+ }
+
+ let oldNode = this.node;
+ if (oldNode) {
+ t.inheritsComments(replacement, oldNode);
+ t.removeComments(oldNode);
+ }
+
+ // replace the node
+ this._replaceWith(replacement);
+ this.type = replacement.type;
+
+ // potentially create new scope
+ this.setScope();
+
+ // requeue for visiting
+ this.requeue();
+}
+
+/**
+ * Description
+ */
+
+export function _replaceWith(node) {
+ if (!this.container) {
+ throw new ReferenceError("Container is falsy");
+ }
+
+ if (this.inList) {
+ t.validate(this.parent, this.key, [node]);
+ } else {
+ t.validate(this.parent, this.key, node);
+ }
+
+ this.node = this.container[this.key] = node;
+}
+
+/**
+ * This method takes an array of statements nodes and then explodes it
+ * into expressions. This method retains completion records which is
+ * extremely important to retain original semantics.
+ */
+
+export function replaceExpressionWithStatements(nodes: Array) {
+ this.resync();
+
+ let toSequenceExpression = t.toSequenceExpression(nodes, this.scope);
+
+ if (t.isSequenceExpression(toSequenceExpression)) {
+ let exprs = toSequenceExpression.expressions;
+
+ if (exprs.length >= 2 && this.parentPath.isExpressionStatement()) {
+ this._maybePopFromStatements(exprs);
+ }
+
+ // could be just one element due to the previous maybe popping
+ if (exprs.length === 1) {
+ this.replaceWith(exprs[0]);
+ } else {
+ this.replaceWith(toSequenceExpression);
+ }
+ } else if (toSequenceExpression) {
+ this.replaceWith(toSequenceExpression);
+ } else {
+ let container = t.functionExpression(null, [], t.blockStatement(nodes));
+ container.shadow = true;
+
+ this.replaceWith(t.callExpression(container, []));
+ this.traverse(hoistVariablesVisitor);
+
+ // add implicit returns to all ending expression statements
+ let completionRecords: Array = this.get("callee").getCompletionRecords();
+ for (let path of completionRecords) {
+ if (!path.isExpressionStatement()) continue;
+
+ let loop = path.findParent((path) => path.isLoop());
+ if (loop) {
+ let callee = this.get("callee");
+
+ let uid = callee.scope.generateDeclaredUidIdentifier("ret");
+ callee.get("body").pushContainer("body", t.returnStatement(uid));
+
+ path.get("expression").replaceWith(
+ t.assignmentExpression("=", uid, path.node.expression)
+ );
+ } else {
+ path.replaceWith(t.returnStatement(path.node.expression));
+ }
+ }
+
+ return this.node;
+ }
+}
+
+export function replaceInline(nodes: Object | Array) {
+ this.resync();
+
+ if (Array.isArray(nodes)) {
+ if (Array.isArray(this.container)) {
+ nodes = this._verifyNodeList(nodes);
+ this._containerInsertAfter(nodes);
+ return this.remove();
+ } else {
+ return this.replaceWithMultiple(nodes);
+ }
+ } else {
+ return this.replaceWith(nodes);
+ }
+}
diff --git a/packages/babel/src/traversal/scope/binding.js b/packages/babel-traverse/src/scope/binding.js
similarity index 76%
rename from packages/babel/src/traversal/scope/binding.js
rename to packages/babel-traverse/src/scope/binding.js
index 0ccd33b38f..fc1f69100e 100644
--- a/packages/babel/src/traversal/scope/binding.js
+++ b/packages/babel-traverse/src/scope/binding.js
@@ -1,3 +1,7 @@
+/* @flow */
+
+import type NodePath from "../path";
+
/**
* This class is responsible for a binding inside of a scope.
*
@@ -11,20 +15,17 @@
export default class Binding {
constructor({ existing, identifier, scope, path, kind }) {
- this.constantViolations = [];
- this.constant = true;
-
this.identifier = identifier;
- this.references = 0;
+ this.scope = scope;
+ this.path = path;
+ this.kind = kind;
+
+ this.constantViolations = [];
+ this.constant = true;
+
+ this.referencePaths = [];
this.referenced = false;
-
- this.scope = scope;
- this.path = path;
- this.kind = kind;
-
- this.hasValue = false;
- this.hasDeoptedValue = false;
- this.value = null;
+ this.references = 0;
this.clearValue();
@@ -37,29 +38,29 @@ export default class Binding {
}
}
- /**
- * [Please add a description.]
- */
+
+ constantViolations: Array;
+ constant: boolean;
+
+ referencePaths: Array;
+ referenced: boolean;
+ references: number;
+
+ hasDeoptedValue: boolean;
+ hasValue: boolean;
+ value: any;
deoptValue() {
this.clearValue();
this.hasDeoptedValue = true;
}
- /**
- * [Please add a description.]
- */
-
setValue(value: any) {
if (this.hasDeoptedValue) return;
this.hasValue = true;
this.value = value;
}
- /**
- * [Please add a description.]
- */
-
clearValue() {
this.hasDeoptedValue = false;
this.hasValue = false;
@@ -79,9 +80,10 @@ export default class Binding {
* Increment the amount of references to this binding.
*/
- reference() {
+ reference(path: NodePath) {
this.referenced = true;
this.references++;
+ this.referencePaths.push(path)
}
/**
diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js
new file mode 100644
index 0000000000..897730f7ef
--- /dev/null
+++ b/packages/babel-traverse/src/scope/index.js
@@ -0,0 +1,893 @@
+/* @flow */
+
+import includes from "lodash/collection/includes";
+import repeating from "repeating";
+import Renamer from "./lib/renamer";
+import type NodePath from "../path";
+import traverse from "../index";
+import defaults from "lodash/object/defaults";
+import * as messages from "babel-messages";
+import Binding from "./binding";
+import globals from "globals";
+import extend from "lodash/object/extend";
+import * as t from "babel-types";
+
+const SCOPE_INFO_CACHE_KEY = "_scopeInfo"; //Symbol();
+
+let collectorVisitor = {
+ For(path) {
+ for (let key of (t.FOR_INIT_KEYS: Array)) {
+ let declar = path.get(key);
+ if (declar.isVar()) path.scope.getFunctionParent().registerBinding("var", declar);
+ }
+ },
+
+ Declaration(path) {
+ // delegate block scope handling to the `blockVariableVisitor`
+ if (path.isBlockScoped()) return;
+
+ // this will be hit again once we traverse into it after this iteration
+ if (path.isExportDeclaration() && path.get("declaration").isDeclaration()) return;
+
+ // we've ran into a declaration!
+ path.scope.getFunctionParent().registerDeclaration(path);
+ },
+
+ ReferencedIdentifier(path, state) {
+ state.references.push(path);
+ },
+
+ ForXStatement(path, state) {
+ let left = path.get("left");
+ if (left.isPattern() || left.isIdentifier()) {
+ state.constantViolations.push(left);
+ }
+ },
+
+ ExportDeclaration: {
+ exit({ node, scope }) {
+ let declar = node.declaration;
+ if (t.isClassDeclaration(declar) || t.isFunctionDeclaration(declar)) {
+ let id = declar.id;
+ if (!id) return;
+
+ let binding = scope.getBinding(id.name);
+ if (binding) binding.reference();
+ } else if (t.isVariableDeclaration(declar)) {
+ for (let decl of (declar.declarations: Array)) {
+ let ids = t.getBindingIdentifiers(decl);
+ for (let name in ids) {
+ let binding = scope.getBinding(name);
+ if (binding) binding.reference();
+ }
+ }
+ }
+ }
+ },
+
+ LabeledStatement(path) {
+ path.scope.getProgramParent().addGlobal(path.node);
+ path.scope.getBlockParent().registerDeclaration(path);
+ },
+
+ AssignmentExpression(path, state) {
+ state.assignments.push(path);
+ },
+
+ UpdateExpression(path, state) {
+ state.constantViolations.push(path.get("argument"));
+ },
+
+ UnaryExpression(path, state) {
+ if (path.node.operator === "delete") {
+ state.constantViolations.push(path.get("argument"));
+ }
+ },
+
+ BlockScoped(path) {
+ let scope = path.scope;
+ if (scope.path === path) scope = scope.parent;
+ scope.getBlockParent().registerDeclaration(path);
+ },
+
+ ClassDeclaration(path) {
+ let id = path.node.id;
+ if (!id) return;
+
+ let name = id.name;
+ path.scope.bindings[name] = path.scope.getBinding(name);
+ },
+
+ Block(path) {
+ let paths = path.get("body");
+ for (let bodyPath of (paths: Array)) {
+ if (bodyPath.isFunctionDeclaration()) {
+ path.scope.getBlockParent().registerDeclaration(bodyPath);
+ }
+ }
+ }
+};
+
+export default class Scope {
+
+ /**
+ * This searches the current "scope" and collects all references/bindings
+ * within.
+ */
+
+ constructor(path: NodePath, parent?: Scope) {
+ if (parent && parent.block === path.node) {
+ return parent;
+ }
+
+ let cached = path.getData("scope");
+ if (cached && cached.parent === parent && cached.block === path.node) {
+ return cached;
+ } else {
+ path.setData("scope", this);
+ }
+
+ this.parent = parent;
+ this.hub = path.hub;
+
+ this.parentBlock = path.parent;
+ this.block = path.node;
+ this.path = path;
+ }
+
+ /**
+ * Globals.
+ */
+
+ static globals = Object.keys(globals.builtin);
+
+ /**
+ * Variables available in current context.
+ */
+
+ static contextVariables = [
+ "arguments",
+ "undefined",
+ "Infinity",
+ "NaN"
+ ];
+
+ /**
+ * Traverse node with current scope and path.
+ */
+
+ traverse(node: Object, opts: Object, state?) {
+ traverse(node, opts, this, state, this.path);
+ }
+
+ /**
+ * Generate a unique identifier and add it to the current scope.
+ */
+
+ generateDeclaredUidIdentifier(name: string = "temp") {
+ let id = this.generateUidIdentifier(name);
+ this.push({ id });
+ return id;
+ }
+
+ /**
+ * Generate a unique identifier.
+ */
+
+ generateUidIdentifier(name: string) {
+ return t.identifier(this.generateUid(name));
+ }
+
+ /**
+ * Generate a unique `_id1` binding.
+ */
+
+ generateUid(name: string) {
+ name = t.toIdentifier(name).replace(/^_+/, "").replace(/[0-9]+$/g, "");
+
+ let uid;
+ let i = 0;
+ do {
+ uid = this._generateUid(name, i);
+ i++;
+ } while (this.hasBinding(uid) || this.hasGlobal(uid) || this.hasReference(uid));
+
+ let program = this.getProgramParent();
+ program.references[uid] = true;
+ program.uids[uid] = true;
+
+ return uid;
+ }
+
+ /**
+ * Generate an `_id1`.
+ */
+
+ _generateUid(name, i) {
+ let id = name;
+ if (i > 1) id += i;
+ return `_${id}`;
+ }
+
+ /**
+ * Generate a unique identifier based on a node.
+ */
+
+ generateUidIdentifierBasedOnNode(parent: Object, defaultName?: String): Object {
+ let node = parent;
+
+ if (t.isAssignmentExpression(parent)) {
+ node = parent.left;
+ } else if (t.isVariableDeclarator(parent)) {
+ node = parent.id;
+ } else if (t.isObjectProperty(node) || t.isObjectMethod(node)) {
+ node = node.key;
+ }
+
+ let parts = [];
+
+ let add = function (node) {
+ if (t.isModuleDeclaration(node)) {
+ if (node.source) {
+ add(node.source);
+ } else if (node.specifiers && node.specifiers.length) {
+ for (let specifier of (node.specifiers: Array)) {
+ add(specifier);
+ }
+ } else if (node.declaration) {
+ add(node.declaration);
+ }
+ } else if (t.isModuleSpecifier(node)) {
+ add(node.local);
+ } else if (t.isMemberExpression(node)) {
+ add(node.object);
+ add(node.property);
+ } else if (t.isIdentifier(node)) {
+ parts.push(node.name);
+ } else if (t.isLiteral(node)) {
+ parts.push(node.value);
+ } else if (t.isCallExpression(node)) {
+ add(node.callee);
+ } else if (t.isObjectExpression(node) || t.isObjectPattern(node)) {
+ for (let prop of (node.properties: Array)) {
+ add(prop.key || prop.argument);
+ }
+ }
+ };
+
+ add(node);
+
+ let id = parts.join("$");
+ id = id.replace(/^_/, "") || defaultName || "ref";
+
+ return this.generateUidIdentifier(id.slice(0, 20));
+ }
+
+ /**
+ * Determine whether evaluating the specific input `node` is a consequenceless reference. ie.
+ * evaluating it wont result in potentially arbitrary code from being ran. The following are
+ * whitelisted and determined not to cause side effects:
+ *
+ * - `this` expressions
+ * - `super` expressions
+ * - Bound identifiers
+ */
+
+ isStatic(node: Object): boolean {
+ if (t.isThisExpression(node) || t.isSuper(node)) {
+ return true;
+ }
+
+ if (t.isIdentifier(node)) {
+ let binding = this.getBinding(node.name);
+ if (binding) {
+ return binding.constant;
+ } else {
+ return this.hasBinding(node.name);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Possibly generate a memoised identifier if it is not static and has consequences.
+ */
+
+ maybeGenerateMemoised(node: Object, dontPush?: boolean): ?Object {
+ if (this.isStatic(node)) {
+ return null;
+ } else {
+ let id = this.generateUidIdentifierBasedOnNode(node);
+ if (!dontPush) this.push({ id });
+ return id;
+ }
+ }
+
+ checkBlockScopedCollisions(local, kind: string, name: string, id: Object) {
+ // ignore parameters
+ if (kind === "param") return;
+
+ // ignore hoisted functions if there's also a local let
+ if (kind === "hoisted" && local.kind === "let") return;
+
+ let duplicate = false;
+
+ // don't allow duplicate bindings to exist alongside
+ if (!duplicate) duplicate = kind === "let" || local.kind === "let" || local.kind === "const" || local.kind === "module";
+
+ // don't allow a local of param with a kind of let
+ if (!duplicate) duplicate = local.kind === "param" && (kind === "let" || kind === "const");
+
+ if (duplicate) {
+ throw this.hub.file.buildCodeFrameError(id, messages.get("scopeDuplicateDeclaration", name), TypeError);
+ }
+ }
+
+ rename(oldName: string, newName: string, block?) {
+ let binding = this.getBinding(oldName);
+ if (binding) {
+ newName = newName || this.generateUidIdentifier(oldName).name;
+ return new Renamer(binding, oldName, newName).rename(block);
+ }
+ }
+
+ _renameFromMap(map, oldName, newName, value) {
+ if (map[oldName]) {
+ map[newName] = value;
+ map[oldName] = null;
+ }
+ }
+
+ dump() {
+ let sep = repeating("-", 60);
+ console.log(sep);
+ let scope = this;
+ do {
+ console.log("#", scope.block.type);
+ for (let name in scope.bindings) {
+ let binding = scope.bindings[name];
+ console.log(" -", name, {
+ constant: binding.constant,
+ references: binding.references,
+ violations: binding.constantViolations.length,
+ kind: binding.kind
+ });
+ }
+ } while(scope = scope.parent);
+ console.log(sep);
+ }
+
+ toArray(node: Object, i?: number) {
+ let file = this.hub.file;
+
+ if (t.isIdentifier(node)) {
+ let binding = this.getBinding(node.name);
+ if (binding && binding.constant && binding.path.isGenericType("Array")) return node;
+ }
+
+ if (t.isArrayExpression(node)) {
+ return node;
+ }
+
+ if (t.isIdentifier(node, { name: "arguments" })) {
+ return t.callExpression(
+ t.memberExpression(
+ t.memberExpression(
+ t.memberExpression(
+ t.identifier("Array"),
+ t.identifier("prototype")
+ ),
+ t.identifier("slice")
+ ),
+ t.identifier("call")
+ ),
+ [node]
+ );
+ }
+
+ let helperName = "toArray";
+ let args = [node];
+ if (i === true) {
+ helperName = "toConsumableArray";
+ } else if (i) {
+ args.push(t.numberLiteral(i));
+ helperName = "slicedToArray";
+ // TODO if (this.hub.file.isLoose("es6.forOf")) helperName += "-loose";
+ }
+ return t.callExpression(file.addHelper(helperName), args);
+ }
+
+ registerDeclaration(path: NodePath) {
+ if (path.isLabeledStatement()) {
+ this.registerBinding("label", path);
+ } else if (path.isFunctionDeclaration()) {
+ this.registerBinding("hoisted", path.get("id"));
+ } else if (path.isVariableDeclaration()) {
+ let declarations = path.get("declarations");
+ for (let declar of (declarations: Array)) {
+ this.registerBinding(path.node.kind, declar);
+ }
+ } else if (path.isClassDeclaration()) {
+ this.registerBinding("let", path);
+ } else if (path.isImportDeclaration()) {
+ let specifiers = path.get("specifiers");
+ for (let specifier of (specifiers: Array)) {
+ this.registerBinding("module", specifier);
+ }
+ } else if (path.isExportDeclaration()) {
+ let declar = path.get("declaration");
+ if (declar.isClassDeclaration() || declar.isFunctionDeclaration() || declar.isVariableDeclaration()) {
+ this.registerDeclaration(declar);
+ }
+ } else {
+ this.registerBinding("unknown", path);
+ }
+ }
+
+ buildUndefinedNode() {
+ if (this.hasBinding("undefined")) {
+ return t.unaryExpression("void", t.numberLiteral(0), true);
+ } else {
+ return t.identifier("undefined");
+ }
+ }
+
+ registerConstantViolation(path: NodePath) {
+ let ids = path.getBindingIdentifiers();
+ for (let name in ids) {
+ let binding = this.getBinding(name);
+ if (binding) binding.reassign(path);
+ }
+ }
+
+ registerBinding(kind: string, path: NodePath) {
+ if (!kind) throw new ReferenceError("no `kind`");
+
+ if (path.isVariableDeclaration()) {
+ let declarators: Array = path.get("declarations");
+ for (let declar of declarators) {
+ this.registerBinding(kind, declar);
+ }
+ return;
+ }
+
+ let parent = this.getProgramParent();
+ let ids = path.getBindingIdentifiers(true);
+
+ for (let name in ids) {
+ for (let id of (ids[name]: Array)) {
+ let local = this.getOwnBinding(name);
+ if (local) {
+ // same identifier so continue safely as we're likely trying to register it
+ // multiple times
+ if (local.identifier === id) continue;
+
+ this.checkBlockScopedCollisions(local, kind, name, id);
+ }
+
+ parent.references[name] = true;
+
+ this.bindings[name] = new Binding({
+ identifier: id,
+ existing: local,
+ scope: this,
+ path: path,
+ kind: kind
+ });
+ }
+ }
+ }
+
+ addGlobal(node: Object) {
+ this.globals[node.name] = node;
+ }
+
+ hasUid(name): boolean {
+ let scope = this;
+
+ do {
+ if (scope.uids[name]) return true;
+ } while (scope = scope.parent);
+
+ return false;
+ }
+
+ hasGlobal(name: string): boolean {
+ let scope = this;
+
+ do {
+ if (scope.globals[name]) return true;
+ } while (scope = scope.parent);
+
+ return false;
+ }
+
+ hasReference(name: string): boolean {
+ let scope = this;
+
+ do {
+ if (scope.references[name]) return true;
+ } while (scope = scope.parent);
+
+ return false;
+ }
+
+ isPure(node, constantsOnly?: boolean) {
+ if (t.isIdentifier(node)) {
+ let binding = this.getBinding(node.name);
+ if (!binding) return false;
+ if (constantsOnly) return binding.constant;
+ return true;
+ } else if (t.isClass(node)) {
+ if (node.superClass && !this.isPure(node.superClass, constantsOnly)) return false;
+ return this.isPure(node.body, constantsOnly);
+ } else if (t.isClassBody(node)) {
+ for (let method of node.body) {
+ if (!this.isPure(method, constantsOnly)) return false;
+ }
+ return true;
+ } else if (t.isBinary(node)) {
+ return this.isPure(node.left, constantsOnly) && this.isPure(node.right, constantsOnly);
+ } else if (t.isArrayExpression(node)) {
+ for (let elem of (node.elements: Array)) {
+ if (!this.isPure(elem, constantsOnly)) return false;
+ }
+ return true;
+ } else if (t.isObjectExpression(node)) {
+ for (let prop of (node.properties: Array)) {
+ if (!this.isPure(prop, constantsOnly)) return false;
+ }
+ return true;
+ } else if (t.isClassMethod(node)) {
+ if (node.computed && !this.isPure(node.key, constantsOnly)) return false;
+ if (node.kind === "get" || node.kind === "set") return false;
+ return true;
+ } else if (t.isClassProperty(node)) {
+ if (node.computed && !this.isPure(node.key, constantsOnly)) return false;
+ return this.isPure(node.value, constantsOnly);
+ } else {
+ return t.isPureish(node);
+ }
+ }
+
+ /**
+ * Set some arbitrary data on the current scope.
+ */
+
+ setData(key, val) {
+ return this.data[key] = val;
+ }
+
+ /**
+ * Recursively walk up scope tree looking for the data `key`.
+ */
+
+ getData(key) {
+ let scope = this;
+ do {
+ let data = scope.data[key];
+ if (data != null) return data;
+ } while(scope = scope.parent);
+ }
+
+ /**
+ * Recursively walk up scope tree looking for the data `key` and if it exists,
+ * remove it.
+ */
+
+ removeData(key) {
+ let scope = this;
+ do {
+ let data = scope.data[key];
+ if (data != null) scope.data[key] = null;
+ } while(scope = scope.parent);
+ }
+
+ init() {
+ if (!this.references) this.crawl();
+ }
+
+ crawl() {
+ let path = this.path;
+
+ //
+
+ let info = this.block[SCOPE_INFO_CACHE_KEY];
+ if (info) return extend(this, info);
+
+ info = this.block[SCOPE_INFO_CACHE_KEY] = {
+ references: Object.create(null),
+ bindings: Object.create(null),
+ globals: Object.create(null),
+ uids: Object.create(null),
+ data: Object.create(null),
+ };
+
+ Object.assign(this, info);
+
+ // ForStatement - left, init
+
+ if (path.isLoop()) {
+ for (let key of (t.FOR_INIT_KEYS: Array)) {
+ let node = path.get(key);
+ if (node.isBlockScoped()) this.registerBinding(node.node.kind, node);
+ }
+ }
+
+ // FunctionExpression - id
+
+ if (path.isFunctionExpression() && path.has("id")) {
+ this.registerBinding("local", path);
+ }
+
+ // Class
+
+ if (path.isClassExpression() && path.has("id")) {
+ this.registerBinding("local", path);
+ }
+
+ // Function - params, rest
+
+ if (path.isFunction()) {
+ let params: Array = path.get("params");
+ for (let param of params) {
+ this.registerBinding("param", param);
+ }
+ }
+
+ // CatchClause - param
+
+ if (path.isCatchClause()) {
+ this.registerBinding("let", path);
+ }
+
+ // Program
+
+ let parent = this.getProgramParent();
+ if (parent.crawling) return;
+
+ let state = {
+ references: [],
+ constantViolations: [],
+ assignments: [],
+ };
+
+ this.crawling = true;
+ path.traverse(collectorVisitor, state);
+ this.crawling = false;
+
+ // register assignments
+ for (let path of state.assignments) {
+ // register undeclared bindings as globals
+ let ids = path.getBindingIdentifiers();
+ let programParent;
+ for (let name in ids) {
+ if (path.scope.getBinding(name)) continue;
+
+ programParent = programParent || path.scope.getProgramParent();
+ programParent.addGlobal(ids[name]);
+ }
+
+ // register as constant violation
+ path.scope.registerConstantViolation(path);
+ }
+
+ // register references
+ for (let ref of state.references) {
+ let binding = ref.scope.getBinding(ref.node.name);
+ if (binding) {
+ binding.reference(ref);
+ } else {
+ ref.scope.getProgramParent().addGlobal(ref.node);
+ }
+ }
+
+ // register constant violations
+ for (let path of state.constantViolations) {
+ path.scope.registerConstantViolation(path);
+ }
+ }
+
+ push(opts: {
+ id: Object;
+ init: ?Object;
+ unique: ?boolean;
+ _blockHoist: ?number;
+ kind: "var" | "let";
+ }) {
+ let path = this.path;
+
+ if (path.isSwitchStatement()) {
+ path = this.getFunctionParent().path;
+ }
+
+ if (path.isLoop() || path.isCatchClause() || path.isFunction()) {
+ t.ensureBlock(path.node);
+ path = path.get("body");
+ }
+
+ if (!path.isBlockStatement() && !path.isProgram()) {
+ path = this.getBlockParent().path;
+ }
+
+ let unique = opts.unique;
+ let kind = opts.kind || "var";
+ let blockHoist = opts._blockHoist == null ? 2 : opts._blockHoist;
+
+ let dataKey = `declaration:${kind}:${blockHoist}`;
+ let declarPath = !unique && path.getData(dataKey);
+
+ if (!declarPath) {
+ let declar = t.variableDeclaration(kind, []);
+ declar._generated = true;
+ declar._blockHoist = blockHoist;
+
+ [declarPath] = path.unshiftContainer("body", [declar]);
+ if (!unique) path.setData(dataKey, declarPath);
+ }
+
+ let declarator = t.variableDeclarator(opts.id, opts.init);
+ declarPath.node.declarations.push(declarator);
+ this.registerBinding(kind, declarPath.get("declarations").pop());
+ }
+
+ /**
+ * Walk up to the top of the scope tree and get the `Program`.
+ */
+
+ getProgramParent() {
+ let scope = this;
+ do {
+ if (scope.path.isProgram()) {
+ return scope;
+ }
+ } while (scope = scope.parent);
+ throw new Error("We couldn't find a Function or Program...");
+ }
+
+ /**
+ * Walk up the scope tree until we hit either a Function or reach the
+ * very top and hit Program.
+ */
+
+ getFunctionParent() {
+ let scope = this;
+ do {
+ if (scope.path.isFunctionParent()) {
+ return scope;
+ }
+ } while (scope = scope.parent);
+ throw new Error("We couldn't find a Function or Program...");
+ }
+
+ /**
+ * Walk up the scope tree until we hit either a BlockStatement/Loop/Program/Function/Switch or reach the
+ * very top and hit Program.
+ */
+
+ getBlockParent() {
+ let scope = this;
+ do {
+ if (scope.path.isBlockParent()) {
+ return scope;
+ }
+ } while (scope = scope.parent);
+ throw new Error("We couldn't find a BlockStatement, For, Switch, Function, Loop or Program...");
+ }
+
+ /**
+ * Walks the scope tree and gathers **all** bindings.
+ */
+
+ getAllBindings(): Object {
+ let ids = Object.create(null);
+
+ let scope = this;
+ do {
+ defaults(ids, scope.bindings);
+ scope = scope.parent;
+ } while (scope);
+
+ return ids;
+ }
+
+ /**
+ * Walks the scope tree and gathers all declarations of `kind`.
+ */
+
+ getAllBindingsOfKind(): Object {
+ let ids = Object.create(null);
+
+ for (let kind of (arguments: Array)) {
+ let scope = this;
+ do {
+ for (let name in scope.bindings) {
+ let binding = scope.bindings[name];
+ if (binding.kind === kind) ids[name] = binding;
+ }
+ scope = scope.parent;
+ } while (scope);
+ }
+
+ return ids;
+ }
+
+ bindingIdentifierEquals(name: string, node: Object): boolean {
+ return this.getBindingIdentifier(name) === node;
+ }
+
+ getBinding(name: string) {
+ let scope = this;
+
+ do {
+ let binding = scope.getOwnBinding(name);
+ if (binding) return binding;
+ } while (scope = scope.parent);
+ }
+
+ getOwnBinding(name: string) {
+ return this.bindings[name];
+ }
+
+ getBindingIdentifier(name: string) {
+ let info = this.getBinding(name);
+ return info && info.identifier;
+ }
+
+ getOwnBindingIdentifier(name: string) {
+ let binding = this.bindings[name];
+ return binding && binding.identifier;
+ }
+
+ hasOwnBinding(name: string) {
+ return !!this.getOwnBinding(name);
+ }
+
+ hasBinding(name: string, noGlobals?) {
+ if (!name) return false;
+ if (this.hasOwnBinding(name)) return true;
+ if (this.parentHasBinding(name, noGlobals)) return true;
+ if (this.hasUid(name)) return true;
+ if (!noGlobals && includes(Scope.globals, name)) return true;
+ if (!noGlobals && includes(Scope.contextVariables, name)) return true;
+ return false;
+ }
+
+ parentHasBinding(name: string, noGlobals?) {
+ return this.parent && this.parent.hasBinding(name, noGlobals);
+ }
+
+ /**
+ * Move a binding of `name` to another `scope`.
+ */
+
+ moveBindingTo(name, scope) {
+ let info = this.getBinding(name);
+ if (info) {
+ info.scope.removeOwnBinding(name);
+ info.scope = scope;
+ scope.bindings[name] = info;
+ }
+ }
+
+ removeOwnBinding(name: string) {
+ delete this.bindings[name];
+ }
+
+ removeBinding(name: string) {
+ // clear literal binding
+ let info = this.getBinding(name);
+ if (info) {
+ info.scope.removeOwnBinding(name);
+ }
+
+ // clear uids with this name - https://github.com/babel/babel/issues/2101
+ let scope = this;
+ do {
+ if (scope.uids[name]) {
+ scope.uids[name] = false;
+ }
+ } while(scope = scope.parent);
+ }
+}
diff --git a/packages/babel-traverse/src/scope/lib/renamer.js b/packages/babel-traverse/src/scope/lib/renamer.js
new file mode 100644
index 0000000000..4e0bb608bb
--- /dev/null
+++ b/packages/babel-traverse/src/scope/lib/renamer.js
@@ -0,0 +1,125 @@
+/* @flow */
+
+import Binding from "../binding";
+import * as t from "babel-types";
+
+let renameVisitor = {
+ ReferencedIdentifier({ node }, state) {
+ if (node.name === state.oldName) {
+ node.name = state.newName;
+ }
+ },
+
+ Scope(path, state) {
+ if (!path.scope.bindingIdentifierEquals(state.oldName, state.binding.identifier)) {
+ path.skip();
+ }
+ },
+
+ "AssignmentExpression|Declaration"(path, state) {
+ let ids = path.getBindingIdentifiers();
+
+ for (let name in ids) {
+ if (name === state.oldName) ids[name].name = state.newName;
+ }
+ }
+};
+
+export default class Renamer {
+ constructor(binding: Binding, oldName: string, newName: string) {
+ this.newName = newName;
+ this.oldName = oldName;
+ this.binding = binding;
+ }
+
+ oldName: string;
+ newName: string;
+ binding: Binding;
+
+ maybeConvertFromExportDeclaration(parentDeclar) {
+ let exportDeclar = parentDeclar.parentPath.isExportDeclaration() && parentDeclar.parentPath;
+ if (!exportDeclar) return;
+
+ // build specifiers that point back to this export declaration
+ let isDefault = exportDeclar.isExportDefaultDeclaration();
+ let bindingIdentifiers = parentDeclar.getBindingIdentifiers();
+ let specifiers = [];
+
+ for (let name in bindingIdentifiers) {
+ let localName = name === this.oldName ? this.newName : name;
+ let exportedName = isDefault ? "default" : name;
+ specifiers.push(t.exportSpecifier(t.identifier(localName), t.identifier(exportedName)));
+ }
+
+ let aliasDeclar = t.exportNamedDeclaration(null, specifiers);
+
+ // hoist to the top if it's a function
+ if (parentDeclar.isFunctionDeclaration()) {
+ aliasDeclar._blockHoist = 3;
+ }
+
+ exportDeclar.insertAfter(aliasDeclar);
+ exportDeclar.replaceWith(parentDeclar.node);
+ }
+
+ maybeConvertFromClassFunctionDeclaration(path) {
+ return; // TODO
+
+ // retain the `name` of a class/function declaration
+
+ if (!path.isFunctionDeclaration() && !path.isClassDeclaration()) return;
+ if (this.binding.kind !== "hoisted") return;
+
+ path.node.id = t.identifier(this.oldName);
+ path.node._blockHoist = 3;
+
+ path.replaceWith(t.variableDeclaration("let", [
+ t.variableDeclarator(t.identifier(this.newName), t.toExpression(path.node))
+ ]));
+ }
+
+ maybeConvertFromClassFunctionExpression(path) {
+ return; // TODO
+
+ // retain the `name` of a class/function expression
+
+ if (!path.isFunctionExpression() && !path.isClassExpression()) return;
+ if (this.binding.kind !== "local") return;
+
+ path.node.id = t.identifier(this.oldName);
+
+ this.binding.scope.parent.push({
+ id: t.identifier(this.newName)
+ });
+
+ path.replaceWith(t.assignmentExpression("=", t.identifier(this.newName), path.node));
+ }
+
+ rename(block?) {
+ let { binding, oldName, newName } = this;
+ let { scope, path } = binding;
+
+ let parentDeclar = path.find((path) => path.isDeclaration() || path.isFunctionExpression());
+ if (parentDeclar) {
+ this.maybeConvertFromExportDeclaration(parentDeclar);
+ }
+
+ scope.traverse(block || scope.block, renameVisitor, this);
+
+ if (!block) {
+ scope.removeOwnBinding(oldName);
+ scope.bindings[newName] = binding;
+ this.binding.identifier.name = newName;
+ }
+
+ if (binding.type === "hoisted") {
+ // https://github.com/babel/babel/issues/2435
+ // todo: hoist and convert function to a let
+ }
+
+ if (parentDeclar) {
+ this.maybeConvertFromClassFunctionDeclaration(parentDeclar);
+ this.maybeConvertFromClassFunctionExpression(parentDeclar);
+ }
+ }
+}
diff --git a/packages/babel-traverse/src/visitors.js b/packages/babel-traverse/src/visitors.js
new file mode 100644
index 0000000000..3562d6f483
--- /dev/null
+++ b/packages/babel-traverse/src/visitors.js
@@ -0,0 +1,217 @@
+/* @flow */
+
+import * as virtualTypes from "./path/lib/virtual-types";
+import * as messages from "babel-messages";
+import * as t from "babel-types";
+import clone from "lodash/lang/clone";
+
+export function explode(visitor) {
+ if (visitor._exploded) return visitor;
+ visitor._exploded = true;
+
+ // normalise pipes
+ for (let nodeType in visitor) {
+ if (shouldIgnoreKey(nodeType)) continue;
+
+ let parts = nodeType.split("|");
+ if (parts.length === 1) continue;
+
+ let fns = visitor[nodeType];
+ delete visitor[nodeType];
+
+ for (let part of (parts: Array)) {
+ visitor[part] = fns;
+ }
+ }
+
+ // verify data structure
+ verify(visitor);
+
+ // make sure there's no __esModule type since this is because we're using loose mode
+ // and it sets __esModule to be enumerable on all modules :(
+ delete visitor.__esModule;
+
+ // ensure visitors are objects
+ ensureEntranceObjects(visitor);
+
+ // ensure enter/exit callbacks are arrays
+ ensureCallbackArrays(visitor);
+
+ // add type wrappers
+ for (let nodeType of (Object.keys(visitor): Array)) {
+ if (shouldIgnoreKey(nodeType)) continue;
+
+ let wrapper = virtualTypes[nodeType];
+ if (!wrapper) continue;
+
+ // wrap all the functions
+ let fns = visitor[nodeType];
+ for (let type in fns) {
+ fns[type] = wrapCheck(wrapper, fns[type]);
+ }
+
+ // clear it from the visitor
+ delete visitor[nodeType];
+
+ if (wrapper.types) {
+ for (let type of (wrapper.types: Array)) {
+ // merge the visitor if necessary or just put it back in
+ if (visitor[type]) {
+ mergePair(visitor[type], fns);
+ } else {
+ visitor[type] = fns;
+ }
+ }
+ } else {
+ mergePair(visitor, fns);
+ }
+ }
+
+ // add aliases
+ for (let nodeType in visitor) {
+ if (shouldIgnoreKey(nodeType)) continue;
+
+ let fns = visitor[nodeType];
+
+ let aliases = t.FLIPPED_ALIAS_KEYS[nodeType];
+ if (!aliases) continue;
+
+ // clear it from the visitor
+ delete visitor[nodeType];
+
+ for (let alias of (aliases: Array)) {
+ let existing = visitor[alias];
+ if (existing) {
+ mergePair(existing, fns);
+ } else {
+ visitor[alias] = clone(fns);
+ }
+ }
+ }
+
+ for (let nodeType in visitor) {
+ if (shouldIgnoreKey(nodeType)) continue;
+
+ ensureCallbackArrays(visitor[nodeType]);
+ }
+
+ return visitor;
+}
+
+export function verify(visitor) {
+ if (visitor._verified) return;
+
+ if (typeof visitor === "function") {
+ throw new Error(messages.get("traverseVerifyRootFunction"));
+ }
+
+ for (let nodeType in visitor) {
+ if (shouldIgnoreKey(nodeType)) continue;
+
+ if (t.TYPES.indexOf(nodeType) < 0) {
+ throw new Error(messages.get("traverseVerifyNodeType", nodeType));
+ }
+
+ let visitors = visitor[nodeType];
+ if (typeof visitors === "object") {
+ for (let visitorKey in visitors) {
+ if (visitorKey === "enter" || visitorKey === "exit") continue;
+ throw new Error(messages.get("traverseVerifyVisitorProperty", nodeType, visitorKey));
+ }
+ }
+ }
+
+ visitor._verified = true;
+}
+
+export function merge(visitors: Array, states: Array = []) {
+ let rootVisitor = {};
+
+ for (let i = 0; i < visitors.length; i++) {
+ let visitor = visitors[i];
+ let state = states[i];
+
+ explode(visitor);
+
+ for (let type in visitor) {
+ let visitorType = visitor[type];
+
+ // if we have state then overload the callbacks to take it
+ if (state) {
+ let oldVisitorType = visitorType;
+ visitorType = {};
+
+ for (let key in oldVisitorType) {
+ let fns = oldVisitorType[key];
+
+ // not an enter/exit array of callbacks
+ if (!Array.isArray(fns)) continue;
+
+ fns = fns.map(function (fn) {
+ if (typeof fn === "function") {
+ let newFn = function (path) {
+ return fn.call(state, path, state);
+ };
+ newFn.toString = () => fn.toString();
+ return newFn;
+ } else {
+ return fn;
+ }
+ });
+
+ visitorType[key] = fns;
+ }
+ }
+
+ let nodeVisitor = rootVisitor[type] = rootVisitor[type] || {};
+ mergePair(nodeVisitor, visitorType);
+ }
+ }
+
+ return rootVisitor;
+}
+
+function ensureEntranceObjects(obj) {
+ for (let key in obj) {
+ if (shouldIgnoreKey(key)) continue;
+
+ let fns = obj[key];
+ if (typeof fns === "function") {
+ obj[key] = { enter: fns };
+ }
+ }
+}
+
+function ensureCallbackArrays(obj){
+ if (obj.enter && !Array.isArray(obj.enter)) obj.enter = [obj.enter];
+ if (obj.exit && !Array.isArray(obj.exit)) obj.exit = [obj.exit];
+}
+
+function wrapCheck(wrapper, fn) {
+ let newFn = function (path) {
+ if (wrapper.checkPath(path)) {
+ return fn.apply(this, arguments);
+ }
+ };
+ newFn.toString = () => fn.toString();
+ return newFn;
+}
+
+function shouldIgnoreKey(key) {
+ // internal/hidden key
+ if (key[0] === "_") return true;
+
+ // ignore function keys
+ if (key === "enter" || key === "exit" || key === "shouldSkip") return true;
+
+ // ignore other options
+ if (key === "blacklist" || key === "noScope" || key === "skipKeys") return true;
+
+ return false;
+}
+
+function mergePair(dest, src) {
+ for (let key in src) {
+ dest[key] = [].concat(dest[key] || [], src[key]);
+ }
+}
diff --git a/packages/babel/test/traverse.js b/packages/babel-traverse/test/traverse.js
similarity index 88%
rename from packages/babel/test/traverse.js
rename to packages/babel-traverse/test/traverse.js
index d33dc90934..b2cc301171 100644
--- a/packages/babel/test/traverse.js
+++ b/packages/babel-traverse/test/traverse.js
@@ -1,4 +1,4 @@
-var traverse = require("../lib/traversal");
+var traverse = require("../lib").default;
var assert = require("assert");
var _ = require("lodash");
@@ -16,7 +16,7 @@ suite("traverse", function () {
"name": "foo",
},
"init": {
- "type": "Literal",
+ "type": "StringLiteral",
"value": "bar",
"raw": "\'bar\'"
}
@@ -41,7 +41,7 @@ suite("traverse", function () {
}
},
"right": {
- "type": "Literal",
+ "type": "StringLiteral",
"value": "wow",
"raw": "\'wow\'"
}
@@ -54,14 +54,14 @@ suite("traverse", function () {
test("traverse replace", function () {
var replacement = {
- type: "Literal",
+ type: "StringLiteral",
value: "foo"
};
var ast2 = _.cloneDeep(ast);
traverse(ast2, {
- enter: function (node) {
- if (node.type === "ThisExpression") return replacement;
+ enter: function (path) {
+ if (path.node.type === "ThisExpression") path.replaceWith(replacement);
}
});
@@ -77,8 +77,8 @@ suite("traverse", function () {
var actual = [];
traverse(ast, {
- enter: function (node) {
- actual.push(node);
+ enter: function (path) {
+ actual.push(path.node);
}
});
@@ -103,8 +103,8 @@ suite("traverse", function () {
traverse(ast, {
blacklist: ["MemberExpression"],
- enter: function (node) {
- actual.push(node);
+ enter: function (path) {
+ actual.push(path.node);
}
});
diff --git a/packages/babel-types/.npmignore b/packages/babel-types/.npmignore
new file mode 100644
index 0000000000..a57582cc39
--- /dev/null
+++ b/packages/babel-types/.npmignore
@@ -0,0 +1 @@
+/src
diff --git a/packages/babel-types/README.md b/packages/babel-types/README.md
new file mode 100644
index 0000000000..a71a129964
--- /dev/null
+++ b/packages/babel-types/README.md
@@ -0,0 +1 @@
+# babel-types
diff --git a/packages/babel-types/package.json b/packages/babel-types/package.json
new file mode 100644
index 0000000000..03e336aea1
--- /dev/null
+++ b/packages/babel-types/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "babel-types",
+ "version": "6.0.2",
+ "description": "",
+ "author": "Sebastian McKenzie ",
+ "homepage": "https://babeljs.io/",
+ "license": "MIT",
+ "repository": "babel/babel",
+ "main": "lib/index.js",
+ "dependencies": {
+ "babel-runtime": "^6.0.2",
+ "babel-traverse": "^6.0.2",
+ "esutils": "^2.0.2",
+ "lodash": "^3.10.1",
+ "to-fast-properties": "^1.0.1"
+ }
+}
\ No newline at end of file
diff --git a/packages/babel/src/types/README.md b/packages/babel-types/src/README.md
similarity index 100%
rename from packages/babel/src/types/README.md
rename to packages/babel-types/src/README.md
diff --git a/packages/babel-types/src/converters.js b/packages/babel-types/src/converters.js
new file mode 100644
index 0000000000..5a58984a81
--- /dev/null
+++ b/packages/babel-types/src/converters.js
@@ -0,0 +1,301 @@
+/* @flow */
+
+import isPlainObject from "lodash/lang/isPlainObject";
+import isNumber from "lodash/lang/isNumber";
+import isRegExp from "lodash/lang/isRegExp";
+import isString from "lodash/lang/isString";
+import traverse from "babel-traverse";
+import type { Scope } from "babel-traverse";
+import * as t from "./index";
+
+export function toComputedKey(node: Object, key: Object = node.key || node.property): Object {
+ if (!node.computed) {
+ if (t.isIdentifier(key)) key = t.stringLiteral(key.name);
+ }
+ return key;
+}
+
+/**
+ * Turn an array of statement `nodes` into a `SequenceExpression`.
+ *
+ * Variable declarations are turned into simple assignments and their
+ * declarations hoisted to the top of the current scope.
+ *
+ * Expression statements are just resolved to their expression.
+ */
+
+export function toSequenceExpression(nodes: Array, scope: Scope): ?Object {
+ if (!nodes || !nodes.length) return;
+
+ let declars = [];
+ let bailed = false;
+
+ let result = convert(nodes);
+ if (bailed) return;
+
+ for (let i = 0; i < declars.length; i++) {
+ scope.push(declars[i]);
+ }
+
+ return result;
+
+ function convert(nodes) {
+ let ensureLastUndefined = false;
+ let exprs = [];
+
+ for (let node of (nodes: Array)) {
+ if (t.isExpression(node)) {
+ exprs.push(node);
+ } else if (t.isExpressionStatement(node)) {
+ exprs.push(node.expression);
+ } else if (t.isVariableDeclaration(node)) {
+ if (node.kind !== "var") return bailed = true; // bailed
+
+ for (let declar of (node.declarations: Array)) {
+ let bindings = t.getBindingIdentifiers(declar);
+ for (let key in bindings) {
+ declars.push({
+ kind: node.kind,
+ id: bindings[key]
+ });
+ }
+
+ if (declar.init) {
+ exprs.push(t.assignmentExpression("=", declar.id, declar.init));
+ }
+ }
+
+ ensureLastUndefined = true;
+ continue;
+ } else if (t.isIfStatement(node)) {
+ let consequent = node.consequent ? convert([node.consequent]) : scope.buildUndefinedNode();
+ let alternate = node.alternate ? convert([node.alternate]) : scope.buildUndefinedNode();
+ if (!consequent || !alternate) return bailed = true;
+
+ exprs.push(t.conditionalExpression(node.test, consequent, alternate));
+ } else if (t.isBlockStatement(node)) {
+ exprs.push(convert(node.body));
+ } else if (t.isEmptyStatement(node)) {
+ // empty statement so ensure the last item is undefined if we're last
+ ensureLastUndefined = true;
+ continue;
+ } else {
+ // bailed, we can't turn this statement into an expression
+ return bailed = true;
+ }
+
+ ensureLastUndefined = false;
+ }
+
+ if (ensureLastUndefined || exprs.length === 0) {
+ exprs.push(scope.buildUndefinedNode());
+ }
+
+ //
+
+ if (exprs.length === 1) {
+ return exprs[0];
+ } else {
+ return t.sequenceExpression(exprs);
+ }
+ }
+}
+
+export function toKeyAlias(node: Object, key: Object = node.key): string {
+ let alias;
+
+ if (node.kind === "method") {
+ return toKeyAlias.increment() + "";
+ } else if (t.isIdentifier(key)) {
+ alias = key.name;
+ } else if (t.isStringLiteral(key)) {
+ alias = JSON.stringify(key.value);
+ } else {
+ alias = JSON.stringify(traverse.removeProperties(t.cloneDeep(key)));
+ }
+
+ if (node.computed) {
+ alias = `[${alias}]`;
+ }
+
+ if (node.static) {
+ alias = `static:${alias}`;
+ }
+
+ return alias;
+}
+
+toKeyAlias.uid = 0;
+
+toKeyAlias.increment = function () {
+ if (toKeyAlias.uid >= Number.MAX_SAFE_INTEGER) {
+ return toKeyAlias.uid = 0;
+ } else {
+ return toKeyAlias.uid++;
+ }
+};
+
+export function toIdentifier(name: string): string {
+ name = name + "";
+
+ // replace all non-valid identifiers with dashes
+ name = name.replace(/[^a-zA-Z0-9$_]/g, "-");
+
+ // remove all dashes and numbers from start of name
+ name = name.replace(/^[-0-9]+/, "");
+
+ // camel case
+ name = name.replace(/[-\s]+(.)?/g, function (match, c) {
+ return c ? c.toUpperCase() : "";
+ });
+
+ if (!t.isValidIdentifier(name)) {
+ name = `_${name}`;
+ }
+
+ return name || "_";
+}
+
+export function toBindingIdentifierName(name: string): string {
+ name = toIdentifier(name);
+ if (name === "eval" || name === "arguments") name = "_" + name;
+ return name;
+}
+
+/**
+ * [Please add a description.]
+ * @returns {Object|Boolean}
+ */
+
+export function toStatement(node: Object, ignore?: boolean) {
+ if (t.isStatement(node)) {
+ return node;
+ }
+
+ let mustHaveId = false;
+ let newType;
+
+ if (t.isClass(node)) {
+ mustHaveId = true;
+ newType = "ClassDeclaration";
+ } else if (t.isFunction(node)) {
+ mustHaveId = true;
+ newType = "FunctionDeclaration";
+ } else if (t.isAssignmentExpression(node)) {
+ return t.expressionStatement(node);
+ }
+
+ if (mustHaveId && !node.id) {
+ newType = false;
+ }
+
+ if (!newType) {
+ if (ignore) {
+ return false;
+ } else {
+ throw new Error(`cannot turn ${node.type} to a statement`);
+ }
+ }
+
+ node.type = newType;
+
+ return node;
+}
+
+export function toExpression(node: Object): Object {
+ if (t.isExpressionStatement(node)) {
+ node = node.expression;
+ }
+
+ if (t.isClass(node)) {
+ node.type = "ClassExpression";
+ } else if (t.isFunction(node)) {
+ node.type = "FunctionExpression";
+ }
+
+ if (t.isExpression(node)) {
+ return node;
+ } else {
+ throw new Error(`cannot turn ${node.type} to an expression`);
+ }
+}
+
+export function toBlock(node, parent: Object): Object {
+ if (t.isBlockStatement(node)) {
+ return node;
+ }
+
+ if (t.isEmptyStatement(node)) {
+ node = [];
+ }
+
+ if (!Array.isArray(node)) {
+ if (!t.isStatement(node)) {
+ if (t.isFunction(parent)) {
+ node = t.returnStatement(node);
+ } else {
+ node = t.expressionStatement(node);
+ }
+ }
+
+ node = [node];
+ }
+
+ return t.blockStatement(node);
+}
+
+export function valueToNode(value: any): Object {
+ // undefined
+ if (value === undefined) {
+ return t.identifier("undefined");
+ }
+
+ // boolean
+ if (value === true || value === false) {
+ return t.booleanLiteral(value);
+ }
+
+ // null
+ if (value === null) {
+ return t.nullLiteral();
+ }
+
+ // strings
+ if (isString(value)) {
+ return t.stringLiteral(value);
+ }
+
+ // numbers
+ if (isNumber(value)) {
+ return t.numberLiteral(value);
+ }
+
+ // regexes
+ if (isRegExp(value)) {
+ let pattern = value.source;
+ let flags = value.toString().match(/\/([a-z]+|)$/)[1];
+ return t.regexLiteral(pattern, flags);
+ }
+
+ // array
+ if (Array.isArray(value)) {
+ return t.arrayExpression(value.map(t.valueToNode));
+ }
+
+ // object
+ if (isPlainObject(value)) {
+ let props = [];
+ for (let key in value) {
+ let nodeKey;
+ if (t.isValidIdentifier(key)) {
+ nodeKey = t.identifier(key);
+ } else {
+ nodeKey = t.literal(key);
+ }
+ props.push(t.objectProperty(nodeKey, t.valueToNode(value[key])));
+ }
+ return t.objectExpression(props);
+ }
+
+ throw new Error("don't know how to turn this value into a node");
+}
diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js
new file mode 100644
index 0000000000..8927d95269
--- /dev/null
+++ b/packages/babel-types/src/definitions/core.js
@@ -0,0 +1,683 @@
+/* @flow */
+
+import * as t from "../index";
+import defineType, {
+ assertValueType,
+ assertNodeType,
+ assertEach,
+ chain,
+ assertOneOf,
+} from "./index";
+
+defineType("ArrayExpression", {
+ fields: {
+ elements: {
+ validate: assertValueType("array")
+ }
+ },
+ visitor: ["elements"],
+ aliases: ["Expression"]
+});
+
+defineType("AssignmentExpression", {
+ fields: {
+ operator: {
+ validate: assertValueType("string")
+ },
+ left: {
+ validate: assertNodeType("LVal")
+ },
+ right: {
+ validate: assertNodeType("Expression")
+ }
+ },
+ builder: ["operator", "left", "right"],
+ visitor: ["left", "right"],
+ aliases: ["Expression"]
+});
+
+defineType("BinaryExpression", {
+ builder: ["operator", "left", "right"],
+ fields: {
+ operator: {
+ validate: assertValueType("string")
+ },
+ left: {
+ validate: assertNodeType("Expression")
+ },
+ right: {
+ validate: assertNodeType("Expression")
+ }
+ },
+ visitor: ["left", "right"],
+ aliases: ["Binary", "Expression"]
+});
+
+defineType("Directive", {
+ visitor: ["value"],
+ fields: {
+ value: {
+ validate: assertNodeType("DirectiveLiteral")
+ }
+ }
+});
+
+defineType("DirectiveLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: assertValueType("string")
+ }
+ }
+});
+
+defineType("BlockStatement", {
+ builder: ["body", "directives"],
+ visitor: ["directives", "body"],
+ fields: {
+ directives: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("Directive"))),
+ default: []
+ },
+ body: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("Statement")))
+ }
+ },
+ aliases: ["Scopable", "BlockParent", "Block", "Statement"]
+});
+
+defineType("BreakStatement", {
+ visitor: ["label"],
+ fields: {
+ label: {
+ validate: assertNodeType("Identifier"),
+ optional: true
+ }
+ },
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"]
+});
+
+defineType("CallExpression", {
+ visitor: ["callee", "arguments"],
+ fields: {
+ callee: {
+ validate: assertNodeType("Expression")
+ },
+ arguments: {
+ validate: assertValueType("array")
+ }
+ },
+ aliases: ["Expression"]
+});
+
+defineType("CatchClause", {
+ visitor: ["param", "body"],
+ fields: {
+ param: {
+ validate: assertNodeType("Identifier")
+ },
+ body: {
+ validate: assertNodeType("BlockStatement")
+ }
+ },
+ aliases: ["Scopable"]
+});
+
+defineType("ConditionalExpression", {
+ visitor: ["test", "consequent", "alternate"],
+ fields: {
+ test: {
+ validate: assertNodeType("Expression")
+ },
+ consequent: {
+ validate: assertNodeType("Expression")
+ },
+ alternate: {
+ validate: assertNodeType("Expression")
+ }
+ },
+ aliases: ["Expression", "Conditional"]
+});
+
+defineType("ContinueStatement", {
+ visitor: ["label"],
+ fields: {
+ label: {
+ validate: assertNodeType("Identifier"),
+ optional: true
+ }
+ },
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"]
+});
+
+defineType("DebuggerStatement", {
+ aliases: ["Statement"]
+});
+
+defineType("DoWhileStatement", {
+ visitor: ["test", "body"],
+ fields: {
+ test: {
+ validate: assertNodeType("Expression")
+ },
+ body: {
+ validate: assertNodeType("BlockStatement")
+ }
+ },
+ aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"]
+});
+
+defineType("EmptyStatement", {
+ aliases: ["Statement"]
+});
+
+defineType("ExpressionStatement", {
+ visitor: ["expression"],
+ fields: {
+ expression: {
+ validate: assertNodeType("Expression")
+ }
+ },
+ aliases: ["Statement", "ExpressionWrapper"]
+});
+
+defineType("File", {
+ builder: ["program", "comments", "tokens"],
+ visitor: ["program"],
+ fields: {
+ program: {
+ validate: assertNodeType("Program")
+ }
+ }
+});
+
+defineType("ForInStatement", {
+ visitor: ["left", "right", "body"],
+ aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"],
+ fields: {
+ left: {
+ validate: assertNodeType("VariableDeclaration", "LVal")
+ },
+ right: {
+ validate: assertNodeType("Expression")
+ },
+ body: {
+ validate: assertNodeType("Statement")
+ }
+ }
+});
+
+defineType("ForStatement", {
+ visitor: ["init", "test", "update", "body"],
+ aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop"],
+ fields: {
+ init: {
+ validate: assertNodeType("VariableDeclaration", "Expression")
+ },
+ test: {
+ validate: assertNodeType("Expression")
+ },
+ update: {
+ validate: assertNodeType("Expression")
+ },
+ body: {
+ validate: assertNodeType("Statement")
+ }
+ }
+});
+
+defineType("FunctionDeclaration", {
+ builder: ["id", "params", "body", "generator", "async"],
+ visitor: ["id", "params", "body", "returnType", "typeParameters"],
+ fields: {
+ id: {
+ validate: assertNodeType("Identifier")
+ },
+ params: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("LVal")))
+ },
+ body: {
+ validate: assertNodeType("BlockStatement")
+ },
+ generator: {
+ default: false,
+ validate: assertValueType("boolean")
+ },
+ async: {
+ default: false,
+ validate: assertValueType("boolean")
+ }
+ },
+ aliases: [
+ "Scopable",
+ "Function",
+ "BlockParent",
+ "FunctionParent",
+ "Statement",
+ "Pureish",
+ "Declaration"
+ ]
+});
+
+defineType("FunctionExpression", {
+ inherits: "FunctionDeclaration",
+ aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"],
+ fields: {
+ id: {
+ validate: assertNodeType("Identifier"),
+ optional: true
+ },
+ params: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("LVal")))
+ },
+ body: {
+ validate: assertNodeType("BlockStatement")
+ },
+ generator: {
+ default: false,
+ validate: assertValueType("boolean")
+ },
+ async: {
+ default: false,
+ validate: assertValueType("boolean")
+ }
+ }
+});
+
+defineType("Identifier", {
+ builder: ["name"],
+ visitor: ["typeAnnotation"],
+ aliases: ["Expression", "LVal"],
+ fields: {
+ name: {
+ validate(node, key, val) {
+ if (!t.isValidIdentifier(val)) {
+ // todo
+ }
+ }
+ }
+ }
+});
+
+defineType("IfStatement", {
+ visitor: ["test", "consequent", "alternate"],
+ aliases: ["Statement", "Conditional"],
+ fields: {
+ test: {
+ validate: assertNodeType("Expression")
+ },
+ consequent: {
+ optional: true,
+ validate: assertNodeType("Statement")
+ },
+ alternate: {
+ optional: true,
+ validate: assertNodeType("Statement")
+ }
+ }
+});
+
+defineType("LabeledStatement", {
+ visitor: ["label", "body"],
+ aliases: ["Statement"],
+ fields: {
+ label: {
+ validate: assertNodeType("Identifier")
+ },
+ body: {
+ validate: assertNodeType("Statement")
+ }
+ }
+});
+
+defineType("StringLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: assertValueType("string")
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+});
+
+defineType("NumberLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: assertValueType("number")
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+});
+
+defineType("NullLiteral", {
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+});
+
+defineType("BooleanLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: assertValueType("boolean")
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+});
+
+defineType("RegexLiteral", {
+ builder: ["pattern", "flags"],
+ aliases: ["Expression", "Literal"],
+ fields: {
+ pattern: {
+ validate: assertValueType("string")
+ },
+ flags: {
+ validate: assertValueType("string"),
+ default: ""
+ }
+ }
+});
+
+defineType("LogicalExpression", {
+ builder: ["operator", "left", "right"],
+ visitor: ["left", "right"],
+ aliases: ["Binary", "Expression"],
+ fields: {
+ operator: {
+ // todo
+ },
+ left: {
+ validate: assertNodeType("Expression")
+ },
+ right: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+defineType("MemberExpression", {
+ builder: ["object", "property", "computed"],
+ visitor: ["object", "property"],
+ aliases: ["Expression", "LVal"],
+ fields: {
+ object: {
+ validate: assertNodeType("Expression")
+ },
+ property: {
+ validate(node, key, val) {
+ let expectedType = node.computed ? "Expression" : "Identifier";
+ assertNodeType(expectedType)(node, key, val);
+ }
+ },
+ computed: {
+ default: false
+ }
+ }
+});
+
+defineType("NewExpression", {
+ visitor: ["callee", "arguments"],
+ aliases: ["Expression"],
+ fields: {
+ callee: {
+ validate: assertNodeType("Expression")
+ },
+ arguments: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression")))
+ }
+ }
+});
+
+defineType("Program", {
+ visitor: ["directives", "body"],
+ builder: ["body", "directives"],
+ fields: {
+ directives: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("Directive"))),
+ default: []
+ },
+ body: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("Statement")))
+ }
+ },
+ aliases: ["Scopable", "BlockParent", "Block", "FunctionParent"]
+});
+
+defineType("ObjectExpression", {
+ visitor: ["properties"],
+ aliases: ["Expression"],
+ fields: {
+ properties: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("ObjectMethod", "ObjectProperty", "SpreadProperty")))
+ }
+ }
+});
+
+defineType("ObjectMethod", {
+ builder: ["kind", "key", "params", "body", "computed"],
+ fields: {
+ kind: {
+ validate: chain(assertValueType("string"), assertOneOf("method", "get", "set")),
+ default: "method"
+ },
+ computed: {
+ validate: assertValueType("boolean"),
+ default: false
+ },
+ key: {
+ validate(node, key, val) {
+ let expectedTypes = node.computed ? ["Expression"] : ["Identifier", "Literal"];
+ assertNodeType(...expectedTypes)(node, key, val);
+ }
+ },
+ decorators: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("Decorator")))
+ },
+ body: {
+ validate: assertNodeType("BlockStatement")
+ },
+ generator: {
+ default: false,
+ validate: assertValueType("boolean")
+ },
+ async: {
+ default: false,
+ validate: assertValueType("boolean")
+ }
+ },
+ visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"],
+ aliases: ["UserWhitespacable", "Function", "Scopable", "BlockParent", "FunctionParent", "Method"]
+});
+
+defineType("ObjectProperty", {
+ builder: ["key", "value", "computed", "shorthand", "decorators"],
+ fields: {
+ computed: {
+ validate: assertValueType("boolean"),
+ default: false
+ },
+ key: {
+ validate(node, key, val) {
+ let expectedTypes = node.computed ? ["Expression"] : ["Identifier", "Literal"];
+ assertNodeType(...expectedTypes)(node, key, val);
+ }
+ },
+ value: {
+ validate: assertNodeType("Expression")
+ },
+ shorthand: {
+ validate: assertValueType("boolean"),
+ default: false
+ },
+ decorators: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("Decorator"))),
+ optional: true
+ }
+ },
+ visitor: ["key", "value", "decorators"],
+ aliases: ["UserWhitespacable", "Property"]
+});
+
+defineType("RestElement", {
+ visitor: ["argument", "typeAnnotation"],
+ aliases: ["LVal"],
+ fields: {
+ argument: {
+ validate: assertNodeType("LVal")
+ }
+ }
+});
+
+defineType("ReturnStatement", {
+ visitor: ["argument"],
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"],
+ fields: {
+ argument: {
+ validate: assertNodeType("Expression"),
+ optional: true
+ }
+ }
+});
+
+defineType("SequenceExpression", {
+ visitor: ["expressions"],
+ fields: {
+ expressions: { validate: assertValueType("array") }
+ },
+ aliases: ["Expression"]
+});
+
+defineType("SwitchCase", {
+ visitor: ["test", "consequent"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("SwitchStatement", {
+ visitor: ["discriminant", "cases"],
+ aliases: ["Statement", "BlockParent", "Scopable"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ThisExpression", {
+ aliases: ["Expression"]
+});
+
+defineType("ThrowStatement", {
+ visitor: ["argument"],
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"],
+ fields: {
+ argument: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+// todo: at least handler or finalizer should be set to be valid
+defineType("TryStatement", {
+ visitor: ["block", "handler", "finalizer"],
+ aliases: ["Statement"],
+ fields: {
+ body: {
+ validate: assertNodeType("BlockStatement")
+ },
+ handler: {
+ optional: true,
+ handler: assertNodeType("BlockStatement")
+ },
+ finalizer: {
+ optional: true,
+ validate: assertNodeType("BlockStatement")
+ }
+ }
+});
+
+defineType("UnaryExpression", {
+ builder: ["operator", "argument", "prefix"],
+ fields: {
+ prefix: {
+ default: false
+ },
+ argument: {
+ validate: assertNodeType("Expression")
+ },
+ operator: {
+ // todo
+ }
+ },
+ visitor: ["argument"],
+ aliases: ["UnaryLike", "Expression"]
+});
+
+defineType("UpdateExpression", {
+ builder: ["operator", "argument", "prefix"],
+ fields: {
+ prefix: {
+ default: false
+ },
+ argument: {
+ validate: assertNodeType("Expression")
+ },
+ operator: {
+ // todo
+ }
+ },
+ visitor: ["argument"],
+ aliases: ["Expression"]
+});
+
+defineType("VariableDeclaration", {
+ builder: ["kind", "declarations"],
+ visitor: ["declarations"],
+ aliases: ["Statement", "Declaration"],
+ fields: {
+ kind: {
+ validate: chain(assertValueType("string"), assertOneOf("var", "let", "const"))
+ },
+ declarations: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("VariableDeclarator")))
+ }
+ }
+});
+
+defineType("VariableDeclarator", {
+ visitor: ["id", "init"],
+ fields: {
+ id: {
+ validate: assertNodeType("LVal")
+ },
+ init: {
+ optional: true,
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+defineType("WhileStatement", {
+ visitor: ["test", "body"],
+ aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"],
+ fields: {
+ test: {
+ validate: assertNodeType("Expression")
+ },
+ body: {
+ validate: assertNodeType("BlockStatement", "Statement")
+ }
+ }
+});
+
+defineType("WithStatement", {
+ visitor: ["object", "body"],
+ aliases: ["Statement"],
+ fields: {
+ object: {
+ object: assertNodeType("Expression")
+ },
+ body: {
+ validate: assertNodeType("BlockStatement")
+ }
+ }
+});
diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js
new file mode 100644
index 0000000000..c42bd87df6
--- /dev/null
+++ b/packages/babel-types/src/definitions/es2015.js
@@ -0,0 +1,336 @@
+/* @flow */
+
+import defineType, {
+ assertNodeType,
+ assertValueType,
+ chain,
+ assertEach,
+ assertOneOf,
+} from "./index";
+
+defineType("AssignmentPattern", {
+ visitor: ["left", "right"],
+ aliases: ["Pattern", "LVal"],
+ fields: {
+ left: {
+ validate: assertNodeType("Identifier")
+ },
+ right: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+defineType("ArrayPattern", {
+ visitor: ["elements", "typeAnnotation"],
+ aliases: ["Pattern", "LVal"],
+ fields: {
+ elements: {
+ validate: chain(assertValueType("array"), assertEach(assertValueType("Expression")))
+ }
+ }
+});
+
+defineType("ArrowFunctionExpression", {
+ builder: ["params", "body", "async"],
+ visitor: ["params", "body", "returnType"],
+ aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"],
+ fields: {
+ params: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("LVal")))
+ },
+ body: {
+ validate: assertNodeType("BlockStatement", "Expression")
+ },
+ async: {
+ validate: assertValueType("boolean"),
+ default: false
+ }
+ }
+});
+
+defineType("ClassBody", {
+ visitor: ["body"],
+ fields: {
+ body: {
+ validate: chain(assertValueType("array"), assertEach(assertValueType("ClassMethod", "ClassProperty")))
+ }
+ }
+});
+
+defineType("ClassDeclaration", {
+ builder: ["id", "superClass", "body", "decorators"],
+ visitor: [
+ "id",
+ "body",
+ "superClass",
+ "typeParameters",
+ "superTypeParameters",
+ "implements",
+ "decorators"
+ ],
+ aliases: ["Scopable", "Class", "Statement", "Declaration", "Pureish"],
+ fields: {
+ id: {
+ validate: assertNodeType("Identifier")
+ },
+ body: {
+ validate: assertNodeType("ClassBody")
+ },
+ superClass: {
+ optional: true,
+ validate: assertNodeType("Expression")
+ },
+ decorators: {
+ validate: chain(assertValueType("array"), assertEach(assertValueType("Decorator")))
+ }
+ }
+});
+
+defineType("ClassExpression", {
+ inherits: "ClassDeclaration",
+ aliases: ["Scopable", "Class", "Expression", "Pureish"],
+ fields: {
+ id: {
+ optional: true,
+ validate: assertNodeType("Identifier")
+ },
+ body: {
+ validate: assertNodeType("ClassBody")
+ },
+ superClass: {
+ optional: true,
+ validate: assertNodeType("Expression")
+ },
+ decorators: {
+ validate: chain(assertValueType("array"), assertEach(assertValueType("Decorator")))
+ }
+ }
+});
+
+defineType("ExportAllDeclaration", {
+ visitor: ["source"],
+ aliases: ["Statement", "Declaration", "ModuleDeclaration", "ExportDeclaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ExportDefaultDeclaration", {
+ visitor: ["declaration"],
+ aliases: ["Statement", "Declaration", "ModuleDeclaration", "ExportDeclaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ExportNamedDeclaration", {
+ visitor: ["declaration", "specifiers", "source"],
+ aliases: ["Statement", "Declaration", "ModuleDeclaration", "ExportDeclaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ExportSpecifier", {
+ visitor: ["local", "exported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: assertNodeType("Identifier")
+ },
+ imported: {
+ validate: assertNodeType("Identifier")
+ }
+ }
+});
+
+defineType("ForOfStatement", {
+ visitor: ["left", "right", "body"],
+ aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"],
+ fields: {
+ left: {
+ validate: assertNodeType("VariableDeclaration", "LVal")
+ },
+ right: {
+ validate: assertNodeType("Expression")
+ },
+ body: {
+ validate: assertNodeType("Statement")
+ }
+ }
+});
+
+defineType("ImportDeclaration", {
+ visitor: ["specifiers", "source"],
+ aliases: ["Statement", "Declaration", "ModuleDeclaration"],
+ fields: {
+ specifiers: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("ImportSpecifier", "ImportDefaultSpecifier", "ImportNamespaceSpecifier")))
+ },
+ source: {
+ validate: assertNodeType("StringLiteral")
+ }
+ }
+});
+
+defineType("ImportDefaultSpecifier", {
+ visitor: ["local"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: assertNodeType("Identifier")
+ }
+ }
+});
+
+defineType("ImportNamespaceSpecifier", {
+ visitor: ["local"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: assertNodeType("Identifier")
+ }
+ }
+});
+
+defineType("ImportSpecifier", {
+ visitor: ["local", "imported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: assertNodeType("Identifier")
+ },
+ imported: {
+ validate: assertNodeType("Identifier")
+ }
+ }
+});
+
+defineType("MetaProperty", {
+ visitor: ["meta", "property"],
+ aliases: ["Expression"],
+ fields: {
+ // todo: limit to new.target
+ meta: {
+ validate: assertValueType("string")
+ },
+ property: {
+ validate: assertValueType("string")
+ }
+ }
+});
+
+defineType("ClassMethod", {
+ aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method"],
+ builder: ["kind", "key", "params", "body", "computed", "static"],
+ visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"],
+ fields: {
+ kind: {
+ validate: chain(assertValueType("string"), assertOneOf("get", "set", "method", "constructor")),
+ default: "method"
+ },
+ computed: {
+ default: false,
+ validate: assertValueType("boolean")
+ },
+ static: {
+ default: false,
+ validate: assertValueType("boolean")
+ },
+ key: {
+ validate(node, key, val) {
+ let expectedTypes = node.computed ? ["Expression"] : ["Identifier", "Literal"];
+ assertNodeType(...expectedTypes)(node, key, val);
+ }
+ },
+ params: {
+ validate: chain(assertValueType("array"), assertEach(assertNodeType("LVal")))
+ },
+ body: {
+ validate: assertNodeType("BlockStatement")
+ },
+ generator: {
+ default: false,
+ validate: assertValueType("boolean")
+ },
+ async: {
+ default: false,
+ validate: assertValueType("boolean")
+ }
+ }
+});
+
+defineType("ObjectPattern", {
+ visitor: ["properties", "typeAnnotation"],
+ aliases: ["Pattern", "LVal"],
+ fields: {
+ properties: {
+ validate: chain(assertValueType("array"), assertEach(assertValueType("RestProperty", "Property")))
+ }
+ }
+});
+
+defineType("SpreadElement", {
+ visitor: ["argument"],
+ aliases: ["UnaryLike"],
+ fields: {
+ argument: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+defineType("Super", {
+ aliases: ["Expression"]
+});
+
+defineType("TaggedTemplateExpression", {
+ visitor: ["tag", "quasi"],
+ aliases: ["Expression"],
+ fields: {
+ tag: {
+ validate: assertNodeType("Expression")
+ },
+ quasi: {
+ validate: assertNodeType("TemplateLiteral")
+ }
+ }
+});
+
+defineType("TemplateElement", {
+ builder: ["value", "tail"],
+ fields: {
+ value: {
+ // todo: flatten `raw` into main node
+ },
+ tail: {
+ validate: assertValueType("boolean"),
+ default: false
+ }
+ }
+});
+
+defineType("TemplateLiteral", {
+ visitor: ["quasis", "expressions"],
+ aliases: ["Expression", "Literal"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("YieldExpression", {
+ builder: ["argument", "delegate"],
+ visitor: ["argument"],
+ aliases: ["Expression", "Terminatorless"],
+ fields: {
+ delegate: {
+ validate: assertValueType("boolean"),
+ default: false
+ },
+ argument: {
+ optional: true,
+ validate: assertNodeType("Expression"),
+ }
+ }
+});
diff --git a/packages/babel-types/src/definitions/experimental.js b/packages/babel-types/src/definitions/experimental.js
new file mode 100644
index 0000000000..45ee553327
--- /dev/null
+++ b/packages/babel-types/src/definitions/experimental.js
@@ -0,0 +1,80 @@
+/* @flow */
+
+import defineType, { assertNodeType } from "./index";
+
+defineType("AwaitExpression", {
+ builder: ["argument"],
+ visitor: ["argument"],
+ aliases: ["Expression", "Terminatorless"],
+ fields: {
+ argument: {
+ validate: assertNodeType("Expression"),
+ }
+ }
+});
+
+defineType("BindExpression", {
+ visitor: ["object", "callee"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("Decorator", {
+ visitor: ["expression"],
+ fields: {
+ expression: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+defineType("DoExpression", {
+ visitor: ["body"],
+ aliases: ["Expression"],
+ fields: {
+ body: {
+ validate: assertNodeType("BlockStatement")
+ }
+ }
+});
+
+defineType("ExportDefaultSpecifier", {
+ visitor: ["exported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ exported: {
+ validate: assertNodeType("Identifier")
+ }
+ }
+});
+
+defineType("ExportNamespaceSpecifier", {
+ visitor: ["exported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ exported: {
+ validate: assertNodeType("Identifier")
+ }
+ }
+});
+
+defineType("RestProperty", {
+ visitor: ["argument"],
+ aliases: ["UnaryLike"],
+ fields: {
+ argument: {
+ validate: assertNodeType("LVal")
+ }
+ }
+});
+
+defineType("SpreadProperty", {
+ visitor: ["argument"],
+ aliases: ["UnaryLike"],
+ fields: {
+ argument: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
diff --git a/packages/babel-types/src/definitions/flow.js b/packages/babel-types/src/definitions/flow.js
new file mode 100644
index 0000000000..4a7a26ca1e
--- /dev/null
+++ b/packages/babel-types/src/definitions/flow.js
@@ -0,0 +1,279 @@
+/* @flow */
+
+import defineType from "./index";
+
+defineType("AnyTypeAnnotation", {
+ aliases: ["Flow", "FlowBaseAnnotation"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ArrayTypeAnnotation", {
+ visitor: ["elementType"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("BooleanTypeAnnotation", {
+ aliases: ["Flow", "FlowBaseAnnotation"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("BooleanLiteralTypeAnnotation", {
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ClassImplements", {
+ visitor: ["id", "typeParameters"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ClassProperty", {
+ visitor: ["key", "value", "typeAnnotation", "decorators"],
+ aliases: ["Flow", "Property"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("DeclareClass", {
+ visitor: ["id", "typeParameters", "extends", "body"],
+ aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("DeclareFunction", {
+ visitor: ["id"],
+ aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("DeclareModule", {
+ visitor: ["id", "body"],
+ aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("DeclareVariable", {
+ visitor: ["id"],
+ aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("FunctionTypeAnnotation", {
+ visitor: ["typeParameters", "params", "rest", "returnType"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("FunctionTypeParam", {
+ visitor: ["name", "typeAnnotation"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("GenericTypeAnnotation", {
+ visitor: ["id", "typeParameters"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("InterfaceExtends", {
+ visitor: ["id", "typeParameters"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("InterfaceDeclaration", {
+ visitor: ["id", "typeParameters", "extends", "body"],
+ aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("IntersectionTypeAnnotation", {
+ visitor: ["types"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("MixedTypeAnnotation", {
+ aliases: ["Flow", "FlowBaseAnnotation"]
+});
+
+defineType("NullableTypeAnnotation", {
+ visitor: ["typeAnnotation"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("NumberLiteralTypeAnnotation", {
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("NumberTypeAnnotation", {
+ aliases: ["Flow", "FlowBaseAnnotation"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("StringLiteralTypeAnnotation", {
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("StringTypeAnnotation", {
+ aliases: ["Flow", "FlowBaseAnnotation"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("TupleTypeAnnotation", {
+ visitor: ["types"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("TypeofTypeAnnotation", {
+ visitor: ["argument"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("TypeAlias", {
+ visitor: ["id", "typeParameters", "right"],
+ aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("TypeAnnotation", {
+ visitor: ["typeAnnotation"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("TypeCastExpression", {
+ visitor: ["expression", "typeAnnotation"],
+ aliases: ["Flow", "ExpressionWrapper"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("TypeParameterDeclaration", {
+ visitor: ["params"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("TypeParameterInstantiation", {
+ visitor: ["params"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ObjectTypeAnnotation", {
+ visitor: ["properties", "indexers", "callProperties"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ObjectTypeCallProperty", {
+ visitor: ["value"],
+ aliases: ["Flow", "UserWhitespacable"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ObjectTypeIndexer", {
+ visitor: ["id", "key", "value"],
+ aliases: ["Flow", "UserWhitespacable"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("ObjectTypeProperty", {
+ visitor: ["key", "value"],
+ aliases: ["Flow", "UserWhitespacable"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("QualifiedTypeIdentifier", {
+ visitor: ["id", "qualification"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("UnionTypeAnnotation", {
+ visitor: ["types"],
+ aliases: ["Flow"],
+ fields: {
+ // todo
+ }
+});
+
+defineType("VoidTypeAnnotation", {
+ aliases: ["Flow", "FlowBaseAnnotation"],
+ fields: {
+ // todo
+ }
+});
diff --git a/packages/babel-types/src/definitions/index.js b/packages/babel-types/src/definitions/index.js
new file mode 100644
index 0000000000..b25bf63073
--- /dev/null
+++ b/packages/babel-types/src/definitions/index.js
@@ -0,0 +1,127 @@
+/* @flow */
+
+import * as t from "../index";
+
+export let VISITOR_KEYS = {};
+export let ALIAS_KEYS = {};
+export let NODE_FIELDS = {};
+export let BUILDER_KEYS = {};
+
+function getType(val) {
+ if (Array.isArray(val)) {
+ return "array";
+ } else if (val === null) {
+ return "null";
+ } else if (val === undefined) {
+ return "undefined";
+ } else {
+ return typeof val;
+ }
+}
+
+export function assertEach(callback: Function): Function {
+ return function (node, key, val) {
+ if (!Array.isArray(val)) return;
+
+ for (let i = 0; i < val.length; i++) {
+ callback(node, `${key}[${i}]`, val[i]);
+ }
+ };
+}
+
+export function assertOneOf(...vals): Function {
+ function validate(node, key, val) {
+ if (vals.indexOf(val) < 0) {
+ throw new TypeError(`Property ${key} expected value to be one of ${JSON.stringify(vals)} but got ${JSON.stringify(val)}`);
+ }
+ }
+
+ validate.oneOf = vals;
+
+ return validate;
+}
+
+export function assertNodeType(...types: Array): Function {
+ function validate(node, key, val) {
+ let valid = false;
+
+ for (let type of types) {
+ if (t.is(type, val)) {
+ valid = true;
+ break;
+ }
+ }
+
+ if (!valid) {
+ throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val && val.type)}`);
+ }
+ }
+
+ validate.oneOfNodeTypes = types;
+
+ return validate;
+}
+
+export function assertValueType(type: string): Function {
+ function validate(node, key, val) {
+ let valid = getType(val) === type;
+
+ if (!valid) {
+ throw new TypeError(`Property ${key} expected type of ${type} but got ${getType(val)}`);
+ }
+ }
+
+ validate.type = type;
+
+ return validate;
+}
+
+export function chain(...fns: Array): Function {
+ return function (...args) {
+ for (let fn of fns) {
+ fn(...args);
+ }
+ };
+}
+
+export default function defineType(
+ type: string,
+ opts: {
+ fields?: Object;
+ visitor?: Array;
+ aliases?: Array;
+ builder?: Array;
+ inherits?: string;
+ } = {},
+) {
+ let inherits = (opts.inherits && store[opts.inherits]) || {};
+
+ opts.fields = opts.fields || inherits.fields || {};
+ opts.visitor = opts.visitor || inherits.visitor || [];
+ opts.aliases = opts.aliases || inherits.aliases || [];
+ opts.builder = opts.builder || inherits.builder || opts.visitor || [];
+
+ // ensure all field keys are represented in `fields`
+ for (let key of (opts.visitor.concat(opts.builder): Array)) {
+ opts.fields[key] = opts.fields[key] || {};
+ }
+
+ for (let key in opts.fields) {
+ let field = opts.fields[key];
+
+ if (field.default === undefined) {
+ field.default = null;
+ } else if (!field.validate) {
+ field.validate = assertValueType(getType(field.default));
+ }
+ }
+
+ VISITOR_KEYS[type] = opts.visitor;
+ BUILDER_KEYS[type] = opts.builder;
+ NODE_FIELDS[type] = opts.fields;
+ ALIAS_KEYS[type] = opts.aliases;
+
+ store[type] = opts;
+}
+
+let store = {};
diff --git a/packages/babel/src/types/definitions/init.js b/packages/babel-types/src/definitions/init.js
similarity index 100%
rename from packages/babel/src/types/definitions/init.js
rename to packages/babel-types/src/definitions/init.js
diff --git a/packages/babel-types/src/definitions/jsx.js b/packages/babel-types/src/definitions/jsx.js
new file mode 100644
index 0000000000..c11d2fdc17
--- /dev/null
+++ b/packages/babel-types/src/definitions/jsx.js
@@ -0,0 +1,136 @@
+/* @flow */
+
+import defineType, { assertNodeType, assertValueType, chain, assertEach } from "./index";
+
+defineType("JSXAttribute", {
+ visitor: ["name", "value"],
+ aliases: ["JSX", "Immutable"],
+ fields: {
+ name: {
+ validate: assertNodeType("JSXIdentifier", "JSXMemberExpression")
+ },
+ value: {
+ optional: true,
+ validate: assertNodeType("JSXElement", "StringLiteral", "JSXExpressionContainer")
+ }
+ }
+});
+
+defineType("JSXClosingElement", {
+ visitor: ["name"],
+ aliases: ["JSX", "Immutable"],
+ fields: {
+ name: {
+ validate: assertNodeType("JSXIdentifier", "JSXMemberExpression")
+ }
+ }
+});
+
+defineType("JSXElement", {
+ builder: ["openingElement", "closingElement", "children", "selfClosing"],
+ visitor: ["openingElement", "children", "closingElement"],
+ aliases: ["JSX", "Immutable", "Expression"],
+ fields: {
+ openingElement: {
+ validate: assertNodeType("JSXOpeningElement")
+ },
+ closingElement: {
+ optional: true,
+ validate: assertNodeType("JSXClosingElement")
+ },
+ children: {
+ // todo
+ }
+ }
+});
+
+defineType("JSXEmptyExpression", {
+ aliases: ["JSX", "Expression"]
+});
+
+defineType("JSXExpressionContainer", {
+ visitor: ["expression"],
+ aliases: ["JSX", "Immutable"],
+ fields: {
+ expression: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+defineType("JSXIdentifier", {
+ builder: ["name"],
+ aliases: ["JSX", "Expression"],
+ fields: {
+ name: {
+ validate: assertValueType("string")
+ }
+ }
+});
+
+defineType("JSXMemberExpression", {
+ visitor: ["object", "property"],
+ aliases: ["JSX", "Expression"],
+ fields: {
+ object: {
+ validate: assertNodeType("JSXIdentifier")
+ },
+ property: {
+ validate: assertNodeType("JSXIdentifier")
+ }
+ }
+});
+
+defineType("JSXNamespacedName", {
+ visitor: ["namespace", "name"],
+ aliases: ["JSX"],
+ fields: {
+ namespace: {
+ validate: assertNodeType("JSXIdentifier")
+ },
+ name: {
+ validate: assertNodeType("JSXIdentifier")
+ }
+ }
+});
+
+defineType("JSXOpeningElement", {
+ builder: ["name", "attributes", "selfClosing"],
+ visitor: ["name", "attributes"],
+ aliases: ["JSX", "Immutable"],
+ fields: {
+ name: {
+ validate: assertNodeType("JSXIdentifier", "JSXMemberExpression")
+ },
+ selfClosing: {
+ default: false,
+ validate: assertValueType("boolean")
+ },
+ attributes: {
+ validate: chain(
+ assertValueType("array"),
+ assertEach(assertNodeType("JSXAttribute", "JSXSpreadAttribute"))
+ )
+ }
+ }
+});
+
+defineType("JSXSpreadAttribute", {
+ visitor: ["argument"],
+ aliases: ["JSX"],
+ fields: {
+ argument: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
+
+defineType("JSXText", {
+ aliases: ["JSX"],
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: assertValueType("string")
+ }
+ }
+});
diff --git a/packages/babel-types/src/definitions/misc.js b/packages/babel-types/src/definitions/misc.js
new file mode 100644
index 0000000000..23e010da14
--- /dev/null
+++ b/packages/babel-types/src/definitions/misc.js
@@ -0,0 +1,17 @@
+/* @flow */
+
+import defineType, { assertNodeType } from "./index";
+
+defineType("Noop", {
+ visitor: []
+});
+
+defineType("ParenthesizedExpression", {
+ visitor: ["expression"],
+ aliases: ["Expression", "ExpressionWrapper"],
+ fields: {
+ expression: {
+ validate: assertNodeType("Expression")
+ }
+ }
+});
diff --git a/packages/babel-types/src/flow.js b/packages/babel-types/src/flow.js
new file mode 100644
index 0000000000..86f53e3b4f
--- /dev/null
+++ b/packages/babel-types/src/flow.js
@@ -0,0 +1,122 @@
+/* @flow */
+
+import * as t from "./index";
+
+/**
+ * Takes an array of `types` and flattens them, removing duplicates and
+ * returns a `UnionTypeAnnotation` node containg them.
+ */
+
+export function createUnionTypeAnnotation(types: Array) {
+ let flattened = removeTypeDuplicates(types);
+
+ if (flattened.length === 1) {
+ return flattened[0];
+ } else {
+ return t.unionTypeAnnotation(flattened);
+ }
+}
+
+/**
+ * Dedupe type annotations.
+ */
+
+export function removeTypeDuplicates(nodes: Array) {
+ let generics = {};
+ let bases = {};
+
+ // store union type groups to circular references
+ let typeGroups = [];
+
+ let types = [];
+
+ for (let i = 0; i < nodes.length; i++) {
+ let node = nodes[i];
+ if (!node) continue;
+
+ // detect duplicates
+ if (types.indexOf(node) >= 0) {
+ continue;
+ }
+
+ // this type matches anything
+ if (t.isAnyTypeAnnotation(node)) {
+ return [node];
+ }
+
+ //
+ if (t.isFlowBaseAnnotation(node)) {
+ bases[node.type] = node;
+ continue;
+ }
+
+ //
+ if (t.isUnionTypeAnnotation(node)) {
+ if (typeGroups.indexOf(node.types) < 0) {
+ nodes = nodes.concat(node.types);
+ typeGroups.push(node.types);
+ }
+ continue;
+ }
+
+ // find a matching generic type and merge and deduplicate the type parameters
+ if (t.isGenericTypeAnnotation(node)) {
+ let name = node.id.name;
+
+ if (generics[name]) {
+ let existing = generics[name];
+ if (existing.typeParameters) {
+ if (node.typeParameters) {
+ existing.typeParameters.params = removeTypeDuplicates(
+ existing.typeParameters.params.concat(node.typeParameters.params)
+ );
+ }
+ } else {
+ existing = node.typeParameters;
+ }
+ } else {
+ generics[name] = node;
+ }
+
+ continue;
+ }
+
+ types.push(node);
+ }
+
+ // add back in bases
+ for (let type in bases) {
+ types.push(bases[type]);
+ }
+
+ // add back in generics
+ for (let name in generics) {
+ types.push(generics[name]);
+ }
+
+ return types;
+}
+
+/**
+ * Create a type anotation based on typeof expression.
+ */
+
+export function createTypeAnnotationBasedOnTypeof(type: string) {
+ if (type === "string") {
+ return t.stringTypeAnnotation();
+ } else if (type === "number") {
+ return t.numberTypeAnnotation();
+ } else if (type === "undefined") {
+ return t.voidTypeAnnotation();
+ } else if (type === "boolean") {
+ return t.booleanTypeAnnotation();
+ } else if (type === "function") {
+ return t.genericTypeAnnotation(t.identifier("Function"));
+ } else if (type === "object") {
+ return t.genericTypeAnnotation(t.identifier("Object"));
+ } else if (type === "symbol") {
+ return t.genericTypeAnnotation(t.identifier("Symbol"));
+ } else {
+ throw new Error("Invalid typeof value");
+ }
+}
diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js
new file mode 100644
index 0000000000..e232281c1f
--- /dev/null
+++ b/packages/babel-types/src/index.js
@@ -0,0 +1,403 @@
+/* @flow */
+
+import toFastProperties from "to-fast-properties";
+import compact from "lodash/array/compact";
+import loClone from "lodash/lang/clone";
+import each from "lodash/collection/each";
+import uniq from "lodash/array/uniq";
+
+let t = exports;
+
+/**
+ * Registers `is[Type]` and `assert[Type]` generated functions for a given `type`.
+ * Pass `skipAliasCheck` to force it to directly compare `node.type` with `type`.
+ */
+
+function registerType(type: string, skipAliasCheck?: boolean) {
+ let is = t[`is${type}`] = function (node, opts) {
+ return t.is(type, node, opts, skipAliasCheck);
+ };
+
+ t[`assert${type}`] = function (node, opts) {
+ opts = opts || {};
+ if (!is(node, opts)) {
+ throw new Error(`Expected type ${JSON.stringify(type)} with option ${JSON.stringify(opts)}`);
+ }
+ };
+}
+
+export const STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"];
+export const FLATTENABLE_KEYS = ["body", "expressions"];
+export const FOR_INIT_KEYS = ["left", "init"];
+export const COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"];
+
+export const INHERIT_KEYS = {
+ optional: ["typeAnnotation", "typeParameters", "returnType"],
+ force: ["_scopeInfo", "_paths", "start", "loc", "end"]
+};
+
+export const BOOLEAN_NUMBER_BINARY_OPERATORS = [">", "<", ">=", "<="];
+export const EQUALITY_BINARY_OPERATORS = ["==", "===", "!=", "!=="];
+export const COMPARISON_BINARY_OPERATORS = EQUALITY_BINARY_OPERATORS.concat(["in", "instanceof"]);
+export const BOOLEAN_BINARY_OPERATORS = [].concat(COMPARISON_BINARY_OPERATORS, BOOLEAN_NUMBER_BINARY_OPERATORS);
+export const NUMBER_BINARY_OPERATORS = ["-", "/", "*", "**", "&", "|", ">>", ">>>", "<<", "^"];
+
+export const BOOLEAN_UNARY_OPERATORS = ["delete", "!"];
+export const NUMBER_UNARY_OPERATORS = ["+", "-", "++", "--", "~"];
+export const STRING_UNARY_OPERATORS = ["typeof"];
+
+import "./definitions/init";
+import { VISITOR_KEYS, ALIAS_KEYS, NODE_FIELDS, BUILDER_KEYS } from "./definitions";
+export { VISITOR_KEYS, ALIAS_KEYS, NODE_FIELDS, BUILDER_KEYS };
+
+import * as _react from "./react";
+export { _react as react };
+
+/**
+ * Registers `is[Type]` and `assert[Type]` for all types.
+ */
+
+for (let type in t.VISITOR_KEYS) {
+ registerType(type, true);
+}
+
+/**
+ * Flip `ALIAS_KEYS` for faster access in the reverse direction.
+ */
+
+t.FLIPPED_ALIAS_KEYS = {};
+
+each(t.ALIAS_KEYS, function (aliases, type) {
+ each(aliases, function (alias) {
+ let types = t.FLIPPED_ALIAS_KEYS[alias] = t.FLIPPED_ALIAS_KEYS[alias] || [];
+ types.push(type);
+ });
+});
+
+/**
+ * Registers `is[Alias]` and `assert[Alias]` functions for all aliases.
+ */
+
+each(t.FLIPPED_ALIAS_KEYS, function (types, type) {
+ t[type.toUpperCase() + "_TYPES"] = types;
+ registerType(type, false);
+});
+
+export const TYPES = Object.keys(t.VISITOR_KEYS).concat(Object.keys(t.FLIPPED_ALIAS_KEYS));
+
+/**
+ * Returns whether `node` is of given `type`.
+ *
+ * For better performance, use this instead of `is[Type]` when `type` is unknown.
+ * Optionally, pass `skipAliasCheck` to directly compare `node.type` with `type`.
+ */
+
+export function is(type: string, node: Object, opts?: Object): boolean {
+ if (!node) return false;
+
+ let matches = isType(node.type, type);
+ if (!matches) return false;
+
+ if (typeof opts === "undefined") {
+ return true;
+ } else {
+ return t.shallowEqual(node, opts);
+ }
+}
+
+/**
+ * Test if a `nodeType` is a `targetType` or if `targetType` is an alias of `nodeType`.
+ */
+
+export function isType(nodeType: string, targetType: string): boolean {
+ if (nodeType === targetType) return true;
+
+ let aliases = t.FLIPPED_ALIAS_KEYS[targetType];
+ if (aliases) {
+ if (aliases[0] === nodeType) return true;
+
+ for (let alias of (aliases: Array)) {
+ if (nodeType === alias) return true;
+ }
+ }
+
+ return false;
+}
+
+each(t.BUILDER_KEYS, function (keys, type) {
+ function builder() {
+ if (arguments.length > keys.length) {
+ // todo: error
+ }
+
+ let node = {};
+ node.type = type;
+
+ let i = 0;
+
+ for (let key of (keys: Array)) {
+ let field = t.NODE_FIELDS[type][key];
+
+ let arg = arguments[i++];
+ if (arg === undefined) arg = loClone(field.default);
+
+ node[key] = arg;
+ }
+
+ for (let key in node) {
+ validate(node, key, node[key]);
+ }
+
+ return node;
+ }
+
+ t[type] = builder;
+ t[type[0].toLowerCase() + type.slice(1)] = builder;
+});
+
+/**
+ * Description
+ */
+
+export function validate(node?: Object, key: string, val: any) {
+ if (!node) return;
+
+ let fields = t.NODE_FIELDS[node.type];
+ if (!fields) return;
+
+ let field = fields[key];
+ if (!field || !field.validate) return;
+ if (field.optional && val == null) return;
+
+ field.validate(node, key, val);
+}
+
+/**
+ * Test if an object is shallowly equal.
+ */
+
+export function shallowEqual(actual: Object, expected: Object): boolean {
+ let keys = Object.keys(expected);
+
+ for (let key of (keys: Array)) {
+ if (actual[key] !== expected[key]) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Append a node to a member expression.
+ */
+
+export function appendToMemberExpression(member: Object, append: Object, computed?: boolean): Object {
+ member.object = t.memberExpression(member.object, member.property, member.computed);
+ member.property = append;
+ member.computed = !!computed;
+ return member;
+}
+
+/**
+ * Prepend a node to a member expression.
+ */
+
+export function prependToMemberExpression(member: Object, prepend: Object): Object {
+ member.object = t.memberExpression(prepend, member.object);
+ return member;
+}
+
+/**
+ * Ensure the `key` (defaults to "body") of a `node` is a block.
+ * Casting it to a block if it is not.
+ */
+
+export function ensureBlock(node: Object, key: string = "body"): Object {
+ return node[key] = t.toBlock(node[key], node);
+}
+
+/**
+ * Create a shallow clone of a `node` excluding `_private` properties.
+ */
+
+export function clone(node: Object): Object {
+ let newNode = {};
+ for (let key in node) {
+ if (key[0] === "_") continue;
+ newNode[key] = node[key];
+ }
+ return newNode;
+}
+
+/**
+ * Create a deep clone of a `node` and all of it's child nodes
+ * exluding `_private` properties.
+ */
+
+export function cloneDeep(node: Object): Object {
+ let newNode = {};
+
+ for (let key in node) {
+ if (key[0] === "_") continue;
+
+ let val = node[key];
+
+ if (val) {
+ if (val.type) {
+ val = t.cloneDeep(val);
+ } else if (Array.isArray(val)) {
+ val = val.map(t.cloneDeep);
+ }
+ }
+
+ newNode[key] = val;
+ }
+
+ return newNode;
+}
+
+/**
+ * Build a function that when called will return whether or not the
+ * input `node` `MemberExpression` matches the input `match`.
+ *
+ * For example, given the match `React.createClass` it would match the
+ * parsed nodes of `React.createClass` and `React["createClass"]`.
+ */
+
+export function buildMatchMemberExpression(match:string, allowPartial?: boolean): Function {
+ let parts = match.split(".");
+
+ return function (member) {
+ // not a member expression
+ if (!t.isMemberExpression(member)) return false;
+
+ let search = [member];
+ let i = 0;
+
+ while (search.length) {
+ let node = search.shift();
+
+ if (allowPartial && i === parts.length) {
+ return true;
+ }
+
+ if (t.isIdentifier(node)) {
+ // this part doesn't match
+ if (parts[i] !== node.name) return false;
+ } else if (t.isStringLiteral(node)) {
+ // this part doesn't match
+ if (parts[i] !== node.value) return false;
+ } else if (t.isMemberExpression(node)) {
+ if (node.computed && !t.isStringLiteral(node.property)) {
+ // we can't deal with this
+ return false;
+ } else {
+ search.push(node.object);
+ search.push(node.property);
+ continue;
+ }
+ } else {
+ // we can't deal with this
+ return false;
+ }
+
+ // too many parts
+ if (++i > parts.length) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+}
+
+/**
+ * Remove comment properties from a node.
+ */
+
+export function removeComments(node: Object): Object {
+ for (let key of COMMENT_KEYS) {
+ delete node[key];
+ }
+ return node;
+}
+
+/**
+ * Inherit all unique comments from `parent` node to `child` node.
+ */
+
+export function inheritsComments(child: Object, parent: Object): Object {
+ inheritTrailingComments(child, parent);
+ inheritLeadingComments(child, parent);
+ inheritInnerComments(child, parent);
+ return child;
+}
+
+export function inheritTrailingComments(child: Object, parent: Object) {
+ _inheritComments("trailingComments", child, parent);
+}
+
+export function inheritLeadingComments(child: Object, parent: Object) {
+ _inheritComments("leadingComments", child, parent);
+}
+
+export function inheritInnerComments(child: Object, parent: Object) {
+ _inheritComments("innerComments", child, parent);
+}
+
+function _inheritComments(key, child, parent) {
+ if (child && parent) {
+ child[key] = uniq(compact([].concat(child[key], parent[key])));
+ }
+}
+
+/**
+ * Inherit all contextual properties from `parent` node to `child` node.
+ */
+
+export function inherits(child: Object, parent: Object): Object {
+ if (!child || !parent) return child;
+
+ for (let key of (t.INHERIT_KEYS.optional: Array)) {
+ if (child[key] == null) {
+ child[key] = parent[key];
+ }
+ }
+
+ for (let key of (t.INHERIT_KEYS.force: Array)) {
+ child[key] = parent[key];
+ }
+
+ t.inheritsComments(child, parent);
+
+ return child;
+}
+
+/**
+ * TODO
+ */
+
+export function assertNode(node?) {
+ if (!isNode(node)) {
+ throw new TypeError("Not a valid node " + (node && node.type));
+ }
+}
+
+/**
+ * TODO
+ */
+
+export function isNode(node?): boolean {
+ return !!(node && VISITOR_KEYS[node.type]);
+}
+
+// Optimize property access.
+toFastProperties(t);
+toFastProperties(t.VISITOR_KEYS);
+
+//
+export * from "./retrievers";
+export * from "./validators";
+export * from "./converters";
+export * from "./flow";
diff --git a/packages/babel-types/src/react.js b/packages/babel-types/src/react.js
new file mode 100644
index 0000000000..8ec3f457b1
--- /dev/null
+++ b/packages/babel-types/src/react.js
@@ -0,0 +1,77 @@
+/* @flow */
+
+import * as t from "./index";
+
+export let isReactComponent = t.buildMatchMemberExpression("React.Component");
+
+export function isCompatTag(tagName?: string): boolean {
+ return !!tagName && /^[a-z]|\-/.test(tagName);
+}
+
+function cleanJSXElementLiteralChild(
+ child: { value: string },
+ args: Array,
+) {
+ let lines = child.value.split(/\r\n|\n|\r/);
+
+ let lastNonEmptyLine = 0;
+
+ for (let i = 0; i < lines.length; i++) {
+ if (lines[i].match(/[^ \t]/)) {
+ lastNonEmptyLine = i;
+ }
+ }
+
+ let str = "";
+
+ for (let i = 0; i < lines.length; i++) {
+ let line = lines[i];
+
+ let isFirstLine = i === 0;
+ let isLastLine = i === lines.length - 1;
+ let isLastNonEmptyLine = i === lastNonEmptyLine;
+
+ // replace rendered whitespace tabs with spaces
+ let trimmedLine = line.replace(/\t/g, " ");
+
+ // trim whitespace touching a newline
+ if (!isFirstLine) {
+ trimmedLine = trimmedLine.replace(/^[ ]+/, "");
+ }
+
+ // trim whitespace touching an endline
+ if (!isLastLine) {
+ trimmedLine = trimmedLine.replace(/[ ]+$/, "");
+ }
+
+ if (trimmedLine) {
+ if (!isLastNonEmptyLine) {
+ trimmedLine += " ";
+ }
+
+ str += trimmedLine;
+ }
+ }
+
+ if (str) args.push(t.stringLiteral(str));
+}
+
+export function buildChildren(node: Object): Array {
+ let elems = [];
+
+ for (let i = 0; i < node.children.length; i++) {
+ let child = node.children[i];
+
+ if (t.isJSXText(child)) {
+ cleanJSXElementLiteralChild(child, elems);
+ continue;
+ }
+
+ if (t.isJSXExpressionContainer(child)) child = child.expression;
+ if (t.isJSXEmptyExpression(child)) continue;
+
+ elems.push(child);
+ }
+
+ return elems;
+}
diff --git a/packages/babel/src/types/retrievers.js b/packages/babel-types/src/retrievers.js
similarity index 93%
rename from packages/babel/src/types/retrievers.js
rename to packages/babel-types/src/retrievers.js
index b9db7599bc..15dfc5a86d 100644
--- a/packages/babel/src/types/retrievers.js
+++ b/packages/babel-types/src/retrievers.js
@@ -68,6 +68,10 @@ getBindingIdentifiers.keys = {
ImportDefaultSpecifier: ["local"],
ImportDeclaration: ["specifiers"],
+ ExportSpecifier: ["exported"],
+ ExportNamespaceSpecifier: ["exported"],
+ ExportDefaultSpecifier: ["exported"],
+
FunctionDeclaration: ["id", "params"],
FunctionExpression: ["id", "params"],
@@ -78,7 +82,7 @@ getBindingIdentifiers.keys = {
UpdateExpression: ["argument"],
SpreadProperty: ["argument"],
- Property: ["value"],
+ ObjectProperty: ["value"],
AssignmentPattern: ["left"],
ArrayPattern: ["elements"],
diff --git a/packages/babel/src/types/validators.js b/packages/babel-types/src/validators.js
similarity index 85%
rename from packages/babel/src/types/validators.js
rename to packages/babel-types/src/validators.js
index 8b3fa5bd03..6223a914ac 100644
--- a/packages/babel/src/types/validators.js
+++ b/packages/babel-types/src/validators.js
@@ -1,3 +1,5 @@
+/* @flow */
+
import { getBindingIdentifiers } from "./retrievers";
import esutils from "esutils";
import * as t from "./index";
@@ -6,21 +8,21 @@ import * as t from "./index";
* Check if the input `node` is a binding identifier.
*/
- export function isBinding(node: Object, parent: Object): boolean {
- let keys = getBindingIdentifiers.keys[parent.type];
- if (keys) {
- for (let i = 0; i < keys.length; i++) {
- let key = keys[i];
- let val = parent[key];
- if (Array.isArray(val)) {
- if (val.indexOf(node) >= 0) return true;
- } else {
- if (val === node) return true;
- }
- }
- }
+export function isBinding(node: Object, parent: Object): boolean {
+ let keys = getBindingIdentifiers.keys[parent.type];
+ if (keys) {
+ for (let i = 0; i < keys.length; i++) {
+ let key = keys[i];
+ let val = parent[key];
+ if (Array.isArray(val)) {
+ if (val.indexOf(node) >= 0) return true;
+ } else {
+ if (val === node) return true;
+ }
+ }
+ }
- return false;
+ return false;
}
/**
@@ -34,6 +36,7 @@ export function isReferenced(node: Object, parent: Object): boolean {
// no: parent.NODE
case "MemberExpression":
case "JSXMemberExpression":
+ case "BindExpression":
if (parent.property === node && parent.computed) {
return true;
} else if (parent.object === node) {
@@ -50,13 +53,13 @@ export function isReferenced(node: Object, parent: Object): boolean {
// yes: { [NODE]: "" }
// yes: { NODE }
// no: { NODE: "" }
- case "Property":
+ case "ObjectProperty":
if (parent.key === node) {
return parent.computed;
}
- // no: var NODE = init;
- // yes: var id = NODE;
+ // no: let NODE = init;
+ // yes: let id = NODE;
case "VariableDeclarator":
return parent.id !== node;
@@ -65,7 +68,7 @@ export function isReferenced(node: Object, parent: Object): boolean {
case "ArrowFunctionExpression":
case "FunctionDeclaration":
case "FunctionExpression":
- for (var param of (parent.params: Array)) {
+ for (let param of (parent.params: Array)) {
if (param === node) return false;
}
@@ -81,6 +84,12 @@ export function isReferenced(node: Object, parent: Object): boolean {
return parent.local === node;
}
+ // no: export NODE from "foo";
+ // no: export * as NODE from "foo";
+ case "ExportNamespaceSpecifier":
+ case "ExportDefaultSpecifier":
+ return false;
+
// no:
case "JSXAttribute":
return parent.name !== node;
@@ -106,7 +115,7 @@ export function isReferenced(node: Object, parent: Object): boolean {
return parent.id !== node;
// yes: class { [NODE](){} }
- case "MethodDefinition":
+ case "ClassMethod":
return parent.key === node && parent.computed;
// no: NODE: for (;;) {}
@@ -206,15 +215,7 @@ export function isScope(node: Object, parent: Object): boolean {
export function isImmutable(node: Object): boolean {
if (t.isType(node.type, "Immutable")) return true;
- if (t.isLiteral(node)) {
- if (node.regex) {
- // regexs are mutable
- return false;
- } else {
- // immutable!
- return true;
- }
- } else if (t.isIdentifier(node)) {
+ if (t.isIdentifier(node)) {
if (node.name === "undefined") {
// immutable!
return true;
diff --git a/packages/babel/README.md b/packages/babel/README.md
new file mode 100644
index 0000000000..17590de468
--- /dev/null
+++ b/packages/babel/README.md
@@ -0,0 +1 @@
+# babel
diff --git a/packages/babel/cli.js b/packages/babel/cli.js
new file mode 100755
index 0000000000..655dad48cd
--- /dev/null
+++ b/packages/babel/cli.js
@@ -0,0 +1,5 @@
+console.error("The CLI has been moved into the package `babel-cli`.");
+console.log();
+console.log("$ npm install -g babel-cli");
+console.log();
+process.exit(1);
diff --git a/packages/babel/index.js b/packages/babel/index.js
index e8f04775a2..06ca959245 100644
--- a/packages/babel/index.js
+++ b/packages/babel/index.js
@@ -1 +1 @@
-module.exports = require("./lib/api/node.js");
+throw new Error("The node API for `babel` has been moved to `babel-core`.");
diff --git a/packages/babel/package.json b/packages/babel/package.json
index 0d9aa3dbb0..565d85adbb 100644
--- a/packages/babel/package.json
+++ b/packages/babel/package.json
@@ -1,78 +1,15 @@
{
- "name": "babel-core",
- "version": "5.8.33",
- "description": "A compiler for writing next generation JavaScript",
+ "name": "babel",
+ "version": "6.0.2",
+ "description": "Turn ES6 code into readable vanilla ES5 with source maps",
"author": "Sebastian McKenzie ",
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "babel/babel",
- "browser": {
- "./lib/api/register/node.js": "./lib/api/register/browser.js"
- },
- "keywords": [
- "6to5",
- "babel",
- "classes",
- "const",
- "es6",
- "harmony",
- "let",
- "modules",
- "transpile",
- "transpiler",
- "var"
- ],
- "scripts": {
- "bench": "make bench",
- "test": "make test"
- },
- "dependencies": {
- "babel-plugin-constant-folding": "^1.0.1",
- "babel-plugin-dead-code-elimination": "^1.0.2",
- "babel-plugin-eval": "^1.0.1",
- "babel-plugin-inline-environment-variables": "^1.0.1",
- "babel-plugin-jscript": "^1.0.4",
- "babel-plugin-member-expression-literals": "^1.0.1",
- "babel-plugin-property-literals": "^1.0.1",
- "babel-plugin-proto-to-assign": "^1.0.3",
- "babel-plugin-react-constant-elements": "^1.0.3",
- "babel-plugin-react-display-name": "^1.0.3",
- "babel-plugin-remove-console": "^1.0.1",
- "babel-plugin-remove-debugger": "^1.0.1",
- "babel-plugin-runtime": "^1.0.7",
- "babel-plugin-undeclared-variables-check": "^1.0.2",
- "babel-plugin-undefined-to-void": "^1.1.6",
- "babylon": "^5.8.29",
- "bluebird": "^2.9.33",
- "chalk": "^1.0.0",
- "convert-source-map": "^1.1.0",
- "core-js": "^1.0.0",
- "debug": "^2.1.1",
- "detect-indent": "^3.0.0",
- "esutils": "^2.0.0",
- "fs-readdir-recursive": "^0.1.0",
- "globals": "^6.4.0",
- "home-or-tmp": "^1.0.0",
- "is-integer": "^1.0.4",
- "js-tokens": "1.0.1",
- "json5": "^0.4.0",
- "line-numbers": "0.2.0",
- "lodash": "^3.10.0",
- "minimatch": "^2.0.3",
- "output-file-sync": "^1.1.0",
- "path-exists": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "private": "^0.1.6",
- "regenerator": "0.8.40",
- "regexpu": "^1.3.0",
- "repeating": "^1.1.2",
- "resolve": "^1.1.6",
- "shebang-regex": "^1.0.0",
- "slash": "^1.0.0",
- "source-map": "^0.5.0",
- "source-map-support": "^0.2.10",
- "to-fast-properties": "^1.0.0",
- "trim-right": "^1.0.0",
- "try-resolve": "^1.0.0"
+ "preferGlobal": true,
+ "bin": {
+ "babel": "./cli.js",
+ "babel-node": "./cli.js",
+ "babel-external-helpers": "./cli.js"
}
}
\ No newline at end of file
diff --git a/packages/babel/polyfill.js b/packages/babel/polyfill.js
deleted file mode 100644
index b18f073c45..0000000000
--- a/packages/babel/polyfill.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/polyfill");
diff --git a/packages/babel/register.js b/packages/babel/register.js
deleted file mode 100644
index c97650c29a..0000000000
--- a/packages/babel/register.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/api/register/node-polyfill");
diff --git a/packages/babel/scripts/build-dist.sh b/packages/babel/scripts/build-dist.sh
deleted file mode 100755
index 41b8ebc695..0000000000
--- a/packages/babel/scripts/build-dist.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/sh
-set -e
-
-BROWSERIFY_CMD="../../node_modules/browserify/bin/cmd.js"
-UGLIFY_CMD="../../node_modules/uglify-js/bin/uglifyjs"
-BROWSERIFY_IGNORE="-i esprima-fb -i through"
-
-set -x
-
-mkdir -p dist
-
-node scripts/cache-templates
-
-node $BROWSERIFY_CMD lib/polyfill.js \
- --insert-global-vars 'global' \
- --plugin bundle-collapser/plugin \
- --plugin derequire/plugin \
- >dist/polyfill.js
-node $UGLIFY_CMD dist/polyfill.js \
- --compress warnings=false \
- --mangle \
- >dist/polyfill.min.js
-
-# Add a Unicode BOM so browsers will interpret the file as UTF-8
-node -p '"\uFEFF"' > dist/browser.js
-node $BROWSERIFY_CMD lib/api/browser.js \
- --standalone babel \
- --plugin bundle-collapser/plugin \
- --plugin derequire/plugin \
- $BROWSERIFY_IGNORE \
- >>dist/browser.js
-node -p '"\uFEFF"' > dist/browser.min.js
-node $UGLIFY_CMD dist/browser.js \
- --compress warnings=false \
- --mangle \
- >>dist/browser.min.js
-
-node $BROWSERIFY_CMD lib/api/node.js \
- --standalone babel \
- --node \
- --plugin bundle-collapser/plugin \
- --plugin derequire/plugin \
- $BROWSERIFY_IGNORE \
- >dist/node.js
-node $UGLIFY_CMD dist/node.js \
- --compress warnings=false \
- --mangle \
- >dist/node.min.js
-
-node ../babel-cli/lib/babel-external-helpers >dist/external-helpers.js
-node $UGLIFY_CMD dist/external-helpers.js \
- --compress warnings=false \
- --mangle \
- >dist/external-helpers.min.js
-
-rm -rf templates.json
diff --git a/packages/babel/scripts/cache-templates.js b/packages/babel/scripts/cache-templates.js
deleted file mode 100755
index fa9d46449b..0000000000
--- a/packages/babel/scripts/cache-templates.js
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env node
-
-var fs = require("fs");
-var util = require("../lib/util");
-fs.writeFileSync(__dirname + "/../templates.json", JSON.stringify(util.templates));
diff --git a/packages/babel/scripts/postpublish.js b/packages/babel/scripts/postpublish.js
deleted file mode 100755
index f94ca17ea5..0000000000
--- a/packages/babel/scripts/postpublish.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function rmRelative(loc) {
- rm(__dirname + "/../" + loc);
-}
-
-rmRelative("browser.js");
-rmRelative("browser.min.js");
-rmRelative("browser-polyfill.js");
-rmRelative("browser-polyfill.min.js");
-rmRelative("external-helpers.js");
-rmRelative("external-helpers.min.js");
diff --git a/packages/babel/scripts/prepublish.js b/packages/babel/scripts/prepublish.js
deleted file mode 100755
index 065c00c233..0000000000
--- a/packages/babel/scripts/prepublish.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function relative(loc) {
- return __dirname + "/../" + loc;
-}
-
-cp(relative("dist/browser.js"), relative("browser.js"));
-cp(relative("dist/browser.min.js"), relative("browser.min.js"));
-cp(relative("dist/polyfill.js"), relative("browser-polyfill.js"));
-cp(relative("dist/polyfill.min.js"), relative("browser-polyfill.min.js"));
-cp(relative("dist/external-helpers.js"), relative("external-helpers.js"));
-cp(relative("dist/external-helpers.min.js"), relative("external-helpers.min.js"));
-require("./cache-templates");
diff --git a/packages/babel/src/README.md b/packages/babel/src/README.md
deleted file mode 100644
index 6831fbaa9b..0000000000
--- a/packages/babel/src/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-## Diving into Babel
-
-If you look around in the various directories in here you'll find some details
-about the organization of the Babel codebase.
diff --git a/packages/babel/src/api/README.md b/packages/babel/src/api/README.md
deleted file mode 100644
index f1816a11f0..0000000000
--- a/packages/babel/src/api/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-## API
-
-In this directory you'll find all the public interfaces to using Babel for both
-node and the browser.
-
-### Node
-
-There are two ways people use Babel within Node, they either are manipulating
-strings of code with `babel.transform` or `babel.parse`, they also might be
-running their code through Babel before execution via `register` or `polyfill`.
-
-### Browser
-
-Usage of Babel in the browser is extremely uncommon and in most cases
-considered A Bad Idea™. However it works by loading `
- */
-
-var runScripts = function () {
- var scripts = [];
- var types = ["text/ecmascript-6", "text/6to5", "text/babel", "module"];
- var index = 0;
-
- /**
- * Transform and execute script. Ensures correct load order.
- */
-
- var exec = function () {
- var param = scripts[index];
- if (param instanceof Array) {
- transform.run.apply(transform, param);
- index++;
- exec();
- }
- };
-
- /**
- * Load, transform, and execute all scripts.
- */
-
- var run = function (script, i) {
- var opts = {};
-
- if (script.src) {
- transform.load(script.src, function (param) {
- scripts[i] = param;
- exec();
- }, opts, true);
- } else {
- opts.filename = "embedded";
- scripts[i] = [script.innerHTML, opts];
- }
- };
-
- // Collect scripts with Babel `types`.
-
- var _scripts = global.document.getElementsByTagName("script");
-
- for (var i = 0; i < _scripts.length; ++i) {
- var _script = _scripts[i];
- if (types.indexOf(_script.type) >= 0) scripts.push(_script);
- }
-
- for (i in scripts) {
- run(scripts[i], i);
- }
-
- exec();
-};
-
-/**
- * Register load event to transform and execute scripts.
- */
-
-if (global.addEventListener) {
- global.addEventListener("DOMContentLoaded", runScripts, false);
-} else if (global.attachEvent) {
- global.attachEvent("onload", runScripts);
-}
diff --git a/packages/babel/src/api/node.js b/packages/babel/src/api/node.js
deleted file mode 100644
index 2757175e45..0000000000
--- a/packages/babel/src/api/node.js
+++ /dev/null
@@ -1,106 +0,0 @@
-import isFunction from "lodash/lang/isFunction";
-import transform from "../transformation";
-import * as babylon from "babylon";
-import * as util from "../util";
-import fs from "fs";
-
-export { util, babylon as acorn, transform };
-export { pipeline } from "../transformation";
-export { canCompile } from "../util";
-
-export { default as File } from "../transformation/file";
-export { default as options } from "../transformation/file/options/config";
-export { default as Plugin } from "../transformation/plugin";
-export { default as Transformer } from "../transformation/transformer";
-export { default as Pipeline } from "../transformation/pipeline";
-export { default as traverse } from "../traversal";
-export { default as buildExternalHelpers } from "../tools/build-external-helpers";
-export { version } from "../../package";
-
-import * as t from "../types";
-export { t as types };
-
-/**
- * Register Babel and polyfill globally.
- */
-
-export function register(opts?: Object) {
- var callback = require("./register/node-polyfill");
- if (opts != null) callback(opts);
- return callback;
-}
-
-/**
- * Register polyfill globally.
- */
-
-export function polyfill() {
- require("../polyfill");
-}
-
-/**
- * Asynchronously transform `filename` with optional `opts`, calls `callback` when complete.
- */
-
-export function transformFile(filename: string, opts?: Object, callback: Function) {
- if (isFunction(opts)) {
- callback = opts;
- opts = {};
- }
-
- opts.filename = filename;
-
- fs.readFile(filename, function (err, code) {
- if (err) return callback(err);
-
- var result;
-
- try {
- result = transform(code, opts);
- } catch (err) {
- return callback(err);
- }
-
- callback(null, result);
- });
-}
-
-/**
- * Synchronous form of `transformFile`.
- */
-
-export function transformFileSync(filename: string, opts?: Object = {}) {
- opts.filename = filename;
- return transform(fs.readFileSync(filename, "utf8"), opts);
-}
-
-/**
- * Parse script with Babel's parser.
- */
-
-export function parse(code, opts = {}) {
- opts.allowHashBang = true;
- opts.sourceType = "module";
- opts.ecmaVersion = Infinity;
- opts.plugins = {
- jsx: true,
- flow: true
- };
- opts.features = {};
-
- for (var key in transform.pipeline.transformers) {
- opts.features[key] = true;
- }
-
- var ast = babylon.parse(code, opts);
-
- if (opts.onToken) {
- opts.onToken.push(...ast.tokens);
- }
-
- if (opts.onComment) {
- opts.onComment.push(...ast.comments);
- }
-
- return ast.program;
-}
diff --git a/packages/babel/src/api/register/browser.js b/packages/babel/src/api/register/browser.js
deleted file mode 100644
index 8ee46c7684..0000000000
--- a/packages/babel/src/api/register/browser.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// required to safely use babel/register within a browserify codebase
-
-export default function () {}
-
-import "../../polyfill";
diff --git a/packages/babel/src/api/register/node-polyfill.js b/packages/babel/src/api/register/node-polyfill.js
deleted file mode 100644
index bbdc316ac8..0000000000
--- a/packages/babel/src/api/register/node-polyfill.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import "../../polyfill";
-export { default } from "./node";
diff --git a/packages/babel/src/api/register/node.js b/packages/babel/src/api/register/node.js
deleted file mode 100644
index 723fcb391a..0000000000
--- a/packages/babel/src/api/register/node.js
+++ /dev/null
@@ -1,227 +0,0 @@
-import sourceMapSupport from "source-map-support";
-import * as registerCache from "./cache";
-import OptionManager from "../../transformation/file/options/option-manager";
-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 path from "path";
-
-/**
- * Install sourcemaps into node.
- */
-
-sourceMapSupport.install({
- handleUncaughtExceptions: false,
- retrieveSourceMap(source) {
- var map = maps && maps[source];
- if (map) {
- return {
- url: null,
- map: map
- };
- } else {
- return null;
- }
- }
-});
-
-/**
- * Load and setup cache.
- */
-
-registerCache.load();
-var cache = registerCache.get();
-
-/**
- * Store options.
- */
-
-var transformOpts = {};
-
-var ignore;
-var only;
-
-var oldHandlers = {};
-var maps = {};
-
-var cwd = process.cwd();
-
-/**
- * Get path from `filename` relative to the current working directory.
- */
-
-var getRelativePath = function (filename){
- return path.relative(cwd, filename);
-};
-
-/**
- * Get last modified time for a `filename`.
- */
-
-var mtime = function (filename) {
- return +fs.statSync(filename).mtime;
-};
-
-/**
- * Compile a `filename` with optional `opts`.
- */
-
-var compile = function (filename, opts = {}) {
- var result;
-
- opts.filename = filename;
-
- var optsManager = new OptionManager;
- optsManager.mergeOptions(transformOpts);
- opts = optsManager.init(opts);
-
- var cacheKey = `${JSON.stringify(opts)}:${babel.version}`;
-
- var env = process.env.BABEL_ENV || process.env.NODE_ENV;
- if (env) cacheKey += `:${env}`;
-
- if (cache) {
- var cached = cache[cacheKey];
- if (cached && cached.mtime === mtime(filename)) {
- result = cached;
- }
- }
-
- if (!result) {
- result = babel.transformFileSync(filename, extend(opts, {
- sourceMap: "both",
- ast: false
- }));
- }
-
- if (cache) {
- result.mtime = mtime(filename);
- cache[cacheKey] = result;
- }
-
- maps[filename] = result.map;
-
- return result.code;
-};
-
-/**
- * Test if a `filename` should be ignored by Babel.
- */
-
-var shouldIgnore = function (filename) {
- if (!ignore && !only) {
- return getRelativePath(filename).split(path.sep).indexOf("node_modules") >= 0;
- } else {
- return util.shouldIgnore(filename, ignore || [], only);
- }
-};
-
-/**
- * Monkey patch istanbul if it is running so that it works properly.
- */
-
-var istanbulMonkey = {};
-
-if (process.env.running_under_istanbul) {
- // we need to monkey patch fs.readFileSync so we can hook into
- // what istanbul gets, it's extremely dirty but it's the only way
- var _readFileSync = fs.readFileSync;
-
- fs.readFileSync = function (filename) {
- if (istanbulMonkey[filename]) {
- delete istanbulMonkey[filename];
- var code = compile(filename, {
- auxiliaryCommentBefore: "istanbul ignore next"
- });
- istanbulMonkey[filename] = true;
- return code;
- } else {
- return _readFileSync.apply(this, arguments);
- }
- };
-}
-
-/**
- * Replacement for the loader for istanbul.
- */
-
-var istanbulLoader = function (m, filename, old) {
- istanbulMonkey[filename] = true;
- old(m, filename);
-};
-
-/**
- * Default loader.
- */
-
-var normalLoader = function (m, filename) {
- m._compile(compile(filename), filename);
-};
-
-/**
- * Register a loader for an extension.
- */
-
-var registerExtension = function (ext) {
- var old = oldHandlers[ext] || oldHandlers[".js"] || require.extensions[".js"];
-
- var loader = normalLoader;
- if (process.env.running_under_istanbul) loader = istanbulLoader;
-
- require.extensions[ext] = function (m, filename) {
- if (shouldIgnore(filename)) {
- old(m, filename);
- } else {
- loader(m, filename, old);
- }
- };
-};
-
-/**
- * Register loader for given extensions.
- */
-
-var hookExtensions = function (_exts) {
- each(oldHandlers, function (old, ext) {
- if (old === undefined) {
- delete require.extensions[ext];
- } else {
- require.extensions[ext] = old;
- }
- });
-
- oldHandlers = {};
-
- each(_exts, function (ext) {
- oldHandlers[ext] = require.extensions[ext];
- registerExtension(ext);
- });
-};
-
-/**
- * Register loader for default extensions.
- */
-
-hookExtensions(util.canCompile.EXTENSIONS);
-
-/**
- * Update options at runtime.
- */
-
-export default function (opts = {}) {
- if (opts.only != null) only = util.arrayify(opts.only, util.regexify);
- if (opts.ignore != null) ignore = util.arrayify(opts.ignore, util.regexify);
-
- if (opts.extensions) hookExtensions(util.arrayify(opts.extensions));
-
- if (opts.cache === false) cache = null;
-
- delete opts.extensions;
- delete opts.ignore;
- delete opts.cache;
- delete opts.only;
-
- extend(transformOpts, opts);
-}
diff --git a/packages/babel/src/babel/transformation/modules.js b/packages/babel/src/babel/transformation/modules.js
deleted file mode 100644
index 27d856ede2..0000000000
--- a/packages/babel/src/babel/transformation/modules.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("../../transformation/modules");
diff --git a/packages/babel/src/generation/README.md b/packages/babel/src/generation/README.md
deleted file mode 100644
index 65b83452a5..0000000000
--- a/packages/babel/src/generation/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-## Generation
-
-Here is Babel's code generator, here you'll find all of the code to turn an AST
-back into a string of code.
-
-[TBD: To Be Documented:]
-
-- Code Generator
-- Buffer
-- Source Maps
- - Position
-- Printer
-- Code Style
- - Whitespace
- - Parenthesis
-- Generators
diff --git a/packages/babel/src/generation/generators/README.md b/packages/babel/src/generation/generators/README.md
deleted file mode 100644
index 787ebf90bf..0000000000
--- a/packages/babel/src/generation/generators/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-## Generators
-
-Code generation in Babel is broken down into generators by node type, they all
-live in this directory.
-
-[TBD: To Be Documented:]
-
-- How generators work
-- How to print a node
-- How generators related to one another
diff --git a/packages/babel/src/generation/generators/base.js b/packages/babel/src/generation/generators/base.js
deleted file mode 100644
index 8c20a10e04..0000000000
--- a/packages/babel/src/generation/generators/base.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Print File.program
- */
-
-export function File(node, print) {
- print.plain(node.program);
-}
-
-/**
- * Print all nodes in a Program.body.
- */
-
-export function Program(node, print) {
- print.sequence(node.body);
-}
-
-/**
- * Print BlockStatement, collapses empty blocks, prints body.
- */
-
-export function BlockStatement(node, print) {
- this.push("{");
- if (node.body.length) {
- this.newline();
- print.sequence(node.body, { indent: true });
- if (!this.format.retainLines) this.removeLast("\n");
- this.rightBrace();
- } else {
- print.printInnerComments();
- this.push("}");
- }
-}
-
-/**
- * What is my purpose?
- * Why am I here?
- * Why are any of us here?
- * Does any of this really matter?
- */
-
-export function Noop() {
-
-}
diff --git a/packages/babel/src/generation/generators/classes.js b/packages/babel/src/generation/generators/classes.js
deleted file mode 100644
index ee52efb6e4..0000000000
--- a/packages/babel/src/generation/generators/classes.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * Print ClassDeclaration, prints decorators, typeParameters, extends, implements, and body.
- */
-
-export function ClassDeclaration(node, print) {
- print.list(node.decorators, { separator: "" });
- this.push("class");
-
- if (node.id) {
- this.push(" ");
- print.plain(node.id);
- }
-
- print.plain(node.typeParameters);
-
- if (node.superClass) {
- this.push(" extends ");
- print.plain(node.superClass);
- print.plain(node.superTypeParameters);
- }
-
- if (node.implements) {
- this.push(" implements ");
- print.join(node.implements, { separator: ", " });
- }
-
- this.space();
- print.plain(node.body);
-}
-
-/**
- * Alias ClassDeclaration printer as ClassExpression.
- */
-
-export { ClassDeclaration as ClassExpression };
-
-/**
- * Print ClassBody, collapses empty blocks, prints body.
- */
-
-export function ClassBody(node, print) {
- this.push("{");
- if (node.body.length === 0) {
- print.printInnerComments();
- this.push("}");
- } else {
- this.newline();
-
- this.indent();
- print.sequence(node.body);
- this.dedent();
-
- this.rightBrace();
- }
-}
-
-/**
- * Print ClassProperty, prints decorators, static, key, typeAnnotation, and value.
- * Also: semicolons, deal with it.
- */
-
-export function ClassProperty(node, print) {
- print.list(node.decorators, { separator: "" });
-
- if (node.static) this.push("static ");
- print.plain(node.key);
- print.plain(node.typeAnnotation);
- if (node.value) {
- this.space();
- this.push("=");
- this.space();
- print.plain(node.value);
- }
- this.semicolon();
-}
-
-/**
- * Print MethodDefinition, prints decorations, static, and method.
- */
-
-export function MethodDefinition(node, print) {
- print.list(node.decorators, { separator: "" });
-
- if (node.static) {
- this.push("static ");
- }
-
- this._method(node, print);
-}
diff --git a/packages/babel/src/generation/generators/comprehensions.js b/packages/babel/src/generation/generators/comprehensions.js
deleted file mode 100644
index 1f3ddd8cd2..0000000000
--- a/packages/babel/src/generation/generators/comprehensions.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Prints ComprehensionBlock, prints left and right.
- */
-
-export function ComprehensionBlock(node, print) {
- this.keyword("for");
- this.push("(");
- print.plain(node.left);
- this.push(" of ");
- print.plain(node.right);
- this.push(")");
-}
-
-/**
- * Prints ComprehensionExpression, prints blocks, filter, and body. Handles generators.
- */
-
-export function ComprehensionExpression(node, print) {
- this.push(node.generator ? "(" : "[");
-
- print.join(node.blocks, { separator: " " });
- this.space();
-
- if (node.filter) {
- this.keyword("if");
- this.push("(");
- print.plain(node.filter);
- this.push(")");
- this.space();
- }
-
- print.plain(node.body);
-
- this.push(node.generator ? ")" : "]");
-}
diff --git a/packages/babel/src/generation/generators/expressions.js b/packages/babel/src/generation/generators/expressions.js
deleted file mode 100644
index 6157673492..0000000000
--- a/packages/babel/src/generation/generators/expressions.js
+++ /dev/null
@@ -1,323 +0,0 @@
-import isInteger from "is-integer";
-import isNumber from "lodash/lang/isNumber";
-import n from "../node"
-import * as t from "../../types";
-
-/**
- * RegExp for testing scientific notation in literals.
- */
-
-const SCIENTIFIC_NOTATION = /e/i;
-
-/**
- * RegExp for testing if a numeric literal is
- * a BinaryIntegerLiteral, OctalIntegerLiteral or HexIntegerLiteral.
- */
-
-const NON_DECIMAL_NUMERIC_LITERAL = /^0(b|o|x)/i;
-
-/**
- * Prints UnaryExpression, prints operator and argument.
- */
-
-export function UnaryExpression(node, print) {
- var needsSpace = /[a-z]$/.test(node.operator);
- var arg = node.argument;
-
- if (t.isUpdateExpression(arg) || t.isUnaryExpression(arg)) {
- needsSpace = true;
- }
-
- if (t.isUnaryExpression(arg) && arg.operator === "!") {
- needsSpace = false;
- }
-
- this.push(node.operator);
- if (needsSpace) this.push(" ");
- print.plain(node.argument);
-}
-
-/**
- * Prints DoExpression, prints body.
- */
-
-export function DoExpression(node, print) {
- this.push("do");
- this.space();
- print.plain(node.body);
-}
-
-/**
- * Prints ParenthesizedExpression, prints expression.
- */
-
-export function ParenthesizedExpression(node, print) {
- this.push("(");
- print.plain(node.expression);
- this.push(")");
-}
-
-/**
- * Prints UpdateExpression, prints operator and argument.
- */
-
-export function UpdateExpression(node, print) {
- if (node.prefix) {
- this.push(node.operator);
- print.plain(node.argument);
- } else {
- print.plain(node.argument);
- this.push(node.operator);
- }
-}
-
-/**
- * Prints ConditionalExpression, prints test, consequent, and alternate.
- */
-
-export function ConditionalExpression(node, print) {
- print.plain(node.test);
- this.space();
- this.push("?");
- this.space();
- print.plain(node.consequent);
- this.space();
- this.push(":");
- this.space();
- print.plain(node.alternate);
-}
-
-/**
- * Prints NewExpression, prints callee and arguments.
- */
-
-export function NewExpression(node, print) {
- this.push("new ");
- print.plain(node.callee);
- this.push("(");
- print.list(node.arguments);
- this.push(")");
-}
-
-/**
- * Prints SequenceExpression.expressions.
- */
-
-export function SequenceExpression(node, print) {
- print.list(node.expressions);
-}
-
-/**
- * Prints ThisExpression.
- */
-
-export function ThisExpression() {
- this.push("this");
-}
-
-/**
- * Prints Super.
- */
-
-export function Super() {
- this.push("super");
-}
-
-/**
- * Prints Decorator, prints expression.
- */
-
-export function Decorator(node, print) {
- this.push("@");
- print.plain(node.expression);
- this.newline();
-}
-
-/**
- * Prints CallExpression, prints callee and arguments.
- */
-
-export function CallExpression(node, print) {
- print.plain(node.callee);
-
- this.push("(");
-
- var isPrettyCall = node._prettyCall && !this.format.retainLines && !this.format.compact;
-
- var separator;
- if (isPrettyCall) {
- separator = ",\n";
- this.newline();
- this.indent();
- }
-
- print.list(node.arguments, { separator });
-
- if (isPrettyCall) {
- this.newline();
- this.dedent();
- }
-
- this.push(")");
-}
-
-/**
- * Builds yield or await expression printer.
- * Prints delegate, all, and argument.
- */
-
-var buildYieldAwait = function (keyword) {
- return function (node, print) {
- this.push(keyword);
-
- if (node.delegate || node.all) {
- this.push("*");
- }
-
- if (node.argument) {
- this.push(" ");
- var terminatorState = this.startTerminatorless();
- print.plain(node.argument);
- this.endTerminatorless(terminatorState);
- }
- };
-};
-
-/**
- * Create YieldExpression and AwaitExpression printers.
- */
-
-export var YieldExpression = buildYieldAwait("yield");
-export var AwaitExpression = buildYieldAwait("await");
-
-/**
- * Prints EmptyStatement.
- */
-
-export function EmptyStatement() {
- this.semicolon();
-}
-
-/**
- * Prints ExpressionStatement, prints expression.
- */
-
-export function ExpressionStatement(node, print) {
- print.plain(node.expression);
- this.semicolon();
-}
-
-/**
- * Prints AssignmentPattern, prints left and right.
- */
-
-export function AssignmentPattern(node, print) {
- print.plain(node.left);
- this.push(" = ");
- print.plain(node.right);
-}
-
-/**
- * Prints AssignmentExpression, prints left, operator, and right.
- */
-
-export function AssignmentExpression(node, print, parent) {
- // Somewhere inside a for statement `init` node but doesn't usually
- // needs a paren except for `in` expressions: `for (a in b ? a : b;;)`
- var parens = this._inForStatementInit && node.operator === "in" &&
- !n.needsParens(node, parent);
-
- if (parens) {
- this.push("(");
- }
-
- // todo: add cases where the spaces can be dropped when in compact mode
- print.plain(node.left);
-
- var spaces = node.operator === "in" || node.operator === "instanceof";
- spaces = true; // todo: https://github.com/babel/babel/issues/1835
- this.space(spaces);
-
- this.push(node.operator);
-
- if (!spaces) {
- // space is mandatory to avoid outputting