Compare commits

..

96 Commits

Author SHA1 Message Date
Sebastian McKenzie
50dee1a754 v1.12.21 2014-11-19 13:49:35 +11:00
Sebastian McKenzie
f80f860bbc changelog for 1.12.21 2014-11-19 13:48:09 +11:00
Sebastian McKenzie
7fc2fe41af fix bug in let scoping resulting in unneccesary replacement - closes #193, closes #185 2014-11-19 13:46:00 +11:00
Sebastian McKenzie
a884a26402 revert acorn-6to5 2014-11-19 13:28:01 +11:00
Sebastian McKenzie
81ec1e1f42 remove unused variable in generators/meta 2014-11-19 12:54:54 +11:00
Sebastian McKenzie
1a27970376 publish acorn-6to5 as an npm package - fixes #187 2014-11-19 12:51:14 +11:00
Sebastian McKenzie
6822c854d4 add interop-require declaration 2014-11-19 12:40:44 +11:00
Sebastian McKenzie
8f4c4be821 generator: add existence check to printJoin 2014-11-19 12:40:35 +11:00
Sebastian McKenzie
5fca095149 use commonInterop module formatter in 6to5/register 2014-11-19 12:40:23 +11:00
Sebastian McKenzie
34599a21cb clean up common-interop module formatter 2014-11-19 12:40:10 +11:00
Sebastian McKenzie
d9d84c60b5 check for existence of node before checking it in let scoping 2014-11-19 12:13:00 +11:00
Sebastian McKenzie
221d78d2e2 arrayify whitelist and blacklist, inherit moduleRoot from sourceRoot and vice versa 2014-11-19 12:13:00 +11:00
Sebastian McKenzie
fa46f60655 expose util as _util 2014-11-19 12:13:00 +11:00
Sebastian McKenzie
03ce52fb7c use regexify and arrayify in register options 2014-11-19 12:13:00 +11:00
Sebastian McKenzie
0df0c696a9 add util.arrayify and util.regexify 2014-11-19 12:12:59 +11:00
Sebastian McKenzie
21b7f4120e add assertion checks into types 2014-11-19 12:12:59 +11:00
Sebastian McKenzie
f43a3dec4b more regenerator spring cleaning 2014-11-19 12:12:59 +11:00
Sebastian McKenzie
cacee5c625 Merge pull request #191 from Naddiseo/commonjs-interop
Added an interop commonjs loader.
2014-11-19 12:09:00 +11:00
Sebastian McKenzie
553c90ae75 Merge pull request #192 from Naddiseo/function-modules
Allow module transformers to be directly passed into opts.
2014-11-19 12:06:02 +11:00
Richard Eames
bc3502d695 Allow module transformers to be directly passed into opts. 2014-11-18 15:29:59 -07:00
Richard Eames
6ae03a5dce Added an interop commonjs loader. 2014-11-18 15:25:12 -07:00
Sebastian McKenzie
68ef2d545e Merge pull request #188 from brentburg/webpack-return
Webpack doesn't like return outside of a function in a module
2014-11-19 01:14:07 +11:00
Brent Burgoyne
861b9e68d3 Deleted uneeded _runtime.js 2014-11-18 07:13:12 -07:00
Brent Burgoyne
a0eb108cd4 Remove global existence check 2014-11-18 07:10:47 -07:00
Brent Burgoyne
756aef6adc Instead of returning early, conditionally require actual runtime (./_runtime.js)
Fix this error with webpack:

ERROR in ./~/6to5/lib/6to5/transformation/transformers/generators/runtime.js
Module parse failed: /[...]/node_modules/6to5/lib/6to5/transformation/transformers/generators/runtime.js Line 12: Illegal return statement
You may need an appropriate loader to handle this file type.
|
| if (typeof global.regeneratorRuntime === "object") {
  |   return;
  |
}
|
 @ ./~/6to5/lib/6to5/polyfill.js 6:0-59
2014-11-18 06:55:39 -07:00
Sebastian McKenzie
7b74c1c8ec more generator spring cleaning 2014-11-17 17:30:41 +11:00
Sebastian McKenzie
8e115ef3ed regenerator spring cleaning 2014-11-17 17:04:04 +11:00
Sebastian McKenzie
b9a6cf35b7 Merge pull request #184 from thejameskyle/support-table
Sort comparison table by most es6 support and split into two groups
2014-11-17 16:50:24 +11:00
James Kyle
2e22de71b4 Sort comparison table by most es6 support and split into two groups 2014-11-16 21:49:19 -08:00
Sebastian McKenzie
a077c75c8c v1.12.20 2014-11-17 14:24:31 +11:00
Sebastian McKenzie
c0b03e8126 append sourceMappingURL when using bin/6to5 and output sourcemaps - fixes #183 2014-11-17 14:22:25 +11:00
Sebastian McKenzie
a3a4a7645c v1.12.19 2014-11-17 14:10:10 +11:00
Sebastian McKenzie
7bd1337ee8 clean up weird regenerator formatting, only one instance, heaps more to go! 2014-11-17 13:56:42 +11:00
Sebastian McKenzie
c54f530b10 fix up duplicate variables in regenerator 2014-11-17 12:48:35 +11:00
Sebastian McKenzie
9d3a3a57f2 fix up generator normaliseOptions 2014-11-17 12:39:01 +11:00
Sebastian McKenzie
e1474c2f5f add 1.12.19 changelog 2014-11-17 12:00:05 +11:00
Sebastian McKenzie
8a9a205122 fix up comments option 2014-11-17 11:59:52 +11:00
Sebastian McKenzie
885d65f9de Merge pull request #179 from webpro/remove-comments
Remove comments
2014-11-17 11:54:41 +11:00
Sebastian McKenzie
43d1435c97 Merge pull request #180 from SimonDegraeve/add-jsxhint-plugin
Add JSXHint in the plugins list.
2014-11-17 11:47:47 +11:00
Simon Degraeve
247c14c5ab Add JSXHint in the plugins list. 2014-11-17 08:19:49 +08:00
Lars Kappert
0e2b12c134 Separate comments and comments setting 2014-11-16 21:11:43 +01:00
Lars Kappert
59c5abe188 Exclude comments from generated code 2014-11-16 20:33:50 +01:00
Lars Kappert
e1cc1dcb4b Introduce --remove-comments (-c) option 2014-11-16 20:33:50 +01:00
Sebastian McKenzie
d091793077 add generator support let scoping - fixes #178 2014-11-17 04:09:48 +11:00
Sebastian McKenzie
e6baac1003 move regenerator into main repo so we can iterate on it faster and make a bunch of additional changes 2014-11-17 04:09:29 +11:00
Sebastian McKenzie
c41608edc3 add gobble to plugins 2014-11-17 04:04:02 +11:00
Sebastian McKenzie
3815913537 v1.12.18 2014-11-16 21:01:12 +11:00
Sebastian McKenzie
e5c18749f0 add changelog for 1.12.18 2014-11-16 21:00:00 +11:00
Sebastian McKenzie
b7458f949c Merge pull request #177 from josh/browser-global
Prefer module provided `global` rather than `window` reference
2014-11-16 20:58:12 +11:00
Sebastian McKenzie
69302b314f add sprockets-es6 to plugins 2014-11-16 20:55:56 +11:00
Joshua Peek
0c57a00fdb Check if attachEvent is defined 2014-11-16 01:41:56 -08:00
Joshua Peek
3bec8b0311 Prefer module global reference rather than window 2014-11-16 01:41:16 -08:00
Sebastian McKenzie
6a88e05362 v1.12.17 2014-11-16 19:29:25 +11:00
Sebastian McKenzie
e3bd2dff8d remove unused path variable 2014-11-16 19:27:49 +11:00
Sebastian McKenzie
ef82171254 update amd/umd modules documentation 2014-11-16 19:27:15 +11:00
Sebastian McKenzie
00d94fd810 update changelog with additional new options 2014-11-16 19:26:03 +11:00
Sebastian McKenzie
d929d3c5eb remove duplicate i variable from traverse 2014-11-16 19:24:58 +11:00
Sebastian McKenzie
5c1ee86b97 remove filenameRelative from bin/6to5* since it's unneccesary 2014-11-16 19:24:47 +11:00
Sebastian McKenzie
5409691a3a update umd and amd tests with new moduleName option 2014-11-16 19:22:37 +11:00
Sebastian McKenzie
24964ac454 add filenameRelative to bin/6to5* 2014-11-16 19:20:08 +11:00
Sebastian McKenzie
faa81ab85b add 1.12.17 changelog 2014-11-16 19:19:57 +11:00
Sebastian McKenzie
d4bc082bb9 add new filenameRelative, sourceRoot and moduleRoot option documentation 2014-11-16 19:19:46 +11:00
Sebastian McKenzie
3777af6bbd add filenameRelative default and make sourceFileName and sourceMapName inherit form it 2014-11-16 19:19:25 +11:00
Sebastian McKenzie
1f258e9e9c add sourceRoot to source map 2014-11-16 19:19:07 +11:00
Sebastian McKenzie
50333c879c add comments and change single quotes in amd formatter getModuleName 2014-11-16 19:18:56 +11:00
Sebastian McKenzie
105e6ac379 add filenameRelative to tests 2014-11-16 19:18:30 +11:00
Sebastian McKenzie
dadab64e39 Merge pull request #176 from darvelo/master
Generate moduleNames for AMD/UMD
2014-11-16 19:00:56 +11:00
Sebastian McKenzie
2b82f2bcc2 ignore unknown nodes in traversal 2014-11-16 18:52:54 +11:00
Sebastian McKenzie
f1183505b1 optimise traverse, improves traversal speed by 50% 2014-11-16 18:50:07 +11:00
Sebastian McKenzie
fa3b24e5b4 don't lazy set templates, can't even remember why i did this 2014-11-16 18:49:29 +11:00
Sebastian McKenzie
5789447068 add loc option to exec test 2014-11-16 18:48:32 +11:00
David Arvelo
f1f7321590 Generate moduleNames for AMD/UMD 2014-11-16 02:38:00 -05:00
Sebastian McKenzie
9ff4df6dae v1.12.16 2014-11-16 14:39:15 +11:00
Sebastian McKenzie
0dbb24c922 remove unused i variable in default parameters transformer 2014-11-16 14:37:26 +11:00
Sebastian McKenzie
a027d2b9cf add 1.12.16 changelog 2014-11-16 14:34:42 +11:00
Sebastian McKenzie
e290990371 scope: remove unused references instance property 2014-11-16 14:34:29 +11:00
Sebastian McKenzie
d0a2bd170e clean up constants transformer 2014-11-16 14:33:37 +11:00
Sebastian McKenzie
69db46f96b move down and clump constants and let scoping transformer positions 2014-11-16 14:33:29 +11:00
Sebastian McKenzie
27ba4b2bba scope: switch over declaration building to info so we can build multiple things 2014-11-16 14:33:16 +11:00
Sebastian McKenzie
b337c1ab06 test/transformation: use full location as filename 2014-11-16 14:32:40 +11:00
Sebastian McKenzie
a1895b4bb4 implement temporal dead zone for default parameters - fixes #169 2014-11-16 14:32:03 +11:00
Sebastian McKenzie
00483917f0 fix comments not being retained from MethodDefinition in classes 2014-11-16 11:30:05 +11:00
Sebastian McKenzie
d09bafaf8c Merge pull request #172 from thejameskyle/docs-whitespace
Add newline to keep marked from parsing incorrectly
2014-11-16 10:32:04 +11:00
James Kyle
a7ef02c781 Add newline to keep marked from parsing incorrectly 2014-11-15 15:31:16 -08:00
Sebastian McKenzie
94cd45c269 v1.12.15 2014-11-15 11:42:06 +11:00
Sebastian McKenzie
424bab97d0 update acorn-6to5 - fixes #165 2014-11-15 11:40:34 +11:00
Sebastian McKenzie
a1bdd804e2 v1.12.14 2014-11-15 11:30:37 +11:00
Sebastian McKenzie
10c051890b fix changelog version 2014-11-15 11:29:41 +11:00
Sebastian McKenzie
ac49d0a335 v1.12.4 2014-11-15 11:29:06 +11:00
Sebastian McKenzie
b56f1800e5 update regenerator-6to5 2014-11-15 11:27:29 +11:00
Sebastian McKenzie
49ef92c586 add changelog for v1.12.4 2014-11-15 11:23:42 +11:00
Sebastian McKenzie
542fe89123 fix up tests to work with new member expression keyword generator 2014-11-15 11:23:16 +11:00
Sebastian McKenzie
5b118c0c3f add _property-literals test 2014-11-15 11:13:10 +11:00
Sebastian McKenzie
8503916799 add _memberExpressionKeywords transformer that turns keyword identifiers to computed literals 2014-11-15 11:13:02 +11:00
Sebastian McKenzie
206c828a56 more react compliant whitespace - #165 2014-11-15 11:00:32 +11:00
Sebastian McKenzie
7a261a1db1 fix duplicate let scoping in functions - fixes #166 2014-11-15 09:47:48 +11:00
189 changed files with 4769 additions and 338 deletions

