1
0
Fork 0
mirror of https://github.com/rails/execjs synced 2023-03-27 23:21:20 -04:00
Run JavaScript code from Ruby
Find a file
Jean Boussier 82dbb78f71
Merge pull request #115 from eregon/gu_install_js
GraalVM 22.2+ needs `gu install js` for JavaScript to be available
2022-07-08 15:40:00 +02:00
.github/workflows GraalVM 22.2+ needs gu install js for JavaScript to be available 2022-07-08 15:24:34 +02:00
lib Convert Ruby Strings to TruffleString when passing them to JavaScript 2022-07-08 15:24:34 +02:00
test Add test for passing Symbol to JS and fix it for GraalJSRuntime and RubyRhinoRuntime 2022-01-27 21:50:57 +01:00
.gitignore Configure Travis to support MiniRacer and TheRubyRacer simultaneously. 2016-05-14 12:25:29 -05:00
CONTRIBUTING.md Add note about installing and testing mini_racer 2016-07-19 13:35:39 +02:00
execjs.gemspec Fix to include license file to gem 2015-12-26 05:30:01 +09:00
Gemfile therubyracer gem is no longer maintained and is incompatible with Ruby 3.0 2021-05-07 10:08:48 +02:00
MAINTAINING.md Use bundle tasks to release 2015-04-08 19:12:47 -03:00
MIT-LICENSE Update copyright year 2016-01-01 01:46:12 +01:00
Rakefile Use bundle tasks to release 2015-04-08 19:12:47 -03:00
README.md therubyracer gem is no longer maintained and is incompatible with Ruby 3.0 2021-05-07 10:08:48 +02:00

ExecJS

ExecJS lets you run JavaScript code from Ruby. It automatically picks the best runtime available to evaluate your JavaScript program, then returns the result to you as a Ruby object.

ExecJS supports these runtimes:

A short example:

require "execjs"
ExecJS.eval "'red yellow blue'.split(' ')"
# => ["red", "yellow", "blue"]

A longer example, demonstrating how to invoke the CoffeeScript compiler:

require "execjs"
require "open-uri"
source = open("http://coffeescript.org/extras/coffee-script.js").read

context = ExecJS.compile(source)
context.call("CoffeeScript.compile", "square = (x) -> x * x", bare: true)
# => "var square;\nsquare = function(x) {\n  return x * x;\n};"

Installation

$ gem install execjs

FAQ

Why can't I use CommonJS require() inside ExecJS?

ExecJS provides a lowest common denominator interface to any JavaScript runtime. Use ExecJS when it doesn't matter which JavaScript interpreter your code runs in. If you want to access the Node API, you should check another library like commonjs.rb designed to provide a consistent interface.

Why can't I use setTimeout?

For similar reasons as modules, not all runtimes guarantee a full JavaScript event loop. So setTimeout, setInterval and other timers are not defined.

Why can't I use ES5 features?

Some runtimes like Node will implement many of the latest ES5 features. However older stock runtimes like JSC on OSX and JScript on Windows may not. You should only count on ES3 features being available. Prefer feature checking these APIs rather than hard coding support for specific runtimes.

Can ExecJS be used to sandbox scripts?

No, ExecJS shouldn't be used for any security related sandboxing. Since runtimes are automatically detected, each runtime has different sandboxing properties. You shouldn't use ExecJS.eval on any inputs you wouldn't feel comfortable Ruby eval()ing.

Contributing to ExecJS

ExecJS is work of dozens of contributors. You're encouraged to submit pull requests, propose features and discuss issues.

See CONTRIBUTING.

License

ExecJS is released under the MIT License.