Package detail

js2coffee

js2coffee30.7kMIT2.2.0

JavaScript to CoffeeScript compiler

javascript, coffeescript, language, compiler

readme

js2coffee

Compile JavaScript into CoffeeScript.

Status

This 2.0 release is a complete rewrite featuring a better parser (Esprima). See what's new in 2.0 for an overview of new features and consult the migration guide for info on updating from 0.x.


Install

Available on npm and bower.

npm install --global js2coffee
js2coffee --help

npm version

Also available via CDN (window.js2coffee):

https://cdn.rawgit.com/js2coffee/js2coffee/v2.1.0/dist/js2coffee.js


Command line

The command line utility accepts both filenames or stdin.

$ js2coffee file.js [file2.js ...]
$ cat file.js | js2coffee


JavaScript API

Available via npm (require('js2coffee')), or via CDN in the browser (as window.js2coffee):

result = js2coffee.build(source);

result.code     // code string
result.ast      // transformed AST
result.map      // source map
result.warnings // array of warnings

Errors are in this format:

catch (e) {
  e.message       // "index.js:3:1: Unexpected INDENT\n\n   3   var\n   ---^"
  e.description   // "Unexpected INDENT"
  e.start         // { line: 1, column: 4 }
  e.end           // { line: 1, column: 10 }
  e.sourcePreview // '...'
}

Warnings are in this format:

result.warnings.forEach((warn) => {
  warn.description   // "Variable 'x' defined twice
  warn.start         // { line: 1, column: 4 }
  warn.end           // { line: 1, column: 9 }
  warn.filename      // "index.js"
})


Docs

  • Migration guide - guide for migrating from 0.x.

  • Hacking guide - want to contribute? here are tips to get you started.

  • AST format - technical description of the CoffeeScript AST format.

  • Special cases - a list of edge cases that js2coffee accounts for.

  • Compatibility mode - list of tweaks that compatibility mode (--compat) addresses.

  • Goals - outline of the project's goals.

  • Specs - examples of how JavaScript compiles to CoffeeScript.


Thanks

js2coffee © 2012+, Rico Sta. Cruz. Released under the MIT License.
Authored by Rico Sta. Cruz with help from co-maintainers and contributors (list).

Maintainers:

changelog

v2.2.0

Apr 2, 2016

v2.1.0

Jul 3, 2015

v2.0.4

