Compare commits

...

116 Commits

Author SHA1 Message Date
Sebastian McKenzie
b1252b865b v4.7.4 2015-03-10 03:29:47 +11:00
Sebastian McKenzie
068b1341d9 fix erroneous whitespace 2015-03-10 03:28:36 +11:00
Sebastian McKenzie
20eb143915 remove Number from the list of valid runtime constructors - fixes #981 2015-03-10 03:27:13 +11:00
Sebastian McKenzie
1302a86bf2 scope -> scopable class alias key 2015-03-10 03:22:55 +11:00
Sebastian McKenzie
b7831f1d7b prepend mocha command with node 2015-03-10 03:15:31 +11:00
Sebastian McKenzie
e46cabb21f remove code coverage from travis make task 2015-03-10 03:12:50 +11:00
Sebastian McKenzie
fff06a047e Revert "delegate node path removal to after call"
This reverts commit 5e0236d9a7.
2015-03-10 02:50:43 +11:00
Sebastian McKenzie
6b0320fc83 disable test262 tests by default 2015-03-10 02:34:35 +11:00
Sebastian McKenzie
5dde63fa0a more elaborate tests for #980 2015-03-10 02:13:00 +11:00
Sebastian McKenzie
672118149a hoist all directives - fixes #980 2015-03-10 01:53:51 +11:00
Sebastian McKenzie
5e0236d9a7 delegate node path removal to after call 2015-03-10 01:44:58 +11:00
Sebastian McKenzie
5101664e7d update 4.7.4 changelog 2015-03-10 01:44:44 +11:00
Sebastian McKenzie
2d684a06d3 update changelog version to 4.7.4 2015-03-10 01:23:24 +11:00
Sebastian McKenzie
e31bad8f42 add 4.7.3 changelog 2015-03-10 01:17:14 +11:00
Sebastian McKenzie
644b4373fc rewrite named function expressions in async function transformers - fixes #979 2015-03-10 01:16:38 +11:00
Sebastian McKenzie
62f37c1e62 fix util.booleanify 2015-03-10 01:10:58 +11:00
Sebastian McKenzie
fc0e89463b use flow types for annotations - goodbye JSDoc! 2015-03-10 00:35:52 +11:00
Sebastian McKenzie
56b6a795a4 remove path.refreshScope until i'm more confident on it's functionality so it doesn't break peopls stuff 2015-03-09 23:09:22 +11:00
Sebastian McKenzie
17b34a2959 dynamic scope tracking, toot toot - fixes #957 2015-03-09 22:07:05 +11:00
Sebastian McKenzie
c4da0253c5 move flattenable keys to types 2015-03-09 16:55:00 +11:00
Sebastian McKenzie
5f2df40f6d consistent whitespace in patch 2015-03-09 16:54:50 +11:00
Sebastian McKenzie
7d20a9b882 add traversal path todos 2015-03-09 16:54:41 +11:00
Sebastian McKenzie
ee0ac9f149 use spread in messages 2015-03-09 16:54:30 +11:00
Sebastian McKenzie
c5d3f42d8a alias core-js/library in babel-runtime - closes #965 2015-03-09 16:54:19 +11:00
Sebastian McKenzie
d162919a53 update symols transformer name 2015-03-09 03:39:30 +11:00
Sebastian McKenzie
d1f712344d add istanbul auxiliary comment task to makefile 2015-03-09 03:38:39 +11:00
Sebastian McKenzie
e985912b54 add Binary node cleanup 2015-03-09 03:38:27 +11:00
Sebastian McKenzie
97a21e4a34 update spec.typeofSymbol references to es6.symbols 2015-03-09 03:38:13 +11:00
Sebastian McKenzie
d8fb7812f7 more utility.removeConsole tests 2015-03-09 03:37:42 +11:00
Sebastian McKenzie
bfe63f5885 rename spec.typeofSymbol transformer to es6.symbols 2015-03-09 03:37:26 +11:00
Sebastian McKenzie
44ca6873a3 add super to contextVariables 2015-03-09 03:37:05 +11:00
Sebastian McKenzie
2f66ea7338 4.7.3 2015-03-08 04:33:50 +11:00
Sebastian McKenzie
70967cf53c v4.7.3 2015-03-08 04:32:46 +11:00
Sebastian McKenzie
dc117a74ae both -> inline - thanks @dkieks 2015-03-08 04:29:48 +11:00
Sebastian McKenzie
b0f32a822d pass file.addImport a name instead of an identifier 2015-03-08 04:10:53 +11:00
Sebastian McKenzie
fd99ea1749 Merge branch 'master' of github.com:babel/babel 2015-03-08 04:05:44 +11:00
Sebastian McKenzie
572129542d fallback to current parentPath if none was provided 2015-03-08 04:04:48 +11:00
Sebastian McKenzie
6f53980bfc move runtime helpers to separate modules - babel/ember-cli-babel#24 2015-03-08 04:04:40 +11:00
Sebastian McKenzie
348af1990d Merge pull request #972 from neVERberleRfellerER/node-external-helpers-tests
add tests for babel-external-helpers
2015-03-08 03:50:28 +11:00
Ondrej Kraus
bd5f350728 add tests for babel-external-helpers 2015-03-07 17:46:40 +01:00
Sebastian McKenzie
958fa282f4 4.7.2 2015-03-08 03:12:09 +11:00
Sebastian McKenzie
31e6b18346 v4.7.2 2015-03-08 03:09:43 +11:00
Sebastian McKenzie
d17ac92a3f fix changelog version 2015-03-08 03:06:46 +11:00
Sebastian McKenzie
188bcb70f7 add 4.7.1 changelog 2015-03-08 03:03:17 +11:00
Sebastian McKenzie
b8bd11a0e7 fix incorrect builder reference 2015-03-08 03:02:19 +11:00
Sebastian McKenzie
45bc74efe7 use a lookup table instead of an if - #945 2015-03-08 02:57:37 +11:00
Sebastian McKenzie
7eb169a894 Merge pull request #945 from neVERberleRfellerER/helper-globals-fix
Add choice of output format to babel-external-helpers
2015-03-08 02:56:30 +11:00
Sebastian McKenzie
eed4f312d8 add sourceMap both option - closes #966 2015-03-08 02:54:23 +11:00
Sebastian McKenzie
44e4dc970f more es6 2015-03-08 02:52:23 +11:00
Sebastian McKenzie
5d32432e67 split up export variable declarations - fixes #939, fixes #964 2015-03-08 02:52:10 +11:00
Sebastian McKenzie
9c9af6dbbd add utility.removeClass tests and move parentPath setting to setContext - fixes #967 2015-03-08 02:49:58 +11:00
Sebastian McKenzie
70cd650e10 remove dead t.isFalsyExpression and ignore private properties in t.cloneDeep - fixes #962 2015-03-08 02:45:14 +11:00
Sebastian McKenzie
c7bb00d58d ignore case breaks - fixes #963 2015-03-07 17:41:56 +11:00
Ondrej Kraus
623be068c4 add unsupportedOutputType to messages.js 2015-03-07 01:53:34 +01:00
Ondrej Kraus
71f5c9791d replace switch with if-else chain 2015-03-07 01:50:50 +01:00
Ondrej Kraus
3e6e86d073 order template keys by length 2015-03-07 01:50:49 +01:00
Ondrej Kraus
a0fb398ca2 add possibility to select format of external helpers 2015-03-07 01:50:49 +01:00
Ondrej Kraus
71b9f19e6a change to normal UMD (fixes bug with leaking variable in AMD mode) 2015-03-07 01:50:48 +01:00
Ondrej Kraus
c45ce58f0c stop assigning to global in generated helpers code 2015-03-07 01:50:48 +01:00
Sebastian McKenzie
d32f587e3c expose dynamicImports when es6.modules is blacklisted babel/ember-cli-babel#24 2015-03-07 03:31:24 +11:00
Sebastian McKenzie
9e1874ba89 4.7.1 2015-03-07 03:31:05 +11:00
Sebastian McKenzie
35fdc5c5d8 v4.7.1 2015-03-07 02:52:17 +11:00
Sebastian McKenzie
a4035fc257 use convert-source-map package - closes #960 2015-03-07 02:46:15 +11:00
Sebastian McKenzie
42e3dc7a70 inherit all options from input source map 2015-03-07 02:28:33 +11:00
Sebastian McKenzie
cdccf24515 4.7.0 2015-03-07 02:04:58 +11:00
Sebastian McKenzie
c8cd5c108b v4.7.0 2015-03-07 01:59:02 +11:00
Sebastian McKenzie
2b95b876e1 return only constructor if class was a named class with only a constructor/no constructor 2015-03-07 01:50:34 +11:00
Sebastian McKenzie
f801772fc2 add inputSourceMap option - fixes #827, related babel/babel-loader#35 2015-03-07 01:50:07 +11:00
Sebastian McKenzie
8ad678e5bc make it illegal to have a rest on a setter 2015-03-07 01:32:03 +11:00
Sebastian McKenzie
35c49dbef7 merge validation transformers 2015-03-07 01:25:44 +11:00
Sebastian McKenzie
119314df74 update traceur 2015-03-07 01:25:37 +11:00
Sebastian McKenzie
51e336b037 class declarations also have a lexical self binding 2015-03-07 01:25:18 +11:00
Sebastian McKenzie
7d446807a9 remove rogue console.log 2015-03-06 23:40:30 +11:00
Sebastian McKenzie
8afdeaf557 replicate module environment in babel-node -e - closes #695, fixes #592 2015-03-06 23:39:49 +11:00
Sebastian McKenzie
4df50954a2 use instance indexOf instead of lodash - #951 2015-03-06 23:31:11 +11:00
Sebastian McKenzie
70b6317865 Merge pull request #951 from neVERberleRfellerER/babel-node-args-fix
add possiblity of passing colliding user arguments by separating them with --
2015-03-06 23:30:31 +11:00
Sebastian McKenzie
5ebdc44297 remove babel-runtime version check to node api 2015-03-06 23:20:48 +11:00
Sebastian McKenzie
a4659fd239 add reference checks for module specifiers - fixes #956 2015-03-06 23:19:26 +11:00
Sebastian McKenzie
19bfa4a35b add debug message for travis... 2015-03-06 23:15:20 +11:00
Sebastian McKenzie
f7fff7d35e add alternate to list of STATEMENT_OR_BLOCK_KEYS - fixes #955 2015-03-06 23:13:03 +11:00
Sebastian McKenzie
130e0ebe6b better classes, more spec compliant and nicer output - fixes #952 2015-03-06 23:08:10 +11:00
Sebastian McKenzie
69c836fc8d Merge branch 'master' of github.com:babel/babel 2015-03-06 02:27:15 +11:00
Sebastian McKenzie
f62a3ef394 further develop ast paths that represent a single location in the ast as an abstraction around a node-parent relationship 2015-03-06 02:26:04 +11:00
Sebastian McKenzie
7a6e568940 clean up classes output 2015-03-06 02:25:24 +11:00
Sebastian McKenzie
65998c3437 add error message for incompatible babel-runtime versions 2015-03-06 02:23:30 +11:00
Ondrej Kraus
160de340b0 add possiblity of passing user arguments by separating them with --
Now, when user arguments have names colliding with node arguments,
they can be separated by -- and will be parsed correctly.
2015-03-05 14:35:53 +01:00
Sebastian McKenzie
76ca40f698 Merge pull request #944 from sindresorhus/modularize-tofastproperties
modularize `util.toFastProperties()`
2015-03-05 01:10:26 +11:00
Sindre Sorhus
01ed824b5c modularize util.toFastProperties()
https://github.com/sindresorhus/to-fast-properties
2015-03-04 21:02:36 +08:00
Sebastian McKenzie
6b0dbc4486 bump regenerator-babel 2015-03-04 23:29:37 +11:00
Sebastian McKenzie
2648268f30 add contextVariables to scope 2015-03-04 22:54:00 +11:00
Sebastian McKenzie
8cf5bf7037 add filename arg to resolveModuleSource option 2015-03-04 22:53:50 +11:00
Sebastian McKenzie
60961bc3ff bump ast-types - fixes #930 2015-03-04 22:53:38 +11:00
Sebastian McKenzie
df16bc17e7 clean up formatting of system module formatter 2015-03-04 22:52:44 +11:00
Sebastian McKenzie
5337ab5a08 statically bind super references in object expressions - fixes #943 2015-03-04 22:52:07 +11:00
Sebastian McKenzie
2eaeebcce4 inherit from class constructor block statement - fixes #937 2015-03-03 23:38:11 +11:00
Sebastian McKenzie
ad71010144 4.6.6 2015-03-03 22:44:44 +11:00
Sebastian McKenzie
864169c1eb v4.6.6 2015-03-03 22:43:06 +11:00
Sebastian McKenzie
930d7f9aa6 add 4.6.6 changelog 2015-03-03 22:38:20 +11:00
Sebastian McKenzie
ed40ec03d1 more es6, template literals and modules 2015-03-03 22:31:49 +11:00
Sebastian McKenzie
73062ae240 take into consideration non-identifier nodes in es6.blockScopingTDZ transformer, also turn default and parameters into lets instead of vars - fixes #929 2015-03-03 22:30:52 +11:00
Sebastian McKenzie
bafa3e0d4c add missing is - fixes #931 - thanks @neVERberleRfellerER 2015-03-03 10:38:18 +11:00
Sebastian McKenzie
f3d2b2bb81 Merge branch 'master' of github.com:babel/babel 2015-03-03 09:49:35 +11:00
Sebastian McKenzie
a74b67d4eb Merge pull request #932 from hzoo/more-es6
More es6
2015-03-03 09:49:29 +11:00
Sebastian McKenzie
625416862f remove no es6 syntax line from contributing.md 2015-03-03 09:49:20 +11:00
Sebastian McKenzie
8dda8838ba check for body existence before length in dead code elimination transformer - fixes #931 2015-03-03 09:37:52 +11:00
Henry Zhu
96d3a25213 use more es6 concise methods 2015-03-02 10:34:30 -05:00
Sebastian McKenzie
727208f376 4.6.5 2015-03-02 22:55:36 +11:00
Sebastian McKenzie
1b046a6ecb v4.6.5 2015-03-02 22:54:35 +11:00
Sebastian McKenzie
3b8ed0d401 add 4.6.5 changelog 2015-03-02 22:51:21 +11:00
Sebastian McKenzie
d4c98d7738 add transformer aliases 2015-03-02 22:47:00 +11:00
Sebastian McKenzie
4e44af819f fix rogue strict reference 2015-03-02 22:45:21 +11:00
Sebastian McKenzie
a65acd73ca fix rogue useStrict transformer references 2015-03-02 22:41:55 +11:00
Sebastian McKenzie
b7cb2bcb7b rename useStrict transformer to strict 2015-03-02 22:37:51 +11:00
Sebastian McKenzie
5ac4dc0541 don't evaluate ArrayExpressions 2015-03-02 17:16:10 +11:00
Sebastian McKenzie
99ddd02b0a change Function export to avoid messing with istanbul 2015-03-02 15:38:43 +11:00
Sebastian McKenzie
19cfee14fd 4.6.4 2015-03-02 15:38:31 +11:00
250 changed files with 2167 additions and 1362 deletions

2
.gitignore vendored
View File

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

View File

