execjs 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +19 -0
- data/lib/execjs/external_runtime.rb +18 -0
- data/lib/execjs/ruby_racer_runtime.rb +10 -1
- data/lib/execjs/ruby_rhino_runtime.rb +19 -12
- data/lib/execjs/runtimes.rb +1 -9
- data/lib/execjs/support/jsc_runner.js +1 -2
- data/lib/execjs/support/node_runner.js +1 -1
- data/lib/execjs/support/spidermonkey_runner.js +0 -1
- data/lib/execjs/version.rb +1 -1
- metadata +11 -17
- data/lib/execjs/johnson_runtime.rb +0 -104
- data/lib/execjs/mustang_runtime.rb +0 -76
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e37eb677376847f2bfe3abf9691b02bb7ac413eb
|
4
|
+
data.tar.gz: 0e44ddbc91755ce29cf30dc4f4bf775afde29f89
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5d1e57303da891beb4ed994fe590bfa1480785edebc12c6babd02075a0dbf8051d1e2f73089aea28e3da70c41f3702fd0c65cbd76fd8d316d63cabbfbe974279
|
7
|
+
data.tar.gz: 2e12d615380795a7ea63b519f9c3ae556536fc72aa4856e56a5cb467167c941cd78c3e03e87eaf943c753f527957f29a79277fc81a01e81ab05a0fde2c9def01
|
data/README.md
CHANGED
@@ -52,6 +52,25 @@ in. If you want to access the Node API, you should check another library like
|
|
52
52
|
[commonjs.rb](https://github.com/cowboyd/commonjs.rb) designed to provide a
|
53
53
|
consistent interface.
|
54
54
|
|
55
|
+
**Why can't I use `setTimeout`?**
|
56
|
+
|
57
|
+
For similar reasons as modules, not all runtimes guarantee a full JavaScript
|
58
|
+
event loop. So `setTimeout`, `setInterval` and other timers are not defined.
|
59
|
+
|
60
|
+
**Why can't I use ES5 features?**
|
61
|
+
|
62
|
+
Some runtimes like Node will implement many of the latest ES5 features. However
|
63
|
+
older stock runtimes like JSC on OSX and JScript on Windows may not. You should
|
64
|
+
only count on ES3 features being available. Prefer feature checking these APIs
|
65
|
+
rather than hard coding support for specific runtimes.
|
66
|
+
|
67
|
+
**Can I ExecJS be used to sandbox scripts?**
|
68
|
+
|
69
|
+
No, ExecJS shouldn't be used for any security related sandboxing. Since runtimes
|
70
|
+
are automatically detected, each runtime has different sandboxing properties.
|
71
|
+
You shouldn't use `ExecJS.eval` on any inputs you wouldn't feel comfortable Ruby
|
72
|
+
`eval()`ing.
|
73
|
+
|
55
74
|
|
56
75
|
# License
|
57
76
|
|
@@ -9,6 +9,9 @@ module ExecJS
|
|
9
9
|
|
10
10
|
@runtime = runtime
|
11
11
|
@source = source
|
12
|
+
|
13
|
+
# Test compile context source
|
14
|
+
exec("")
|
12
15
|
end
|
13
16
|
|
14
17
|
def eval(source, options = {})
|
@@ -166,6 +169,21 @@ module ExecJS
|
|
166
169
|
arg
|
167
170
|
}.join(" ")
|
168
171
|
end
|
172
|
+
elsif RUBY_ENGINE == 'jruby'
|
173
|
+
require 'shellwords'
|
174
|
+
|
175
|
+
def exec_runtime(filename)
|
176
|
+
command = "#{Shellwords.join(binary.split(' ') << filename)} 2>&1"
|
177
|
+
io = IO.popen(command, @popen_options)
|
178
|
+
output = io.read
|
179
|
+
io.close
|
180
|
+
|
181
|
+
if $?.success?
|
182
|
+
output
|
183
|
+
else
|
184
|
+
raise RuntimeError, output
|
185
|
+
end
|
186
|
+
end
|
169
187
|
else
|
170
188
|
def exec_runtime(filename)
|
171
189
|
io = IO.popen(binary.split(' ') << filename, @popen_options.merge({err: [:child, :out]}))
|
@@ -8,7 +8,16 @@ module ExecJS
|
|
8
8
|
|
9
9
|
lock do
|
10
10
|
@v8_context = ::V8::Context.new
|
11
|
-
|
11
|
+
|
12
|
+
begin
|
13
|
+
@v8_context.eval(source)
|
14
|
+
rescue ::V8::JSError => e
|
15
|
+
if e.value["name"] == "SyntaxError"
|
16
|
+
raise RuntimeError, e.value.to_s
|
17
|
+
else
|
18
|
+
raise ProgramError, e.value.to_s
|
19
|
+
end
|
20
|
+
end
|
12
21
|
end
|
13
22
|
end
|
14
23
|
|
@@ -9,6 +9,8 @@ module ExecJS
|
|
9
9
|
@rhino_context = ::Rhino::Context.new
|
10
10
|
fix_memory_limit! @rhino_context
|
11
11
|
@rhino_context.eval(source)
|
12
|
+
rescue Exception => e
|
13
|
+
reraise_error(e)
|
12
14
|
end
|
13
15
|
|
14
16
|
def exec(source, options = {})
|
@@ -25,22 +27,14 @@ module ExecJS
|
|
25
27
|
if /\S/ =~ source
|
26
28
|
unbox @rhino_context.eval("(#{source})")
|
27
29
|
end
|
28
|
-
rescue
|
29
|
-
|
30
|
-
raise RuntimeError, e.message
|
31
|
-
else
|
32
|
-
raise ProgramError, e.message
|
33
|
-
end
|
30
|
+
rescue Exception => e
|
31
|
+
reraise_error(e)
|
34
32
|
end
|
35
33
|
|
36
34
|
def call(properties, *args)
|
37
35
|
unbox @rhino_context.eval(properties).call(*args)
|
38
|
-
rescue
|
39
|
-
|
40
|
-
raise RuntimeError, e.message
|
41
|
-
else
|
42
|
-
raise ProgramError, e.message
|
43
|
-
end
|
36
|
+
rescue Exception => e
|
37
|
+
reraise_error(e)
|
44
38
|
end
|
45
39
|
|
46
40
|
def unbox(value)
|
@@ -64,6 +58,19 @@ module ExecJS
|
|
64
58
|
end
|
65
59
|
end
|
66
60
|
|
61
|
+
def reraise_error(e)
|
62
|
+
case e
|
63
|
+
when ::Rhino::JSError
|
64
|
+
if e.message == "syntax error"
|
65
|
+
raise RuntimeError, e.message
|
66
|
+
else
|
67
|
+
raise ProgramError, e.message
|
68
|
+
end
|
69
|
+
else
|
70
|
+
raise e
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
67
74
|
private
|
68
75
|
# Disables bytecode compiling which limits you to 64K scripts
|
69
76
|
def fix_memory_limit!(context)
|
data/lib/execjs/runtimes.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require "execjs/module"
|
2
2
|
require "execjs/disabled_runtime"
|
3
3
|
require "execjs/external_runtime"
|
4
|
-
require "execjs/johnson_runtime"
|
5
|
-
require "execjs/mustang_runtime"
|
6
4
|
require "execjs/ruby_racer_runtime"
|
7
5
|
require "execjs/ruby_rhino_runtime"
|
8
6
|
|
@@ -14,10 +12,6 @@ module ExecJS
|
|
14
12
|
|
15
13
|
RubyRhino = RubyRhinoRuntime.new
|
16
14
|
|
17
|
-
Johnson = JohnsonRuntime.new
|
18
|
-
|
19
|
-
Mustang = MustangRuntime.new
|
20
|
-
|
21
15
|
Node = ExternalRuntime.new(
|
22
16
|
name: "Node.js (V8)",
|
23
17
|
command: ["nodejs", "node"],
|
@@ -78,10 +72,8 @@ module ExecJS
|
|
78
72
|
@runtimes ||= [
|
79
73
|
RubyRacer,
|
80
74
|
RubyRhino,
|
81
|
-
Johnson,
|
82
|
-
Mustang,
|
83
|
-
Node,
|
84
75
|
JavaScriptCore,
|
76
|
+
Node,
|
85
77
|
SpiderMonkey,
|
86
78
|
JScript
|
87
79
|
]
|
@@ -1,4 +1,4 @@
|
|
1
|
-
(function(program, execJS) { execJS(program) })(function(module, exports, require, console) { #{source}
|
1
|
+
(function(program, execJS) { execJS(program) })(function(global, module, exports, require, console, setTimeout, setInterval, clearTimeout, clearInterval, setImmediate, clearImmediate) { #{source}
|
2
2
|
}, function(program) {
|
3
3
|
var output, print = function(string) {
|
4
4
|
process.stdout.write('' + string);
|
data/lib/execjs/version.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: execjs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
5
|
-
prerelease:
|
4
|
+
version: 2.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Sam Stephenson
|
@@ -10,22 +9,20 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2015-02-03 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: rake
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- -
|
18
|
+
- - ">="
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: '0'
|
23
21
|
type: :development
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- -
|
25
|
+
- - ">="
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: '0'
|
31
28
|
description: ExecJS lets you run JavaScript code from Ruby.
|
@@ -36,14 +33,13 @@ executables: []
|
|
36
33
|
extensions: []
|
37
34
|
extra_rdoc_files: []
|
38
35
|
files:
|
39
|
-
- README.md
|
40
36
|
- LICENSE
|
37
|
+
- README.md
|
38
|
+
- lib/execjs.rb
|
41
39
|
- lib/execjs/disabled_runtime.rb
|
42
40
|
- lib/execjs/encoding.rb
|
43
41
|
- lib/execjs/external_runtime.rb
|
44
|
-
- lib/execjs/johnson_runtime.rb
|
45
42
|
- lib/execjs/module.rb
|
46
|
-
- lib/execjs/mustang_runtime.rb
|
47
43
|
- lib/execjs/ruby_racer_runtime.rb
|
48
44
|
- lib/execjs/ruby_rhino_runtime.rb
|
49
45
|
- lib/execjs/runtime.rb
|
@@ -54,30 +50,28 @@ files:
|
|
54
50
|
- lib/execjs/support/node_runner.js
|
55
51
|
- lib/execjs/support/spidermonkey_runner.js
|
56
52
|
- lib/execjs/version.rb
|
57
|
-
- lib/execjs.rb
|
58
53
|
homepage: https://github.com/sstephenson/execjs
|
59
54
|
licenses:
|
60
55
|
- MIT
|
56
|
+
metadata: {}
|
61
57
|
post_install_message:
|
62
58
|
rdoc_options: []
|
63
59
|
require_paths:
|
64
60
|
- lib
|
65
61
|
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
62
|
requirements:
|
68
|
-
- -
|
63
|
+
- - ">="
|
69
64
|
- !ruby/object:Gem::Version
|
70
65
|
version: '0'
|
71
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
67
|
requirements:
|
74
|
-
- -
|
68
|
+
- - ">="
|
75
69
|
- !ruby/object:Gem::Version
|
76
70
|
version: '0'
|
77
71
|
requirements: []
|
78
72
|
rubyforge_project:
|
79
|
-
rubygems_version:
|
73
|
+
rubygems_version: 2.2.2
|
80
74
|
signing_key:
|
81
|
-
specification_version:
|
75
|
+
specification_version: 4
|
82
76
|
summary: Run JavaScript code from Ruby
|
83
77
|
test_files: []
|
@@ -1,104 +0,0 @@
|
|
1
|
-
require "execjs/runtime"
|
2
|
-
|
3
|
-
module ExecJS
|
4
|
-
class JohnsonRuntime < Runtime
|
5
|
-
class Context < Runtime::Context
|
6
|
-
def initialize(runtime, source = "")
|
7
|
-
source = encode(source)
|
8
|
-
|
9
|
-
@runtime = Johnson::Runtime.new
|
10
|
-
@runtime.evaluate(source)
|
11
|
-
end
|
12
|
-
|
13
|
-
def exec(source, options = {})
|
14
|
-
source = encode(source)
|
15
|
-
|
16
|
-
if /\S/ =~ source
|
17
|
-
eval "(function(){#{source}})()", options
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def eval(source, options = {})
|
22
|
-
source = encode(source)
|
23
|
-
|
24
|
-
if /\S/ =~ source
|
25
|
-
unbox @runtime.evaluate("(#{source})")
|
26
|
-
end
|
27
|
-
rescue Johnson::Error => e
|
28
|
-
if syntax_error?(e)
|
29
|
-
raise RuntimeError, e.message
|
30
|
-
else
|
31
|
-
raise ProgramError, e.message
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def call(properties, *args)
|
36
|
-
unbox @runtime.evaluate(properties).call(*args)
|
37
|
-
rescue Johnson::Error => e
|
38
|
-
if syntax_error?(e)
|
39
|
-
raise RuntimeError, e.message
|
40
|
-
else
|
41
|
-
raise ProgramError, e.message
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def unbox(value)
|
46
|
-
case
|
47
|
-
when function?(value)
|
48
|
-
nil
|
49
|
-
when string?(value)
|
50
|
-
value.force_encoding('UTF-8')
|
51
|
-
when array?(value)
|
52
|
-
value.map { |v| unbox(v) }
|
53
|
-
when object?(value)
|
54
|
-
value.inject({}) do |vs, (k, v)|
|
55
|
-
vs[k] = unbox(v) unless function?(v)
|
56
|
-
vs
|
57
|
-
end
|
58
|
-
else
|
59
|
-
value
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
def syntax_error?(error)
|
65
|
-
error.message =~ /^syntax error at /
|
66
|
-
end
|
67
|
-
|
68
|
-
def function?(value)
|
69
|
-
value.respond_to?(:function?) && value.function?
|
70
|
-
end
|
71
|
-
|
72
|
-
def string?(value)
|
73
|
-
value.is_a?(String)
|
74
|
-
end
|
75
|
-
|
76
|
-
def array?(value)
|
77
|
-
array_test.call(value)
|
78
|
-
end
|
79
|
-
|
80
|
-
def object?(value)
|
81
|
-
value.respond_to?(:inject)
|
82
|
-
end
|
83
|
-
|
84
|
-
def array_test
|
85
|
-
@array_test ||= @runtime.evaluate("(function(a) {return a instanceof [].constructor})")
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def name
|
90
|
-
"Johnson (SpiderMonkey)"
|
91
|
-
end
|
92
|
-
|
93
|
-
def available?
|
94
|
-
require "johnson"
|
95
|
-
true
|
96
|
-
rescue LoadError
|
97
|
-
false
|
98
|
-
end
|
99
|
-
|
100
|
-
def deprecated?
|
101
|
-
true
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require "execjs/runtime"
|
2
|
-
|
3
|
-
module ExecJS
|
4
|
-
class MustangRuntime < Runtime
|
5
|
-
class Context < Runtime::Context
|
6
|
-
def initialize(runtime, source = "")
|
7
|
-
source = encode(source)
|
8
|
-
|
9
|
-
@v8_context = ::Mustang::Context.new
|
10
|
-
@v8_context.eval(source)
|
11
|
-
end
|
12
|
-
|
13
|
-
def exec(source, options = {})
|
14
|
-
source = encode(source)
|
15
|
-
|
16
|
-
if /\S/ =~ source
|
17
|
-
eval "(function(){#{source}})()", options
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def eval(source, options = {})
|
22
|
-
source = encode(source)
|
23
|
-
|
24
|
-
if /\S/ =~ source
|
25
|
-
unbox @v8_context.eval("(#{source})")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def call(properties, *args)
|
30
|
-
unbox @v8_context.eval(properties).call(*args)
|
31
|
-
rescue NoMethodError => e
|
32
|
-
raise ProgramError, e.message
|
33
|
-
end
|
34
|
-
|
35
|
-
def unbox(value)
|
36
|
-
case value
|
37
|
-
when Mustang::V8::Array
|
38
|
-
value.map { |v| unbox(v) }
|
39
|
-
when Mustang::V8::Boolean
|
40
|
-
value.to_bool
|
41
|
-
when Mustang::V8::NullClass, Mustang::V8::UndefinedClass
|
42
|
-
nil
|
43
|
-
when Mustang::V8::Function
|
44
|
-
nil
|
45
|
-
when Mustang::V8::SyntaxError
|
46
|
-
raise RuntimeError, value.message
|
47
|
-
when Mustang::V8::Error
|
48
|
-
raise ProgramError, value.message
|
49
|
-
when Mustang::V8::Object
|
50
|
-
value.inject({}) { |h, (k, v)|
|
51
|
-
v = unbox(v)
|
52
|
-
h[k] = v if v
|
53
|
-
h
|
54
|
-
}
|
55
|
-
else
|
56
|
-
value.respond_to?(:delegate) ? value.delegate : value
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def name
|
62
|
-
"Mustang (V8)"
|
63
|
-
end
|
64
|
-
|
65
|
-
def available?
|
66
|
-
require "mustang"
|
67
|
-
true
|
68
|
-
rescue LoadError
|
69
|
-
false
|
70
|
-
end
|
71
|
-
|
72
|
-
def deprecated?
|
73
|
-
true
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|