Lebab transpiles your ES5 code to ES2015. It does exactly the opposite of what Babel does. If you want to understand what Lebab exactly does, try the live demo.
Install it using npm:
$ npm install -g lebab
Transpile your old-fashioned code using the lebab
cli tool.
$ lebab es5.js -o es6.js
Or convert just the features of your choice:
$ lebab es5.js -o es6.js --enable let,arrow,commonjs
- class - function/prototypes to classes
- recognizes
Foo.prototype.method = function(){ ... };
- recognizes
Foo.prototype = { ...methods... };
- recognizes getters/setters defined with
Object.defineProperty()
- does not recognize classes without methods
- does not recognize static methods
- no support for extending classes
- BUG does not support namespaced classes
- BUG class and method comments are not preserved
- recognizes
- template - string concatenation to template strings
- converts variables and arbitrary expressions to
${...}
- BUG removes indentation of multi-line strings
- BUG ignores difference between
.toString()
and.valueOf()
- converts variables and arbitrary expressions to
- arrow - callbacks to arrow functions
- Converts bound functions like
function(){}.bind(this)
- not applied to unbound functions that use
this
- not applied to functions that use
arguments
- not applied to object properties (use
obj-method
transform) - converts immediate return
{ return x; }
to=> x
- does not remove
that = this
assignments - BUG fails with immediately returning functions that have methods invoked
- Converts bound functions like
- let -
var
tolet
/const
- never modified variables are converted to
const
- properly recognizes block-scoping
- vars that conflict with block-scoping are not converted
- BUG treats existing
let
/const
asvar
- BUG does not recognize destructuring
- never modified variables are converted to
- default-param - default parameters instead of
a = a || 2
- recognizes
a = a || 2
- recognizes
a = a ? a : 2
- recognizes
a = a === undefined ? 2 : a
- recognizes
a = typeof a === 'undefined' ? 2 : a
- recognizes
- arg-spread - use of apply() to spread operator
- recognizes
obj.method.apply(obj, args)
- recognizes
func.apply(undefined, args)
- recognizes
- obj-method - function values in object to methods
- does not convert named function expressions
- does not convert arrow-functions
- obj-shorthand -
{foo: foo}
to{foo}
- ignores numeric and
NaN
properties - does not convert string properties
- ignores numeric and
- no-strict - removal of
"use strict"
directives- does not touch stuff like
x = "use strict";
- does not touch stuff like
- commonjs - CommonJS module definition to ES6 modules
- converts
var foo = require("foo")
toimport foo from "foo"
- converts
var bar = require("foo").bar
toimport {bar} from "foo"
- converts
var {bar} = require("foo")
toimport {bar} from "foo"
- only handles
require()
calls invar
declarations - does not ensure that imported variable is treated as
const
- converts
module.exports = <anything>
toexport default <anything>
- converts
exports.foo = function(){}
toexport function foo(){}
- converts
exports.Foo = class {}
toexport class Foo {}
- converts
exports.foo = 123
toexport var foo = 123
- converts
exports.foo = bar
toexport {bar as foo}
- does not check if named export conflicts with existing variable names
- does not recognize imports/exports inside nested blocks/functions
- converts
Which feature should Lebab implement next? Let us know by creating an issue or voicing your opinion in existing one.
Want to contribute? Read how Lebab looks for patterns in syntax trees.