Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/termi/es6-transpiler
Tomorrow's JavaScript syntax today
https://github.com/termi/es6-transpiler
Last synced: 18 days ago
JSON representation
Tomorrow's JavaScript syntax today
- Host: GitHub
- URL: https://github.com/termi/es6-transpiler
- Owner: termi
- License: other
- Created: 2013-07-16T18:01:09.000Z (over 11 years ago)
- Default Branch: master
- Last Pushed: 2015-07-19T10:54:16.000Z (over 9 years ago)
- Last Synced: 2024-10-20T02:52:57.838Z (about 2 months ago)
- Language: JavaScript
- Homepage:
- Size: 1.35 MB
- Stars: 216
- Watchers: 15
- Forks: 18
- Open Issues: 38
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- es6-tools - es6-transpiler - ES6 > ES5. Includes classes, destructuring, default parameters, spread (Transpilers)
README
# es6-transpiler.js
es6 -> es5## status
Beta
## Goal
* different output than [traceur-compiler](https://github.com/google/traceur-compiler):
1. no runtime library (only polyfills if needed)
1. no try/catch for block binding
1. spread:
* via `.concat`
* should respect Iterator protocol
* spread is operator, not a function
1. minimal count of temporary variables
1. termination stage for temporary variables
1. es6 RegExp support
1. and others
* output should support [Closure Compiler](https://code.google.com/p/closure-compiler/)
* line-to-line input/output mapping## Supported
* classes
* generator comprehensions
* destructuring (with default values)
* block binding (let / const)
* loops: fresh lexical environment per iteration
* function default parameters and rest
* arrow functions
* spread (with iterator protocol)
* for-of (with iterator protocol)
* array comprehensions (with iterator protocol)
* string templates (with tags support)
* object literals:
* methods
* shorthands
* computed properties
* binary/octal numericLiteral
* unicode code point escapes
* RegExp:
* 'y' flag support (in runtime via polyfill)
* 'u' flag support:
* full transpiler-time support: [negative] astral symbols (surrogate pairs) ranges, \D, \W, '.' etc captures astral symbols
* partial runtime support see: [Not supported](#not-supported)Static scope analysis and transpilation of ES6 block scoped `const` and `let` variables to ES3 based on [olov/defs](https://github.com/olov/defs).
## Not supported
* modules
* generators
* symbols
* RegExp:
* 'u' flag in runtime (via polyfill) for the newly generated patterns:
1. \D, \W, '.' etc not supported
1. negative astral symbols (surrogate pairs) ranges## Supported iterator protocol
```javascript
var obj = {a: 1, b: 2, c: 3};
var Symbol_iterator = typeof Symbol !== 'undefined' && Symbol.iterator || "@@iterator";
obj[Symbol_iterator] = function() {
var iterableObject = this;
var keys = ["a", "b", "c"];return {
next: function() {
var currentKey = keys.shift();return {
value: currentKey ? iterableObject[currentKey] : void 0
, done: !currentKey
}
}
}
}
```## Installation
Install using npm
npm install es6-transpiler
Or just using [Grunt task](https://github.com/termi/grunt-es6-transpiler) (see below).
## Usage
For the output code works you need an implementation of Object.create in the target browser.
You can get it here: [es5-shim](https://github.com/kriskowal/es5-shim/) or copy and past this code:
```
if(!Object.create)Object.create = function(_prototype) {//[Warning!!!]This is PURE and UNSAFE implementation of Object.create
var Type = function () {};
Type.prototype = _prototype;
var _object = new Type();
_object.__proto__ = _prototype;return _object;
};
```### Grunt task
[Grunt](http://gruntjs.com/) task can be fount here: https://github.com/termi/grunt-es6-transpiler
Install:
`npm install grunt-es6-transpiler`Usage:
```javascript
grunt.loadNpmTasks('grunt-es6-transpiler');grunt.initConfig({
"es6-transpiler": {
test: {
src: 'test.js'
, dest: 'test.es5.js'
}
},
})
```### Gulp task
[Gulp](http://gulpjs.com/) task can be fount here: https://github.com/sindresorhus/gulp-es6-transpiler
Install:
`npm install --save-dev gulp-es6-transpiler`Usage:
```javascript
var gulp = require('gulp');
var es6transpiler = require('gulp-es6-transpiler');gulp.task('default', function () {
gulp.src('src/app.js')
.pipe(es6transpiler())
.pipe(gulp.dest('dist'));
});
```### In console
Run it as `es6toes5 `. Or `node --harmony es6toes5 `. Also you can run a compiled es5 version `node build/es5/es6toes5 `.
The errors (if any) will go to stderr, the transpiled source to `stdout`, so redirect it like `es6toes5 file.js > output.js`.### Node.js / Using as a library
require("es6-transpiler").run(\)
Options is:
{
filename: string // input file
src: string // input source if not filename
outputToConsole: boolean // if true -> result would be outputted to console
outputFilename: string // if specific -> result would be written to file
}
Other options below in "Options" section.```javascript
var es6tr = require("./es6-transpiler");
var result = es6tr.run({filename: "test.js"});
console.log(result.src);//result
```
result object is:{
src: string or "" // on success
errors: array of error messages or [] // on errors
stats: statistics object
ast: transformed ast // ast tree from esprima
getNeedfulList: > // list of necessary polyfills
getNeedfulLib: // text of necessary polyfills
getFullLib: // text of all available polyfills
}## Options
Example of `options` object:
{
//described above:
//"filename" or "src": "string"
//outputToConsole: false
//outputFilename: true"environments": ["node", "browser"],
"globals": {
"my": false,
"hat": true
},
"disallowVars": false,
"disallowDuplicated": true,
"disallowUnknownReferences": true,
"includePolyfills": | <"full">,
"polyfillsSeparator":
}`globals` lets you list your program's globals, and indicate whether they are
writable (`true`) or read-only (`false`), just like `jshint`.`environments` lets you import a set of pre-defined globals, here `node` and
`browser`. These default environments are borrowed from `jshint` (see
[jshint_globals/vars.js](https://github.com/olov/defs/blob/master/jshint_globals/vars.js)).`disallowVars` (defaults to `false`) can be enabled to make
usage of `var` an error.`disallowDuplicated` (defaults to `true`) errors on duplicated
`var` definitions in the same function scope.`disallowUnknownReferences` (defaults to `true`) errors on references to
unknown global variables.`includePolyfills` (defaults to `false`) insert polyfills in the output file.
`true` - insert only the necessary polyfills. `"full"` - insert all available polyfills.`polyfillsSeparator` (default - empty string) any string that should be inserted before polyfills library.
## License
`MIT`, see [LICENSE](LICENSE) file.## Example
See tests
## Compatibility
`es6-transpiler.js` strives to transpile your program as true to the ES6 semantics as
possible, while being as maximally non-intrusive as possible.### Referenced (inside closure) before declaration
`es6-transpiler.js` detects the vast majority of cases where a variable is referenced prior to
its declaration. The one case it cannot detect is the following:```javascript
function printx() { console.log(x); }
printx(); // illegal
let x = 1;
printx(); // legal
```The first call to `printx` is not legal because `x` hasn't been initialized at that point
of *time*, which is impossible to catch reliably with statical analysis.
`v8 --harmony` will detect and error on this via run-time checking. `es6-transpiler.js` will
happily transpile this example (`let` => `var` and that's it), and the transpiled code
will print `undefined` on the first call to `printx`. This difference should be a very
minor problem in practice.## TODO
1. Generators support
1. Modules support
1. 'pre-es6-node10', 'pre-es6-chrome20' and 'pre-es6-ff24' output modes