View File

@@ -1,3 +1,44 @@
# 1.12.21
* Fix unneccesary let scoping replacement.
* Add `commonInterop` module formatter. Thanks [@Naddiseo](https://github.com/Naddiseo).
* Fix `return` outside of function body bug. Thanks [@brentburg](https://github.com/brentburg).
* Add more flexible option types.
# 1.12.20
* Append `sourceMappingURL` when using `bin/6to5` and output sourcemaps.
# 1.12.19
* Add `comments` option and `--remove-comments` flag. Thanks [@webpro](htps://github.com/webpro).
* Embed `regenerator`.
# 1.12.18
* Use `global` reference instead of `window`.
# 1.12.17
* Add `moduleName`, `sourceRoot` and `filenameRelative` options. Thanks [@darvelo](https://github.com/darvelo).
* Traversal optimisations.
# 1.12.16
* Fix comments not being retained from `MethodDefinition` in classes.
* Add temporal dead zone in default parameters.
# 1.12.15
* Update `acorn-6to5`.
# 1.12.14
* Fix duplicate let scoping in functions.
* Make JSX whitespace more React-compliant.
* Add `_memberExpressionKeywords` transformer that turns keyword identifiers to computed literals.
* Upgrade `regenerator-6to5`.
# 1.12.13
* Support duplicate constants within different block scopes.

View File

@@ -19,7 +19,9 @@ module.exports = function (commander, filenames, opts) {
mkdirp.sync(up);
if (commander.sourceMaps) {
fs.writeFileSync(dest + ".map", JSON.stringify(data.map));
var mapLoc = dest + ".map";
data.code = util.addSourceMappingUrl(data.code, mapLoc);
fs.writeFileSync(mapLoc, JSON.stringify(data.map));
}
fs.writeFileSync(dest, data.code);

View File

@@ -56,7 +56,9 @@ module.exports = function (commander, filenames) {
if (commander.outFile) {
if (commander.sourceMaps) {
fs.writeFileSync(commander.outFile + ".map", JSON.stringify(result.map));
var mapLoc = commander.outFile + ".map";
result.code = util.addSourceMappingUrl(result.code, mapLoc);
fs.writeFileSync(mapLoc, JSON.stringify(result.map));
}
fs.writeFileSync(commander.outFile, result.code);

View File

@@ -17,6 +17,7 @@ commander.option("-w, --whitelist [whitelist]", "Whitelist of transformers to ON
commander.option("-b, --blacklist [blacklist]", "Blacklist of transformers to NOT use", util.list);
commander.option("-o, --out-file [out]", "Compile all input files into a single file");
commander.option("-d, --out-dir [out]", "Compile an input directory of modules into an output directory");
commander.option("-c, --remove-comments", "Remove comments from the compiled code", false);
commander.on("--help", function(){
var outKeys = function (title, obj) {
@@ -88,6 +89,7 @@ exports.opts = {
blacklist: commander.blacklist,
whitelist: commander.whitelist,
sourceMap: commander.sourceMaps || commander.sourceMapsInline,
comments: !commander.removeComments,
runtime: commander.runtime,
modules: commander.modules
};

View File

@@ -1,6 +1,7 @@
var readdir = require("fs-readdir-recursive");
var index = require("./index");
var util = require("../../lib/6to5/util");
var path = require("path");
var to5 = require("../../lib/6to5");
var fs = require("fs");
var _ = require("lodash");
@@ -11,6 +12,10 @@ exports.readdirFilter = function (filename) {
});
};
exports.addSourceMappingUrl = function (code, loc) {
return code + "\n//# sourceMappingURL=" + path.basename(loc);
};
exports.transform = function (filename, code, opts) {
opts = _.extend(opts || {}, index.opts);
opts.filename = filename;

View File

@@ -56,31 +56,42 @@ better suited if you'd like a full ES6 environment with polyfills and all.
## Comparison to other transpilers
| | 6to5 | Traceur | esnext | es6now | es6-transpiler | jstransform |
| ---------------------------- | ---- | ------- | ------ | ------ | -------------- | ----------- |
| No runtime | ✓ | | | | ✓ | ✓ |
| Source maps | ✓ | ✓ | ✓ | | ✓ | ✓ |
| No compiler global pollution | ✓ | | ✓ | | ✓ | ✓ |
| Browser support | ✓ | | ✓ | | | |
| Array comprehension | ✓ | | | | ✓ | |
| Arrow functions | ✓ | ✓ | | ✓ | ✓ | |
| Async functions | ✓ | ✓ | ✓ | | | |
| Classes | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Computed property names | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Constants | ✓ | ✓ | | | ✓ | |
| Default parameters | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Destructuring | ✓ | ✓ | ✓ | ✓ | ✓ | |
| For-of | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Generators | ✓ | ✓ | | | | |
| Generator comprehension | ✓ | ✓ | | | | |
| Let scoping | ✓ | ✓ | | | ✓ | |
| Modules | ✓ | ✓ | | ✓ | | |
| Property method assignment | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Property name shorthand | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Rest parameters | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Spread | ✓ | ✓ | | ✓ | | |
| Template literals | ✓ | ✓ | | ✓ | | |
| Unicode regex | ✓ | ✓ | | | | |
### Features
| | 6to5 | Traceur | es6-transpiler | esnext | es6now | jstransform |
| ---------------------------- | ---- | ------- | -------------- | ------ | ------ | ----------- |
| Source maps | ✓ | | ✓ | ✓ | | ✓ |
| No compiler global pollution | ✓ | | ✓ | ✓ | | |
| No runtime | ✓ | | ✓ | | | ✓ |
| Browser support | ✓ | ✓ | | ✓ | | |
### Language Support
| | 6to5 | Traceur | es6-transpiler | esnext | es6now | jstransform |
| ---------------------------- | ----- | ------- | -------------- | ------ | ------ | ----------- |
| Array comprehension | ✓ | ✓ | ✓ | | | |
| Arrow functions | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Async functions | ✓ | ✓ | | | | |
| Classes | ✓ | ✓ | | | ✓ | |
| Computed property names | ✓ | ✓ | | ✓ | ✓ | |
| Constants | ✓ | ✓ | | | | |
| Default parameters | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Destructuring | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| For-of | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Generators | ✓ | ✓ | | ✓ | | |
| Generator comprehension | ✓ | ✓ | | | | |
| Let scoping | ✓ | ✓ | | | | |
| Modules | ✓ | ✓ | | | ✓ | |
| Property method assignment | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Property name shorthand | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Rest parameters | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Spread | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Template literals | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Unicode regex | ✓ | ✓ | ✓ | | | |
### [Traceur](https://github.com/google/traceur-compiler)

View File

@@ -133,11 +133,13 @@ for (var i of [1, 2, 3]) {
## Generators
```javascript
```
## Generator comprehension
```javascript
```
## Let scoping
@@ -151,6 +153,7 @@ for (let i in arr) {
## Modules
```javascript
```
## Numeric literals

View File

@@ -66,7 +66,7 @@ export function bar() {
**Out**
```javascript
define(["exports", "foo"], function (exports, _foo) {
define("filename", ["exports", "foo"], function (exports, _foo) {
exports.bar = bar;
var foo = _foo.default;
@@ -94,7 +94,7 @@ export function bar() {
```javascript
(function (factory) {
if (typeof define === "function" && define.amd) {
define(["exports", "foo"], factory);
define("filename", ["exports", "foo"], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require("foo"));
}
@@ -111,7 +111,6 @@ export function bar() {
### Ignore
**In**
```javascript

View File

@@ -5,11 +5,13 @@
- [Brunch](https://github.com/es128/6to5-brunch)
- [Duo](https://github.com/bdo-labs/duo6to5)
- [Connect](https://github.com/6to5/6to5-connect)
- [Gobble](https://github.com/gobblejs/gobble-6to5)
- [Gulp](https://github.com/sindresorhus/gulp-6to5)
- [Grunt](https://github.com/sindresorhus/grunt-6to5)
- [Jade](https://github.com/Apoxx/jade-6to5)
- [Jest](https://github.com/6to5/6to5-jest)
- [JSXHint](https://github.com/STRML/JSXHint) (A wrapper around JSHint to allow linting of JSX files)
- [Karma](https://github.com/shuhei/karma-6to5-preprocessor)
- [Mocha](https://github.com/6to5/6to5-mocha)
- [Rails](https://github.com/6to5/6to5-rails)
- [Rails](https://github.com/josh/sprockets-es6) or via [browserify-rails](https://github.com/6to5/6to5-rails)
- [webpack](https://github.com/Couto/6to5-loader)

View File

@@ -83,6 +83,10 @@ to5.transformFile("filename.js", options, function (err, result) {
// Default: "unknown"
filename: "filename",
// Filename relative to `sourceRoot`
// Default: `filename` option.
filenameRelative: "",
// List of transformers to EXCLUDE.
// Run `6to5 --help` to see a full list of transformers.
blacklist: [],
@@ -103,17 +107,28 @@ to5.transformFile("filename.js", options, function (err, result) {
sourceMap: true,
// Set `file` on returned source map.
// Default: `filename` option.
// Default: `filenameRelative` option.
sourceMapName: "filename",
// Set `sources[0]` on returned source map.
// Default: `filename` option.
// Default: `filenameRelative` option.
sourceFileName: "filename",
// The root from which all sources are relative
sourceRoot: "assets/scripts",
// Optional prefix for the AMD module formatter that will be prepend to the
// filename on module definitions
moduleRoot: "my-app",
// Optionally replace all 6to5 helper declarations with a referenece to this
// variable. If set to `true` then the default namespace is used "to5Runtime".
// Default: false
runtime: true
runtime: true,
// Output comments in generated output
// Default: true
comments: false
}
```

View File

@@ -12,7 +12,7 @@ transform.load = function (url, callback, opts, hold) {
opts = opts || {};
opts.filename = opts.filename || url;
var xhr = window.ActiveXObject ? new window.ActiveXObject("Microsoft.XMLHTTP") : new window.XMLHttpRequest();
var xhr = global.ActiveXObject ? new global.ActiveXObject("Microsoft.XMLHTTP") : new global.XMLHttpRequest();
xhr.open("GET", url, true);
if ("overrideMimeType" in xhr) xhr.overrideMimeType("text/plain");
@@ -60,7 +60,7 @@ var runScripts = function () {
}
};
var _scripts = window.document.getElementsByTagName("script");
var _scripts = global.document.getElementsByTagName("script");
for (var i in _scripts) {
var _script = _scripts[i];
if (types.indexOf(_script.type) >= 0) scripts.push(_script);
@@ -73,8 +73,8 @@ var runScripts = function () {
exec();
};
if (window.addEventListener) {
window.addEventListener("DOMContentLoaded", runScripts, false);
} else {
window.attachEvent("onload", runScripts);
if (global.addEventListener) {
global.addEventListener("DOMContentLoaded", runScripts, false);
} else if (global.attachEvent) {
global.attachEvent("onload", runScripts);
}

View File

@@ -19,7 +19,7 @@ function File(opts) {
}
File.declarations = ["extends", "class-props", "slice", "apply-constructor",
"tagged-template-literal"];
"tagged-template-literal", "interop-require"];
File.normaliseOptions = function (opts) {
opts = _.cloneDeep(opts || {});
@@ -29,6 +29,7 @@ File.normaliseOptions = function (opts) {
blacklist: [],
whitelist: [],
sourceMap: false,
comments: true,
filename: "unknown",
modules: "common",
runtime: false,
@@ -38,9 +39,24 @@ File.normaliseOptions = function (opts) {
// normalise windows path separators to unix
opts.filename = opts.filename.replace(/\\/g, "/");
opts.blacklist = util.arrayify(opts.blacklist);
opts.whitelist = util.arrayify(opts.whitelist);
_.defaults(opts, {
sourceFileName: opts.filename,
sourceMapName: opts.filename
moduleRoot: opts.sourceRoot
});
_.defaults(opts, {
sourceRoot: opts.moduleRoot
});
_.defaults(opts, {
filenameRelative: opts.filename
});
_.defaults(opts, {
sourceFileName: opts.filenameRelative,
sourceMapName: opts.filenameRelative
});
if (opts.runtime === true) {
@@ -54,7 +70,7 @@ File.normaliseOptions = function (opts) {
};
File.prototype.getModuleFormatter = function (type) {
var ModuleFormatter = transform.moduleFormatters[type];
var ModuleFormatter = _.isFunction(type) ? type : transform.moduleFormatters[type];
if (!ModuleFormatter) {
var loc = util.resolve(type);

View File

@@ -35,21 +35,17 @@ _.each(Buffer.prototype, function (fn, key) {
});
CodeGenerator.normaliseOptions = function (opts) {
opts = opts.format || {};
opts = _.merge({
return _.merge({
parentheses: true,
semicolons: true,
comments: true,
comments: opts.comments == null || opts.comments,
compact: false,
indent: {
adjustMultilineComment: true,
style: " ",
base: 0
}
}, opts);
return opts;
}, opts.format || {});
};
CodeGenerator.generators = {
@@ -169,6 +165,8 @@ CodeGenerator.prototype.print = function (node, parent, opts) {
};
CodeGenerator.prototype.printJoin = function (print, nodes, opts) {
if (!nodes || !nodes.length) return;
opts = opts || {};
var self = this;

View File

@@ -9,7 +9,8 @@ function SourceMap(position, opts, code) {
if (opts.sourceMap) {
this.map = new sourceMap.SourceMapGenerator({
file: opts.sourceMapName
file: opts.sourceMapName,
sourceRoot: opts.sourceRoot
});
this.map.setSourceContent(opts.sourceFileName, code);

View File

@@ -17,6 +17,9 @@ exports.polyfill = function () {
exports.canCompile = util.canCompile;
// do not use this - this is for use by official maintained 6to5 plugins
exports._util = util;
exports.transform = transform;
exports.transformFile = function (filename, opts, callback) {

View File

@@ -3,4 +3,4 @@ if (typeof Symbol === "undefined") {
}
require("es6-shim");
require("regenerator-6to5/runtime");
require("./transformation/transformers/generators/runtime");

View File

@@ -1,6 +1,7 @@
require("./polyfill");
var sourceMapSupport = require("source-map-support");
var util = require("./util");
var to5 = require("./index");
var _ = require("lodash");
@@ -71,7 +72,8 @@ var loader = function (m, filename) {
var result = to5.transformFileSync(filename, {
whitelist: whitelist,
blacklist: blacklist,
sourceMap: true
sourceMap: true,
modules: "commonInterop"
});
maps[filename] = result.map;
@@ -100,11 +102,11 @@ module.exports = function (opts) {
if (_.isRegExp(opts)) opts = { ignore: opts };
if (opts.ignoreRegex != null) opts.ignore = opts.ignoreRegex;
if (opts.only != null) onlyRegex = opts.only;
if (opts.ignore != null) ignoreRegex = opts.ignore;
if (opts.only != null) onlyRegex = util.regexify(opts.only);
if (opts.ignore != null) ignoreRegex = util.regexify(opts.ignore);
if (opts.extensions) hookExtensions(opts.extensions);
if (opts.extensions) hookExtensions(util.arrayify(opts.extensions));
if (opts.blacklist) blacklist = opts.blacklist;
if (opts.whitelist) whitelist = opts.whitelist;
if (opts.blacklist) blacklist = util.arrayify(opts.blacklist);
if (opts.whitelist) whitelist = util.arrayify(opts.whitelist);
};

View File

@@ -0,0 +1,3 @@
(function (obj) {
return obj && (obj["default"] || obj);
})

View File

@@ -29,12 +29,41 @@ AMDFormatter.prototype.transform = function (ast) {
var params = _.values(this.ids);
params.unshift(t.identifier("exports"));
var moduleName = this.getModuleName();
var container = t.functionExpression(null, params, t.blockStatement(body));
var call = t.callExpression(t.identifier("define"), [names, container]);
var call = t.callExpression(t.identifier("define"), [t.literal(moduleName), names, container]);
program.body = [t.expressionStatement(call)];
};
AMDFormatter.prototype.getModuleName = function () {
var opts = this.file.opts;
var filenameRelative = opts.filenameRelative;
var moduleName = "";
if (opts.moduleRoot) {
moduleName = opts.moduleRoot + "/";
}
if (!opts.filenameRelative) {
return moduleName + opts.filename.replace(/^\//, "");
}
if (opts.sourceRoot) {
// remove sourceRoot from filename
var sourceRootRegEx = new RegExp("^" + opts.sourceRoot + "\/?");
filenameRelative = filenameRelative.replace(sourceRootRegEx, "");
}
// remove extension
filenameRelative = filenameRelative.replace(/\.(.*?)$/, "");
moduleName += filenameRelative;
return moduleName;
};
AMDFormatter.prototype._push = function (node) {
var id = node.source.value;
var ids = this.ids;

View File

@@ -0,0 +1,29 @@
module.exports = CommonJSInteropFormatter;
var CommonJSFormatter = require("./common");
var util = require("../../util");
var t = require("../../types");
function CommonJSInteropFormatter(file) {
this.file = file;
}
util.inherits(CommonJSInteropFormatter, CommonJSFormatter);
CommonJSInteropFormatter.prototype.importSpecifier = function (specifier, node, nodes) {
var variableName = t.getSpecifierName(specifier);
// import foo from "foo";
if (specifier.default) {
nodes.push(t.variableDeclaration("var", [
t.variableDeclarator(variableName,
t.callExpression(this.file.addDeclaration("interop-require"), [util.template("require", {
MODULE_NAME: node.source.raw
})])
)
]));
return;
}
CommonJSFormatter.prototype.importSpecifier.apply(this, arguments);
};

View File

@@ -32,8 +32,10 @@ UMDFormatter.prototype.transform = function (ast) {
// runner
var moduleName = this.getModuleName();
var runner = util.template("umd-runner-body", {
AMD_ARGUMENTS: t.arrayExpression([t.literal("exports")].concat(names)),
AMD_ARGUMENTS: [t.literal(moduleName), t.arrayExpression([t.literal("exports")].concat(names))],
COMMON_ARGUMENTS: names.map(function (name) {
return t.callExpression(t.identifier("require"), [name]);

View File

@@ -20,44 +20,47 @@ transform._ensureTransformerNames = function (type, keys) {
transform.transformers = {};
transform.moduleFormatters = {
common: require("./modules/common"),
ignore: require("./modules/ignore"),
amd: require("./modules/amd"),
umd: require("./modules/umd")
common: require("./modules/common"),
commonInterop: require("./modules/common-interop"),
ignore: require("./modules/ignore"),
amd: require("./modules/amd"),
umd: require("./modules/umd")
};
_.each({
modules: require("./transformers/modules"),
propertyNameShorthand: require("./transformers/property-name-shorthand"),
constants: require("./transformers/constants"),
arrayComprehension: require("./transformers/array-comprehension"),
generatorComprehension: require("./transformers/generator-comprehension"),
arrowFunctions: require("./transformers/arrow-functions"),
classes: require("./transformers/classes"),
modules: require("./transformers/modules"),
propertyNameShorthand: require("./transformers/property-name-shorthand"),
arrayComprehension: require("./transformers/array-comprehension"),
generatorComprehension: require("./transformers/generator-comprehension"),
arrowFunctions: require("./transformers/arrow-functions"),
classes: require("./transformers/classes"),
_propertyLiterals: require("./transformers/_property-literals"),
computedPropertyNames: require("./transformers/computed-property-names"),
_propertyLiterals: require("./transformers/_property-literals"),
computedPropertyNames: require("./transformers/computed-property-names"),
spread: require("./transformers/spread"),
templateLiterals: require("./transformers/template-literals"),
propertyMethodAssignment: require("./transformers/property-method-assignment"),
defaultParameters: require("./transformers/default-parameters"),
restParameters: require("./transformers/rest-parameters"),
destructuring: require("./transformers/destructuring"),
forOf: require("./transformers/for-of"),
letScoping: require("./transformers/let-scoping"),
unicodeRegex: require("./transformers/unicode-regex"),
spread: require("./transformers/spread"),
templateLiterals: require("./transformers/template-literals"),
propertyMethodAssignment: require("./transformers/property-method-assignment"),
defaultParameters: require("./transformers/default-parameters"),
restParameters: require("./transformers/rest-parameters"),
destructuring: require("./transformers/destructuring"),
forOf: require("./transformers/for-of"),
unicodeRegex: require("./transformers/unicode-regex"),
react: require("./transformers/react"),
react: require("./transformers/react"),
constants: require("./transformers/constants"),
letScoping: require("./transformers/let-scoping"),
_aliasFunctions: require("./transformers/_alias-functions"),
_blockHoist: require("./transformers/_block-hoist"),
_declarations: require("./transformers/_declarations"),
generators: require("./transformers/generators"),
generators: require("./transformers/generators"),
useStrict: require("./transformers/use-strict"),
_blockHoist: require("./transformers/_block-hoist"),
_declarations: require("./transformers/_declarations"),
_aliasFunctions: require("./transformers/_alias-functions"),
_moduleFormatter: require("./transformers/_module-formatter")
useStrict: require("./transformers/use-strict"),
_memberExpressionKeywords: require("./transformers/_member-expression-keywords"),
_moduleFormatter: require("./transformers/_module-formatter")
}, function (transformer, key) {
transform.transformers[key] = new Transformer(key, transformer);
});

View File

@@ -0,0 +1,10 @@
var esutils = require("esutils");
var t = require("../../types");
exports.MemberExpression = function (node) {
var prop = node.property;
if (t.isIdentifier(prop) && esutils.keyword.isKeywordES6(prop.name, true)) {
node.property = t.literal(prop.name);
node.computed = true;
}
};

View File

@@ -254,6 +254,7 @@ Class.prototype.pushConstructor = function (method) {
this.hasConstructor = true;
t.inherits(construct, fn);
t.inheritsComments(construct, method);
construct.defaults = fn.defaults;
construct.params = fn.params;

View File

@@ -9,24 +9,27 @@ exports.ForOfStatement =
exports.ForStatement = function (node, parent, file) {
var constants = {};
var check = function (node, names, parent) {
_.each(names, function (name) {
var check = function (parent, names) {
_.each(names, function (nameNode, name) {
if (!_.has(constants, name)) return;
if (parent && t.isBlockStatement(parent) && parent !== constants[name]) return;
throw file.errorWithNode(node, name + " is read-only");
throw file.errorWithNode(nameNode, name + " is read-only");
});
};
var getIds = function (node) {
return t.getIds(node, false, ["MemberExpression"]);
return t.getIds(node, true, ["MemberExpression"]);
};
_.each(node.body, function (child, parent) {
if (child && t.isVariableDeclaration(child, { kind: "const" })) {
_.each(child.declarations, function (declar) {
_.each(getIds(declar), function (name) {
check(declar, [name], parent);
_.each(getIds(declar), function (nameNode, name) {
var names = {};
names[name] = nameNode;
check(parent, names);
constants[name] = parent;
});
@@ -42,9 +45,10 @@ exports.ForStatement = function (node, parent, file) {
traverse(node, function (child, parent) {
if (child._ignoreConstant) return;
if (t.isVariableDeclaration(child)) return;
if (t.isDeclaration(child) || t.isAssignmentExpression(child)) {
check(child, getIds(child), parent);
if (t.isVariableDeclarator(child) || t.isDeclaration(child) || t.isAssignmentExpression(child)) {
check(parent, getIds(child));
}
});
};

View File

@@ -1,21 +1,70 @@
var util = require("../../util");
var t = require("../../types");
var _ = require("lodash");
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
var _ = require("lodash");
exports.Function = function (node) {
exports.Function = function (node, parent, file, scope) {
if (!node.defaults || !node.defaults.length) return;
t.ensureBlock(node);
var ids = node.params.map(function (param) {
return t.getIds(param);
});
var closure = false;
_.each(node.defaults, function (def, i) {
if (!def) return;
var param = node.params[i];
node.body.body.unshift(util.template("if-undefined-set-to", {
VARIABLE: param,
DEFAULT: def
// temporal dead zone check - here we prevent accessing of params that
// are to the right - ie. uninitialized parameters
_.each(ids.slice(i), function (ids) {
var check = function (node, parent) {
if (!t.isIdentifier(node) || !t.isReferenced(node, parent)) return;
if (_.contains(ids, node.name)) {
throw file.errorWithNode(node, "Temporal dead zone - accessing a variable before it's initialized");
}
if (scope.has(node.name)) {
closure = true;
}
};
check(def, node);
traverse(def, check);
});
// we're accessing a variable that's already defined within this function
var has = scope.get(param.name);
if (has && !_.contains(node.params, has)) {
closure = true;
}
});
var body = [];
_.each(node.defaults, function (def, i) {
if (!def) return;
body.push(util.template("if-undefined-set-to", {
VARIABLE: node.params[i],
DEFAULT: def
}, true));
});
if (closure) {
var container = t.functionExpression(null, [], node.body, node.generator);
container._aliasFunction = true;
body.push(t.returnStatement(t.callExpression(container, [])));
node.body = t.blockStatement(body);
} else {
node.body.body = body.concat(node.body.body);
}
node.defaults = [];
};

View File

@@ -1,3 +0,0 @@
var regenerator = require("regenerator-6to5");
module.exports = regenerator.transform;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,151 @@
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* https://raw.githut.com/facebook/regenerator/master/LICENSE file. An
* additional grant of patent rights can be found in the PATENTS file in
* the same directory.
*/
var assert = require("assert");
var types = require("ast-types");
var t = require("../../../types");
var _ = require("lodash");
// The hoist function takes a FunctionExpression or FunctionDeclaration
// and replaces any Declaration nodes in its body with assignments, then
// returns a VariableDeclaration containing just the names of the removed
// declarations.
exports.hoist = function(funPath) {
assert.ok(funPath instanceof types.NodePath);
t.assertFunction(funPath.value);
var vars = {};
function varDeclToExpr(vdec, includeIdentifiers) {
t.assertVariableDeclaration(vdec);
var exprs = [];
vdec.declarations.forEach(function(dec) {
vars[dec.id.name] = dec.id;
if (dec.init) {
exprs.push(t.assignmentExpression(
"=", dec.id, dec.init
));
} else if (includeIdentifiers) {
exprs.push(dec.id);
}
});
if (exprs.length === 0)
return null;
if (exprs.length === 1)
return exprs[0];
return t.sequenceExpression(exprs);
}
types.visit(funPath.get("body"), {
visitVariableDeclaration: function(path) {
var expr = varDeclToExpr(path.value, false);
if (expr === null) {
path.replace();
} else {
// We don't need to traverse this expression any further because
// there can't be any new declarations inside an expression.
return t.expressionStatement(expr);
}
// Since the original node has been either removed or replaced,
// avoid traversing it any further.
return false;
},
visitForStatement: function(path) {
var init = path.value.init;
if (t.isVariableDeclaration(init)) {
path.get("init").replace(varDeclToExpr(init, false));
}
this.traverse(path);
},
visitForInStatement: function(path) {
var left = path.value.left;
if (t.isVariableDeclaration(left)) {
path.get("left").replace(varDeclToExpr(left, true));
}
this.traverse(path);
},
visitFunctionDeclaration: function(path) {
var node = path.value;
vars[node.id.name] = node.id;
var assignment = t.expressionStatement(
t.assignmentExpression(
"=",
node.id,
t.functionExpression(
node.id,
node.params,
node.body,
node.generator,
node.expression
)
)
);
if (t.isBlockStatement(path.parent.node)) {
// Insert the assignment form before the first statement in the
// enclosing block.
path.parent.get("body").unshift(assignment);
// Remove the function declaration now that we've inserted the
// equivalent assignment form at the beginning of the block.
path.replace();
} else {
// If the parent node is not a block statement, then we can just
// replace the declaration with the equivalent assignment form
// without worrying about hoisting it.
path.replace(assignment);
}
// Don't hoist variables out of inner functions.
return false;
},
visitFunctionExpression: function() {
// Don't descend into nested function expressions.
return false;
}
});
var paramNames = {};
funPath.get("params").each(function(paramPath) {
var param = paramPath.value;
if (t.isIdentifier(param)) {
paramNames[param.name] = param;
} else {
// Variables declared by destructuring parameter patterns will be
// harmlessly re-declared.
}
});
var declarations = [];
Object.keys(vars).forEach(function(name) {
if (!_.has(paramNames, name)) {
declarations.push(t.variableDeclarator(vars[name], null));
}
});
if (declarations.length === 0) {
return null; // Be sure to handle this case!
}
return t.variableDeclaration("var", declarations);
};

View File

@@ -0,0 +1 @@
module.exports = require("./visit").transform;

View File

@@ -0,0 +1,163 @@
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* https://raw.github.com/facebook/regenerator/master/LICENSE file. An
* additional grant of patent rights can be found in the PATENTS file in
* the same directory.
*/
exports.FunctionEntry = FunctionEntry;
exports.FinallyEntry = FinallyEntry;
exports.SwitchEntry = SwitchEntry;
exports.LeapManager = LeapManager;
exports.CatchEntry = CatchEntry;
exports.LoopEntry = LoopEntry;
exports.TryEntry = TryEntry;
var assert = require("assert");
var util = require("util");
var t = require("../../../types");
var inherits = util.inherits;
function Entry() {
assert.ok(this instanceof Entry);
}
function FunctionEntry(returnLoc) {
Entry.call(this);
t.assertLiteral(returnLoc);
this.returnLoc = returnLoc;
}
inherits(FunctionEntry, Entry);
function LoopEntry(breakLoc, continueLoc, label) {
Entry.call(this);
t.assertLiteral(breakLoc);
t.assertLiteral(continueLoc);
if (label) {
t.assertIdentifier(label);
} else {
label = null;
}
this.breakLoc = breakLoc;
this.continueLoc = continueLoc;
this.label = label;
}
inherits(LoopEntry, Entry);
function SwitchEntry(breakLoc) {
Entry.call(this);
t.assertLiteral(breakLoc);
this.breakLoc = breakLoc;
}
inherits(SwitchEntry, Entry);
function TryEntry(firstLoc, catchEntry, finallyEntry) {
Entry.call(this);
t.assertLiteral(firstLoc);
if (catchEntry) {
assert.ok(catchEntry instanceof CatchEntry);
} else {
catchEntry = null;
}
if (finallyEntry) {
assert.ok(finallyEntry instanceof FinallyEntry);
} else {
finallyEntry = null;
}
// Have to have one or the other (or both).
assert.ok(catchEntry || finallyEntry);
this.firstLoc = firstLoc;
this.catchEntry = catchEntry;
this.finallyEntry = finallyEntry;
}
inherits(TryEntry, Entry);
function CatchEntry(firstLoc, paramId) {
Entry.call(this);
t.assertLiteral(firstLoc);
t.assertIdentifier(paramId);
this.firstLoc = firstLoc;
this.paramId = paramId;
}
inherits(CatchEntry, Entry);
function FinallyEntry(firstLoc) {
Entry.call(this);
t.assertLiteral(firstLoc);
this.firstLoc = firstLoc;
}
inherits(FinallyEntry, Entry);
function LeapManager(emitter) {
assert.ok(this instanceof LeapManager);
var Emitter = require("./emit").Emitter;
assert.ok(emitter instanceof Emitter);
this.emitter = emitter;
this.entryStack = [new FunctionEntry(emitter.finalLoc)];
}
LeapManager.prototype.withEntry = function(entry, callback) {
assert.ok(entry instanceof Entry);
this.entryStack.push(entry);
try {
callback.call(this.emitter);
} finally {
var popped = this.entryStack.pop();
assert.strictEqual(popped, entry);
}
};
LeapManager.prototype._findLeapLocation = function(property, label) {
for (var i = this.entryStack.length - 1; i >= 0; --i) {
var entry = this.entryStack[i];
var loc = entry[property];
if (loc) {
if (label) {
if (entry.label &&
entry.label.name === label.name) {
return loc;
}
} else {
return loc;
}
}
}
return null;
};
LeapManager.prototype.getBreakLoc = function(label) {
return this._findLeapLocation("breakLoc", label);
};
LeapManager.prototype.getContinueLoc = function(label) {
return this._findLeapLocation("continueLoc", label);
};

View File

@@ -0,0 +1,98 @@
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* https://raw.github.com/facebook/regenerator/master/LICENSE file. An
* additional grant of patent rights can be found in the PATENTS file in
* the same directory.
*/
var assert = require("assert");
var types = require("ast-types");
var m = require("private").makeAccessor();
var _ = require("lodash");
var isArray = types.builtInTypes.array;
var n = types.namedTypes;
function makePredicate(propertyName, knownTypes) {
function onlyChildren(node) {
n.Node.check(node);
// Assume no side effects until we find out otherwise.
var result = false;
function check(child) {
if (result) {
// Do nothing.
} else if (isArray.check(child)) {
child.some(check);
} else if (n.Node.check(child)) {
assert.strictEqual(result, false);
result = predicate(child);
}
return result;
}
types.eachField(node, function(name, child) {
check(child);
});
return result;
}
function predicate(node) {
n.Node.check(node);
var meta = m(node);
if (_.has(meta, propertyName)) return meta[propertyName];
// Certain types are "opaque," which means they have no side
// effects or leaps and we don't care about their subexpressions.
if (_.has(opaqueTypes, node.type)) return meta[propertyName] = false;
if (_.has(knownTypes, node.type)) return meta[propertyName] = true;
return meta[propertyName] = onlyChildren(node);
}
predicate.onlyChildren = onlyChildren;
return predicate;
}
var opaqueTypes = {
FunctionExpression: true
};
// These types potentially have side effects regardless of what side
// effects their subexpressions have.
var sideEffectTypes = {
CallExpression: true, // Anything could happen!
ForInStatement: true, // Modifies the key variable.
UnaryExpression: true, // Think delete.
BinaryExpression: true, // Might invoke .toString() or .valueOf().
AssignmentExpression: true, // Side-effecting by definition.
UpdateExpression: true, // Updates are essentially assignments.
NewExpression: true // Similar to CallExpression.
};
// These types are the direct cause of all leaps in control flow.
var leapTypes = {
YieldExpression: true,
BreakStatement: true,
ContinueStatement: true,
ReturnStatement: true,
ThrowStatement: true
};
// All leap types are also side effect types.
for (var type in leapTypes) {
if (_.has(leapTypes, type)) {
sideEffectTypes[type] = leapTypes[type];
}
}
exports.hasSideEffects = makePredicate("hasSideEffects", sideEffectTypes);
exports.containsLeap = makePredicate("containsLeap", leapTypes);

View File

@@ -0,0 +1,454 @@
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* https://raw.github.com/facebook/regenerator/master/LICENSE file. An
* additional grant of patent rights can be found in the PATENTS file in
* the same directory.
*/
var iteratorSymbol = typeof Symbol === "function" && Symbol.iterator || "@@iterator";
var runtime = global.regeneratorRuntime = exports;
var hasOwn = Object.prototype.hasOwnProperty;
var wrap = runtime.wrap = function wrap(innerFn, outerFn, self, tryList) {
return new Generator(innerFn, outerFn, self || null, tryList || []);
};
var GenStateSuspendedStart = "suspendedStart";
var GenStateSuspendedYield = "suspendedYield";
var GenStateExecuting = "executing";
var GenStateCompleted = "completed";
// Returning this object from the innerFn has the same effect as
// breaking out of the dispatch switch statement.
var ContinueSentinel = {};
// Dummy constructor that we use as the .constructor property for
// functions that return Generator objects.
var GF = function GeneratorFunction() {};
var GFp = function GeneratorFunctionPrototype() {};
var Gp = GFp.prototype = Generator.prototype;
(GFp.constructor = GF).prototype =
Gp.constructor = GFp;
// Ensure isGeneratorFunction works when Function#name not supported.
var GFName = "GeneratorFunction";
if (GF.name !== GFName) GF.name = GFName;
if (GF.name !== GFName) throw new Error(GFName + " renamed?");
runtime.isGeneratorFunction = function(genFun) {
var ctor = genFun && genFun.constructor;
return ctor ? GF.name === ctor.name : false;
};
runtime.mark = function(genFun) {
genFun.__proto__ = GFp;
genFun.prototype = Object.create(Gp);
return genFun;
};
runtime.async = function(innerFn, outerFn, self, tryList) {
return new Promise(function(resolve, reject) {
var generator = wrap(innerFn, outerFn, self, tryList);
var callNext = step.bind(generator.next);
var callThrow = step.bind(generator["throw"]);
function step(arg) {
var info;
var value;
try {
info = this(arg);
value = info.value;
} catch (error) {
return reject(error);
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(callNext, callThrow);
}
}
callNext();
});
};
function Generator(innerFn, outerFn, self, tryList) {
var generator = outerFn ? Object.create(outerFn.prototype) : this;
var context = new Context(tryList);
var state = GenStateSuspendedStart;
function invoke(method, arg) {
if (state === GenStateExecuting) {
throw new Error("Generator is already running");
}
if (state === GenStateCompleted) {
throw new Error("Generator has already finished");
}
while (true) {
var delegate = context.delegate;
var info;
if (delegate) {
try {
info = delegate.iterator[method](arg);
// Delegate generator ran and handled its own exceptions so
// regardless of what the method was, we continue as if it is
// "next" with an undefined arg.
method = "next";
arg = undefined;
} catch (uncaught) {
context.delegate = null;
// Like returning generator.throw(uncaught), but without the
// overhead of an extra function call.
method = "throw";
arg = uncaught;
continue;
}
if (info.done) {
context[delegate.resultName] = info.value;
context.next = delegate.nextLoc;
} else {
state = GenStateSuspendedYield;
return info;
}
context.delegate = null;
}
if (method === "next") {
if (state === GenStateSuspendedStart &&
typeof arg !== "undefined") {
// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
throw new TypeError(
"attempt to send " + JSON.stringify(arg) + " to newborn generator"
);
}
if (state === GenStateSuspendedYield) {
context.sent = arg;
} else {
delete context.sent;
}
} else if (method === "throw") {
if (state === GenStateSuspendedStart) {
state = GenStateCompleted;
throw arg;
}
if (context.dispatchException(arg)) {
// If the dispatched exception was caught by a catch block,
// then let that catch block handle the exception normally.
method = "next";
arg = undefined;
}
} else if (method === "return") {
context.abrupt("return", arg);
}
state = GenStateExecuting;
try {
var value = innerFn.call(self, context);
// If an exception is thrown from innerFn, we leave state ===
// GenStateExecuting and loop back for another invocation.
state = context.done ? GenStateCompleted : GenStateSuspendedYield;
info = {
value: value,
done: context.done
};
if (value === ContinueSentinel) {
if (context.delegate && method === "next") {
// Deliberately forget the last sent value so that we don't
// accidentally pass it on to the delegate.
arg = undefined;
}
} else {
return info;
}
} catch (thrown) {
state = GenStateCompleted;
if (method === "next") {
context.dispatchException(thrown);
} else {
arg = thrown;
}
}
}
}
generator.next = invoke.bind(generator, "next");
generator["throw"] = invoke.bind(generator, "throw");
generator["return"] = invoke.bind(generator, "return");
return generator;
}
Gp[iteratorSymbol] = function() {
return this;
};
Gp.toString = function() {
return "[object Generator]";
};
function pushTryEntry(triple) {
var entry = { tryLoc: triple[0] };
if (1 in triple) {
entry.catchLoc = triple[1];
}
if (2 in triple) {
entry.finallyLoc = triple[2];
}
this.tryEntries.push(entry);
}
function resetTryEntry(entry, i) {
var record = entry.completion || {};
record.type = i === 0 ? "normal" : "return";
delete record.arg;
entry.completion = record;
}
function Context(tryList) {
// The root entry object (effectively a try statement without a catch
// or a finally block) gives us a place to store values thrown from
// locations where there is no enclosing try statement.
this.tryEntries = [{ tryLoc: "root" }];
tryList.forEach(pushTryEntry, this);
this.reset();
}
runtime.keys = function(object) {
var keys = [];
for (var key in object) {
keys.push(key);
}
keys.reverse();
// Rather than returning an object with a next method, we keep
// things simple and return the next function itself.
return function next() {
while (keys.length) {
var key = keys.pop();
if (key in object) {
next.value = key;
next.done = false;
return next;
}
}
// To avoid creating an additional object, we just hang the .value
// and .done properties off the next function object itself. This
// also ensures that the minifier will not anonymize the function.
next.done = true;
return next;
};
};
function values(iterable) {
var iterator = iterable;
if (iteratorSymbol in iterable) {
iterator = iterable[iteratorSymbol]();
} else if (!isNaN(iterable.length)) {
var i = -1;
iterator = function next() {
while (++i < iterable.length) {
if (i in iterable) {
next.value = iterable[i];
next.done = false;
return next;
}
}
next.done = true;
return next;
};
iterator.next = iterator;
}
return iterator;
}
runtime.values = values;
Context.prototype = {
constructor: Context,
reset: function() {
this.prev = 0;
this.next = 0;
this.sent = undefined;
this.done = false;
this.delegate = null;
this.tryEntries.forEach(resetTryEntry);
// Pre-initialize at least 20 temporary variables to enable hidden
// class optimizations for simple generators.
for (var tempIndex = 0, tempName;
hasOwn.call(this, tempName = "t" + tempIndex) || tempIndex < 20;
++tempIndex) {
this[tempName] = null;
}
},
stop: function() {
this.done = true;
var rootEntry = this.tryEntries[0];
var rootRecord = rootEntry.completion;
if (rootRecord.type === "throw") {
throw rootRecord.arg;
}
return this.rval;
},
dispatchException: function(exception) {
if (this.done) {
throw exception;
}
var context = this;
function handle(loc, caught) {
record.type = "throw";
record.arg = exception;
context.next = loc;
return !!caught;
}
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
var record = entry.completion;
if (entry.tryLoc === "root") {
// Exception thrown outside of any try block that could handle
// it, so set the completion value of the entire function to
// throw the exception.
return handle("end");
}
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc");
var hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
} else if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else if (hasCatch) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
}
} else if (hasFinally) {
if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else {
throw new Error("try statement without catch or finally");
}
}
}
},
_findFinallyEntry: function(finallyLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc <= this.prev &&
hasOwn.call(entry, "finallyLoc") && (
entry.finallyLoc === finallyLoc ||
this.prev < entry.finallyLoc)) {
return entry;
}
}
},
abrupt: function(type, arg) {
var entry = this._findFinallyEntry();
var record = entry ? entry.completion : {};
record.type = type;
record.arg = arg;
if (entry) {
this.next = entry.finallyLoc;
} else {
this.complete(record);
}
return ContinueSentinel;
},
complete: function(record) {
if (record.type === "throw") {
throw record.arg;
}
if (record.type === "break" || record.type === "continue") {
this.next = record.arg;
} else if (record.type === "return") {
this.rval = record.arg;
this.next = "end";
}
return ContinueSentinel;
},
finish: function(finallyLoc) {
var entry = this._findFinallyEntry(finallyLoc);
return this.complete(entry.completion);
},
"catch": function(tryLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
var thrown;
if (record.type === "throw") {
thrown = record.arg;
resetTryEntry(entry, i);
}
return thrown;
}
}
// The context.catch method must only be called with a location
// argument that corresponds to a known catch block.
throw new Error("illegal catch attempt");
},
delegateYield: function(iterable, resultName, nextLoc) {
this.delegate = {
iterator: values(iterable),
resultName: resultName,
nextLoc: nextLoc
};
return ContinueSentinel;
}
};

View File

@@ -0,0 +1,18 @@
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* https://raw.github.com/facebook/regenerator/master/LICENSE file. An
* additional grant of patent rights can be found in the PATENTS file in
* the same directory.
*/
var t = require("../../../types");
exports.runtimeProperty = function (name) {
return t.memberExpression(
t.identifier("regeneratorRuntime"),
t.identifier(name)
);
};

View File

@@ -0,0 +1,219 @@
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* https://raw.githut.com/facebook/regenerator/master/LICENSE file. An
* additional grant of patent rights can be found in the PATENTS file in
* the same directory.
*/
var runtimeProperty = require("./util").runtimeProperty;
var Emitter = require("./emit").Emitter;
var hoist = require("./hoist").hoist;
var types = require("ast-types");
var t = require("../../../types");
var runtimeAsyncMethod = runtimeProperty("async");
var runtimeWrapMethod = runtimeProperty("wrap");
var runtimeMarkMethod = runtimeProperty("mark");
exports.transform = function transform(node) {
return types.visit(node, visitor);
};
var visitor = types.PathVisitor.fromMethodsObject({
visitFunction: function(path) {
// Calling this.traverse(path) first makes for a post-order traversal.
this.traverse(path);
var node = path.value;
if (!node.generator && !node.async) {
return;
}
node.generator = false;
if (node.expression) {
// Transform expression lambdas into normal functions.
node.expression = false;
node.body = t.blockStatement([
t.returnStatement(node.body)
]);
}
if (node.async) {
awaitVisitor.visit(path.get("body"));
}
var outerFnId = node.id || (
node.id = path.scope.parent.declareTemporary("callee$")
);
var innerFnId = t.identifier(node.id.name + "$");
var contextId = path.scope.declareTemporary("context$");
var vars = hoist(path);
var emitter = new Emitter(contextId);
emitter.explode(path.get("body"));
var outerBody = [];
if (vars && vars.declarations.length > 0) {
outerBody.push(vars);
}
var wrapArgs = [
emitter.getContextFunction(innerFnId),
// Async functions don't care about the outer function because they
// don't need it to be marked and don't inherit from its .prototype.
node.async ? t.literal(null) : outerFnId,
t.thisExpression()
];
var tryEntryList = emitter.getTryEntryList();
if (tryEntryList) {
wrapArgs.push(tryEntryList);
}
var wrapCall = t.callExpression(
node.async ? runtimeAsyncMethod : runtimeWrapMethod,
wrapArgs
);
outerBody.push(t.returnStatement(wrapCall));
node.body = t.blockStatement(outerBody);
if (node.async) {
node.async = false;
return;
}
if (t.isFunctionDeclaration(node)) {
var pp = path.parent;
while (pp && !(t.isBlockStatement(pp.value) || t.isProgram(pp.value))) {
pp = pp.parent;
}
if (!pp) {
return;
}
// Here we turn the FunctionDeclaration into a named
// FunctionExpression that will be assigned to a variable of the
// same name at the top of the enclosing block. This is important
// for a very subtle reason: named function expressions can refer to
// themselves by name without fear that the binding may change due
// to code executing outside the function, whereas function
// declarations are vulnerable to the following rebinding:
//
// function f() { return f }
// var g = f;
// f = "asdf";
// g(); // "asdf"
//
// One way to prevent the problem illustrated above is to transform
// the function declaration thus:
//
// var f = function f() { return f };
// var g = f;
// f = "asdf";
// g(); // f
// g()()()()(); // f
//
// In the code below, we transform generator function declarations
// in the following way:
//
// gen().next(); // { value: gen, done: true }
// function *gen() {
// return gen;
// }
//
// becomes something like
//
// var gen = runtime.mark(function *gen() {
// return gen;
// });
// gen().next(); // { value: gen, done: true }
//
// which ensures that the generator body can always reliably refer
// to gen by name.
// Remove the FunctionDeclaration so that we can add it back as a
// FunctionExpression passed to runtime.mark.
path.replace();
// Change the type of the function to be an expression instead of a
// declaration. Note that all the other fields are the same.
node.type = "FunctionExpression";
var varDecl = t.variableDeclaration("var", [
t.variableDeclarator(
node.id,
t.callExpression(runtimeMarkMethod, [node])
)
]);
if (node.comments) {
// Copy any comments preceding the function declaration to the
// variable declaration, to avoid weird formatting consequences.
varDecl.comments = node.comments;
node.comments = null;
}
var bodyPath = pp.get("body");
var bodyLen = bodyPath.value.length;
for (var i = 0; i < bodyLen; ++i) {
var firstStmtPath = bodyPath.get(i);
if (!shouldNotHoistAbove(firstStmtPath)) {
firstStmtPath.insertBefore(varDecl);
return;
}
}
bodyPath.push(varDecl);
} else {
t.assertFunctionExpression(node);
return t.callExpression(runtimeMarkMethod, [node]);
}
}
});
function shouldNotHoistAbove(stmtPath) {
var value = stmtPath.value;
t.assertStatement(value);
// If the first statement is a "use strict" declaration, make sure to
// insert hoisted declarations afterwards.
if (t.isExpressionStatement(value) &&
t.isLiteral(value.expression) &&
value.expression.value === "use strict") {
return true;
}
if (t.isVariableDeclaration(value)) {
for (var i = 0; i < value.declarations.length; ++i) {
var decl = value.declarations[i];
if (t.isCallExpression(decl.init) && types.astNodesAreEquivalent(decl.init.callee, runtimeMarkMethod)) {
return true;
}
}
}
return false;
}
var awaitVisitor = types.PathVisitor.fromMethodsObject({
visitFunction: function() {
return false; // Don't descend into nested function scopes.
},
visitAwaitExpression: function(path) {
// Convert await expressions to yield expressions.
return t.yieldExpression(path.value.argument, false);
}
});

View File

@@ -74,7 +74,6 @@ function LetScoping(forParent, block, parent, file, scope) {
this.letReferences = {};
this.body = [];
this.info = this.getInfo();
}
/**
@@ -87,8 +86,13 @@ LetScoping.prototype.run = function () {
if (block._letDone) return;
block._letDone = true;
this.info = this.getInfo();
// remap all let references that exist in upper scopes to their uid
this.remap();
// this is a block within a `Function` so we can safely leave it be
if (t.isFunction(this.parent)) return;
if (t.isFunction(this.parent)) return this.noClosure();
// this block has no let references so let's clean up
if (!this.info.keys.length) return this.noClosure();
@@ -127,27 +131,39 @@ LetScoping.prototype.run = function () {
var call = t.callExpression(fn, params);
var ret = t.identifier(this.file.generateUid("ret", this.scope));
var hasYield = traverse.hasType(fn.body, "YieldExpression", t.FUNCTION_TYPES);
if (hasYield) {
fn.generator = true;
call = t.yieldExpression(call, true);
}
this.build(ret, call);
};
/**
* There are no let references accessed within a closure so we can just traverse
* through this block and replace all references that exist in a higher scope to
* their uids.
* There are no let references accessed within a closure so we can just turn the
* lets into vars.
*/
LetScoping.prototype.noClosure = function () {
var replacements = this.info.duplicates;
var declarators = this.info.declarators;
var block = this.block;
standardiseLets(this.info.declarators);
};
standardiseLets(declarators);
/**
* Traverse through block and replace all references that exist in a higher
* scope to their uids.
*/
LetScoping.prototype.remap = function () {
var replacements = this.info.duplicates;
var block = this.block;
if (_.isEmpty(replacements)) return;
var replace = function (node, parent) {
var replace = function (node, parent, scope) {
if (!t.isIdentifier(node)) return;
if (!t.isReferenced(node, parent)) return;
if (scope && scope.hasOwn(node.name)) return;
node.name = replacements[node.name] || node.name;
};
@@ -244,28 +260,34 @@ LetScoping.prototype.checkFor = function () {
hasBreak: false,
};
if (this.forParent) {
traverse(this.block, function (node) {
var replace;
var forParent = this.forParent;
if (t.isFunction(node) || t.isFor(node)) {
return false;
} else if (t.isBreakStatement(node) && !node.label) {
traverse(this.block, function (node) {
var replace;
if (t.isFunction(node) || t.isFor(node)) {
return false;
}
if (forParent && node && !node.label) {
if (t.isBreakStatement(node)) {
has.hasBreak = true;
replace = t.returnStatement(t.literal("break"));
} else if (t.isContinueStatement(node) && !node.label) {
} else if (t.isContinueStatement(node)) {
has.hasContinue = true;
replace = t.returnStatement(t.literal("continue"));
} else if (t.isReturnStatement(node)) {
has.hasReturn = true;
replace = t.returnStatement(t.objectExpression([
t.property("init", t.identifier("v"), node.argument || t.identifier("undefined"))
]));
}
}
if (replace) return t.inherits(replace, node);
});
}
if (t.isReturnStatement(node)) {
has.hasReturn = true;
replace = t.returnStatement(t.objectExpression([
t.property("init", t.identifier("v"), node.argument || t.identifier("undefined"))
]));
}
if (replace) return t.inherits(replace, node);
});
return has;
};

View File

@@ -106,11 +106,35 @@ exports.XJSElement = {
exit: function (node) {
var callExpr = node.openingElement;
var childrenToRender = node.children.filter(function(child) {
return !(t.isLiteral(child) && _.isString(child.value) && child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/));
});
_.each(node.children, function (child) {
if (t.isLiteral(child)) {
var lines = child.value.split(/\r\n|\n|\r/);
_.each(lines, function (line, i) {
var isFirstLine = i === 0;
var isLastLine = i === lines.length - 1;
// replace rendered whitespace tabs with spaces
var trimmedLine = line.replace(/\t/g, ' ');
// trim whitespace touching a newline
if (!isFirstLine) {
trimmedLine = trimmedLine.replace(/^[ ]+/, '');
}
// trim whitespace touching an endline
if (!isLastLine) {
trimmedLine = trimmedLine.replace(/[ ]+$/, '');
}
if (trimmedLine) {
callExpr.arguments.push(t.literal(trimmedLine));
}
});
return;
}
_.each(childrenToRender, function (child) {
callExpr.arguments.push(child);
});

View File

@@ -29,25 +29,32 @@ function traverse(parent, callbacks, opts) {
// normalise callbacks
if (_.isFunction(callbacks)) callbacks = { enter: callbacks };
_.each(keys, function (key) {
for (var i in keys) {
var key = keys[i];
var nodes = parent[key];
if (!nodes) return;
if (!nodes) continue;
var updated = false;
var handle = function (obj, key) {
var node = obj[key];
if (!node) return;
// type is blacklisted
if (_.contains(blacklistTypes, node.type)) return;
if (blacklistTypes.indexOf(node.type) > -1) return;
// replace node
var maybeReplace = function (result) {
if (result === false) return;
if (result != null) node = obj[key] = result;
if (result != null) {
updated = true;
node = obj[key] = result;
}
};
//
var opts2 = _.clone(opts);
var opts2 = { scope: opts.scope, blacklist: opts.blacklist };
if (t.isScope(node)) opts2.scope = new Scope(opts.scope, node);
// enter
@@ -69,15 +76,15 @@ function traverse(parent, callbacks, opts) {
};
if (_.isArray(nodes)) {
_.each(nodes, function (node, i) {
for (i in nodes) {
handle(nodes, i);
});
}
parent[key] = _.flatten(parent[key]);
if (updated) parent[key] = _.flatten(parent[key]);
} else {
handle(parent, key);
}
});
}
}
traverse.removeProperties = function (tree) {

View File

@@ -9,24 +9,30 @@ var FOR_KEYS = ["left", "init"];
function Scope(parent, block) {
this.parent = parent;
this.block = block;
this.ids = this.getIds();
this.getIds();
this.info = this.getInfo();
this.declarations = this.info.declarations;
}
Scope.prototype.getIds = function () {
Scope.prototype.getInfo = function () {
var block = this.block;
if (block._scopeIds) return block._scopeIds;
if (block._scope) return block._scope;
var self = this;
var ids = block._scopeIds = {};
var info = block._scope = {
declarations: {}
};
var add = function (node) {
self.addDeclaration(node, info.declarations);
};
// ForStatement - left, init
if (t.isFor(block)) {
_.each(FOR_KEYS, function (key) {
var node = block[key];
if (t.isLet(node)) self.add(node, ids);
if (t.isLet(node)) add(node);
});
block = block.body;
@@ -37,14 +43,14 @@ Scope.prototype.getIds = function () {
if (t.isBlockStatement(block) || t.isProgram(block)) {
_.each(block.body, function (node) {
// check for non-var `VariableDeclaration`s
if (t.isLet(node)) self.add(node, ids);
if (t.isLet(node)) add(node);
});
}
// CatchClause - param
if (t.isCatchClause(block)) {
self.add(block.param, ids);
add(block.param);
}
// Program, Function - var variables
@@ -54,7 +60,7 @@ Scope.prototype.getIds = function () {
if (t.isFor(node)) {
_.each(FOR_KEYS, function (key) {
var declar = node[key];
if (t.isVar(declar)) self.add(declar, ids);
if (t.isVar(declar)) add(declar);
});
}
@@ -65,26 +71,26 @@ Scope.prototype.getIds = function () {
// we've ran into a declaration!
// we'll let the BlockStatement scope deal with `let` declarations
if (t.isDeclaration(node) && !t.isLet(node)) {
self.add(node, ids);
add(node);
}
});
}
// Function - params
// Function - params, rest
if (t.isFunction(block)) {
this.add(block.rest, ids);
add(block.rest);
_.each(block.params, function (param) {
self.add(param, ids);
add(param);
});
}
return ids;
return info;
};
Scope.prototype.add = function (node, ids) {
Scope.prototype.addDeclaration = function (node, declarations) {
if (!node) return;
_.merge(ids || this.ids, t.getIds(node, true));
_.merge(declarations || this.declarations, t.getIds(node, true));
};
Scope.prototype.get = function (id) {
@@ -92,7 +98,7 @@ Scope.prototype.get = function (id) {
};
Scope.prototype.getOwn = function (id) {
return _.has(this.ids, id) && this.ids[id];
return _.has(this.declarations, id) && this.declarations[id];
};
Scope.prototype.parentGet = function (id) {

View File

@@ -19,7 +19,9 @@
"Property": ["kind", "key", "value", "computed"],
"ReturnStatement": ["argument"],
"SequenceExpression": ["expressions"],
"ThrowExpression": ["argument"],
"UnaryExpression": ["operator", "argument", "prefix"],
"VariableDeclaration": ["kind", "declarations"],
"VariableDeclarator": ["id", "init"]
"VariableDeclarator": ["id", "init"],
"YieldExpression": ["argument", "delegate"]
}

View File

@@ -2,14 +2,25 @@ var _ = require("lodash");
var t = exports;
var addAssert = function (type, is) {
t["assert" + type] = function (node, opts) {
opts = opts || {};
if (!is(node, opts)) {
throw new Error("Expected type " + JSON.stringify(type) + " with option " + JSON.stringify(opts));
}
};
};
//
t.VISITOR_KEYS = require("./visitor-keys");
_.each(t.VISITOR_KEYS, function (keys, type) {
t["is" + type] = function (node, opts) {
var is = t["is" + type] = function (node, opts) {
return node && node.type === type && t.shallowEqual(node, opts);
};
addAssert(type, is);
});
//
@@ -43,13 +54,23 @@ _.each(t.ALIAS_KEYS, function (aliases, type) {
_.each(_aliases, function (types, type) {
t[type.toUpperCase() + "_TYPES"] = types;
t["is" + type] = function (node, opts) {
var is = t["is" + type] = function (node, opts) {
return node && _.contains(types, node.type) && t.shallowEqual(node, opts);
};
addAssert(type, is);
});
//
t.isExpression = function (node) {
return !t.isStatement(node);
};
addAssert("Expression", t.isExpression);
//
t.shallowEqual = function (actual, expected) {
var same = true;
@@ -70,6 +91,9 @@ t.isReferenced = function (node, parent) {
// we're a property key so we aren't referenced
if (t.isProperty(parent) && parent.key === node) return false;
// we're a variable declarator id so we aren't referenced
if (t.isVariableDeclarator(parent) && parent.id === node) return false;
var isMemberExpression = t.isMemberExpression(parent);
// we're in a member expression and we're the computed property so we're referenced
@@ -161,7 +185,7 @@ t.toBlock = function (node, parent) {
t.getIds = function (node, map, ignoreTypes) {
ignoreTypes = ignoreTypes || [];
var search = [node];
var search = [].concat(node);
var ids = {};
while (search.length) {
@@ -185,14 +209,6 @@ t.getIds = function (node, map, ignoreTypes) {
return ids;
};
t.isLet = function (node) {
return t.isVariableDeclaration(node) && (node.kind !== "var" || node._let);
};
t.isVar = function (node) {
return t.isVariableDeclaration(node, { kind: "var" }) && !node._let;
};
t.getIds.nodes = {
AssignmentExpression: "left",
ImportSpecifier: "id",
@@ -214,13 +230,32 @@ t.getIds.arrays = {
ObjectPattern: "properties"
};
t.isLet = function (node) {
return t.isVariableDeclaration(node) && (node.kind !== "var" || node._let);
};
t.isVar = function (node) {
return t.isVariableDeclaration(node, { kind: "var" }) && !node._let;
};
t.removeComments = function (child) {
delete child.leadingComments;
delete child.trailingComments;
return child;
};
t.inheritsComments = function (child, parent) {
child.leadingComments = _.compact([].concat(child.leadingComments, parent.leadingComments));
child.trailingComments = _.compact([].concat(child.trailingComments, parent.trailingComments));
return child;
};
t.inherits = function (child, parent) {
child.loc = parent.loc;
child.end = parent.end;
child.range = parent.range;
child.start = parent.start;
child.leadingComments = parent.leadingComments;
child.trailingComments = parent.trailingComments;
child.loc = parent.loc;
child.end = parent.end;
child.range = parent.range;
child.start = parent.start;
t.inheritsComments(child, parent);
return child;
};

View File

@@ -37,6 +37,21 @@ exports.list = function (val) {
return val ? val.split(",") : [];
};
exports.regexify = function (val) {
if (!val) return new RegExp;
if (_.isArray(val)) val = val.join("|");
if (_.isString(val)) return new RegExp(val || "");
if (_.isRegExp(val)) return val;
throw new TypeError("illegal type for regexify");
};
exports.arrayify = function (val) {
if (!val) return [];
if (_.isString(val)) return exports.list(val);
if (_.isArray(val)) return val;
throw new TypeError("illegal type for arrayify");
};
exports.getUid = function (parent, file) {
var node;
@@ -106,8 +121,13 @@ exports.buildDefineProperties = function (mutatorMap) {
if (key[0] === "_") return;
node = _.clone(node);
var inheritNode = node;
if (t.isMethodDefinition(node)) node = node.value;
mapNode.properties.push(t.property("init", t.identifier(key), node));
var prop = t.property("init", t.identifier(key), node);
t.inheritsComments(prop, inheritNode);
t.removeComments(inheritNode);
mapNode.properties.push(prop);
});
objExpr.properties.push(propNode);
@@ -271,9 +291,5 @@ try {
} catch (err) {
if (err.code !== "MODULE_NOT_FOUND") throw err;
Object.defineProperty(exports, "templates", {
get: function () {
return exports.templates = loadTemplates();
}
});
exports.templates = loadTemplates();
}

View File

@@ -1,7 +1,7 @@
{
"name": "6to5",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "1.12.13",
"version": "1.12.21",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://github.com/6to5/6to5",
"repository": {
@@ -44,12 +44,12 @@
"es6-symbol": "0.1.1",
"regexpu": "0.3.0",
"source-map": "0.1.40",
"regenerator-6to5": "https://github.com/6to5/regenerator-6to5/archive/75925940a7bb67d1ee8afec36b6d6eec072fb47c.tar.gz",
"chokidar": "0.10.5",
"source-map-support": "0.2.8",
"esutils": "1.1.4",
"acorn-6to5": "https://github.com/6to5/acorn-6to5/archive/a6c34ba73e215bd16ee585f6794f6a6587820c58.tar.gz",
"estraverse": "^1.7.0"
"acorn-6to5": "0.9.1-2",
"estraverse": "^1.7.0",
"private": "^0.1.6"
},
"devDependencies": {
"istanbul": "0.3.2",

View File

@@ -0,0 +1,33 @@
var assert = require("assert");
exports.check = function check(g, yields, returnValue) {
for (var i = 0; i < yields.length; ++i) {
var info = i > 0 ? g.next(i) : g.next();
assert.deepEqual(info.value, yields[i]);
assert.strictEqual(info.done, false);
}
assert.deepEqual(
i > 0 ? g.next(i) : g.next(),
{ value: returnValue, done: true }
);
};
// A version of `throw` whose behavior can't be statically analyzed.
// Useful for testing dynamic exception dispatching.
exports.raise = function raise(argument) {
throw argument;
};
exports.assertAlreadyFinished = function assertAlreadyFinished(generator) {
try {
generator.next();
assert.ok(false, "should have thrown an exception");
} catch (err) {
assert.ok(err instanceof Error);
assert.strictEqual(
err.message,
"Generator has already finished"
);
}
};

View File

@@ -48,8 +48,9 @@ exports.get = function (entryName) {
var execLoc = taskDir + "/exec.js";
var taskOpts = _.merge({
filename: actualLocAlias,
sourceMapName: expectLocAlias
filenameRelative: expectLocAlias,
sourceFileName: actualLocAlias,
sourceMapName: expectLocAlias
}, _.cloneDeep(suite.options));
var taskOptsLoc = taskDir + "/options.json";
@@ -60,6 +61,7 @@ exports.get = function (entryName) {
disabled: taskName[0] === ".",
options: taskOpts,
exec: {
loc: execLoc,
code: readFile(execLoc),
filename: execLocAlias,
},

View File

@@ -1,3 +1,4 @@
"use strict";
var Test = function Test() {};
//# sourceMappingURL=bar.js.map

View File

@@ -3,3 +3,4 @@
arr.map(function (x) {
return x * MULTIPLIER;
});
//# sourceMappingURL=foo.js.map

View File

@@ -6,3 +6,5 @@ var Test = function Test() {};
arr.map(function (x) {
return x * MULTIPLIER;
});
//# sourceMappingURL=script3.js.map

View File

@@ -3,3 +3,5 @@
arr.map(function (x) {
return x * x;
});
//# sourceMappingURL=test.js.map

View File

@@ -0,0 +1,7 @@
Copyright (c) 2014, Facebook, Inc.
All rights reserved.
This source code is licensed under the BSD-style license found in the
https://raw.github.com/facebook/regenerator/master/LICENSE file. An
additional grant of patent rights can be found in the PATENTS file in
the same directory.

View File

@@ -0,0 +1,26 @@
async function outer(value) {
var resolved = false;
var p1 = new Promise(function(resolve) {
setTimeout(function() {
resolve(value + 1);
resolved = true;
}, 0);
});
assert.strictEqual(resolved, false);
var v2 = await p1.then(function(value) {
return value + 1;
});
assert.strictEqual(resolved, true);
var v1 = await p1;
return [v1, v2];
}
outer(1).then(function(pair) {
assert.deepEqual(pair, [2, 3]);
done();
}).catch(done);

View File

@@ -0,0 +1,40 @@
var markers = [];
async function innerMost(marker) {
markers.push(marker);
return await marker;
}
async function inner(marker) {
markers.push(marker);
assert.strictEqual(
await innerMost(marker + 1),
marker + 1
);
markers.push(marker + 2);
assert.strictEqual(
await innerMost(marker + 3),
marker + 3
);
markers.push(marker + 4);
}
async function outer() {
markers.push(0);
await inner(1);
markers.push(6);
await inner(7);
markers.push(12);
}
outer().then(function() {
var expected = [];
for (var i = 0; i <= 12; ++i)
expected.push(i);
assert.deepEqual(markers, expected);
done();
}).catch(done);

View File

@@ -0,0 +1,15 @@
var called = false;
async function noAwait(value) {
called = true;
return value;
}
var promise = noAwait("asdf");
assert.strictEqual(called, true);
promise.then(function(value) {
assert.strictEqual(called, true);
assert.strictEqual(value, "asdf");
done();
}).catch(done);

View File

@@ -0,0 +1,19 @@
var flag1 = false;
var flag2 = false;
async function oneAwait(value) {
flag1 = true;
var result = await value;
flag2 = true;
return result;
}
var promise = oneAwait("asdf");
assert.strictEqual(flag1, true);
assert.strictEqual(flag2, false);
promise.then(function(value) {
assert.strictEqual(flag2, true);
assert.strictEqual(value, "asdf");
done();
}).catch(done);

View File

@@ -0,0 +1,3 @@
{
"asyncExec": true
}

View File

@@ -0,0 +1,42 @@
var error = new Error("rejected");
async function e(arg) {
if (arg) {
throw arg;
}
return "did not throw";
}
async function f(arg) {
return await e(arg);
}
async function g(arg) {
return await f(arg);
}
async function h(arg) {
return await Promise.all([
g(arg),
Promise.resolve("dummy")
]);
}
Promise.all([
h(error).then(function() {
done(new Error("should not have resolved"));
}, function(e) {
assert.strictEqual(e, error);
return "ok1";
}),
h(null).then(function(result) {
assert.deepEqual(result, [
"did not throw",
"dummy"
]);
return "ok2";
})
]).then(function(results) {
assert.deepEqual(results, ["ok1", "ok2"]);
done();
}).catch(done);

View File

@@ -0,0 +1,21 @@
var error = new Error("rejected");
async function f(arg) {
try {
return await arg;
} catch (e) {
assert.strictEqual(e, error);
return "did throw";
}
}
Promise.all([
f(Promise.reject(error)),
f(Promise.resolve("did not throw"))
]).then(function(results) {
assert.deepEqual(results, [
"did throw",
"did not throw"
]);
done();
}).catch(done);

View File

@@ -19,7 +19,7 @@ var _extends = function (child, parent) {
var Test = (function (Foo) {
var Test = function Test() {
woops.super.test();
woops["super"].test();
Foo.call(this);
Foo.prototype.test.call(this);
foob(Foo);

View File

@@ -1,8 +1,8 @@
"use strict";
var t = function (t, f) {
if (f === undefined) f = 5;
if (t === undefined) t = "foo";
if (f === undefined) f = 5;
return t + " bar " + f;
};

View File

@@ -0,0 +1 @@
function foo(a=b, b) {}

View File

@@ -0,0 +1,3 @@
{
"throws": "Temporal dead zone - accessing a variable before it's initialized"
}

View File

@@ -0,0 +1,4 @@
assert.equal((function(a, b=a++){
function b(){}
return a;
})(1), 2);

View File

@@ -0,0 +1 @@
function foo(a=a) {}

View File

@@ -0,0 +1,3 @@
{
"throws": "Temporal dead zone - accessing a variable before it's initialized"
}

View File

@@ -0,0 +1,7 @@
Copyright (c) 2014, Facebook, Inc.
All rights reserved.
This source code is licensed under the BSD-style license found in the
https://raw.github.com/facebook/regenerator/master/LICENSE file. An
additional grant of patent rights can be found in the PATENTS file in
the same directory.

View File

@@ -0,0 +1,24 @@
function *gen() {
var a$0 = 0, a$1 = 1;
let a = 3;
{
let a = 1;
yield a + a$0;
}
{
let a = 2;
yield a - 1 + a$1;
}
yield a;
}
var g = gen();
assert.deepEqual(g.next(), { value: 1, done: false });
assert.deepEqual(g.next(), { value: 2, done: false });
assert.deepEqual(g.next(), { value: 3, done: false });
assert.deepEqual(g.next(), { value: void 0, done: true });

View File

@@ -0,0 +1,22 @@
function *gen() {
let arr = [];
for (let x = 0; x < 3; x++) {
let y = x;
arr.push(function() { return y; });
}
{
let x;
while( x = arr.pop() ) {
yield x;
}
}
}
var g = gen();
assert.equal(g.next().value(), 2);
assert.equal(g.next().value(), 1);
assert.equal(g.next().value(), 0);
assert.deepEqual(g.next(), { value: void 0, done: true });

View File

@@ -0,0 +1,15 @@
function *gen() {
try {
genHelpers.raise("e1");
} catch (e) {
yield e;
try {
genHelpers.raise("e2");
} catch (e) {
yield e;
}
yield e;
}
}
genHelpers.check(gen(), ["e1", "e2", "e1"]);

View File

@@ -0,0 +1,22 @@
function *gen(x) {
var y = x + 1;
try {
throw x + 2;
} catch (x) {
yield x;
x += 1;
yield x;
}
yield x;
try {
throw x + 3;
} catch (y) {
yield y;
y *= 2;
yield y;
}
yield y;
}
genHelpers.check(gen(1), [3, 4, 1, 4, 8, 2]);
genHelpers.check(gen(2), [4, 5, 2, 5, 10, 3]);

View File

@@ -0,0 +1,32 @@
function *gen(x) {
try {
throw x;
} catch (x) {
yield x;
yield (function(x) {
return x += 1;
}(x + 1));
yield (function() {
var x = arguments[0];
return x * 2;
}(x + 2));
yield (function() {
function notCalled(x) {
throw x;
}
x >>= 1;
return x;
}());
yield x -= 1;
}
yield x;
}
genHelpers.check(gen(10), [10, 12, 24, 5, 4, 10]);
genHelpers.check(gen(11), [11, 13, 26, 5, 4, 11]);

View File

@@ -0,0 +1,42 @@
function *gen(n) {
var count = 0;
yield n;
while (n !== 1) {
count += 1;
if (n % 2) {
yield n = n * 3 + 1;
} else {
yield n >>= 1;
}
}
return count;
}
function collatz(n) {
var result = [n];
while (n !== 1) {
if (n % 2) {
n *= 3;
n += 1;
} else {
n >>= 1;
}
result.push(n);
}
return result;
}
var seven = collatz(7);
var fiftyTwo = seven.slice(seven.indexOf(52));
var eightyTwo = collatz(82);
genHelpers.check(gen(7), seven, 16);
genHelpers.check(gen(52), fiftyTwo, 11);
genHelpers.check(gen(82), eightyTwo, 110);

View File

@@ -0,0 +1,11 @@
function *gen() {
return "ALL DONE";
}
var g = gen();
assert.deepEqual(g.next(), {
value: "ALL DONE", done: true
});
genHelpers.assertAlreadyFinished(g);

View File

@@ -0,0 +1,27 @@
var error = new Error("thrown");
function *outer(n) {
try {
yield 0;
yield* inner(n);
yield 1;
} catch (err) {
yield err.message;
}
yield 4;
}
function *inner(n) {
while (n --> 0) {
try {
if (n === 3) {
genHelpers.raise(error);
}
} finally {
yield n;
}
}
}
genHelpers.check(outer(3), [0, 2, 1, 0, 1, 4]);
genHelpers.check(outer(5), [0, 4, 3, "thrown", 4]);

View File

@@ -0,0 +1,10 @@
function *gen(condition) {
if (condition) {
yield 0;
yield* gen(false);
yield 1;
}
}
genHelpers.check(gen(true), [0, 1]);
genHelpers.check(gen(false), []);

View File

@@ -0,0 +1,12 @@
function *gen(condition) {
yield 0;
if (condition) {
yield 1;
yield* gen(false);
yield 2;
}
yield 3;
}
genHelpers.check(gen(true), [0, 1, 0, 3, 2, 3]);
genHelpers.check(gen(false), [0, 3]);

View File

@@ -0,0 +1,37 @@
var count = 0;
function *gen() {
yield* inner();
try {
yield* inner();
} catch (err) {
// pass
}
return yield* inner();
}
function *inner() {
return yield count++;
}
var g = gen();
assert.deepEqual(g.next(), {
value: 0,
done: false
});
assert.deepEqual(g.next(), {
value: 1,
done: false
});
assert.deepEqual(g.throw(new Error("lol")), {
value: 2,
done: false,
});
assert.deepEqual(g.next("sent"), {
value: "sent",
done: true
});

View File

@@ -0,0 +1,15 @@
function *outer(n) {
yield* inner(n << 1);
yield "zxcv";
}
function *inner(n) {
return yield yield yield n;
}
var g = outer(3);
assert.deepEqual(g.next(), { value: 6, done: false });
assert.deepEqual(g.next(1), { value: 1, done: false });
assert.deepEqual(g.next(2), { value: 2, done: false });
assert.deepEqual(g.next(4), { value: "zxcv", done: false });
assert.deepEqual(g.next(5), { value: void 0, done: true });

View File

@@ -0,0 +1,18 @@
function *outer(n) {
yield n;
yield* middle(n - 1, inner(n + 10));
yield n + 1;
}
function *middle(n, plusTen) {
yield n;
yield* inner(n - 1);
yield n + 1;
yield* plusTen;
}
function *inner(n) {
yield n;
}
genHelpers.check(outer(5), [5, 4, 3, 5, 15, 6]);

View File

@@ -0,0 +1,11 @@
function *gen() {
yield 0;
yield* [
yield "one",
yield "two",
yield "three"
];
yield 5;
}
genHelpers.check(gen(), [0, "one", "two", "three", 2, 3, 4, 5]);

View File

@@ -0,0 +1,20 @@
function *gen(x, fname) {
try {
return fns[fname](x);
} catch (thrown) {
yield thrown;
}
}
var fns = {
f: function(x) {
throw x;
},
g: function(x) {
return x;
}
};
genHelpers.check(gen("asdf", "f"), ["asdf"]);
genHelpers.check(gen("asdf", "g"), [], "asdf");

View File

@@ -0,0 +1,16 @@
function *gen(x) {
while (x) {
// empty while loop
}
do {
// empty do-while loop
} while (x);
return gen.toString();
}
var info = gen(false).next();
assert.strictEqual(info.done, true);
assert.ok(/do \{/.test(info.value));
assert.ok(/while \(/.test(info.value));

View File

@@ -0,0 +1,19 @@
function *gen(obj) {
var count = 0;
for (var key in (yield "why not", obj)) {
if (obj.hasOwnProperty(key)) {
if (key === "skip") {
break;
}
count += 1;
yield [key, obj[key]];
}
}
return count;
}
genHelpers.check(
gen({ a: 1, b: 2, skip: 3, c: 4 }),
["why not", ["a", 1], ["b", 2]],
2
);

View File

@@ -0,0 +1,13 @@
function *gen() {
var count = 0;
var obj = {foo: 1, bar: 2};
for (var key in obj) {
assert(obj.hasOwnProperty(key), key + " must be own property");
yield [key, obj[key]];
delete obj.bar;
count += 1;
}
return count;
}
genHelpers.check(gen(), [["foo", 1]], 1);

View File

@@ -0,0 +1,26 @@
function a(sent) {
assert.strictEqual(sent, 1);
a.called = true;
}
function b(sent) {
assert.strictEqual(sent, 2);
b.called = true;
return { callee: b };
}
function *gen() {
assert.ok(!a.called);
assert.ok(!b.called);
for (var key in a(yield 0), b(yield 1)) {
assert.ok(a.called);
assert.ok(b.called);
assert.strictEqual(yield key, 3);
}
for (var key in a(1), { foo: "foo", bar: "bar" }) {
yield key;
}
}
genHelpers.check(gen(), [0, 1, "callee", "foo", "bar"]);

View File

@@ -0,0 +1,12 @@
function *gen() {
var count = 0;
var obj = {foo: 1, bar: 2};
for (var key in obj) {
assert(obj.hasOwnProperty(key), key + " must be own property");
yield [key, obj[key]];
count += 1;
}
return count;
}
genHelpers.check(gen(), [["foo", 1], ["bar", 2]], 2);

View File

@@ -0,0 +1,16 @@
function *gen() {
var count = 0;
function Foo() {
this.baz = 1
}
Foo.prototype.bar = 2;
var foo = new Foo();
for (var key in foo) {
yield [key, foo[key]];
count += 1;
}
return count;
}
genHelpers.check(gen(), [["baz", 1], ["bar", 2]], 2);

View File

@@ -0,0 +1,7 @@
// https://github.com/facebook/regenerator/issues/103
function *range() {
for (var i = 0; false; ) {
}
}
genHelpers.check(range(), []);

View File

@@ -0,0 +1,5 @@
var sum = 0;
for (var x of [1, 2].concat(3)) {
sum += x;
}
assert.strictEqual(sum, 6);

View File

@@ -0,0 +1,10 @@
function *range(n) {
for (var i = 0; i < n; ++i) {
yield i;
}
}
var value, values = [];
for (value of range(3))
values.push(value);
assert.deepEqual(values, [0, 1, 2]);

View File

@@ -0,0 +1,45 @@
function *yieldPermutations(list) {
if (list.length < 2) {
yield list;
return 1;
}
var count = 0;
var first = list.slice(0, 1);
var genRest = yieldPermutations(list.slice(1));
for (var perm of genRest) {
for (var i = 0; i < list.length; ++i) {
var prefix = perm.slice(0, i);
var suffix = perm.slice(i);
yield prefix.concat(first, suffix);
}
count += i;
}
return count;
}
var count = 0;
for (var perm of yieldPermutations([])) {
assert.deepEqual(perm, []);
++count;
}
assert.strictEqual(count, 1);
genHelpers.check(yieldPermutations([1]), [[1]], 1);
genHelpers.check(yieldPermutations([2, 1]), [
[2, 1],
[1, 2]
], 2);
genHelpers.check(yieldPermutations([1,3,2]), [
[1, 3, 2],
[3, 1, 2],
[3, 2, 1],
[1, 2, 3],
[2, 1, 3],
[2, 3, 1]
], 6);

View File

@@ -1,20 +0,0 @@
function *range(max, step) {
var count = 0;
step = step || 1;
for (var i = 0; i < max; i += step) {
count++;
yield i;
}
return count;
}
var gen = range(20, 3);
var values = [];
for (var value of gen) {
values.push(value);
}
assert.deepEqual(values, [0, 3, 6, 9, 12, 15, 18]);

View File

@@ -0,0 +1,32 @@
function *gen(n) {
yield increment(n);
function increment(x) {
return x + 1;
}
if (n % 2) {
yield halve(decrement(n));
function halve(x) {
return x >> 1;
}
function decrement(x) {
return x - 1;
}
} else {
// The behavior of function declarations nested inside conditional
// blocks is notoriously underspecified, and in V8 it appears the
// halve function is still defined when we take this branch, so
// "undefine" it for consistency with regenerator semantics.
halve = void 0;
}
yield typeof halve;
yield increment(increment(n));
}
genHelpers.check(gen(3), [4, 1, "function", 5]);
genHelpers.check(gen(4), [5, "undefined", 6]);

View File

@@ -0,0 +1,15 @@
function *outer(n) {
yield 0;
assert.ok(regeneratorRuntime.isGeneratorFunction(inner));
return yield* inner(n);
// Note that this function declaration comes after everything else
// in the outer function, but needs to be fully available above.
function *inner(n) {
yield n - 1;
yield n;
return yield n + 1;
}
}
genHelpers.check(outer(2), [0, 1, 2, 3], 4);

View File

@@ -0,0 +1,6 @@
genHelpers.check(function *(x, y) {
yield x;
yield y;
yield x + y;
return x * y;
}(3, 7), [3, 7, 10], 21);

View File

@@ -0,0 +1,60 @@
var GeneratorFunctionPrototype = f.__proto__;
var GeneratorFunction = GeneratorFunctionPrototype.constructor;
assert.strictEqual(GeneratorFunction.name, 'GeneratorFunction');
assert.strictEqual(GeneratorFunction.prototype,
GeneratorFunctionPrototype);
assert.strictEqual(GeneratorFunctionPrototype.prototype.constructor,
GeneratorFunctionPrototype);
assert.strictEqual(GeneratorFunctionPrototype.prototype,
f.prototype.__proto__);
assert.strictEqual(GeneratorFunctionPrototype.__proto__,
Function.prototype);
assert.strictEqual(GeneratorFunctionPrototype.name,
"GeneratorFunctionPrototype");
assert.strictEqual(typeof f2, "function");
assert.strictEqual(f2.constructor, GeneratorFunction);
assert.ok(f2 instanceof GeneratorFunction);
assert.strictEqual(f2.name, "f2");
var g = f();
assert.ok(g instanceof f);
assert.strictEqual(g.__proto__, f.prototype);
assert.deepEqual([], Object.getOwnPropertyNames(f.prototype));
// assert.deepEqual([], Object.getOwnPropertyNames(g));
f.prototype.x = 42;
var g2 = f();
assert.strictEqual(g2.x, 42);
var g3 = new f();
assert.strictEqual(g3.x, 42);
function* f2() {
yield 1;
}
assert.strictEqual(f.__proto__, f2.__proto__);
assert.strictEqual(f.hasOwnProperty('constructor'), false);
assert.strictEqual(f.__proto__.constructor.name, 'GeneratorFunction');
// Intentionally at the end to test hoisting.
function* f() {
yield this;
}
function* f() {
yield 1;
}
var f2 = f;
f = 42;
var g = f2();
assert.deepEqual(g.next(), { value: 1, done: false });
assert.deepEqual(g.next(), { value: void 0, done: true });
assert.ok(g instanceof f2);

View File

@@ -0,0 +1,18 @@
function *gen(x) {
try {
(yield x).next(x);
} catch (err) {
yield err;
}
return x + 1;
}
var g = gen(3);
assert.deepEqual(g.next(), { value: 3, done: false });
var complaint = g.next(g); // Sending the generator to itself.
assert.ok(complaint.value instanceof Error);
assert.strictEqual(
complaint.value.message,
"Generator is already running"
);
assert.deepEqual(g.next(), { value: 4, done: true });

View File

@@ -0,0 +1,22 @@
var executedFinally = false;
function *gen() {
try {
yield 0;
} catch (err) {
assert.ok(false, "should not have executed the catch handler");
} finally {
executedFinally = true;
}
}
var g = gen();
assert.deepEqual(g.next(), { value: 0, done: false });
assert.deepEqual(g.return("argument"), {
value: "argument",
done: true
});
assert.strictEqual(executedFinally, true);
genHelpers.assertAlreadyFinished(g);

View File

@@ -0,0 +1,12 @@
function *gen() {
yield 0;
}
var g = gen();
assert.deepEqual(g.return("argument"), {
value: "argument",
done: true
});
genHelpers.assertAlreadyFinished(g);

View File

@@ -0,0 +1,16 @@
function *gen(x) {
yield 2;
throw 1;
}
var u = gen();
u.next();
try {
u.throw(2);
} catch (err) {
assert.strictEqual(err, 2);
}
genHelpers.assertAlreadyFinished(u);

View File

@@ -0,0 +1,16 @@
var began = false;
function *gen() {
began = true;
yield 1;
}
var g = gen();
var exception = new Error("unhandled exception");
try {
g.throw(exception);
assert.ok(false, "should have thrown an exception");
} catch (err) {
assert.strictEqual(err, exception);
assert.strictEqual(began, false);
}

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