May 5, 2015

  • Fix a - (b + c) incorrectly dropping parentheses (#373)
  • if (x in y) now translates to x of y instead of in (@snowyu, #355)
  • Fix "Cannot read property 'line' of undefined" errors (@snowyu, #356)

v2.0.3

Feb 14, 2015

  • Remove 'coffee-script' as hard dependency, just use pre-built distribution (#351)

v2.0.2

Feb 13, 2015

  • Fix nesting division operators (eg: a / (b * c)) (#348)
  • Add 'coffee-script' as a hard dependency (#351)

v2.0.1

Feb 10, 2015

  • Upgrade from esprima-harmony to esprima-fb v10001.1.0 (#343)
  • Fix multiple unary operators not being spaced properly (eg: a - - - b) (#339)
  • Fix nesting subtraction operators (eg: a - (b - c)) (#347)
  • Fix nesting ternary operators (eg: a ? (b ? c : d) e) (#345)

v2.0.0

Feb 2, 2015

Full rewrite that features the Esprima parser. This release resolves a lot of issues, a lot of which are tracked with the "fixed in 2.0" label.

Check the migration guide for information on what's changed from v0 to v2.0.


v0.3.5 - December 11, 2014

  • fix complex update statements for issue #49
  • move docpad-eco plugin to dev dependency #327

v0.3.4 - December 01, 2014

  • fix missing newline after throw #320
  • fix continue within loops #49

v0.3.3 - August 23, 2014

  • add error handling during conversion

v0.3.2 - August 23, 2014

v0.3.1 - July 11, 2014

  • Update dependencies
  • Fixed DocPad always being installed (only needed for dev)

v0.3.0 - May 17, 2014

  • Updated for CoffeeScript ~1.7.1 from ~1.6.3
  • Browserify build no longer includes the entire package.json file
    • It was only used for the version number, which is now inserted automatically via our build script

v0.2.7 - Februrary 7, 2014

v0.2.6 - January 31, 2014

v0.2.5 - January 20, 2014

v0.2.4 - January 03, 2014

v0.2.3 - October 19, 2013

v0.2.2 - October 14, 2013

  • Replace option parser with nopt
    • add CLI option for indent issue #143
    • add CLI option for single quoted string literals
    • use ansidiff in tests for colored assertion errors
    • you can pass build options as a JSON comment in test files:
      // OPTIONS:{"single_quotes":true}

v0.2.0 - September 26, 2013

v0.1.4 - June 7, 2013

Thanks to @balupton, @tsantef, @ForbesLindesay

v0.1.3 - January 6, 2012

Small "emergency" bugfixes, thanks @tricknotes.

Fixed:

  • Exit when compilation completes in Node 0.6. (#112)
  • Fix typo in the help text when typing js2coffee. (#113)

v0.1.2 - October 15, 2011

Thanks to @Wisdom, @nilbus, @joelvh, @gabipurcaru, @michaelficarra, @tricknotes, @eventualbuddha, @clkao for the contributions.

Fixed:

  • Fix misspelling in package.json.
  • Object lookups using object literals (o[{a:1, b:2}]) are now supported.
  • Fixed js2coffee file.js not working in Linux. (#90, #54)
  • Returning from an if without curly braces are now supported. (if (x) return y;)) (#50)
  • Returning object literals should now have the objects parenthesized properly. ( return {x:1, y:2}) (#52)
  • Always new-line objects to support { a: { b: c } }. (#96, #94)
  • Reserved words are now allowed as property accessors. Fixes object.on(...). (#97, #95, #75)
  • Empty switch cases now get compiled correctly. (#70, #28)
  • The value undefined now gets compiled properly. (#20, #85)
  • Declaring var x will now translate to x = undefined. (#79)
  • Updated reserved keywords list. (#25, #67)

Changed:

  • Compile !! into !! instead of not not. (#30)
  • Implement CRLF support. Closes (#81, #88)
  • !!!x now condenses to not x.
  • == and === now become is. (#29)
  • !(a instanceof b) now becomes a not instanceof b. (#29)
  • Doing var x = y will now have different behavior for reserved keywords. (#79)

Misc changes:

  • Fixed bad link in README. (#63)
  • Make npm test run tests.
  • Running tests now shows less output.
  • Running tests now exits with an error code when it fails.

v0.1.1 - July 09, 2011

Fixed:

  • Invert the 'a == null' behavior. (#19, #51)
  • Fix the problem where passing an anonymous function as a parameter can sometimes lead to syntax errors. (#55)

v0.1.0 - June 13, 2011

Lots of refactoring and new improvements.

Added:

  • Single line ifs. if (x) continue; will now compile to continue if x.
  • Hide empty catches. (#32).
    • try { .. } catch (f) {} now becomes try .. without a catch.
  • Omit returns more agressively. (#42)
  • Omit many unneeded parentheses in certain cases. (#31)

Fixed:

  • Fix x.prototype.y to be x::y instead of x::.y (#24)
  • The in operator now compiles to of. (#46)
    • a in b now compiles to a of b.
  • Fix floating point numbers. (#45)
  • Fix a problem with returning object literals. (#47)

Refactoring:

  • Lots and lots of refactoring.
  • Builder is now a class (to support warnings in the future, and more).
  • Implement a new Transformer class to do AST transformations before building the compiled source.
  • Recursive functions now use Node::walk().
  • Move stuff into js2coffee/helpers.coffee and js2coffee/node_ext.coffee.

v0.0.5 - June 10, 2011

Special thanks to Michael Ficarra for agressively reporting issues and suggesting numerous improvements.

Added:

  • Account for negative existence checks (if !x?). (#19)
    • Compile if (x != null) to unless x?
    • Compile if (x === null) to if x?
  • Ensure object literals with more than one property get surrounded by ({ .. }). (#8)
  • Support debugger. (#27)
  • Support destructuring in functions. (#17)
  • Use loop instead of while true in while and for loops. (#35)
  • Use the :: prototype operator. (#24)
  • Use unless and until as the inverse of if and while respectively. (#35)

Fixed:

  • Keys in object literals now get quoted if needed. This fixes the erroneous compilation of objects such as { 'click #button': function() { ... } }.

v0.0.4 - June 09, 2011

Changed:

  • Allow single-line JS comments without a newline in the end.
  • Enquote identifiers in object literals as needed. (#16)
  • Ensure that percent interpolation (%i) don't get messed up in the Node version. (#13)
  • Ensure that when anonymous functions are called, they are parenthesized. (#14)

Added:

  • more tests.

Fixed:

  • ++b is now no longer erroneously translated to b++.
  • Fixed an issue where { off: 2 } erroneously becomes { off_: 2 }.
  • Returning object literals should now not create invalid CoffeeScript. (#15)

Misc:

  • Annotate the source code.
  • Make a simpler (but less stringent) JS packing routine for js2coffee.min.js.

v0.0.3 - June 05, 2011

Fixed:

  • Narcissus to not go into an infinite loop in the browser.
  • Use this instead of @ for better readability. (#10)

Changed:

  • Implement += and friends. (#9)
  • Use 'cake' instead of 'make'.

v0.0.2 - June 4, 2011

Changed:

  • Better string escaping
  • Better handling of empty blocks
  • Support for commas (eg: a = 2, b = 3)
  • Returns and breaks are omitted when not needed
  • Switch/case now uses switch instead of if
  • Some other improvements

v0.0.1

Initial version.