@@ -13,6 +13,59 @@ _Note: Gaps between patch versions are faulty/broken releases._
See [CHANGELOG - 6to5](CHANGELOG-6to5.md) for the pre-4.0.0 version changelog.
## 4.7.4
* **Bug Fix**
* Rewrite named function expressions in optional async function transformers.
* Hoist directives.
* Remove `Number` from the list of valid `runtime` constructors.
* **Internal**
* `spec.typeofSymbol` transformer has been renamed to `es6.symbols`.
## 4.7.2
* **New Feature**
* `"both"` option for `sourceMap`.
* Add output types to external helpers. Thanks [@neVERberleRfellerER](https://github.com/neVERberleRfellerER)!
* **Bug Fix**
* Fix node duplication sometimes resulting in a recursion error.
* Ignore `break`s within cases inside `for...of`.
* **Polish**
* Split up variable declarations and export declarations to allow easier transformation.
## 4.7.0
* **Bug Fix**
* Add `alternate` to list of `STATEMENT_OR_BLOCK` keys.
* Add support for module specifiers to `t.isReferenced`.
* **New Feature**
* Add `inputSourceMap` option.
* **Polish**
* Throw an error on different `babel` and `babel-runtime` versions.
* Replicate module environment for `babel-node` eval.
* Clean up classes output.
* **Spec Compliancy**
* Make it illegal to use a rest parameter on a setter.
## 4.6.6
* **Bug Fix**
* Fix incorrect method call in `utility.deadCodeElimination` transformer.
* Fix `es6.blockScopingTDZ` transformer duplicating binding nodes.
## 4.6.5
* **Internal**
* `useStrict` transformer has been renamed to `strict`.
## 4.6.4
* **Bug Fix**
* Fix `ForOfStatement` not proplery inheriting labels.
* When in closure mode in block scoping transformer, properly check for variable shadowing.
* **New Feature**
* New `utility.inlineEnvironmentVariables` and `utility.inlineExpression` transformers.
## 4.6.3
* **Bug Fix**

View File

@@ -53,7 +53,6 @@ $ mocha test/transformation.js
#### Code Standards
* **General**
* No ES6 syntax features or methods, exclusively ES5.
* Max of five arguments for functions
* Max depth of four nested blocks
* 2-spaced soft tabs

View File

@@ -8,11 +8,14 @@ BABEL_CMD = node_modules/babel/bin/babel
export NODE_ENV = test
.PHONY: clean test test-cov test-clean test-travis test-simple test-all test-browser publish build bootstrap publish-core publish-runtime build-core watch-core
.PHONY: clean test test-cov test-clean test-travis test-simple test-all test-browser publish build bootstrap publish-core publish-runtime build-core watch-core build-core-test
build-core:
node $(BABEL_CMD) src --out-dir lib --copy-files
build-core-test:
node $(BABEL_CMD) src --out-dir lib --copy-files --auxiliary-comment "istanbul ignore next"
watch-core:
node $(BABEL_CMD) src --out-dir lib --watch --copy-files
@@ -40,26 +43,19 @@ test-clean:
rm -rf test/tmp
test:
$(MOCHA_CMD)
node $(MOCHA_CMD)
make test-clean
test-simple:
# excludes test262
export SIMPLE_BABEL_TESTS=1; \
make test
test-all:
export ALL_BABEL_TESTS=1; \
make test
test-cov:
rm -rf coverage
export SIMPLE_BABEL_TESTS=1; \
make build-core-test
node $(ISTANBUL_CMD) $(MOCHA_CMD) --
test-travis: bootstrap build
node $(ISTANBUL_CMD) $(MOCHA_CMD) --
if test -n "$$CODECLIMATE_REPO_TOKEN"; then codeclimate < coverage/lcov.info; fi
test-travis: bootstrap build test
test-browser:
mkdir -p dist

View File

@@ -60,7 +60,18 @@ if (program.eval || program.print) {
var code = program.eval;
if (!code || code === true) code = program.print;
var result = _eval(code, "eval");
global.__filename = "[eval]";
global.__dirname = process.cwd();
var module = new Module(global.__filename);
module.filename = global.__filename;
module.paths = Module._nodeModulePaths(global.__dirname);
global.exports = module.exports;
global.module = module;
global.require = module.require.bind(module);
var result = _eval(code, global.__filename);
if (program.print) console.log(result);
} else {
if (program.args.length) {
@@ -88,7 +99,7 @@ if (program.eval || program.print) {
args = args.slice(i);
// make the filename absolute
var filename = args[0]
var filename = args[0];
if (!pathIsAbsolute(filename)) args[0] = path.join(process.cwd(), filename);
// add back on node and concat the sliced args

View File

@@ -1,4 +1,13 @@
#!/usr/bin/env node
var commander = require("commander");
var util = require("../lib/babel/util");
var runtime = require("../lib/babel/build-external-helpers");
console.log(runtime());
commander.option("-l, --whitelist [whitelist]", "Whitelist of helpers to ONLY include", util.list);
commander.option("-t, --output-type [type]", "Type of output (global|umd|var)", "global");
commander.usage("[options]");
commander.parse(process.argv);
console.log(runtime(commander.whitelist, commander.outputType));

View File

@@ -7,7 +7,17 @@
var args = [__dirname + "/_babel-node"];
process.argv.slice(2).forEach(function(arg){
var babelArgs = process.argv.slice(2);
var userArgs;
// separate node arguments from script arguments
var 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];
switch (flag) {
@@ -49,6 +59,11 @@ process.argv.slice(2).forEach(function(arg){
}
});
// append arguments passed after --
if (argSeparator > -1) {
args = args.concat(userArgs);
}
try {
var kexec = require("kexec");
kexec(process.argv[0], args);

View File

@@ -1,10 +1,10 @@
var sourceMapToComment = require("source-map-to-comment");
var sourceMap = require("source-map");
var chokidar = require("chokidar");
var path = require("path");
var util = require("./util");
var fs = require("fs");
var _ = require("lodash");
var convertSourceMap = require("convert-source-map");
var sourceMap = require("source-map");
var chokidar = require("chokidar");
var path = require("path");
var util = require("./util");
var fs = require("fs");
var _ = require("lodash");
module.exports = function (commander, filenames) {
var results = [];
@@ -42,7 +42,7 @@ module.exports = function (commander, filenames) {
});
if (commander.sourceMapsInline || (!commander.outFile && commander.sourceMaps)) {
code += "\n" + sourceMapToComment(map);
code += "\n" + convertSourceMap.fromObject(map).toComment();
}
return {

View File

@@ -1,7 +1,7 @@
{
"name": "babel",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "4.6.4",
"version": "4.7.4",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://babeljs.io/",
"repository": "babel/babel",
@@ -37,10 +37,11 @@
},
"dependencies": {
"acorn-babel": "0.11.1-37",
"ast-types": "~0.6.1",
"ast-types": "~0.7.0",
"chalk": "^1.0.0",
"chokidar": "^0.12.6",
"commander": "^2.6.0",
"convert-source-map": "^0.5.0",
"core-js": "^0.6.1",
"debug": "^2.1.1",
"detect-indent": "^3.0.0",
@@ -56,14 +57,14 @@
"output-file-sync": "^1.1.0",
"path-is-absolute": "^1.0.0",
"private": "^0.1.6",
"regenerator-babel": "0.8.13-1",
"regenerator-babel": "0.8.13-2",
"regexpu": "^1.1.2",
"repeating": "^1.1.2",
"shebang-regex": "^1.0.0",
"slash": "^1.0.0",
"source-map": "^0.4.0",
"source-map-support": "^0.2.9",
"source-map-to-comment": "^1.0.0",
"to-fast-properties": "^1.0.0",
"trim-right": "^1.0.0"
},
"devDependencies": {

View File

@@ -0,0 +1 @@
module.exports = require("core-js/library");

View File

View File

@@ -1,7 +1,10 @@
{
"name": "babel-runtime",
"description": "babel selfContained runtime",
"version": "4.6.3",
"version": "4.7.3",
"repository": "babel/babel",
"author": "Sebastian McKenzie <sebmck@gmail.com>"
}
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"dependencies": {
"core-js": "^0.6.1"
}
}

View File

@@ -1,11 +1,12 @@
"use strict";
var transform = require("../lib/babel/transformation");
var buildHelpers = require("../lib/babel/build-helpers");
var util = require("../lib/babel/util");
var fs = require("fs");
var t = require("../lib/babel/types");
var _ = require("lodash");
var transform = require("../lib/babel/transformation");
var each = require("lodash/collection/each");
var File = require("../lib/babel/transformation/file");
var util = require("../lib/babel/util");
var fs = require("fs");
var t = require("../lib/babel/types");
var _ = require("lodash");
var relative = function (filename) {
return __dirname + "/babel-runtime/" + filename;
@@ -39,22 +40,26 @@ var updatePackage = function () {
var selfContainify = function (code) {
return transform(code, {
optional: ["selfContained"]
optional: ["runtime"]
}).code;
};
var buildHelpers2 = function () {
var body = util.template("self-contained-helpers-head");
var tree = t.program(body);
buildHelpers(body, t.identifier("helpers"));
var buildHelper = function (helperName) {
var tree = t.program(
util.template("self-contained-helpers-head", {
HELPER: util.template(helperName)
})
);
return transform.fromAst(tree, null, {
optional: ["selfContained"]
optional: ["runtime"]
}).code;
};
writeFile("helpers.js", buildHelpers2());
each(File.helpers, function (helperName) {
writeFile("helpers/" + helperName + ".js", buildHelper(helperName));
});
writeFile("core-js.js", readFile("core-js/library", true));
writeFile("regenerator/index.js", readFile("regenerator-babel/runtime-module", true));
writeFile("regenerator/runtime.js", selfContainify(readFile("regenerator-babel/runtime")));

View File

@@ -25,7 +25,7 @@ transform.load = function (url, callback, opts = {}, hold) {
if (!hold) transform.run.apply(transform, param);
if (callback) callback(param);
} else {
throw new Error("Could not load " + url);
throw new Error(`Could not load ${url}`);
}
};

View File

@@ -46,7 +46,7 @@ var compile = function (filename) {
var opts = extend({}, transformOpts);
resolveRc(filename, opts);
var cacheKey = filename + ":" + JSON.stringify(opts);
var cacheKey = `${filename}:${JSON.stringify(opts)}`;
if (cache) {
var cached = cache[cacheKey];
@@ -57,7 +57,7 @@ var compile = function (filename) {
if (!result) {
result = babel.transformFileSync(filename, extend(opts, {
sourceMap: true,
sourceMap: "both",
ast: false
}));
}
@@ -153,3 +153,16 @@ export default function (opts = {}) {
extend(transformOpts, opts);
};
//
try {
var runtimePackage = require("babel-runtime/package");
var version = require("../../package").version;
if (runtimePackage.version !== version) {
throw new ReferenceError(`The verison of babel-runtime of ${runtimePackage.runtime} that you have installed does not match the babel verison of ${version}`);
}
} catch (err) {
if (err.code !== "MODULE_NOT_FOUND") throw err;
}

View File

@@ -23,7 +23,7 @@ export default function (loc, opts = {}) {
try {
json = JSON.parse(content);
} catch (err) {
err.message = file + ": " + err.message;
err.message = `${file}: ${err.message}`;
throw err;
}

View File

@@ -1,11 +1,11 @@
import buildHelpers from "./build-helpers";
import generator from "./generation";
import * as messages from "./messages";
import * as util from "./util";
import File from "./transformation/file";
import each from "lodash/collection/each";
import t from "./types";
export default function (whitelist) {
var namespace = t.identifier("babelHelpers");
function buildGlobal(namespace, builder) {
var body = [];
var container = t.functionExpression(null, [t.identifier("global")], t.blockStatement(body));
var tree = t.program([t.expressionStatement(t.callExpression(container, [util.template("self-global")]))]);
@@ -17,7 +17,70 @@ export default function (whitelist) {
)
]));
buildHelpers(body, namespace, whitelist);
builder(body);
return tree;
}
function buildUmd(namespace, builder) {
var body = [];
body.push(t.variableDeclaration("var", [
t.variableDeclarator(namespace, t.identifier("global"))
]));
builder(body);
var container = util.template("umd-commonjs-strict", {
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.literal("exports")]),
FACTORY_BODY: body,
UMD_ROOT: t.identifier("this")
});
return t.program([container]);
}
function buildVar(namespace, builder) {
var body = [];
body.push(t.variableDeclaration("var", [
t.variableDeclarator(namespace, t.objectExpression({}))
]));
builder(body);
return t.program(body);
}
function buildHelpers(body, namespace, whitelist = []) {
each(File.helpers, function (name) {
if (whitelist.length && whitelist.indexOf(name) === -1) return;
var key = t.identifier(t.toIdentifier(name));
body.push(t.expressionStatement(
t.assignmentExpression("=", t.memberExpression(namespace, key), util.template(name))
));
});
}
export default function (whitelist, outputType = "global") {
var namespace = t.identifier("babelHelpers");
var builder = function (body) {
return buildHelpers(body, namespace, whitelist);
};
var tree;
var 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;
};

View File

@@ -1,15 +0,0 @@
import File from "./transformation/file";
import * as util from "./util";
import each from "lodash/collection/each";
import t from "./types";
export default function (body, namespace, whitelist = []) {
each(File.helpers, function (name) {
if (whitelist.length && whitelist.indexOf(name) === -1) return;
var key = t.identifier(t.toIdentifier(name));
body.push(t.expressionStatement(
t.assignmentExpression("=", t.memberExpression(namespace, key), util.template(name))
));
});
};

View File

@@ -140,7 +140,7 @@ export default class Buffer {
var indent = this.getIndent();
// replace all newlines with newlines with the indentation
str = str.replace(/\n/g, "\n" + indent);
str = str.replace(/\n/g, `\n${indent}`);
// we've got a newline before us so prepend on the indentation
if (this.isLast("\n")) this._push(indent);

View File

@@ -109,16 +109,19 @@ export function ExpressionStatement(node, print) {
this.semicolon();
}
exports.BinaryExpression =
exports.LogicalExpression =
exports.AssignmentPattern =
exports.AssignmentExpression = function (node, print) {
export function AssignmentExpression(node, print) {
// todo: add cases where the spaces can be dropped when in compact mode
print(node.left);
this.push(" ");
this.push(node.operator);
this.push(" ");
print(node.right);
}
export {
AssignmentExpression as BinaryExpression,
AssignmentExpression as LogicalExpression,
AssignmentExpression as AssignmentPattern
};
var SCIENTIFIC_NOTATION = /e/i;

View File

@@ -44,8 +44,7 @@ export function _method(node, print) {
print(value.body);
}
exports.FunctionDeclaration =
exports.FunctionExpression = function (node, print) {
export function FunctionExpression(node, print) {
if (node.async) this.push("async ");
this.push("function");
if (node.generator) this.push("*");
@@ -60,7 +59,9 @@ exports.FunctionExpression = function (node, print) {
this._params(node, print);
this.space();
print(node.body);
};
}
export { FunctionExpression as FunctionDeclaration };
export function ArrowFunctionExpression(node, print) {
if (node.async) this.push("async ");

View File

@@ -5,7 +5,7 @@ export function ImportSpecifier(node, print) {
if (t.isSpecifierDefault(node)) {
print(t.getSpecifierName(node));
} else {
return exports.ExportSpecifier.apply(this, arguments);
return ExportSpecifier.apply(this, arguments);
}
}

View File

@@ -2,6 +2,6 @@ import each from "lodash/collection/each";
each(["BindMemberExpression", "BindFunctionExpression"], function (type) {
exports[type] = function () {
throw new ReferenceError("Trying to render non-standard playground node " + JSON.stringify(type));
throw new ReferenceError(`Trying to render non-standard playground node ${JSON.stringify(type)}`);
};
});

View File

@@ -60,7 +60,7 @@ var buildForXStatement = function (op) {
this.keyword("for");
this.push("(");
print(node.left);
this.push(" " + op + " ");
this.push(` ${op} `);
print(node.right);
this.push(")");
print.block(node.body);
@@ -192,7 +192,7 @@ export function VariableDeclaration(node, print, parent) {
var sep = ",";
if (!this.format.compact && hasInits) {
sep += "\n" + repeating(" ", node.kind.length + 1);
sep += `\n${repeating(" ", node.kind.length + 1)}`;
} else {
sep += " ";
}

View File

@@ -4,12 +4,12 @@ export function Identifier(node) {
this.push(node.name);
}
exports.RestElement =
exports.SpreadElement =
exports.SpreadProperty = function (node, print) {
export function RestElement(node, print) {
this.push("...");
print(node.argument);
};
}
export { RestElement as SpreadElement, RestElement as SpreadProperty };
export function VirtualPropertyExpression(node, print) {
print(node.object);
@@ -17,8 +17,7 @@ export function VirtualPropertyExpression(node, print) {
print(node.property);
}
exports.ObjectExpression =
exports.ObjectPattern = function (node, print) {
export function ObjectExpression(node, print) {
var props = node.properties;
if (props.length) {
@@ -32,7 +31,9 @@ exports.ObjectPattern = function (node, print) {
} else {
this.push("{}");
}
};
}
export { ObjectExpression as ObjectPattern };
export function Property(node, print) {
if (node.method || node.kind === "get" || node.kind === "set") {
@@ -53,8 +54,7 @@ export function Property(node, print) {
}
}
exports.ArrayExpression =
exports.ArrayPattern = function (node, print) {
export function ArrayExpression(node, print) {
var elems = node.elements;
var len = elems.length;
@@ -76,7 +76,9 @@ exports.ArrayPattern = function (node, print) {
});
this.push("]");
};
}
export { ArrayExpression as ArrayPattern };
export function Literal(node) {
var val = node.value;
@@ -89,7 +91,7 @@ export function Literal(node) {
} else if (type === "boolean") {
this.push(val ? "true" : "false");
} else if (node.regex) {
this.push("/" + node.regex.pattern + "/" + node.regex.flags);
this.push(`/${node.regex.pattern}/${node.regex.flags}`);
} else if (val === null) {
this.push("null");
}

View File

@@ -187,7 +187,7 @@ class CodeGenerator {
this.printTrailingComments(node, parent);
} else {
throw new ReferenceError("unknown node of type " + JSON.stringify(node.type) + " with constructor " + JSON.stringify(node && node.constructor.name));
throw new ReferenceError(`unknown node of type ${JSON.stringify(node.type)} with constructor ${JSON.stringify(node && node.constructor.name)}`);
}
this.format.concise = oldConcise;
@@ -238,9 +238,9 @@ class CodeGenerator {
generateComment(comment) {
var val = comment.value;
if (comment.type === "Line") {
val = "//" + val;
val = `//${val}`;
} else {
val = "/*" + val + "*/";
val = `/*${val}*/`;
}
return val;
}
@@ -319,7 +319,7 @@ class CodeGenerator {
}
var indent = Math.max(this.indentSize(), column);
val = val.replace(/\n/g, "\n" + repeating(" ", indent));
val = val.replace(/\n/g, `\n${repeating(" ", indent)}`);
}
if (column === 0) {

View File

@@ -55,7 +55,7 @@ var highlight = function (text) {
});
};
module.exports = function (lines, lineNumber, colNumber) {
export default function (lines, lineNumber, colNumber) {
colNumber = Math.max(colNumber, 0);
if (chalk.supportsColor) {
@@ -81,8 +81,7 @@ module.exports = function (lines, lineNumber, colNumber) {
return;
}
if (colNumber) {
params.line += "\n" + params.before + repeating(" ", params.width) +
params.after + repeating(" ", colNumber - 1) + "^";
params.line += `\n${params.before}${repeating(" ", params.width)}${params.after}${repeating(" ", colNumber - 1)}^`;
}
params.before = params.before.replace(/^./, ">");
}

View File

@@ -1,6 +1,6 @@
import t from "../types";
module.exports = function (ast, comments, tokens) {
export default function (ast, comments, tokens) {
if (ast && ast.type === "Program") {
return t.file(ast, comments || [], tokens || []);
} else {

View File

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

View File

@@ -3,7 +3,7 @@ import estraverse from "estraverse";
import codeFrame from "./code-frame";
import acorn from "acorn-babel";
module.exports = function (opts, code, callback) {
export default function (opts, code, callback) {
try {
var comments = [];
var tokens = [];
@@ -32,7 +32,7 @@ module.exports = function (opts, code, callback) {
} catch (err) {
if (!err._babel) {
err._babel = true;
var message = opts.filename + ": " + err.message;
var message = `${opts.filename}: ${err.message}`;
var loc = err.loc;
if (loc) {

View File

@@ -1,15 +0,0 @@
/**
* A trick from Bluebird to force V8 to use fast properties for an object.
* Read more: http://stackoverflow.com/questions/24987896/
*
* Use %HasFastProperties(obj) and --allow-natives-syntax to check whether
* a particular object already has fast properties.
*/
module.exports = function toFastProperties(obj) {
/*jshint -W027*/
function f() {}
f.prototype = obj;
return f;
eval(obj);
};

View File

@@ -10,6 +10,7 @@ export var messages = {
undeclaredVariable: "Reference to undeclared variable $1",
undeclaredVariableSuggestion: "Reference to undeclared variable $1 - did you mean $2?",
settersInvalidParamLength: "Setters must have exactly one parameter",
settersNoRest: "Setters aren't allowed to have a rest",
noAssignmentsInForHead: "No assignments allowed in for-in/of head",
expectedMemberExpressionOrIdentifier: "Expected type MemeberExpression or Identifier",
invalidParentForThisNode: "We don't know how to handle this node within the current parent - please open an issue",
@@ -18,25 +19,23 @@ export var messages = {
unknownForHead: "Unknown node type $1 in ForStatement",
didYouMean: "Did you mean $1?",
evalInStrictMode: "eval is not allowed in strict mode",
codeGeneratorDeopt: "Note: The code generator has deoptimised the styling of $1 as it exceeds the max of $2."
codeGeneratorDeopt: "Note: The code generator has deoptimised the styling of $1 as it exceeds the max of $2.",
missingTemplatesDirectory: "no templates directory - this is most likely the result of a broken `npm publish`. Please report to https://github.com/babel/babel/issues",
unsupportedOutputType: "Unsupported output type $1"
};
export function get(key) {
var msg = exports.messages[key];
if (!msg) throw new ReferenceError("Unknown message `" + key + "`");
export function get(key: String, ...args) {
var msg = messages[key];
if (!msg) throw new ReferenceError(`Unknown message ${JSON.stringify(key)}`);
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
args = exports.parseArgs(args);
args = parseArgs(args);
return msg.replace(/\$(\d+)/g, function (str, i) {
return args[--i];
});
}
export function parseArgs(args) {
export function parseArgs(args: Array<any>) {
return args.map(function (val) {
if (val != null && val.inspect) {
return val.inspect();

View File

@@ -9,8 +9,8 @@ extend(estraverse.VisitorKeys, t.VISITOR_KEYS);
// regenerator-babel/ast-types
var def = types.Type.def;
var or = types.Type.or;
var def = types.Type.def;
var or = types.Type.or;
def("File")
.bases("Node")

View File

@@ -1,6 +1,7 @@
import sourceMapToComment from "source-map-to-comment";
import convertSourceMap from "convert-source-map";
import shebangRegex from "shebang-regex";
import isFunction from "lodash/lang/isFunction";
import sourceMap from "source-map";
import transform from "./index";
import generate from "../generation";
import defaults from "lodash/object/defaults";
@@ -48,7 +49,7 @@ export default class File {
static helpers = [
"inherits",
"defaults",
"prototype-properties",
"create-class",
"apply-constructor",
"tagged-template-literal",
"tagged-template-literal-loose",
@@ -77,34 +78,41 @@ export default class File {
static validOptions = [
"filename",
"filenameRelative",
"blacklist",
"whitelist",
"loose",
"optional",
"loose",
"playground",
"experimental",
"modules",
"moduleIds",
"moduleId",
"resolveModuleSource",
"keepModuleIdExtensions",
"code",
"ast",
"comments",
"compact",
"auxiliaryComment",
"externalHelpers",
"returnUsedHelpers",
"inputSourceMap",
"sourceMap",
"sourceMapName",
"sourceFileName",
"sourceRoot",
"moduleRoot",
"moduleIds",
"comments",
"reactCompat",
"keepModuleIdExtensions",
"code",
"ast",
"playground",
"experimental",
"externalHelpers",
"auxiliaryComment",
"compact",
"returnUsedHelpers",
"resolveModuleSource",
"moduleId",
// legacy
"format",
"reactCompat",
// these are used by plugins
"ignore",
@@ -113,12 +121,12 @@ export default class File {
"accept"
];
normalizeOptions(opts) {
normalizeOptions(opts: Object) {
opts = assign({}, opts);
for (var key in opts) {
if (key[0] !== "_" && File.validOptions.indexOf(key) < 0) {
throw new ReferenceError("Unknown option: " + key);
throw new ReferenceError(`Unknown option: ${key}`);
}
}
@@ -128,6 +136,7 @@ export default class File {
returnUsedHelpers: false,
externalHelpers: false,
auxilaryComment: "",
inputSourceMap: false,
experimental: false,
reactCompat: false,
playground: false,
@@ -145,6 +154,10 @@ export default class File {
ast: true
});
if (opts.inputSourceMap) {
opts.sourceMap = true;
}
// normalize windows path separators to unix
opts.filename = slash(opts.filename);
if (opts.sourceRoot) {
@@ -214,7 +227,7 @@ export default class File {
return opts;
};
isLoose(key) {
isLoose(key: string) {
return includes(this.opts.loose, key);
}
@@ -246,13 +259,13 @@ export default class File {
this.transformers = transformers;
}
debug(msg) {
debug(msg?: string) {
var parts = this.opts.filename;
if (msg) parts += ": " + msg;
if (msg) parts += `: ${msg}`;
util.debug(parts);
}
getModuleFormatter(type) {
getModuleFormatter(type: string) {
var ModuleFormatter = isFunction(type) ? type : transform.moduleFormatters[type];
if (!ModuleFormatter) {
@@ -261,13 +274,25 @@ export default class File {
}
if (!ModuleFormatter) {
throw new ReferenceError("Unknown module formatter type " + JSON.stringify(type));
throw new ReferenceError(`Unknown module formatter type ${JSON.stringify(type)}`);
}
return new ModuleFormatter(this);
}
parseShebang(code) {
parseInputSourceMap(code: string) {
var opts = this.opts;
var inputMap = convertSourceMap.fromSource(code);
if (inputMap) {
opts.inputSourceMap = inputMap.toObject();
code = convertSourceMap.removeComments(code);
}
return code;
}
parseShebang(code: string) {
var shebangMatch = shebangRegex.exec(code);
if (shebangMatch) {
@@ -280,15 +305,15 @@ export default class File {
return code;
}
set(key, val) {
set(key: string, val): any {
return this.data[key] = val;
};
setDynamic(key, fn) {
setDynamic(key: string, fn: Function) {
this.dynamicData[key] = fn;
}
get(key) {
get(key: string): any {
var data = this.data[key];
if (data) {
return data;
@@ -300,7 +325,7 @@ export default class File {
}
}
addImport(source, name, noDefault) {
addImport(source: string, name?: string, noDefault?: boolean): Object {
name ||= source;
var id = this.dynamicImportIds[name];
@@ -314,17 +339,21 @@ export default class File {
this.dynamicImported.push(declar);
if (noDefault) this.dynamicImportedNoDefault.push(declar);
this.moduleFormatter.importSpecifier(specifiers[0], declar, this.dynamicImports);
if (this.transformers["es6.modules"].canRun()) {
this.moduleFormatter.importSpecifier(specifiers[0], declar, this.dynamicImports);
} else {
this.dynamicImports.push(declar);
}
}
return id;
}
isConsequenceExpressionStatement(node) {
isConsequenceExpressionStatement(node: Object): boolean {
return t.isExpressionStatement(node) && this.lastStatements.indexOf(node) >= 0;
}
attachAuxiliaryComment(node) {
attachAuxiliaryComment(node: Object): Object {
var comment = this.opts.auxiliaryComment;
if (comment) {
node.leadingComments ||= [];
@@ -336,9 +365,9 @@ export default class File {
return node;
}
addHelper(name) {
addHelper(name: string): Object {
if (!includes(File.helpers, name)) {
throw new ReferenceError("Unknown helper " + name);
throw new ReferenceError(`Unknown helper ${name}`);
}
var program = this.ast.program;
@@ -348,10 +377,13 @@ export default class File {
this.usedHelpers[name] = true;
var generator = this.get("helperGenerator");
var runtime = this.get("helpersNamespace");
if (runtime) {
name = t.identifier(t.toIdentifier(name));
return t.memberExpression(runtime, name);
if (generator) {
return generator(name);
} else if (runtime) {
var id = t.identifier(t.toIdentifier(name));
return t.memberExpression(runtime, id);
} else {
var ref = util.template(name);
ref._compact = true;
@@ -371,24 +403,25 @@ export default class File {
errorWithNode(node, msg, Error = SyntaxError) {
var loc = node.loc.start;
var err = new Error("Line " + loc.line + ": " + msg);
var err = new Error(`Line ${loc.line}: ${msg}`);
err.loc = loc;
return err;
}
addCode(code) {
addCode(code: string) {
code = (code || "") + "";
code = this.parseInputSourceMap(code);
this.code = code;
return this.parseShebang(code);
}
parse(code) {
parse(code: string) {
code = this.addCode(code);
var opts = this.opts;
opts.allowImportExportEverywhere = this.isLoose("es6.modules");
opts.strictMode = this.transformers.useStrict.canRun();
opts.strictMode = this.transformers.strict.canRun();
return parse(opts, code, (tree) => {
this.transform(tree);
@@ -419,7 +452,7 @@ export default class File {
this.call("post");
}
call(key) {
call(key: string) {
var stack = this.transformerStack;
for (var i = 0; i < stack.length; i++) {
var transformer = stack[i].transformer;
@@ -430,6 +463,13 @@ export default class File {
}
checkNode(node, scope) {
if (Array.isArray(node)) {
for (var i = 0; i < node.length; i++) {
this.checkNode(node[i], scope);
}
return;
}
var stack = this.transformerStack;
scope ||= this.scope;
@@ -440,7 +480,33 @@ export default class File {
});
}
generate() {
mergeSourceMap(map: Object) {
var opts = this.opts;
var inputMap = opts.inputSourceMap;
if (inputMap) {
map.sources[0] = inputMap.file;
var inputMapConsumer = new sourceMap.SourceMapConsumer(inputMap);
var outputMapConsumer = new sourceMap.SourceMapConsumer(map);
var outputMapGenerator = sourceMap.SourceMapGenerator.fromSourceMap(outputMapConsumer);
outputMapGenerator.applySourceMap(inputMapConsumer);
var mergedMap = outputMapGenerator.toJSON();
mergedMap.sources = inputMap.sources
mergedMap.file = inputMap.file;
return mergedMap;
}
return map;
}
generate(): {
code: string;
map?: Object;
ast?: Object;
} {
var opts = this.opts;
var ast = this.ast;
@@ -463,11 +529,16 @@ export default class File {
if (this.shebang) {
// add back shebang
result.code = this.shebang + "\n" + result.code;
result.code = `${this.shebang}\n${result.code}`;
}
result.map = this.mergeSourceMap(result.map);
if (opts.sourceMap === "inline" || opts.sourceMap === "both") {
result.code += "\n" + convertSourceMap.fromObject(result.map).toComment();
}
if (opts.sourceMap === "inline") {
result.code += "\n" + sourceMapToComment(result.map);
result.map = null;
}

View File

@@ -1,7 +1,7 @@
import explode from "./explode-assignable-expression";
import t from "../../types";
module.exports = function (exports, opts) {
export default function (exports, opts) {
var isAssignment = function (node) {
return node.operator === opts.operator + "=";
};

View File

@@ -1,6 +1,6 @@
import t from "../../types";
module.exports = function build(node, buildBody) {
export default function build(node, buildBody) {
var self = node.blocks.shift();
if (!self) return;
@@ -20,4 +20,4 @@ module.exports = function build(node, buildBody) {
self.right,
t.blockStatement([child])
);
};
}

View File

@@ -1,7 +1,7 @@
import explode from "./explode-assignable-expression";
import t from "../../types";
module.exports = function (exports, opts) {
export default function (exports, opts) {
var buildAssignment = function (left, right) {
return t.assignmentExpression("=", left, right);
};

View File

@@ -9,7 +9,7 @@ import esutils from "esutils";
import * as react from "./react";
import t from "../../types";
module.exports = function (exports, opts) {
export default function (exports, opts) {
exports.check = function (node) {
if (t.isJSX(node)) return true;
if (react.isCreateClass(node)) return true;

View File

@@ -1,6 +1,5 @@
import cloneDeep from "lodash/lang/cloneDeep";
import traverse from "../../traversal";
import clone from "lodash/lang/clone";
import each from "lodash/collection/each";
import has from "lodash/object/has";
import t from "../../types";
@@ -10,11 +9,11 @@ export function push(mutatorMap, key, kind, computed, value) {
if (t.isIdentifier(key)) {
alias = key.name;
if (computed) alias = "computed:" + alias;
if (computed) alias = `computed:${alias}`;
} else if (t.isLiteral(key)) {
alias = String(key.value);
} else {
alias = JSON.stringify(traverse.removeProperties(cloneDeep(key)));
alias = JSON.stringify(traverse.removeProperties(t.cloneDeep(key)));
}
var map;
@@ -33,7 +32,7 @@ export function push(mutatorMap, key, kind, computed, value) {
map[kind] = value;
}
export function build(mutatorMap) {
export function toClassObject(mutatorMap) {
var objExpr = t.objectExpression([]);
each(mutatorMap, function (map) {
@@ -41,22 +40,43 @@ export function build(mutatorMap) {
var propNode = t.property("init", map._key, mapNode, map._computed);
if (!map.get && !map.set) {
map.writable = t.literal(true);
}
if (map.enumerable === false) {
delete map.enumerable;
} else {
map.enumerable = t.literal(true);
}
map.configurable = t.literal(true);
each(map, function (node, key) {
if (key[0] === "_") return;
node = clone(node);
var inheritNode = node;
if (t.isMethodDefinition(node)) node = node.value;
var prop = t.property("init", t.identifier(key), node);
t.inheritsComments(prop, inheritNode);
t.removeComments(inheritNode);
mapNode.properties.push(prop);
});
objExpr.properties.push(propNode);
});
return objExpr;
}
export function toDefineObject(mutatorMap) {
var objExpr = t.objectExpression([]);
each(mutatorMap, function (map) {
var mapNode = t.objectExpression([]);
var propNode = t.property("init", map._key, mapNode, map._computed);
if (map.value) {
map.writable = t.literal(true);
}
map.configurable = t.literal(true);
map.enumerable = t.literal(true);
each(map, function (node, key) {
if (key[0] === "_") return;
node = t.clone(node);
var inheritNode = node;
if (t.isMethodDefinition(node)) node = node.value;

View File

@@ -23,7 +23,7 @@ var getObjRef = function (node, nodes, file, scope) {
return ref;
}
} else {
throw new Error("We can't explode this node type " + node.type);
throw new Error(`We can't explode this node type ${node.type}`);
}
var temp = scope.generateUidBasedOnNode(ref);
@@ -45,7 +45,7 @@ var getPropRef = function (node, nodes, file, scope) {
return temp;
};
module.exports = function (node, nodes, file, scope, allowedSingleIdent) {
export default function (node, nodes, file, scope, allowedSingleIdent) {
var obj;
if (t.isIdentifier(node) && allowedSingleIdent) {
obj = node;

View File

@@ -1,6 +1,6 @@
import t from "../../types";
module.exports = function (node) {
export default function (node) {
var lastNonDefault = 0;
for (var i = 0; i < node.params.length; i++) {
if (!t.isAssignmentPattern(node.params[i])) lastNonDefault = i + 1;

View File

@@ -6,7 +6,7 @@ var visitor = {
enter(node, parent, scope, state) {
// check if this node is a referenced identifier that matches the same as our
// function id
if (!t.isReferencedIdentifier(node, parent, { name: state.name })) return;
if (!this.isReferencedIdentifier({ name: state.name })) return;
// check that we don't have a local variable declared as that removes the need
// for the wrapper
@@ -89,6 +89,11 @@ var visit = function (node, name, scope) {
return state;
};
export function custom(node, id, scope) {
var state = visit(node, id.name, scope);
return wrap(state, node, id, scope);
}
export function property(node, file, scope) {
var key = t.toComputedKey(node, node.key);
if (!t.isLiteral(key)) return node; // we can't set a function id with this
@@ -103,7 +108,7 @@ export function property(node, file, scope) {
export function bare(node, parent, scope) {
// has an `id` so we don't need to infer one
if (node.id) return;
if (node.id) return node;
var id;
if (t.isProperty(parent) && parent.kind === "init" && !parent.computed) {
@@ -113,10 +118,10 @@ export function bare(node, parent, scope) {
// var foo = function () {};
id = parent.id;
} else {
return;
return node;
}
if (!t.isIdentifier(id)) return;
if (!t.isIdentifier(id)) return node;
var name = t.toIdentifier(id.name);
id = t.identifier(name);

View File

@@ -1,7 +1,7 @@
import t from "../../types";
var visitor = {
enter(node) {
var awaitVisitor = {
enter(node, parent, scope, state) {
if (t.isFunction(node)) this.skip();
if (t.isAwaitExpression(node)) {
@@ -16,15 +16,25 @@ var visitor = {
}
};
module.exports = function (node, callId, scope) {
var referenceVisitor = {
enter(node, parent, scope, state) {
var name = state.id.name;
if (t.isReferencedIdentifier(node, parent, { name: name }) && scope.bindingIdentifierEquals(name, state.id)) {
return state.ref ||= scope.generateUidIdentifier(name);
}
}
};
export default function (node, callId, scope) {
node.async = false;
node.generator = true;
scope.traverse(node, visitor);
scope.traverse(node, awaitVisitor, state);
var call = t.callExpression(callId, [node]);
var id = node.id;
delete node.id;
node.id = null;
if (t.isFunctionDeclaration(node)) {
var declar = t.variableDeclaration("let", [
@@ -33,6 +43,16 @@ module.exports = function (node, callId, scope) {
declar._blockHoist = true;
return declar;
} else {
if (id) {
var state = { id: id };
scope.traverse(node, referenceVisitor, state);
if (state.ref) {
scope.parent.push({ id: state.ref });
return t.assignmentExpression("=", state.ref, call);
}
}
return call;
}
};

View File

@@ -47,22 +47,23 @@ export default class ReplaceSupers {
/**
* Description
*
* @param {Object} opts
* @param {Boolean} [inClass]
*/
constructor(opts, inClass) {
constructor(opts: Object, inClass?: boolean = false) {
this.topLevelThisReference = opts.topLevelThisReference;
this.methodNode = opts.methodNode;
this.className = opts.className;
this.superName = opts.superName;
this.superRef = opts.superRef;
this.isStatic = opts.isStatic;
this.hasSuper = false;
this.inClass = inClass;
this.isLoose = opts.isLoose;
this.scope = opts.scope;
this.file = opts.file;
this.opts = opts;
}
getObjectRef() {
return this.opts.objectRef || this.opts.getObjectRef();
}
/**
@@ -72,22 +73,16 @@ export default class ReplaceSupers {
*
* _set(Object.getPrototypeOf(CLASS.prototype), "METHOD", "VALUE", this)
*
* @param {Node} property
* @param {Node} value
* @param {Boolean} isComputed
* @param {Node} thisExpression
*
* @returns {Node}
*/
setSuperProperty(property, value, isComputed, thisExpression) {
setSuperProperty(property: Object, value: Object, isComputed: boolean, thisExpression: Object): Object {
return t.callExpression(
this.file.addHelper("set"),
[
t.callExpression(
t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")),
[
this.isStatic ? this.className : t.memberExpression(this.className, t.identifier("prototype"))
this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype"))
]
),
isComputed ? property : t.literal(property.name),
@@ -104,21 +99,16 @@ export default class ReplaceSupers {
*
* _get(Object.getPrototypeOf(CLASS.prototype), "METHOD", this)
*
* @param {Node} property
* @param {Boolean} isComputed
* @param {Node} thisExpression
*
* @returns {Node}
*/
getSuperProperty(property, isComputed, thisExpression) {
getSuperProperty(property: Object, isComputed: boolean, thisExpression: Object): Object {
return t.callExpression(
this.file.addHelper("get"),
[
t.callExpression(
t.memberExpression(t.identifier("Object"), t.identifier("getPrototypeOf")),
[
this.isStatic ? this.className : t.memberExpression(this.className, t.identifier("prototype"))
this.isStatic ? this.getObjectRef() : t.memberExpression(this.getObjectRef(), t.identifier("prototype"))
]
),
isComputed ? property : t.literal(property.name),
@@ -137,12 +127,9 @@ export default class ReplaceSupers {
/**
* Description
*
* @param {Object} node
* @param {Boolean} topLevel
*/
traverseLevel(node, topLevel) {
traverseLevel(node: Object, topLevel: boolean) {
var state = { self: this, topLevel: topLevel };
this.scope.traverse(node, visitor, state);
}
@@ -165,29 +152,24 @@ export default class ReplaceSupers {
/**
* Description
*
* @param {Object} node
* @param {Object} id
* @param {Object} parent
* @returns {Object}
*/
getLooseSuperProperty(id, parent) {
getLooseSuperProperty(id: Object, parent: Object) {
var methodNode = this.methodNode;
var methodName = methodNode.key;
var superName = this.superName || t.identifier("Function");
var superRef = this.superRef || t.identifier("Function");
if (parent.property === id) {
return;
} else if (t.isCallExpression(parent, { callee: id })) {
// super(); -> ClassName.prototype.MethodName.call(this);
// super(); -> objectRef.prototype.MethodName.call(this);
parent.arguments.unshift(t.thisExpression());
if (methodName.name === "constructor") {
// constructor() { super(); }
return t.memberExpression(superName, t.identifier("call"));
return t.memberExpression(superRef, t.identifier("call"));
} else {
id = superName;
id = superRef;
// foo() { super(); }
if (!methodNode.static) {
@@ -198,22 +180,18 @@ export default class ReplaceSupers {
return t.memberExpression(id, t.identifier("call"));
}
} else if (t.isMemberExpression(parent) && !methodNode.static) {
// super.test -> ClassName.prototype.test
return t.memberExpression(superName, t.identifier("prototype"));
// super.test -> objectRef.prototype.test
return t.memberExpression(superRef, t.identifier("prototype"));
} else {
return superName;
return superRef;
}
}
/**
* Description
*
* @param {Function} getThisReference
* @param {Object} node
* @param {Object} parent
*/
looseHandle(getThisReference, node, parent) {
looseHandle(getThisReference: Function, node: Object, parent: Object) {
if (t.isIdentifier(node, { name: "super" })) {
this.hasSuper = true;
return this.getLooseSuperProperty(node, parent);
@@ -222,7 +200,7 @@ export default class ReplaceSupers {
if (!t.isMemberExpression(callee)) return;
if (callee.object.name !== "super") return;
// super.test(); -> ClassName.prototype.MethodName.call(this);
// super.test(); -> objectRef.prototype.MethodName.call(this);
this.hasSuper = true;
t.appendToMemberExpression(callee, t.identifier("call"));
node.arguments.unshift(getThisReference());
@@ -231,13 +209,9 @@ export default class ReplaceSupers {
/**
* Description
*
* @param {Function} getThisReference
* @param {Object} node
* @param {Object} parent
*/
specHandle(getThisReference, node, parent) {
specHandle(getThisReference: Function, node: Object, parent: Object) {
var methodNode = this.methodNode;
var property;
var computed;
@@ -251,7 +225,7 @@ export default class ReplaceSupers {
if (t.isCallExpression(node)) {
var callee = node.callee;
if (isSuper(callee, node)) {
// super(); -> _get(Object.getPrototypeOf(ClassName), "MethodName", this).call(this);
// super(); -> _get(Object.getPrototypeOf(objectRef), "MethodName", this).call(this);
property = methodNode.key;
computed = methodNode.computed;
args = node.arguments;
@@ -264,17 +238,17 @@ export default class ReplaceSupers {
throw this.file.errorWithNode(node, messages.get("classesIllegalSuperCall", methodName));
}
} else if (t.isMemberExpression(callee) && isSuper(callee.object, callee)) {
// super.test(); -> _get(Object.getPrototypeOf(ClassName.prototype), "test", this).call(this);
// super.test(); -> _get(Object.getPrototypeOf(objectRef.prototype), "test", this).call(this);
property = callee.property;
computed = callee.computed;
args = node.arguments;
}
} else if (t.isMemberExpression(node) && isSuper(node.object, node)) {
// super.name; -> _get(Object.getPrototypeOf(ClassName.prototype), "name", this);
// super.name; -> _get(Object.getPrototypeOf(objectRef.prototype), "name", this);
property = node.property;
computed = node.computed;
} else if (t.isAssignmentExpression(node) && isSuper(node.left.object, node.left) && methodNode.kind === "set") {
// super.name = "val"; -> _set(Object.getPrototypeOf(ClassName.prototype), "name", this);
// super.name = "val"; -> _set(Object.getPrototypeOf(objectRef.prototype), "name", this);
this.hasSuper = true;
return this.setSuperProperty(node.left.property, node.right, node.left.computed, getThisReference());
}

View File

@@ -7,7 +7,7 @@ export function has(node) {
export function wrap(node, callback) {
var useStrictNode;
if (exports.has(node)) {
if (has(node)) {
useStrictNode = node.body.shift();
}

View File

@@ -4,7 +4,7 @@ import object from "../helpers/object";
import File from "./file";
import each from "lodash/collection/each";
export default function transform(code, opts) {
export default function transform(code: code, opts?: Object) {
var file = new File(opts);
return file.parse(code);
}
@@ -18,16 +18,19 @@ transform.fromAst = function (ast, code, opts) {
return file.generate();
};
transform._ensureTransformerNames = function (type, rawKeys) {
transform._ensureTransformerNames = function (type: string, rawKeys: Array<string>) {
var keys = [];
for (var i = 0; i < rawKeys.length; i++) {
var key = rawKeys[i];
var deprecatedKey = transform.deprecatedTransformerMap[key];
if (deprecatedKey) {
var aliasKey = transform.aliasTransformerMap[key];
if (aliasKey) {
keys.push(aliasKey);
} else if (deprecatedKey) {
// deprecated key, remap it to the new one
console.error("The transformer " + key + " has been renamed to " + deprecatedKey);
console.error(`The transformer ${key} has been renamed to ${deprecatedKey}`);
rawKeys.push(deprecatedKey);
} else if (transform.transformers[key]) {
// valid key
@@ -37,7 +40,7 @@ transform._ensureTransformerNames = function (type, rawKeys) {
keys = keys.concat(transform.namespaces[key]);
} else {
// invalid key
throw new ReferenceError("Unknown transformer " + key + " specified in " + type);
throw new ReferenceError(`Unknown transformer ${key} specified in ${type}`);
}
}
@@ -49,6 +52,7 @@ transform.transformers = object();
transform.namespaces = object();
transform.deprecatedTransformerMap = require("./transformers/deprecated");
transform.aliasTransformerMap = require("./transformers/aliases");
transform.moduleFormatters = require("./modules");
import rawTransformers from "./transformers";

View File

@@ -42,8 +42,8 @@ var remapVisitor = {
};
var importsVisitor = {
enter(node, parent, scope, formatter) {
if (t.isImportDeclaration(node)) {
ImportDeclaration: {
enter(node, parent, scope, formatter) {
formatter.hasLocalImports = true;
extend(formatter.localImports, t.getBindingIdentifiers(node));
formatter.bumpImportOccurences(node);
@@ -52,9 +52,9 @@ var importsVisitor = {
};
var exportsVisitor = {
enter(node, parent, scope, formatter) {
var declar = node && node.declaration;
if (t.isExportDeclaration(node)) {
ExportDeclaration: {
enter(node, parent, scope, formatter) {
var declar = node.declaration;
formatter.hasLocalImports = true;
if (declar && t.isStatement(declar)) {

View File

@@ -1,4 +1,4 @@
module.exports = {
export default {
commonStrict: require("./common-strict"),
amdStrict: require("./amd-strict"),
umdStrict: require("./umd-strict"),

View File

@@ -142,9 +142,9 @@ export default class SystemFormatter extends AMDFormatter {
return t.arrayExpression(map(this.ids, function (uid, source) {
var state = {
hoistDeclarators: hoistDeclarators,
source: source,
nodes: [],
hoistDeclarators: hoistDeclarators
nodes: []
};
scope.traverse(block, runnerSettersVisitor, state);
@@ -161,11 +161,11 @@ export default class SystemFormatter extends AMDFormatter {
var block = t.blockStatement(program.body);
var runner = util.template("system", {
MODULE_NAME: moduleNameLiteral,
MODULE_DEPENDENCIES: t.arrayExpression(this.buildDependencyLiterals()),
EXPORT_IDENTIFIER: this.exportIdentifier,
SETTERS: this.buildRunnerSetters(block, hoistDeclarators),
EXECUTE: t.functionExpression(null, [], block)
EXPORT_IDENTIFIER: this.exportIdentifier,
MODULE_NAME: moduleNameLiteral,
SETTERS: this.buildRunnerSetters(block, hoistDeclarators),
EXECUTE: t.functionExpression(null, [], block)
}, true);
var handlerBody = runner.expression.arguments[2].body.body;

View File

@@ -0,0 +1,16 @@
(function() {
function defineProperties(target, props) {
for (var key in props) {
var prop = props[key];
prop.configurable = true;
if (prop.value) prop.writable = true;
}
Object.defineProperties(target, props);
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
})()

View File

@@ -1,4 +0,0 @@
(function (child, staticProps, instanceProps) {
if (staticProps) Object.defineProperties(child, staticProps);
if (instanceProps) Object.defineProperties(child.prototype, instanceProps);
})

View File

@@ -1,2 +1,2 @@
var helpers = exports.default = {};
exports.default = HELPER;
exports.__esModule = true;

View File

@@ -0,0 +1,11 @@
(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
});

View File

@@ -6,14 +6,14 @@ import includes from "lodash/collection/includes";
*/
export default class TransformerPass {
constructor(file, transformer) {
constructor(file: File, transformer: Transformer) {
this.transformer = transformer;
this.shouldRun = !transformer.check;
this.handlers = transformer.handlers;
this.file = file;
}
canRun() {
canRun(): boolean {
var transformer = this.transformer;
var opts = this.file.opts;
@@ -42,7 +42,7 @@ export default class TransformerPass {
return true;
}
checkNode(node) {
checkNode(node: Object): boolean {
var check = this.transformer.check;
if (check) {
return this.shouldRun = check(node);
@@ -56,7 +56,7 @@ export default class TransformerPass {
var file = this.file;
file.debug("Running transformer " + this.transformer.key);
file.debug(`Running transformer ${this.transformer.key}`);
file.scope.traverse(file.ast, this.handlers, file);
}

View File

@@ -12,7 +12,7 @@ import each from "lodash/collection/each";
*/
export default class Transformer {
constructor(transformerKey, transformer, opts) {
constructor(transformerKey: key, transformer: Object, opts: Object) {
transformer = assign({}, transformer);
var take = function (key) {
@@ -36,7 +36,7 @@ export default class Transformer {
this.key = transformerKey;
}
normalize(transformer) {
normalize(transformer: Object): Object {
if (isFunction(transformer)) {
transformer = { ast: transformer };
}
@@ -65,7 +65,7 @@ export default class Transformer {
return transformer;
}
buildPass(file) {
buildPass(file: File): TransformerPass {
return new TransformerPass(file, this);
}
}

View File

@@ -0,0 +1,3 @@
{
"useStrict": "strict"
}

View File

@@ -1,6 +1,7 @@
{
"selfContained": "runtime",
"unicode-regex": "regex.unicode",
"spec.typeofSymbol": "es6.symbols",
"minification.deadCodeElimination": "utility.deadCodeElimination",
"minification.removeConsoleCalls": "utility.removeConsole",

View File

@@ -23,6 +23,6 @@ export function ObjectExpression(node) {
return t.callExpression(
t.memberExpression(t.identifier("Object"), t.identifier("defineProperties")),
[node, defineMap.build(mutatorMap)]
[node, defineMap.toDefineObject(mutatorMap)]
);
}

View File

@@ -2,7 +2,7 @@ import t from "../../../types";
var visitor = {
enter(node, parent, scope, state) {
if (!t.isReferencedIdentifier(node, parent)) return;
if (!this.isReferencedIdentifier()) return;
var declared = state.letRefs[node.name];
if (!declared) return;
@@ -32,12 +32,10 @@ export function BlockStatement(node, parent, scope, file) {
var letRefs = node._letReferences;
if (!letRefs) return;
var state = {
scope.traverse(node, visitor, {
letRefs: letRefs,
file: file
};
scope.traverse(node, visitor, state);
});
}
export { BlockStatement as Program, BlockStatement as Loop };

View File

@@ -75,7 +75,7 @@ export function Loop(node, parent, scope, file) {
export function BlockStatement(block, parent, scope, file) {
if (!t.isLoop(parent)) {
var blockScoping = new BlockScoping(false, block, parent, scope, file);
var blockScoping = new BlockScoping(null, block, parent, scope, file);
blockScoping.run();
}
}
@@ -109,7 +109,7 @@ function traverseReplace(node, parent, scope, remaps) {
var letReferenceBlockVisitor = {
enter(node, parent, scope, state) {
if (t.isFunction(node)) {
if (this.isFunction()) {
scope.traverse(node, letReferenceFunctionVisitor, state);
return this.skip();
}
@@ -119,7 +119,7 @@ var letReferenceBlockVisitor = {
var letReferenceFunctionVisitor = {
enter(node, parent, scope, state) {
// not a direct reference
if (!t.isReferencedIdentifier(node, parent)) return;
if (!this.isReferencedIdentifier()) return;
// this scope has a variable with the same name so it couldn't belong
// to our let scope
@@ -134,17 +134,17 @@ var letReferenceFunctionVisitor = {
var hoistVarDeclarationsVisitor = {
enter(node, parent, scope, self) {
if (t.isForStatement(node)) {
if (this.isForStatement()) {
if (isVar(node.init, node)) {
node.init = t.sequenceExpression(self.pushDeclar(node.init));
}
} else if (t.isFor(node)) {
} else if (this.isFor()) {
if (isVar(node.left, node)) {
node.left = node.left.declarations[0].id;
}
} else if (isVar(node, parent)) {
return self.pushDeclar(node).map(t.expressionStatement);
} else if (t.isFunction(node)) {
} else if (this.isFunction()) {
return this.skip();
}
}
@@ -152,7 +152,7 @@ var hoistVarDeclarationsVisitor = {
var loopLabelVisitor = {
enter(node, parent, scope, state) {
if (t.isLabeledStatement(node)) {
if (this.isLabeledStatement()) {
state.innerLabels.push(node.label.name);
}
}
@@ -170,13 +170,13 @@ var loopVisitor = {
enter(node, parent, scope, state) {
var replace;
if (t.isLoop(node)) {
if (this.isLoop()) {
state.ignoreLabeless = true;
scope.traverse(node, loopVisitor, state);
state.ignoreLabeless = false;
}
if (t.isFunction(node) || t.isLoop(node)) {
if (this.isFunction() || this.isLoop()) {
return this.skip();
}
@@ -189,7 +189,7 @@ var loopVisitor = {
return;
}
loopText = loopText + "|" + node.label.name;
loopText = `${loopText}|${node.label.name}`;
} else {
// we shouldn't be transforming these statements because
// they don't refer to the actual loop we're scopifying
@@ -204,7 +204,7 @@ var loopVisitor = {
replace = t.literal(loopText);
}
if (t.isReturnStatement(node)) {
if (this.isReturnStatement()) {
state.hasReturn = true;
replace = t.objectExpression([
t.property("init", t.identifier("v"), node.argument || t.identifier("undefined"))
@@ -222,15 +222,9 @@ class BlockScoping {
/**
* Description
*
* @param {Boolean|Node} loopParent
* @param {Node} block
* @param {Node} parent
* @param {Scope} scope
* @param {File} file
*/
constructor(loopParent, block, parent, scope, file) {
constructor(loopParent?: Object, block: Object, parent: Object, scope: Scope, file: File) {
this.loopParent = loopParent;
this.parent = parent;
this.scope = scope;
@@ -466,12 +460,9 @@ class BlockScoping {
/**
* Turn a `VariableDeclaration` into an array of `AssignmentExpressions` with
* their declarations hoisted to before the closure wrapper.
*
* @param {Node} node VariableDeclaration
* @returns {Array}
*/
pushDeclar(node) {
pushDeclar(node: { type: "VariableDeclaration" }): Array<Object> {
this.body.push(t.variableDeclaration(node.kind, node.declarations.map(function (declar) {
return t.variableDeclarator(declar.id);
})));
@@ -491,12 +482,9 @@ class BlockScoping {
/**
* Push the closure to the body.
*
* @param {Node} ret Identifier
* @param {Node} call CallExpression
*/
build(ret, call) {
build(ret: { type: "Identifier" }, call: { type: "CallExpression" }) {
var has = this.has;
if (has.hasReturn || has.hasBreakContinue) {
this.buildHas(ret, call);
@@ -507,12 +495,9 @@ class BlockScoping {
/**
* Description
*
* @param {Node} ret Identifier
* @param {Node} call CallExpression
*/
buildHas(ret, call) {
buildHas(ret: { type: "Identifier" }, call: { type: "CallExpression" }) {
var body = this.body;
body.push(t.variableDeclaration("var", [

View File

@@ -3,57 +3,81 @@ import * as nameMethod from "../../helpers/name-method";
import * as defineMap from "../../helpers/define-map";
import * as messages from "../../../messages";
import * as util from "../../../util";
import traverse from "../../../traversal";
import t from "../../../types";
export var check = t.isClass;
export function ClassDeclaration(node, parent, scope, file) {
return new ClassTransformer(node, file, scope, true).run();
return t.variableDeclaration("let", [
t.variableDeclarator(node.id, t.toExpression(node))
]);
}
export function ClassExpression(node, parent, scope, file) {
if (!node.id) {
if (t.isProperty(parent) && parent.value === node && !parent.computed && t.isIdentifier(parent.key)) {
// var o = { foo: class {} };
node.id = parent.key;
}
return new ClassTransformer(node, parent, scope, file).run();
}
if (t.isVariableDeclarator(parent) && t.isIdentifier(parent.id)) {
// var foo = class {};
node.id = parent.id;
var verifyConstructorVisitor = traverse.explode({
MethodDefinition: {
enter() {
this.skip();
}
},
Property: {
enter(node) {
if (node.method) this.skip();
}
},
CallExpression: {
enter(node, parent, scope, state) {
if (t.isIdentifier(node.callee, { name: "super" })) {
state.hasBareSuper = true;
if (!state.hasSuper) {
throw state.file.errorWithNode(node, "super call is only allowed in derived constructor");
}
}
}
},
ThisExpression: {
enter(node, parent, scope, state) {
if (state.hasSuper && !state.hasBareSuper) {
throw state.file.errorWithNode(node, "'this' is not allowed before super()");
}
}
}
return new ClassTransformer(node, file, scope, false).run();
}
});
class ClassTransformer {
/**
* Description
*
* @param {Node} node
* @param {File} file
* @param {Scope} scope
* @param {Boolean} isStatement
*/
constructor(node, file, scope, isStatement) {
this.isStatement = isStatement;
this.scope = scope;
this.node = node;
this.file = file;
constructor(node: Object, parent: Object, scope: Scope, file: File) {
this.parent = parent;
this.scope = scope;
this.node = node;
this.file = file;
this.hasInstanceMutators = false;
this.hasStaticMutators = false;
this.instanceMutatorMap = {};
this.staticMutatorMap = {};
this.hasConstructor = false;
this.className = node.id || scope.generateUidIdentifier("class");
this.superName = node.superClass || t.identifier("Function");
this.hasSuper = !!node.superClass;
this.isLoose = file.isLoose("es6.classes");
this.hasConstructor = false;
this.className = node.id;
this.classRef = node.id || scope.generateUidIdentifier("class");
this.superName = node.superClass || t.identifier("Function");
this.hasSuper = !!node.superClass;
this.isLoose = file.isLoose("es6.classes");
}
/**
@@ -66,39 +90,35 @@ class ClassTransformer {
var superName = this.superName;
var className = this.className;
var classBody = this.node.body.body;
var classRef = this.classRef;
var file = this.file;
//
var body = this.body = [];
//
var constructorBody = t.blockStatement([
t.expressionStatement(t.callExpression(file.addHelper("class-call-check"), [
t.thisExpression(),
className
classRef
]))
]);
var constructor;
if (this.node.id) {
constructor = t.functionDeclaration(className, [], constructorBody);
if (this.className) {
constructor = t.functionDeclaration(this.className, [], constructorBody);
body.push(constructor);
} else {
var constructorName = null;
// when a class has no parent and there is only a constructor or no body
// then the constructor is not wrapped in a closure and needs to be named
var containsOnlyConstructor = classBody.length === 1 && classBody[0].key.name === "constructor";
if (!this.hasSuper && (classBody.length === 0 || containsOnlyConstructor)) {
constructorName = className;
}
constructor = t.functionExpression(constructorName, [], constructorBody);
body.push(t.variableDeclaration("var", [
t.variableDeclarator(className, constructor)
]));
constructor = t.functionExpression(null, [], constructorBody);
}
this.constructor = constructor;
//
var closureParams = [];
var closureArgs = [];
@@ -107,40 +127,40 @@ class ClassTransformer {
if (this.hasSuper) {
closureArgs.push(superName);
if (!t.isIdentifier(superName)) {
superName = this.scope.generateUidBasedOnNode(superName, this.file);
}
superName = this.scope.generateUidBasedOnNode(superName, this.file);
closureParams.push(superName);
this.superName = superName;
body.push(t.expressionStatement(t.callExpression(file.addHelper("inherits"), [className, superName])));
body.push(t.expressionStatement(t.callExpression(file.addHelper("inherits"), [classRef, superName])));
}
//
this.buildBody();
t.inheritsComments(body[0], this.node);
var init;
if (body.length === 1) {
// only a constructor so no need for a closure container
init = t.toExpression(constructor);
if (this.className) {
// named class with only a constructor
if (body.length === 1) return t.toExpression(body[0]);
} else {
body.push(t.returnStatement(className));
init = t.callExpression(
t.functionExpression(null, closureParams, t.blockStatement(body)),
closureArgs
);
// infer class name if this is a nameless class expression
constructor = nameMethod.bare(constructor, this.parent, this.scope);
body.unshift(t.variableDeclaration("var", [
t.variableDeclarator(classRef, constructor)
]));
t.inheritsComments(body[0], this.node);
}
if (this.isStatement) {
return t.variableDeclaration("let", [
t.variableDeclarator(className, init)
]);
} else {
return init;
}
//
body.push(t.returnStatement(classRef));
return t.callExpression(
t.functionExpression(null, closureParams, t.blockStatement(body)),
closureArgs
);
}
/**
@@ -157,18 +177,22 @@ class ClassTransformer {
for (var i = 0; i < classBody.length; i++) {
var node = classBody[i];
if (t.isMethodDefinition(node)) {
var isConstructor = (!node.computed && t.isIdentifier(node.key, { name: "constructor" })) || t.isLiteral(node.key, { value: "constructor" });
if (isConstructor) this.verifyConstructor(node);
var replaceSupers = new ReplaceSupers({
methodNode: node,
className: this.className,
superName: this.superName,
objectRef: this.classRef,
superRef: this.superName,
isStatic: node.static,
isLoose: this.isLoose,
scope: this.scope,
file: this.file
}, true);
replaceSupers.replace();
if ((!node.computed && t.isIdentifier(node.key, { name: "constructor" })) || t.isLiteral(node.key, { value: "constructor" })) {
if (isConstructor) {
this.pushConstructor(node);
} else {
this.pushMethod(node);
@@ -182,7 +206,7 @@ class ClassTransformer {
}
// we have no constructor, we have a super, and the super doesn't appear to be falsy
if (!this.hasConstructor && this.hasSuper && t.evaluateTruthy(superName) !== false) {
if (!this.hasConstructor && this.hasSuper && t.evaluateTruthy(superName, this.scope) !== false) {
var helperName = "class-super-constructor-call";
if (this.isLoose) helperName += "-loose";
constructor.body.body.push(util.template(helperName, {
@@ -195,32 +219,50 @@ class ClassTransformer {
var staticProps;
if (this.hasInstanceMutators) {
instanceProps = defineMap.build(this.instanceMutatorMap);
instanceProps = defineMap.toClassObject(this.instanceMutatorMap);
}
if (this.hasStaticMutators) {
staticProps = defineMap.build(this.staticMutatorMap);
staticProps = defineMap.toClassObject(this.staticMutatorMap);
}
if (instanceProps || staticProps) {
staticProps ||= t.literal(null);
instanceProps ||= t.literal(null);
var args = [className, staticProps];
if (instanceProps) args.push(instanceProps);
var args = [this.classRef, instanceProps];
if (staticProps) args.push(staticProps);
body.push(t.expressionStatement(
t.callExpression(this.file.addHelper("prototype-properties"), args)
t.callExpression(this.file.addHelper("create-class"), args)
));
}
}
/**
* Push a method to its respective mutatorMap.
*
* @param {Node} node MethodDefinition
* Description
*/
pushMethod(node) {
verifyConstructor(node: Object) {
return; // enable this for the next major
var state = {
hasBareSuper: false,
hasSuper: this.hasSuper,
file: this.file
};
traverse(node, verifyConstructorVisitor, this.scope, state);
if (!state.hasBareSuper && this.hasSuper) {
throw this.file.errorWithNode(node, "Derived constructor must call super()");
}
}
/**
* Push a method to its respective mutatorMap.
*/
pushMethod(node: { type: "MethodDefinition" }) {
var methodName = node.key;
var kind = node.kind;
@@ -231,9 +273,9 @@ class ClassTransformer {
if (this.isLoose) {
// use assignments instead of define properties for loose classes
var className = this.className;
if (!node.static) className = t.memberExpression(className, t.identifier("prototype"));
methodName = t.memberExpression(className, methodName, node.computed);
var classRef = this.classRef;
if (!node.static) classRef = t.memberExpression(classRef, t.identifier("prototype"));
methodName = t.memberExpression(classRef, methodName, node.computed);
var expr = t.expressionStatement(t.assignmentExpression("=", methodName, node.value));
t.inheritsComments(expr, node);
@@ -253,22 +295,19 @@ class ClassTransformer {
}
defineMap.push(mutatorMap, methodName, kind, node.computed, node);
defineMap.push(mutatorMap, methodName, "enumerable", node.computed, false);
}
/**
* Description
*
* @param {Node} node
*/
pushProperty(node) {
pushProperty(node: Object) {
if (!node.value) return;
var key;
if (node.static) {
key = t.memberExpression(this.className, node.key);
key = t.memberExpression(this.classRef, node.key);
this.body.push(
t.expressionStatement(t.assignmentExpression("=", key, node.value))
);
@@ -282,11 +321,9 @@ class ClassTransformer {
/**
* Replace the constructor body of our class.
*
* @param {Node} method MethodDefinition
*/
pushConstructor(method) {
pushConstructor(method: { type: "MethodDefinition" }) {
if (method.kind) {
throw this.file.errorWithNode(method, messages.get("classesIllegalConstructorKind"));
}
@@ -301,6 +338,8 @@ class ClassTransformer {
construct._ignoreUserWhitespace = true;
construct.params = fn.params;
construct.body.body = construct.body.body.concat(fn.body.body);
t.inherits(construct.body, fn.body);
construct.body.body = construct.body.body.concat(fn.body.body);
}
}

View File

@@ -7,8 +7,8 @@ export function check(node) {
var visitor = {
enter(node, parent, scope, state) {
if (t.isAssignmentExpression(node) || t.isUpdateExpression(node)) {
var ids = t.getBindingIdentifiers(node);
if (this.isAssignmentExpression() || this.isUpdateExpression()) {
var ids = this.getBindingIdentifiers();
for (var name in ids) {
var id = ids[name];
@@ -30,7 +30,7 @@ var visitor = {
throw state.file.errorWithNode(id, messages.get("readOnly", name));
}
} else if (t.isScope(node, parent)) {
} else if (this.isScope()) {
this.skip();
}
}

View File

@@ -56,12 +56,12 @@ export { ForOfStatement as ForInStatement };
exports.Function = function (node, parent, scope, file) {
var nodes = [];
var hasDestructuringTransformer = false;
var hasDestructuring = false;
node.params = node.params.map(function (pattern, i) {
if (!t.isPattern(pattern)) return pattern;
hasDestructuringTransformer = true;
hasDestructuring = true;
var ref = scope.generateUidIdentifier("ref");
var destructuring = new DestructuringTransformer({
@@ -69,15 +69,16 @@ exports.Function = function (node, parent, scope, file) {
nodes: nodes,
scope: scope,
file: file,
kind: "var",
kind: "let"
});
destructuring.init(pattern, ref);
return ref;
});
if (!hasDestructuringTransformer) return;
if (!hasDestructuring) return;
file.checkNode(nodes);
t.ensureBlock(node);
var block = node.body;
@@ -218,7 +219,7 @@ export function VariableDeclaration(node, parent, scope, file) {
}
return nodes;
};
}
var hasRest = function (pattern) {
for (var i = 0; i < pattern.elements.length; i++) {

View File

@@ -41,17 +41,20 @@ export function ForOfStatement(node, parent, scope, file) {
var breakVisitor = {
enter(node, parent, scope, state) {
if (t.isLoop(node)) {
if (this.isLoop()) {
state.ignoreLabeless = true;
scope.traverse(node, breakVisitor, state);
state.ignoreLabeless = false;
return this.skip();
}
if (t.isBreakStatement(node)) {
if (this.isBreakStatement()) {
if (!node.label && state.ignoreLabeless) return;
if (node.label && node.label.name !== state.label) return;
// break statements mean something different in this context
if (t.isSwitchCase(parent)) return;
var ret = t.expressionStatement(
t.callExpression(t.memberExpression(state.iteratorKey, t.identifier("return")), [])
);
@@ -103,7 +106,7 @@ var loose = function (node, parent, scope, file) {
iteratorKey: iteratorKey,
label: t.isLabeledStatement(parent) && parent.label.name,
wrapReturn: function (node) {
wrapReturn(node) {
return t.ifStatement(
t.logicalExpression(
"&&",
@@ -124,8 +127,6 @@ var loose = function (node, parent, scope, file) {
};
var spec = function (node, parent, scope, file) {
var left = node.left;
var declar;
@@ -173,7 +174,7 @@ var spec = function (node, parent, scope, file) {
iteratorKey: iteratorKey,
label: isLabeledParent && parent.label.name,
wrapReturn: function (node) {
wrapReturn(node) {
return t.ifStatement(t.memberExpression(iteratorKey, t.identifier("return")), node);
}
});

View File

@@ -5,7 +5,7 @@ export function check(node) {
return t.isIdentifier(node, { name: "super" });
}
export function Property(node, parent, scope, file) {
function Property(node, scope, getObjectRef, file) {
if (!node.method) return;
var value = node.value;
@@ -13,8 +13,8 @@ export function Property(node, parent, scope, file) {
var replaceSupers = new ReplaceSupers({
topLevelThisReference: thisExpr,
getObjectRef: getObjectRef,
methodNode: node,
className: thisExpr,
isStatic: true,
scope: scope,
file: file
@@ -30,3 +30,20 @@ export function Property(node, parent, scope, file) {
);
}
}
export function ObjectExpression(node, parent, scope, file) {
var objectRef;
var getObjectRef = () => objectRef ||= scope.generateUidIdentifier("obj");
for (var i = 0; i < node.properties.length; i++) {
Property(node.properties[i], scope, getObjectRef, file);
}
if (objectRef) {
scope.push({
id: objectRef
});
return t.assignmentExpression("=", objectRef, node);
}
}

View File

@@ -14,7 +14,7 @@ var hasDefaults = function (node) {
var iifeVisitor = {
enter(node, parent, scope, state) {
if (!t.isReferencedIdentifier(node, parent)) return;
if (!this.isReferencedIdentifier()) return;
if (!state.scope.hasOwnBinding(node.name)) return;
if (state.scope.bindingIdentifierEquals(node.name, node)) return;
@@ -61,7 +61,7 @@ exports.Function = function (node, parent, scope, file) {
scope.traverse(param, iifeVisitor, state);
}
if (file.transformers["es6.blockScopingTDZ"].canRun()) {
if (file.transformers["es6.blockScopingTDZ"].canRun() && t.isIdentifier(param)) {
pushDefNode(param, t.identifier("undefined"), i);
}

View File

@@ -7,13 +7,13 @@ export var check = t.isRestElement;
var memberExpressionOptimisationVisitor = {
enter(node, parent, scope, state) {
// check if this scope has a local binding that will shadow the rest parameter
if (t.isScope(node, parent) && !scope.bindingIdentifierEquals(state.name, state.outerBinding)) {
if (this.isScope() && !scope.bindingIdentifierEquals(state.name, state.outerBinding)) {
return this.skip();
}
// skip over functions as whatever `arguments` we reference inside will refer
// to the wrong function
if (t.isFunctionDeclaration(node) || t.isFunctionExpression(node)) {
if (this.isFunctionDeclaration() || this.isFunctionExpression()) {
state.noOptimise = true;
scope.traverse(node, memberExpressionOptimisationVisitor, state);
state.noOptimise = false;
@@ -21,7 +21,7 @@ var memberExpressionOptimisationVisitor = {
}
// is this a referenced identifier and is it referencing the rest parameter?
if (!t.isReferencedIdentifier(node, parent, { name: state.name })) return;
if (!this.isReferencedIdentifier({ name: state.name })) return;
if (!state.noOptimise && t.isMemberExpression(parent) && parent.computed) {
// if we know that this member expression is referencing a number then we can safely
@@ -55,7 +55,7 @@ var hasRest = function (node) {
return t.isRestElement(node.params[node.params.length - 1]);
};
exports.Function = function (node, parent, scope) {
exports.Function = function (node, parent, scope, file) {
if (!hasRest(node)) return;
var rest = node.params.pop().argument;
@@ -69,10 +69,12 @@ exports.Function = function (node, parent, scope) {
if (t.isPattern(rest)) {
var pattern = rest;
rest = scope.generateUidIdentifier("ref");
var declar = t.variableDeclaration("var", pattern.elements.map(function (elem, index) {
var declar = t.variableDeclaration("let", pattern.elements.map(function (elem, index) {
var accessExpr = t.memberExpression(rest, t.literal(index), true);
return t.variableDeclarator(elem, accessExpr);
}));
file.checkNode(declar);
node.body.body.unshift(declar);
}

View File

@@ -1,4 +1,3 @@
import clone from "lodash/lang/clone";
import t from "../../../types";
export function check(node) {
@@ -12,6 +11,6 @@ export function Property(node) {
if (node.shorthand) {
node.shorthand = false;
node.key = t.removeComments(clone(node.key));
node.key = t.removeComments(t.clone(node.key));
}
}

View File

@@ -17,7 +17,7 @@ function returnBlock(expr) {
// looks for and replaces tail recursion calls
var firstPass = {
enter(node, parent, scope, state) {
if (t.isIfStatement(node)) {
if (this.isIfStatement()) {
if (t.isReturnStatement(node.alternate)) {
t.ensureBlock(node, "alternate");
}
@@ -25,7 +25,7 @@ var firstPass = {
if (t.isReturnStatement(node.consequent)) {
t.ensureBlock(node, "consequent");
}
} else if (t.isReturnStatement(node)) {
} else if (this.isReturnStatement()) {
this.skip();
return state.subTransform(node.argument);
} else if (t.isTryStatement(parent)) {
@@ -34,9 +34,9 @@ var firstPass = {
} else if (parent.finalizer && node !== parent.finalizer) {
this.skip();
}
} else if (t.isFunction(node)) {
} else if (this.isFunction()) {
this.skip();
} else if (t.isVariableDeclaration(node)) {
} else if (this.isVariableDeclaration()) {
this.skip();
state.vars.push(node);
}
@@ -47,15 +47,15 @@ var firstPass = {
// them as needed
var secondPass = {
enter(node, parent, scope, state) {
if (t.isThisExpression(node)) {
if (this.isThisExpression()) {
state.needsThis = true;
return state.getThisId();
} else if (t.isReferencedIdentifier(node, parent, { name: "arguments" })) {
} else if (this.isReferencedIdentifier({ name: "arguments" })) {
state.needsArguments = true;
return state.getArgumentsId();
} else if (t.isFunction(node)) {
} else if (this.isFunction()) {
this.skip();
if (t.isFunctionDeclaration(node)) {
if (this.isFunctionDeclaration()) {
node = t.variableDeclaration("var", [
t.variableDeclarator(node.id, t.toExpression(node))
]);
@@ -69,7 +69,7 @@ var secondPass = {
// optimizes recursion by removing `this` and `arguments` if they aren't used
var thirdPass = {
enter(node, parent, scope, state) {
if (!t.isExpressionStatement(node)) return;
if (!this.isExpressionStatement()) return;
var expr = node.expression;
if (!t.isAssignmentExpression(expr)) return;
@@ -229,7 +229,7 @@ class TailCallTransformer {
subTransform(node) {
if (!node) return;
var handler = this["subTransform" + node.type];
var handler = this[`subTransform${node.type}`];
if (handler) return handler.call(this, node);
}

View File

@@ -1,9 +1,9 @@
export default {
useStrict: require("./other/use-strict"),
strict: require("./other/strict"),
_validation: require("./internal/validation"),
"validation.undeclaredVariableCheck": require("./validation/undeclared-variable-check"),
"validation.noForInOfAssignment": require("./validation/no-for-in-of-assignment"),
"validation.setters": require("./validation/setters"),
"validation.react": require("./validation/react"),
// this goes at the start so we only transform the original user code
@@ -94,10 +94,10 @@ export default {
_aliasFunctions: require("./internal/alias-functions"),
"spec.typeofSymbol": require("./spec/typeof-symbol"),
"es6.symbols": require("./es6/symbols"),
"spec.undefinedToVoid": require("./spec/undefined-to-void"),
_useStrict: require("./internal/use-strict"),
_strict: require("./internal/strict"),
_moduleFormatter: require("./internal/module-formatter"),
"es3.propertyLiterals": require("./es3/property-literals"),

View File

@@ -2,7 +2,7 @@ import t from "../../../types";
var functionChildrenVisitor = {
enter(node, parent, scope, state) {
if (t.isFunction(node) && !node._aliasFunction) {
if (this.isFunction() && !node._aliasFunction) {
return this.skip();
}
@@ -10,22 +10,22 @@ var functionChildrenVisitor = {
var getId;
if (t.isIdentifier(node) && node.name === "arguments") {
if (this.isIdentifier() && node.name === "arguments") {
getId = state.getArgumentsId;
} else if (t.isThisExpression(node)) {
} else if (this.isThisExpression()) {
getId = state.getThisId;
} else {
return;
}
if (t.isReferenced(node, parent)) return getId();
if (this.isReferenced()) return getId();
}
};
var functionVisitor = {
enter(node, parent, scope, state) {
if (!node._aliasFunction) {
if (t.isFunction(node)) {
if (this.isFunction()) {
// stop traversal of this node as it'll be hit again by this transformer
return this.skip();
} else {

View File

@@ -13,3 +13,18 @@ export var ExpressionStatement = {
if (!node.expression) this.remove();
}
};
export var Binary = {
exit(node) {
var right = node.right;
var left = node.left;
if (!left && !right) {
this.remove();
} else if (!left) {
return right;
} else if (!right) {
return left;
}
}
};

View File

@@ -1,4 +1,4 @@
import * as useStrict from "../../helpers/use-strict";
import * as strict from "../../helpers/strict";
import t from "../../../types";
export var secondPass = true;
@@ -6,7 +6,7 @@ export var secondPass = true;
export function BlockStatement(node, parent, scope, file) {
if (!node._declarations) return;
useStrict.wrap(node, function () {
strict.wrap(node, function () {
var kinds = {};
var kind;

View File

@@ -1,12 +1,12 @@
import * as useStrict from "../../helpers/use-strict";
import * as strict from "../../helpers/strict";
export function Program(program, parent, scope, file) {
if (!file.transformers["es6.modules"].canRun()) return;
useStrict.wrap(program, function () {
strict.wrap(program, function () {
program.body = file.dynamicImports.concat(program.body);
});
if (!file.transformers["es6.modules"].canRun()) return;
if (file.moduleFormatter.transform) {
file.moduleFormatter.transform(program);
}

View File

@@ -13,7 +13,7 @@ export function check(node) {
export function ImportDeclaration(node, parent, scope, file) {
var resolveModuleSource = file.opts.resolveModuleSource;
if (node.source && resolveModuleSource) {
node.source.value = resolveModuleSource(node.source.value);
node.source.value = resolveModuleSource(node.source.value, file.opts.filename);
}
}
@@ -32,9 +32,11 @@ export function ExportDeclaration(node, parent, scope) {
if (node.default) {
if (t.isClassDeclaration(declar)) {
// export default class Foo {};
this.node = [getDeclar(), node];
node.declaration = declar.id;
return [getDeclar(), node];
} else if (t.isClassExpression(declar)) {
// export default class {};
var temp = scope.generateUidIdentifier("default");
declar = t.variableDeclaration("var", [
t.variableDeclarator(temp, declar)
@@ -42,16 +44,27 @@ export function ExportDeclaration(node, parent, scope) {
node.declaration = temp;
return [getDeclar(), node];
} else if (t.isFunctionDeclaration(declar)) {
// export default function Foo() {}
node._blockHoist = 2;
node.declaration = declar.id;
return [getDeclar(), node];
}
} else {
if (t.isFunctionDeclaration(declar)) {
// export function Foo() {}
node.specifiers = [t.importSpecifier(declar.id, declar.id)];
node.declaration = null;
node._blockHoist = 2;
return [getDeclar(), node];
} else if (t.isVariableDeclaration(declar)) {
// export var foo = "bar";
var specifiers = [];
var bindings = t.getBindingIdentifiers(declar);
for (var key in bindings) {
var id = bindings[key];
specifiers.push(t.exportSpecifier(id, id));
}
return [declar, t.exportDeclaration(null, specifiers)];
}
}
}

View File

@@ -1,7 +1,7 @@
import t from "../../../types";
export function Program(program, parent, scope, file) {
if (file.transformers.useStrict.canRun()) {
if (file.transformers.strict.canRun()) {
program.body.unshift(t.expressionStatement(t.literal("use strict")));
}
}

View File

@@ -0,0 +1,40 @@
import * as messages from "../../../messages";
import t from "../../../types";
export function ForOfStatement(node, parent, scope, file) {
var left = node.left;
if (t.isVariableDeclaration(left)) {
var declar = left.declarations[0];
if (declar.init) throw file.errorWithNode(declar, messages.get("noAssignmentsInForHead"));
}
}
export { ForOfStatement as ForInStatement };
export function Property(node, parent, scope, file) {
if (node.kind === "set") {
if (node.value.params.length !== 1) {
throw file.errorWithNode(node.value, messages.get("settersInvalidParamLength"));
}
var first = node.value.params[0];
if (t.isRestElement(first)) {
throw file.errorWithNode(first, messages.get("settersNoRest"));
}
}
}
export { Property as MethodDefinition };
export function BlockStatement(node) {
for (var i = 0; i < node.body.length; i++) {
var bodyNode = node.body[i];
if (t.isExpressionStatement(bodyNode) && t.isLiteral(bodyNode.expression)) {
bodyNode._blockHoist = Infinity;
} else {
return;
}
}
}
export { BlockStatement as Program };

View File

@@ -13,12 +13,12 @@ export function Class(node) {
node.implements = null;
}
export function Function(node) {
exports.Function = function (node) {
for (var i = 0; i < node.params.length; i++) {
var param = node.params[i];
param.optional = false;
}
}
};
export function TypeCastExpression(node) {
return node.expression;

View File

@@ -23,7 +23,7 @@ var astVisitor = {
enter(node, parent, scope, file) {
var prop;
if (t.isMemberExpression(node) && t.isReferenced(node, parent)) {
if (this.isMemberExpression() && this.isReferenced()) {
// Array.from -> _core.Array.from
var obj = node.object;
prop = node.property;
@@ -34,10 +34,10 @@ var astVisitor = {
this.skip();
return t.prependToMemberExpression(node, file.get("coreIdentifier"));
}
} else if (t.isReferencedIdentifier(node, parent) && !t.isMemberExpression(parent) && includes(ALIASABLE_CONSTRUCTORS, node.name) && !scope.getBindingIdentifier(node.name)) {
} else if (this.isReferencedIdentifier() && !t.isMemberExpression(parent) && includes(ALIASABLE_CONSTRUCTORS, node.name) && !scope.getBindingIdentifier(node.name)) {
// Symbol() -> _core.Symbol(); new Promise -> new _core.Promise
return t.memberExpression(file.get("coreIdentifier"), node);
} else if (t.isCallExpression(node)) {
} else if (this.isCallExpression()) {
// arr[Symbol.iterator]() -> _core.$for.getIterator(arr)
var callee = node.callee;
@@ -53,7 +53,7 @@ var astVisitor = {
CORE_ID: file.get("coreIdentifier"),
VALUE: callee.object
});
} else if (t.isBinaryExpression(node)) {
} else if (this.isBinaryExpression()) {
// Symbol.iterator in arr -> core.$for.isIterable(arr)
if (node.operator !== "in") return;
@@ -80,8 +80,8 @@ export function Program(node, parent, scope, file) {
}
export function pre(file) {
file.setDynamic("helpersNamespace", function () {
return file.addImport("babel-runtime/helpers", "babelHelpers");
file.set("helperGenerator", function (name) {
return file.addImport("babel-runtime/helpers/" + name, name);
});
file.setDynamic("coreIdentifier", function () {
@@ -94,7 +94,7 @@ export function pre(file) {
}
export function Identifier(node, parent, scope, file) {
if (t.isReferencedIdentifier(node, parent, { name: "regeneratorRuntime" })) {
if (this.isReferencedIdentifier({ name: "regeneratorRuntime" })) {
return file.get("regeneratorIdentifier");
}
}

View File

@@ -6,8 +6,7 @@ export var playground = true;
build(exports, {
is(node, file) {
var is = t.isAssignmentExpression(node) && node.operator === "||=";
if (is) {
if (t.isAssignmentExpression(node, { operator: "||=" })) {
var left = node.left;
if (!t.isMemberExpression(left) && !t.isIdentifier(left)) {
throw file.errorWithNode(left, messages.get("expectedMemberExpressionOrIdentifier"));

View File

@@ -5,7 +5,7 @@ export var playground = true;
build(exports, {
is(node) {
var is = t.isAssignmentExpression(node) && node.operator === "?=";
var is = t.isAssignmentExpression(node, { operator: "?=" });
if (is) t.assertMemberExpression(node.left);
return is;
},

View File

@@ -4,9 +4,9 @@ export var playground = true;
var visitor = {
enter(node, parent, scope, state) {
if (t.isFunction(node)) return this.skip();
if (this.isFunction()) return this.skip();
if (t.isReturnStatement(node) && node.argument) {
if (this.isReturnStatement() && node.argument) {
node.argument = t.memberExpression(t.callExpression(state.file.addHelper("define-property"), [
t.thisExpression(),
state.key,

View File

@@ -3,7 +3,7 @@ import t from "../../../types";
export var optional = true;
export function Identifier(node, parent) {
if (node.name === "undefined" && t.isReferenced(node, parent)) {
if (node.name === "undefined" && this.isReferenced()) {
return t.unaryExpression("void", t.literal(0), true);
}
}

View File

@@ -19,8 +19,8 @@ function toStatements(node) {
export var optional = true;
export function ConditionalExpression(node) {
var evaluateTest = t.evaluateTruthy(node.test);
export function ConditionalExpression(node, parent, scope) {
var evaluateTest = t.evaluateTruthy(node.test, scope);
if (evaluateTest === true) {
return node.consequent;
} else if (evaluateTest === false) {
@@ -29,12 +29,12 @@ export function ConditionalExpression(node) {
}
export var IfStatement = {
exit(node) {
exit(node, parent, scope) {
var consequent = node.consequent;
var alternate = node.alternate;
var test = node.test;
var evaluateTest = t.evaluateTruthy(test);
var evaluateTest = t.evaluateTruthy(test, scope);
// we can check if a test will be truthy 100% and if so then we can inline
// the consequent and completely ignore the alternate
@@ -77,7 +77,7 @@ export var IfStatement = {
// if (foo) {} else { bar; } -> if (!foo) { bar; }
//
if (t.blockStatement(consequent) && !consequent.body.length && t.isBlockStatement(alternate) && alternate.body.length) {
if (t.isBlockStatement(consequent) && !consequent.body.length && t.isBlockStatement(alternate) && alternate.body.length) {
node.consequent = node.alternate;
node.alternate = null;
node.test = t.unaryExpression("!", test, true);

View File

@@ -2,7 +2,11 @@ import t from "../../../types";
export var optional = true;
export function Expression(node) {
var res = t.evaluate(node);
export function Expression(node, parent, scope) {
var res = t.evaluate(node, scope);
if (res.confident) return t.valueToNode(res.value);
}
export function Identifier() {
// override Expression
}

View File

@@ -3,7 +3,7 @@ import t from "../../../types";
export var optional = true;
export function ExpressionStatement(node) {
if (t.isIdentifier(node.expression, { name: "debugger" })) {
if (this.get("expression").isIdentifier({ name: "debugger" })) {
this.remove();
}
}

View File

@@ -1,14 +0,0 @@
import * as messages from "../../../messages";
import t from "../../../types";
export { isFor as check } from "../../../types";
export function ForOfStatement(node, parent, scope, file) {
var left = node.left;
if (t.isVariableDeclaration(left)) {
var declar = left.declarations[0];
if (declar.init) throw file.errorWithNode(declar, messages.get("noAssignmentsInForHead"));
}
}
export { ForOfStatement as ForInStatement };

View File

@@ -2,7 +2,7 @@ import * as messages from "../../../messages";
import t from "../../../types";
// check if the input Literal `source` is an alternate casing of "react"
var check = function (source, file) {
function check(source, file) {
if (t.isLiteral(source)) {
var name = source.value;
var lower = name.toLowerCase();
@@ -11,7 +11,7 @@ var check = function (source, file) {
throw file.errorWithNode(source, messages.get("didYouMean", "react"));
}
}
};
}
export function CallExpression(node, parent, scope, file) {
if (t.isIdentifier(node.callee, { name: "require" }) && node.arguments.length === 1) {

View File

@@ -1,13 +0,0 @@
import * as messages from "../../../messages";
export function check(node) {
return node.kind === "set";
}
export function Property(node, parent, scope, file) {
if (node.kind === "set" && node.value.params.length !== 1) {
throw file.errorWithNode(node.value, messages.get("settersInvalidParamLength"));
}
}
export { Property as MethodDefinition };

View File

@@ -1,11 +1,10 @@
import levenshtein from "leven";
import * as messages from "../../../messages";
import t from "../../../types";
export var optional = true;
export function Identifier(node, parent, scope, file) {
if (!t.isReferenced(node, parent)) return;
if (!this.isReferenced()) return;
if (scope.hasBinding(node.name)) return;
// get the closest declaration to offer as a suggestion

View File

@@ -1,15 +1,15 @@
import TraversalPath from "./path";
import flatten from "lodash/array/flatten";
import compact from "lodash/array/compact";
import t from "../types";
export default class TraversalConext {
export default class TraversalContext {
constructor(scope, opts, state, parentPath) {
this.shouldFlatten = false;
this.parentPath = parentPath;
this.scope = scope;
this.state = state;
this.opts = opts;
this.scope = scope;
this.state = state;
this.opts = opts;
}
flatten() {
@@ -17,7 +17,7 @@ export default class TraversalConext {
}
visitNode(node, obj, key) {
var iteration = new TraversalPath(this, node, obj, key);
var iteration = TraversalPath.get(this.parentPath, this, node, obj, key);
return iteration.visit();
}
@@ -43,7 +43,7 @@ export default class TraversalConext {
if (this.shouldFlatten) {
node[key] = flatten(node[key]);
if (key === "body" || key === "expressions") {
if (t.FLATTENABLE_KEYS.indexOf(key) >= 0) {
// we can safely compact this
node[key] = compact(node[key]);
}

View File

@@ -9,7 +9,7 @@ function traverse(parent, opts, scope, state) {
if (!opts.noScope && !scope) {
if (parent.type !== "Program" && parent.type !== "File") {
throw new Error("Must pass a scope unless traversing a Program/File got a " + parent.type + " node");
throw new Error(`Must pass a scope unless traversing a Program/File got a ${parent.type} node`);
}
}
@@ -42,13 +42,14 @@ traverse.node = function (node, opts, scope, state, parentPath) {
function clearNode(node) {
node._declarations = null;
node.extendedRange = null;
node._scopeInfo = null;
node.tokens = null;
node.range = null;
node.start = null;
node.end = null;
node.loc = null;
node.raw = null;
node._scopeInfo = null;
node._paths = null;
node.tokens = null;
node.range = null;
node.start = null;
node.end = null;
node.loc = null;
node.raw = null;
if (Array.isArray(node.trailingComments)) {
clearComments(node.trailingComments);
@@ -57,11 +58,18 @@ function clearNode(node) {
if (Array.isArray(node.leadingComments)) {
clearComments(node.leadingComments);
}
for (var key in node) {
var val = node[key];
if (Array.isArray(val)) {
delete val._paths;
}
}
}
var clearVisitor = {
noScope: true,
enter: clearNode
exit: clearNode
};
function clearComments(comments) {
@@ -71,8 +79,8 @@ function clearComments(comments) {
}
traverse.removeProperties = function (tree) {
clearNode(tree);
traverse(tree, clearVisitor);
clearNode(tree);
return tree;
};

View File

@@ -4,23 +4,33 @@ import Scope from "./scope";
import t from "../types";
export default class TraversalPath {
constructor(context, parent, container, key) {
this.shouldRemove = false;
this.shouldSkip = false;
this.shouldStop = false;
this.parentPath = context.parentPath;
this.context = context;
this.state = this.context.state;
this.opts = this.context.opts;
constructor(parent, container) {
this.container = container;
this.key = key;
this.parent = parent;
this.data = {};
}
this.parent = parent;
this.state = context.state;
static get(parentPath, context, parent, container, key) {
var targetNode = container[key];
var paths = container._paths ||= [];
var path;
this.setScope();
for (var i = 0; i < paths.length; i++) {
var pathCheck = paths[i];
if (pathCheck.node === targetNode) {
path = pathCheck;
break;
}
}
if (!path) {
path = new TraversalPath(parent, container);
paths.push(path);
}
path.setContext(parentPath, context, key);
return path;
}
static getScope(node, parent, scope) {
@@ -34,13 +44,35 @@ export default class TraversalPath {
return ourScope;
}
setData(key, val) {
return this.data[key] = val;
}
getData(key) {
return this.data[key];
}
setScope() {
this.scope = TraversalPath.getScope(this.node, this.parent, this.context.scope);
}
setContext(parentPath, context, key) {
this.shouldSkip = false;
this.shouldStop = false;
this.parentPath = parentPath || this.parentPath;
this.context = context;
this.state = context.state;
this.opts = context.opts;
this.key = key;
this.setScope();
}
remove() {
this.shouldRemove = true;
this.shouldSkip = true;
this._refresh(this.node, []);
this.container[this.key] = null;
this.flatten();
}
skip() {
@@ -56,30 +88,43 @@ export default class TraversalPath {
this.context.flatten();
}
_refresh(oldNode, newNodes) {
// todo
}
refresh() {
var node = this.node;
this._refresh(node, [node]);
}
get node() {
return this.container[this.key];
}
set node(replacement) {
var isArray = Array.isArray(replacement);
if (!replacement) return this.remove();
var oldNode = this.node;
var isArray = Array.isArray(replacement);
var replacements = isArray ? replacement : [replacement];
// inherit comments from original node to the first replacement node
var inheritTo = replacement;
if (isArray) inheritTo = replacement[0];
if (inheritTo) t.inheritsComments(inheritTo, this.node);
var inheritTo = replacements[0];
if (inheritTo) t.inheritsComments(inheritTo, oldNode);
// replace the node
this.container[this.key] = replacement;
// potentially create new scope
this.setScope();
// refresh scope with new/removed bindings
this._refresh(oldNode, replacements);
var file = this.scope && this.scope.file;
if (file) {
if (isArray) {
for (var i = 0; i < replacement.length; i++) {
file.checkNode(replacement[i], this.scope);
}
} else {
file.checkNode(replacement, this.scope);
for (var i = 0; i < replacements.length; i++) {
file.checkNode(replacements[i], this.scope);
}
}
@@ -91,6 +136,7 @@ export default class TraversalPath {
}
this.flatten();
// TODO: duplicate internal path metadata across the new node paths
}
}
@@ -107,21 +153,15 @@ export default class TraversalPath {
if (replacement) {
this.node = replacement;
}
}
if (this.shouldRemove) {
this.container[this.key] = null;
this.flatten();
}
isBlacklisted() {
var blacklist = this.opts.blacklist;
return blacklist && blacklist.indexOf(this.node.type) > -1;
}
visit() {
var opts = this.opts;
var node = this.node;
// type is blacklisted
if (opts.blacklist && opts.blacklist.indexOf(node.type) > -1) {
return false;
}
if (this.isBlacklisted()) return false;
this.call("enter");
@@ -129,23 +169,50 @@ export default class TraversalPath {
return this.shouldStop;
}
node = this.node;
var node = this.node;
var opts = this.opts;
if (Array.isArray(node)) {
// traverse over these replacement nodes we purposely don't call exitNode
// as the original node has been destroyed
for (var i = 0; i < node.length; i++) {
traverse.node(node[i], opts, this.scope, this.state, this);
if (node) {
if (Array.isArray(node)) {
// traverse over these replacement nodes we purposely don't call exitNode
// as the original node has been destroyed
for (var i = 0; i < node.length; i++) {
traverse.node(node[i], opts, this.scope, this.state, this);
}
} else {
traverse.node(node, opts, this.scope, this.state, this);
this.call("exit");
}
} else {
traverse.node(node, opts, this.scope, this.state, this);
this.call("exit");
}
return this.shouldStop;
}
isReferencedIdentifier() {
return t.isReferencedIdentifier(this.node);
get(key) {
return TraversalPath.get(this, this.context, this.node, this.node, key);
}
isReferencedIdentifier(opts) {
return t.isReferencedIdentifier(this.node, this.parent, opts);
}
isReferenced() {
return t.isReferenced(this.node, this.parent);
}
isScope() {
return t.isScope(this.node, this.parent);
}
getBindingIdentifiers() {
return t.getBindingIdentifiers(this.node);
}
}
for (var i = 0; i < t.TYPES.length; i++) {
let type = t.TYPES[i];
let typeKey = `is${type}`;
TraversalPath.prototype[typeKey] = function (opts) {
return t[typeKey](this.node, opts);
};
}

View File

@@ -9,7 +9,6 @@ import object from "../helpers/object";
import each from "lodash/collection/each";
import t from "../types";
var functionVariableVisitor = {
enter(node, parent, scope, state) {
if (t.isFor(node)) {
@@ -64,14 +63,9 @@ export default class Scope {
/**
* This searches the current "scope" and collects all references/bindings
* within.
*
* @param {Node} block
* @param {Node} parentBlock
* @param {Scope} [parent]
* @param {File} [file]
*/
constructor(block, parentBlock, parent, file) {
constructor(block: Object, parentBlock: Object, parent?: Scope, file?: File) {
this.parent = parent;
this.file = parent ? parent.file : file;
@@ -82,27 +76,22 @@ export default class Scope {
}
static globals = flatten([globals.builtin, globals.browser, globals.node].map(Object.keys));
static contextVariables = ["this", "arguments", "super"];
/**
* Description
*
* @param {Object} node
* @param {Object} opts
* @param [state]
*/
traverse(node, opts, state) {
traverse(node: Object, opts: Object, state?) {
traverse(node, opts, this, state);
}
/**
* Description
*
* @param {String} [name="temp"]
*/
generateTemp(name) {
var id = this.generateUidIdentifier(name || "temp");
generateTemp(name: string = "temp") {
var id = this.generateUidIdentifier(name);
this.push({
key: id.name,
id: id
@@ -112,11 +101,9 @@ export default class Scope {
/**
* Description
*
* @param {String} name
*/
generateUidIdentifier(name) {
generateUidIdentifier(name: string) {
var id = t.identifier(this.generateUid(name));
this.getFunctionParent().registerBinding("uid", id);
return id;
@@ -124,11 +111,9 @@ export default class Scope {
/**
* Description
*
* @param {String} name
*/
generateUid(name) {
generateUid(name: string) {
name = t.toIdentifier(name).replace(/^_+/, "");
var uid;
@@ -143,17 +128,14 @@ export default class Scope {
_generateUid(name, i) {
var id = name;
if (i > 1) id += i;
return "_" + id;
return `_${id}`;
}
/*
* Description
*
* @param {Object} parent
* @returns {Object}
*/
generateUidBasedOnNode(parent) {
generateUidBasedOnNode(parent: Object): Object {
var node = parent;
if (t.isAssignmentExpression(parent)) {
@@ -189,12 +171,9 @@ export default class Scope {
/**
* Description
*
* @param {Object} node
* @returns {Object}
*/
generateTempBasedOnNode(node) {
generateTempBasedOnNode(node: Object): ?Object {
if (t.isIdentifier(node) && this.hasBinding(node.name)) {
return null;
}
@@ -207,7 +186,11 @@ export default class Scope {
return id;
}
checkBlockScopedCollisions(kind, name, id) {
/**
* Description
*/
checkBlockScopedCollisions(kind: string, name: string, id: Object) {
var local = this.getOwnBindingInfo(name);
if (!local) return;
@@ -219,7 +202,11 @@ export default class Scope {
}
}
rename(oldName, newName) {
/**
* Description
*/
rename(oldName: string, newName: string) {
newName ||= this.generateUidIdentifier(oldName).name;
var info = this.getBindingInfo(oldName);
@@ -245,13 +232,17 @@ export default class Scope {
}
});
this.clearOwnBinding(oldName);
scope.removeOwnBinding(oldName);
scope.bindings[newName] = info;
binding.name = newName;
}
inferType(node) {
/**
* Description
*/
inferType(node: Object) {
var target;
if (t.isVariableDeclarator(node)) {
@@ -283,7 +274,11 @@ export default class Scope {
}
}
isTypeGeneric(name, genericName) {
/**
* Description
*/
isTypeGeneric(name: string, genericName: string) {
var info = this.getBindingInfo(name);
if (!info) return false;
@@ -291,18 +286,30 @@ export default class Scope {
return t.isGenericTypeAnnotation(type) && t.isIdentifier(type.id, { name: genericName });
}
assignTypeGeneric(name, type) {
/**
* Description
*/
assignTypeGeneric(name: string, type: Object) {
this.assignType(name, t.genericTypeAnnotation(t.identifier(type)));
}
assignType(name, type) {
/**
* Description
*/
assignType(name: string, type: Object) {
var info = this.getBindingInfo(name);
if (!info) return;
info.typeAnnotation = type;
}
getTypeAnnotation(name, id, node) {
/**
* Description
*/
getTypeAnnotation(id: Object, node: Object): Object {
var info = {
annotation: null,
inferred: false
@@ -327,7 +334,11 @@ export default class Scope {
return info;
}
toArray(node, i) {
/**
* Description
*/
toArray(node: Object, i?: number) {
var file = this.file;
if (t.isIdentifier(node) && this.isTypeGeneric(node.name, "Array")) {
@@ -353,11 +364,25 @@ export default class Scope {
return t.callExpression(file.addHelper(helperName), args);
}
clearOwnBinding(name) {
delete this.bindings[name];
/**
* Description
*/
refreshDeclaration(node: Object) {
if (t.isBlockScoped(node)) {
this.getBlockParent().registerDeclaration(node);
} else if (t.isVariableDeclaration(node, { kind: "var" })) {
this.getFunctionParent().registerDeclaration(node);
} else if (node === this.block) {
this.recrawl();
}
}
registerDeclaration(node) {
/**
* Description
*/
registerDeclaration(node: Object) {
if (t.isFunctionDeclaration(node)) {
this.registerBinding("hoisted", node);
} else if (t.isVariableDeclaration(node)) {
@@ -373,7 +398,11 @@ export default class Scope {
}
}
registerBindingReassignment(node) {
/**
* Description
*/
registerBindingReassignment(node: Object) {
var ids = t.getBindingIdentifiers(node);
for (var name in ids) {
var info = this.getBindingInfo(name);
@@ -388,7 +417,11 @@ export default class Scope {
}
}
registerBinding(kind, node) {
/**
* Description
*/
registerBinding(kind: string, node: Object) {
if (!kind) throw new ReferenceError("no `kind`");
var ids = t.getBindingIdentifiers(node);
@@ -398,7 +431,7 @@ export default class Scope {
this.checkBlockScopedCollisions(kind, name, id);
var typeInfo = this.getTypeAnnotation(name, id, node);
var typeInfo = this.getTypeAnnotation(id, node);
this.bindings[name] = {
typeAnnotationInferred: typeInfo.inferred,
@@ -412,18 +445,19 @@ export default class Scope {
}
}
registerVariableDeclaration(declar) {
var declars = declar.declarations;
for (var i = 0; i < declars.length; i++) {
this.registerBinding(declars[i], declar.kind);
}
/**
* Description
*/
addGlobal(node: Object) {
this.globals[node.name] = node;
}
addGlobal(node) {
this.globals[node.name] = node;
};
/**
* Description
*/
hasGlobal(name) {
hasGlobal(name: string): boolean {
var scope = this;
do {
@@ -433,6 +467,19 @@ export default class Scope {
return false;
}
/**
* Description
*/
recrawl() {
this.block._scopeInfo = null;
this.crawl();
}
/**
* Description
*/
crawl() {
var block = this.block;
var i;
@@ -473,6 +520,12 @@ export default class Scope {
}
}
// Class
if (t.isClass(block) && block.id) {
this.registerBinding("var", block.id);
}
// Function - params, rest
if (t.isFunction(block)) {
@@ -518,11 +571,9 @@ export default class Scope {
/**
* Description
*
* @param {Object} opts
*/
push(opts) {
push(opts: Object) {
var block = this.block;
if (t.isLoop(block) || t.isCatchClause(block) || t.isFunction(block)) {
@@ -532,13 +583,13 @@ export default class Scope {
if (t.isBlockStatement(block) || t.isProgram(block)) {
block._declarations ||= {};
block._declarations[opts.key] = {
kind: opts.kind,
block._declarations[opts.key || opts.id.name] = {
kind: opts.kind || "var",
id: opts.id,
init: opts.init
};
} else {
throw new TypeError("cannot add a declaration here in node type " + block.type);
throw new TypeError(`cannot add a declaration here in node type ${block.type}`);
}
}
@@ -556,12 +607,23 @@ export default class Scope {
}
/**
* Walks the scope tree and gathers **all** bindings.
*
* @returns {Object}
* Walk up the scope tree until we hit either a BlockStatement/Loop or reach the
* very top and hit Program.
*/
getAllBindings() {
getBlockParent() {
var scope = this;
while (scope.parent && !t.isFunction(scope.block) && !t.isLoop(scope.block) && !t.isFunction(scope.block)) {
scope = scope.parent;
}
return scope;
}
/**
* Walks the scope tree and gathers **all** bindings.
*/
getAllBindings(): Object {
var ids = object();
var scope = this;
@@ -575,12 +637,9 @@ export default class Scope {
/**
* Walks the scope tree and gathers all declarations of `kind`.
*
* @param {String} kind
* @returns {Object}
*/
getAllBindingsOfKind(kind) {
getAllBindingsOfKind(kind: string): Object {
var ids = object();
var scope = this;
@@ -595,15 +654,19 @@ export default class Scope {
return ids;
}
// misc
/**
* Description
*/
bindingIdentifierEquals(name, node) {
bindingIdentifierEquals(name: string, node: Object): boolean {
return this.getBindingIdentifier(name) === node;
}
// get
/**
* Description
*/
getBindingInfo(name) {
getBindingInfo(name: string) {
var scope = this;
do {
@@ -612,35 +675,113 @@ export default class Scope {
} while (scope = scope.parent);
}
getOwnBindingInfo(name) {
/**
* Description
*/
getOwnBindingInfo(name: string) {
return this.bindings[name];
}
getBindingIdentifier(name) {
/**
* Description
*/
getBindingIdentifier(name: string) {
var info = this.getBindingInfo(name);
return info && info.identifier;
}
getOwnBindingIdentifier(name) {
/**
* Description
*/
getOwnBindingIdentifier(name: string) {
var binding = this.bindings[name];
return binding && binding.identifier;
}
// has
/**
* Description
*/
hasOwnBinding(name) {
getOwnImmutableBindingValue(name: string) {
return this._immutableBindingInfoToValue(this.getOwnBindingInfo(name));
}
/**
* Description
*/
getImmutableBindingValue(name: string) {
return this._immutableBindingInfoToValue(this.getBindingInfo(name));
}
_immutableBindingInfoToValue(info) {
if (!info) return;
// can't guarantee this value is the same
if (info.reassigned) return;
var node = info.node;
if (t.isVariableDeclarator(node)) {
if (t.isIdentifier(node.id)) {
node = node.init;
} else {
// otherwise it's probably a destructuring like:
// var { foo } = "foo";
return;
}
}
if (t.isImmutable(node)) {
return node;
}
}
/**
* Description
*/
hasOwnBinding(name: string) {
return !!this.getOwnBindingInfo(name);
}
hasBinding(name) {
/**
* Description
*/
hasBinding(name: string) {
if (!name) return false;
if (this.hasOwnBinding(name)) return true;
if (this.parentHasBinding(name)) return true;
if (includes(Scope.globals, name)) return true;
if (includes(Scope.contextVariables, name)) return true;
return false;
}
parentHasBinding(name) {
/**
* Description
*/
parentHasBinding(name: string) {
return this.parent && this.parent.hasBinding(name);
}
/**
* Description
*/
removeOwnBinding(name: string) {
this.bindings[name] = null;
}
/**
* Description
*/
removeBinding(name: string) {
var info = this.getBindingInfo(name);
if (info) info.scope.removeOwnBinding(name);
}
}

View File

@@ -25,7 +25,7 @@
"ImportSpecifier": ["ModuleSpecifier"],
"ExportSpecifier": ["ModuleSpecifier"],
"BlockStatement": ["Statement", "Scopable"],
"BlockStatement": ["Scopable", "Statement"],
"Program": ["Scopable"],
"CatchClause": ["Scopable"],
@@ -36,8 +36,8 @@
"SpreadProperty": ["UnaryLike"],
"SpreadElement": ["UnaryLike"],
"ClassDeclaration": ["Statement", "Declaration", "Class"],
"ClassExpression": ["Class", "Expression"],
"ClassDeclaration": ["Scopable", "Class", "Statement", "Declaration"],
"ClassExpression": ["Scopable", "Class", "Expression"],
"ForOfStatement": ["Scopable", "Statement", "For", "Loop"],
"ForInStatement": ["Scopable", "Statement", "For", "Loop"],

View File

@@ -1,4 +1,4 @@
import toFastProperties from "../helpers/to-fast-properties";
import toFastProperties from "to-fast-properties";
import isPlainObject from "lodash/lang/isPlainObject";
import isNumber from "lodash/lang/isNumber";
import isRegExp from "lodash/lang/isRegExp";
@@ -6,6 +6,7 @@ import isString from "lodash/lang/isString";
import compact from "lodash/array/compact";
import esutils from "esutils";
import object from "../helpers/object";
import clone from "lodash/lang/clone";
import each from "lodash/collection/each";
import uniq from "lodash/array/uniq";
@@ -15,26 +16,24 @@ export default t;
/**
* Registers `is[Type]` and `assert[Type]` generated functions for a given `type`.
* Pass `skipAliasCheck` to force it to directly compare `node.type` with `type`.
*
* @param {String} type
* @param {Boolean?} skipAliasCheck
*/
function registerType(type, skipAliasCheck) {
var is = t["is" + type] = function (node, opts) {
function registerType(type: string, skipAliasCheck?: boolean) {
var is = t[`is${type}`] = function (node, opts) {
return t.is(type, node, opts, skipAliasCheck);
};
t["assert" + type] = function (node, opts) {
t[`assert${type}`] = function (node, opts) {
opts ||= {};
if (!is(node, opts)) {
throw new Error("Expected type " + JSON.stringify(type) + " with option " + JSON.stringify(opts));
throw new Error(`Expected type ${JSON.stringify(type)} with option ${JSON.stringify(opts)}`);
}
};
}
t.STATEMENT_OR_BLOCK_KEYS = ["consequent", "body"];
t.STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"];
t.NATIVE_TYPE_NAMES = ["Array", "Object", "Number", "Boolean", "Date", "Array", "String"];
t.FLATTENABLE_KEYS = ["body", "expressions"];
t.FOR_INIT_KEYS = ["left", "init"];
t.VISITOR_KEYS = require("./visitor-keys");
@@ -48,7 +47,7 @@ each(t.VISITOR_KEYS, function (keys, type) {
each(t.ALIAS_KEYS, function (aliases, type) {
each(aliases, function (alias) {
var types = t.FLIPPED_ALIAS_KEYS[alias] = t.FLIPPED_ALIAS_KEYS[alias] || [];
var types = t.FLIPPED_ALIAS_KEYS[alias] ||= [];
types.push(type);
});
});
@@ -58,20 +57,16 @@ each(t.FLIPPED_ALIAS_KEYS, function (types, type) {
registerType(type, false);
});
t.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`.
*
* @param {String} type
* @param {Node} node
* @param {Object?} opts
* @param {Boolean?} skipAliasCheck
* @returns {Boolean} isOfType
*/
t.is = function (type, node, opts, skipAliasCheck) {
t.is = function (type: string, node: Object, opts?: Object, skipAliasCheck?: boolean): boolean {
if (!node) return false;
var typeMatches = type === node.type;
@@ -129,34 +124,15 @@ each(t.BUILDER_KEYS, function (keys, type) {
/**
* Description
*
* @param {Object} node
* @returns {Object}
*/
t.toComputedKey = function (node, key) {
t.toComputedKey = function (node: Object, key: Object): Object {
if (!node.computed) {
if (t.isIdentifier(key)) key = t.literal(key.name);
}
return key;
};
/*
* Shallowly checks to see if the passed `node` is falsy.
*
* @param {Object} node
* @returns {Boolean}
*/
t.isFalsyExpression = function (node) {
if (t.isLiteral(node)) {
return !node.value;
} else if (t.isIdentifier(node)) {
return node.name === "undefined";
}
return false;
};
/**
* Turn an array of statement `nodes` into a `SequenceExpression`.
*
@@ -164,12 +140,9 @@ t.isFalsyExpression = function (node) {
* declarations hoisted to the top of the current scope.
*
* Expression statements are just resolved to their standard expression.
*
* @param {Array} nodes
* @param {Scope} scope
*/
t.toSequenceExpression = function (nodes, scope) {
t.toSequenceExpression = function (nodes: Array<Object>, scope: Scope): Object {
var exprs = [];
each(nodes, function (node) {
@@ -198,13 +171,9 @@ t.toSequenceExpression = function (nodes, scope) {
/*
* Description
*
* @param {Object} actual
* @param {Object} expected
* @returns {Boolean}
*/
t.shallowEqual = function (actual, expected) {
t.shallowEqual = function (actual: Object, expected: Object): boolean {
var keys = Object.keys(expected);
for (var i = 0; i < keys.length; i++) {
@@ -220,14 +189,9 @@ t.shallowEqual = function (actual, expected) {
/**
* Description
*
* @param {Object} member
* @param {Object} append
* @param {Boolean} [computed]
* @returns {Object} member
*/
t.appendToMemberExpression = function (member, append, computed) {
t.appendToMemberExpression = function (member: Object, append: Object, computed?: boolean): Object {
member.object = t.memberExpression(member.object, member.property, member.computed);
member.property = append;
member.computed = !!computed;
@@ -236,26 +200,18 @@ t.appendToMemberExpression = function (member, append, computed) {
/**
* Description
*
* @param {Object} member
* @param {Object} append
* @returns {Object} member
*/
t.prependToMemberExpression = function (member, append) {
t.prependToMemberExpression = function (member: Object, append: Object): Object {
member.object = t.memberExpression(append, member.object);
return member;
};
/**
* Check if the input `node` is a reference to a bound variable.
*
* @param {Object} node
* @param {Object} parent
* @returns {Boolean}
*/
t.isReferenced = function (node, parent) {
t.isReferenced = function (node: Object, parent: Object): boolean {
// yes: PARENT[NODE]
// yes: NODE.child
// no: parent.CHILD
@@ -292,6 +248,16 @@ t.isReferenced = function (node, parent) {
return parent.id !== node;
}
// no: export { foo as NODE };
if (t.isExportSpecifier(parent, { name: node })) {
return false;
}
// no: import { NODE as foo } from "foo";
if (t.isImportSpecifier(parent, { id: node })) {
return false;
}
// no: class NODE {}
if (t.isClass(parent)) {
return parent.id !== node;
@@ -349,36 +315,26 @@ t.isReferenced = function (node, parent) {
/**
* Check if the input `node` is an `Identifier` and `isReferenced`.
*
* @param {Node} node
* @parma {Node} parent
* @returns {Boolean}
*/
t.isReferencedIdentifier = function (node, parent, opts) {
t.isReferencedIdentifier = function (node: Object, parent: Object, opts?: Object): boolean {
return t.isIdentifier(node, opts) && t.isReferenced(node, parent);
};
/**
* Check if the input `name` is a valid identifier name
* and isn't a reserved word.
*
* @param {String} name
* @returns {Boolean}
*/
t.isValidIdentifier = function (name) {
t.isValidIdentifier = function (name: string): boolean {
return isString(name) && esutils.keyword.isIdentifierName(name) && !esutils.keyword.isReservedWordES6(name, true);
};
/*
* Description
*
* @param {String} name
* @returns {String}
*/
t.toIdentifier = function (name) {
t.toIdentifier = function (name: string): string {
if (t.isIdentifier(name)) return name.name;
name = name + "";
@@ -395,7 +351,7 @@ t.toIdentifier = function (name) {
});
if (!t.isValidIdentifier(name)) {
name = "_" + name;
name = `_${name}`;
}
return name || "_";
@@ -403,29 +359,60 @@ t.toIdentifier = function (name) {
/**
* Description
*
* @param {Object} node
* @param {String=} key
*/
t.ensureBlock = function (node, key) {
key ||= "body";
t.ensureBlock = function (node: Object, key: string = "body") {
return node[key] = t.toBlock(node[key], node);
};
/**
* Description
*/
t.clone = function (node: Object): Object {
var newNode = {};
for (var key in node) {
if (key[0] === "_") continue;
newNode[key] = node[key];
}
return newNode;
};
/**
* Description
*/
t.cloneDeep = function (node: Object): Object {
var newNode = {};
for (var key in node) {
if (key[0] === "_") continue;
var 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"]`.
*
* @param {String} match Dot-delimited string
* @param {Boolean} [allowPartial] Allow a partial match
* @returns {Function}
*/
t.buildMatchMemberExpression = function (match, allowPartial) {
t.buildMatchMemberExpression = function (match:string, allowPartial?: boolean): Function {
var parts = match.split(".");
return function (member) {
@@ -475,12 +462,10 @@ t.buildMatchMemberExpression = function (match, allowPartial) {
/**
* Description
*
* @param {Object} node
* @param {Boolean} [ignore]
* @returns {Object|Boolean}
*/
t.toStatement = function (node, ignore) {
t.toStatement = function (node: Object, ignore?: boolean) {
if (t.isStatement(node)) {
return node;
}
@@ -506,7 +491,7 @@ t.toStatement = function (node, ignore) {
if (ignore) {
return false;
} else {
throw new Error("cannot turn " + node.type + " to a statement");
throw new Error(`cannot turn ${node.type} to a statement`);
}
}
@@ -517,12 +502,9 @@ t.toStatement = function (node, ignore) {
/**
* Description
*
* @param {Object} node
* @returns {Object}
*/
t.toExpression = function (node) {
t.toExpression = function (node: Object): Object {
if (t.isExpressionStatement(node)) {
node = node.expression;
}
@@ -536,19 +518,15 @@ t.toExpression = function (node) {
if (t.isExpression(node)) {
return node;
} else {
throw new Error("cannot turn " + node.type + " to an expression");
throw new Error(`cannot turn ${node.type} to an expression`);
}
};
/**
* Description
*
* @param {Object} node
* @param {Object} parent
* @returns {Object}
*/
t.toBlock = function (node, parent) {
t.toBlock = function (node: Object, parent: Object): Object {
if (t.isBlockStatement(node)) {
return node;
}
@@ -575,12 +553,9 @@ t.toBlock = function (node, parent) {
/**
* Return a list of binding identifiers associated with
* the input `node`.
*
* @param {Object} node
* @returns {Array|Object}
*/
t.getBindingIdentifiers = function (node) {
t.getBindingIdentifiers = function (node: Object): Object {
var search = [].concat(node);
var ids = object();
@@ -615,7 +590,9 @@ t.getBindingIdentifiers.keys = {
ImportBatchSpecifier: ["name"],
VariableDeclarator: ["id"],
FunctionDeclaration: ["id"],
FunctionExpression: ["id"],
ClassDeclaration: ["id"],
ClassExpression: ["id"],
SpreadElement: ["argument"],
RestElement: ["argument"],
UpdateExpression: ["argument"],
@@ -633,34 +610,25 @@ t.getBindingIdentifiers.keys = {
/**
* Description
*
* @param {Object} node
* @returns {Boolean}
*/
t.isLet = function (node) {
t.isLet = function (node: Object): boolean {
return t.isVariableDeclaration(node) && (node.kind !== "var" || node._let);
};
/**
* Description
*
* @param {Object} node
* @returns {Boolean}
*/
t.isBlockScoped = function (node) {
t.isBlockScoped = function (node: Object): boolean {
return t.isFunctionDeclaration(node) || t.isClassDeclaration(node) || t.isLet(node);
};
/**
* Description
*
* @param {Object} node
* @returns {Boolean}
*/
t.isVar = function (node) {
t.isVar = function (node: Object): boolean {
return t.isVariableDeclaration(node, { kind: "var" }) && !node._let;
};
@@ -670,12 +638,9 @@ t.COMMENT_KEYS = ["leadingComments", "trailingComments"];
/**
* Description
*
* @param {Object} child
* @returns {Object} child
*/
t.removeComments = function (child) {
t.removeComments = function (child: Object): Object {
each(t.COMMENT_KEYS, function (key) {
delete child[key];
});
@@ -684,13 +649,9 @@ t.removeComments = function (child) {
/**
* Description
*
* @param {Object} child
* @param {Object} parent
* @returns {Object} child
*/
t.inheritsComments = function (child, parent) {
t.inheritsComments = function (child: Object, parent: Object): Object {
each(t.COMMENT_KEYS, function (key) {
child[key] = uniq(compact([].concat(child[key], parent[key])));
});
@@ -699,13 +660,9 @@ t.inheritsComments = function (child, parent) {
/**
* Description
*
* @param {Object} child
* @param {Object} parent
* @returns {Object} child
*/
t.inherits = function (child, parent) {
t.inherits = function (child: Object, parent: Object): Object {
child._declarations = parent._declarations;
child._scopeInfo = parent._scopeInfo;
child.range = parent.range;
@@ -722,12 +679,9 @@ t.inherits = function (child, parent) {
/**
* Description
*
* @param {Object} node
* @returns {Array}
*/
t.getLastStatements = function (node) {
t.getLastStatements = function (node: Object): Array<Object> {
var nodes = [];
var add = function (node) {
@@ -750,23 +704,17 @@ t.getLastStatements = function (node) {
/**
* Description
*
* @param {Object} specifier
* @returns {String}
*/
t.getSpecifierName = function (specifier) {
t.getSpecifierName = function (specifier: Object): Object {
return specifier.name || specifier.id;
};
/**
* Description
*
* @param {Object} specifier
* @returns {String}
*/
t.getSpecifierId = function (specifier) {
t.getSpecifierId = function (specifier: Object): Object {
if (specifier.default) {
return t.identifier("default");
} else {
@@ -776,24 +724,17 @@ t.getSpecifierId = function (specifier) {
/**
* Description
*
* @param {Object} specifier
* @returns {Boolean}
*/
t.isSpecifierDefault = function (specifier) {
t.isSpecifierDefault = function (specifier: Object): boolean {
return specifier.default || t.isIdentifier(specifier.id) && specifier.id.name === "default";
};
/**
* Description
*
* @param {Node} node
* @param {Node} parent
* @returns {Boolean}
*/
t.isScope = function (node, parent) {
t.isScope = function (node: Object, parent: Object): boolean {
if (t.isBlockStatement(node)) {
if (t.isLoop(parent.block, { body: node })) {
return false;
@@ -807,6 +748,32 @@ t.isScope = function (node, parent) {
return t.isScopable(node);
};
/**
* Description
*/
t.isImmutable = function (node: Object): boolean {
if (t.isLiteral(node)) {
if (node.regex) {
// regexes are mutable
return false;
} else {
// immutable!
return true;
}
} else if (t.isIdentifier(node)) {
if (node.name === "undefined") {
// immutable!
return true;
} else {
// no idea...
return false;
}
}
return false;
};
/**
* Walk the input `node` and statically evaluate if it's truthy.
*
@@ -823,12 +790,10 @@ t.isScope = function (node, parent) {
*
* if (!t.evaluateTruthy(node)) falsyLogic();
*
* @param {Node} node
* @returns {Boolean}
*/
t.evaluateTruthy = function (node) {
var res = t.evaluate(node);
t.evaluateTruthy = function (node: Object, scope: Scope): boolean {
var res = t.evaluate(node, scope);
if (res.confident) return !!res.value;
};
@@ -845,11 +810,9 @@ t.evaluateTruthy = function (node) {
* t.evaluate(parse("!true")) // { confident: true, value: false }
* t.evaluate(parse("foo + foo")) // { confident: false, value: undefined }
*
* @param {Node} node
* @returns {Object}
*/
t.evaluate = function (node) {
t.evaluate = function (node: Object, scope: Scope): { confident: boolean; value: any } {
var confident = true;
var value = evaluate(node);
@@ -882,30 +845,26 @@ t.evaluate = function (node) {
}
}
if (t.isIdentifier(node, { name: "undefined" })) {
return undefined;
if (t.isIdentifier(node)) {
if (node.name === "undefined") {
return undefined;
} else {
return evaluate(scope.getImmutableBindingValue(node.name));
}
}
if (t.isUnaryExpression(node, { prefix: true })) {
var arg = evaluate(node.argument);
switch (node.operator) {
case "void": return undefined;
case "!": return !evaluate(node.argument);
case "+": return +evaluate(node.argument);
case "-": return -evaluate(node.argument);
case "!": return !arg;
case "+": return +arg;
case "-": return -arg;
}
}
if (t.isArrayExpression(node)) {
// possible perf issues - could deopt on X elements
var values = [];
for (var i = 0; i < node.elements.length; i++) {
values.push(evaluate(node.elements[i]));
}
return values;
}
if (t.isObjectExpression(node)) {
// todo: deopt on mutable computed property keys etc
if (t.isArrayExpression(node) || t.isObjectExpression(node)) {
// we could evaluate these but it's probably impractical and not very useful
}
if (t.isLogicalExpression(node)) {
@@ -945,12 +904,9 @@ t.evaluate = function (node) {
/**
* Description
*
* @param value
* @returns {Node}
*/
t.valueToNode = function (value) {
t.valueToNode = function (value: any): Object {
if (value === undefined) {
return t.identifier("undefined");
}

View File

@@ -3,6 +3,7 @@ import "./patch";
import buildDebug from "debug/node";
import cloneDeep from "lodash/lang/cloneDeep";
import isBoolean from "lodash/lang/isBoolean";
import * as messages from "./messages";
import contains from "lodash/collection/contains";
import traverse from "./traversal";
import isString from "lodash/lang/isString";
@@ -19,15 +20,15 @@ export { inherits, inspect } from "util";
export var debug = buildDebug("babel");
export function canCompile(filename, altExts) {
var exts = altExts || exports.canCompile.EXTENSIONS;
export function canCompile(filename: string, altExts?: Array<string>) {
var exts = altExts || canCompile.EXTENSIONS;
var ext = path.extname(filename);
return contains(exts, ext);
}
canCompile.EXTENSIONS = [".js", ".jsx", ".es6", ".es"];
export function resolve(loc) {
export function resolve(loc: string) {
try {
return require.resolve(loc);
} catch (err) {
@@ -35,11 +36,11 @@ export function resolve(loc) {
}
}
export function list(val) {
export function list(val: string): Array<string> {
return val ? val.split(",") : [];
}
export function regexify(val) {
export function regexify(val: any): RegExp {
if (!val) return new RegExp(/.^/);
if (Array.isArray(val)) val = val.join("|");
if (isString(val)) return new RegExp(val);
@@ -47,15 +48,15 @@ export function regexify(val) {
throw new TypeError("illegal type for regexify");
}
export function arrayify(val) {
export function arrayify(val: any): Array {
if (!val) return [];
if (isBoolean(val)) return [val];
if (isString(val)) return exports.list(val);
if (isString(val)) return list(val);
if (Array.isArray(val)) return val;
throw new TypeError("illegal type for arrayify");
}
export function booleanify(val) {
export function booleanify(val: any): boolean {
if (val === "true") return true;
if (val === "false") return false;
return val;
@@ -71,11 +72,13 @@ var templateVisitor = {
return nodes[node.name];
}
}
};
}
export function template(name, nodes, keepExpression) {
//
export function template(name: string, nodes?: Array<Object>, keepExpression?: boolean): Object {
var ast = exports.templates[name];
if (!ast) throw new ReferenceError("unknown template " + name);
if (!ast) throw new ReferenceError(`unknown template ${name}`);
if (nodes === true) {
keepExpression = true;
@@ -99,9 +102,10 @@ export function template(name, nodes, keepExpression) {
}
}
export function parseTemplate(loc, code) {
export function parseTemplate(loc: string, code: string): Object {
var ast = parse({ filename: loc }, code).program;
return traverse.removeProperties(ast);
ast = traverse.removeProperties(ast);
return ast;
}
function loadTemplates() {
@@ -109,9 +113,7 @@ function loadTemplates() {
var templatesLoc = path.join(__dirname, "transformation/templates");
if (!fs.existsSync(templatesLoc)) {
throw new Error("no templates directory - this is most likely the " +
"result of a broken `npm publish`. Please report to " +
"https://github.com/babel/babel/issues");
throw new ReferenceError(messages.get("missingTemplatesDirectory"));
}
each(fs.readdirSync(templatesLoc), function (name) {
@@ -131,6 +133,5 @@ try {
exports.templates = require("../../templates.json");
} catch (err) {
if (err.code !== "MODULE_NOT_FOUND") throw err;
exports.templates = loadTemplates();
}

View File

@@ -1,17 +1,20 @@
var genHelpers = require("./_generator-helpers");
var transform = require("../lib/babel/transformation");
var sourceMap = require("source-map");
var codeFrame = require("../lib/babel/helpers/code-frame");
var Module = require("module");
var helper = require("./_helper");
var assert = require("assert");
var chai = require("chai");
var path = require("path");
var util = require("../lib/babel/util");
var _ = require("lodash");
var genHelpers = require("./_generator-helpers");
var transform = require("../lib/babel/transformation");
var buildExernalHelpers = require("../lib/babel/build-external-helpers");
var sourceMap = require("source-map");
var codeFrame = require("../lib/babel/helpers/code-frame");
var Module = require("module");
var helper = require("./_helper");
var assert = require("assert");
var chai = require("chai");
var path = require("path");
var util = require("../lib/babel/util");
var _ = require("lodash");
require("../lib/babel/polyfill");
eval(buildExernalHelpers());
global.assertNoOwnProperties = function (obj) {
assert.equal(Object.getOwnPropertyNames(obj).length, 0);
};
@@ -83,8 +86,8 @@ var run = function (task, done) {
}
};
var fn = new Function("require", "done", execCode);
fn.call(global, fakeRequire, chai.assert, done);
var fn = new Function("require", "done", "exports", execCode);
fn.call(global, fakeRequire, chai.assert, {}, done);
} catch (err) {
err.message = exec.loc + ": " + err.message;
err.message += codeFrame(execCode);

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