ruby2js 3.0.11 → 3.0.12
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 +4 -4
- data/README.md +19 -0
- data/lib/ruby2js.rb +12 -0
- data/lib/ruby2js/converter/block.rb +3 -3
- data/lib/ruby2js/converter/hash.rb +5 -0
- data/lib/ruby2js/converter/nthref.rb +1 -1
- data/lib/ruby2js/converter/opasgn.rb +8 -1
- data/lib/ruby2js/filter.rb +96 -0
- data/lib/ruby2js/filter/functions.rb +30 -20
- data/lib/ruby2js/filter/rubyjs.rb +19 -15
- data/lib/ruby2js/filter/underscore.rb +30 -24
- data/lib/ruby2js/filter/vue.rb +5 -1
- data/lib/ruby2js/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33e8a99086fe503dbff4afab72211baf206981e2b0dd68174aa8cc2ea9a1d361
|
4
|
+
data.tar.gz: 9c86b76630c9c2dbe32032280db32e52b0569ba56ccfcafee0729f8f6d9d351c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8a0f54b473fa2494ac736232e8e60487a96923d9cd4df5635329c532726836d15a7b465744e7441016e811b153dcc22993d3e0b7013fa99696c18674f3f66fe
|
7
|
+
data.tar.gz: c7806d2aefa3449e3f2e07438fdea60a1b222d0bb866f51035ddd95da67a44a009df109ba39bf9ab2da6ba866c8bf4a8fb9652fca5bfea43e5c688307b9141af
|
data/README.md
CHANGED
@@ -157,6 +157,20 @@ to `forEach`, `each!` will pass through the filter. The final code that emits
|
|
157
157
|
JavaScript function calls and parameter accesses will strip off these
|
158
158
|
suffixes.
|
159
159
|
|
160
|
+
This approach works well if it is an occasional change, but if the usage is
|
161
|
+
pervasive, most filters support options to `exclude` a list of mappings,
|
162
|
+
for example:
|
163
|
+
|
164
|
+
```ruby
|
165
|
+
puts Ruby2JS.convert('jQuery("li").each {|index| ...}', exclude: :each)
|
166
|
+
```
|
167
|
+
|
168
|
+
Alternatively, you can change the default:
|
169
|
+
|
170
|
+
```ruby
|
171
|
+
Ruby2JS::Filter.exclude :each
|
172
|
+
```
|
173
|
+
|
160
174
|
Static transformations and runtime libraries aren't aren’t mutually exclusive.
|
161
175
|
With enough of each, one could reproduce any functionality desired. Just be
|
162
176
|
forewarned, that implementing a function like `method_missing` would require a
|
@@ -262,6 +276,11 @@ the script.
|
|
262
276
|
of `Error` instead; and default constructors will be provided
|
263
277
|
* `loop do...end` will be replaced with `while (true) {...}`
|
264
278
|
|
279
|
+
Additionally, there is one mapping that will only be done if explicitly
|
280
|
+
<a href="https://github.com/rubys/ruby2js/blob/master/lib/ruby2js/filter.rb">included</a>:
|
281
|
+
|
282
|
+
* `.class` becomes `.constructor`
|
283
|
+
|
265
284
|
* <a id="rubyjs" href="https://github.com/rubys/ruby2js/blob/master/spec/rubyjs_spec.rb">rubyjs</a>
|
266
285
|
* `.at()` becomes `_a.at()`
|
267
286
|
* `.between?()` becomes `R().between()`
|
data/lib/ruby2js.rb
CHANGED
@@ -9,6 +9,7 @@ ensure
|
|
9
9
|
end
|
10
10
|
|
11
11
|
require 'ruby2js/converter'
|
12
|
+
require 'ruby2js/filter'
|
12
13
|
|
13
14
|
module Ruby2JS
|
14
15
|
class SyntaxError < RuntimeError
|
@@ -48,6 +49,7 @@ module Ruby2JS
|
|
48
49
|
end
|
49
50
|
|
50
51
|
class Processor < Parser::AST::Processor
|
52
|
+
include Ruby2JS::Filter
|
51
53
|
BINARY_OPERATORS = Converter::OPERATORS[2..-1].flatten
|
52
54
|
|
53
55
|
def initialize(comments)
|
@@ -57,6 +59,14 @@ module Ruby2JS
|
|
57
59
|
|
58
60
|
def options=(options)
|
59
61
|
@options = options
|
62
|
+
|
63
|
+
@included = @@included
|
64
|
+
@excluded = @@excluded
|
65
|
+
|
66
|
+
include_all if options[:include_all]
|
67
|
+
include_only(options[:include_only]) if options[:include_only]
|
68
|
+
include(options[:include]) if options[:include]
|
69
|
+
exclude(options[:exclude]) if options[:exclude]
|
60
70
|
end
|
61
71
|
|
62
72
|
def es2015
|
@@ -148,11 +158,13 @@ module Ruby2JS
|
|
148
158
|
filters = options[:filters] || Filter::DEFAULTS
|
149
159
|
|
150
160
|
unless filters.empty?
|
161
|
+
|
151
162
|
filter = Filter::Processor
|
152
163
|
filters.reverse.each do |mod|
|
153
164
|
filter = Class.new(filter) {include mod}
|
154
165
|
end
|
155
166
|
filter = filter.new(comments)
|
167
|
+
|
156
168
|
filter.options = options
|
157
169
|
ast = filter.process(ast)
|
158
170
|
end
|
@@ -28,11 +28,11 @@ module Ruby2JS
|
|
28
28
|
put "; "; parse var;
|
29
29
|
if call.children[2].type == :int and call.children[2].children[0] < 0
|
30
30
|
put " #{comp.sub('<', '>')} "; parse expression.children.last
|
31
|
-
put "; "; parse var
|
32
|
-
|
31
|
+
put "; "; parse s(:op_asgn, var, :-,
|
32
|
+
s(:int, -call.children[2].children[0])), :statement
|
33
33
|
else
|
34
34
|
put " #{comp} "; parse expression.children.last
|
35
|
-
put "; "; parse var
|
35
|
+
put "; "; parse s(:op_asgn, var, :+, call.children[2]), :statement
|
36
36
|
end
|
37
37
|
puts ") {"
|
38
38
|
scope block
|
@@ -87,6 +87,11 @@ module Ruby2JS
|
|
87
87
|
then
|
88
88
|
@prop = left.children.first
|
89
89
|
parse right, :method
|
90
|
+
elsif
|
91
|
+
es2015 and left.type == :sym and right.type == :lvar and
|
92
|
+
left.children == right.children
|
93
|
+
then
|
94
|
+
parse right
|
90
95
|
else
|
91
96
|
if not [:str, :sym].include? left.type and es2015
|
92
97
|
put '['
|
@@ -12,7 +12,14 @@ module Ruby2JS
|
|
12
12
|
var = s(:lvar, var.children.first) if var.type == :lvasgn
|
13
13
|
var = s(:cvar, var.children.first) if var.type == :cvasgn
|
14
14
|
|
15
|
-
if
|
15
|
+
if
|
16
|
+
[:+, :-].include?(op) and value.type==:int and
|
17
|
+
(value.children==[1] or value.children==[-1])
|
18
|
+
then
|
19
|
+
if value.children.first == -1
|
20
|
+
op = (op == :+ ? :- : :+)
|
21
|
+
end
|
22
|
+
|
16
23
|
if @state == :statement
|
17
24
|
parse var; put "#{ op }#{ op }"
|
18
25
|
else
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#
|
2
|
+
# Manage a list of methods to be included or excluded. This allows fine
|
3
|
+
# grained control over filters.
|
4
|
+
#
|
5
|
+
|
6
|
+
module Ruby2JS
|
7
|
+
module Filter
|
8
|
+
|
9
|
+
#
|
10
|
+
# module level defaults
|
11
|
+
#
|
12
|
+
|
13
|
+
@@included = nil
|
14
|
+
@@excluded = []
|
15
|
+
|
16
|
+
# indicate that the specified methods are not to be processed
|
17
|
+
def self.exclude(*methods)
|
18
|
+
if @@included
|
19
|
+
@@included -= methods.flatten
|
20
|
+
else
|
21
|
+
@@excluded += methods.flatten
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# indicate that all methods are to be processed
|
26
|
+
def self.include_all
|
27
|
+
@@included = nil
|
28
|
+
@@excluded = []
|
29
|
+
end
|
30
|
+
|
31
|
+
# indicate that only the specified methods are to be processed
|
32
|
+
def self.include_only(*methods)
|
33
|
+
@@included = methods.flatten
|
34
|
+
end
|
35
|
+
|
36
|
+
# indicate that the specified methods are to be processed
|
37
|
+
def self.include(*methods)
|
38
|
+
if @@included
|
39
|
+
@@included += methods.flatten
|
40
|
+
else
|
41
|
+
@@excluded -= methods.flatten
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# indicate that the specified methods are not to be processed
|
46
|
+
def self.exclude(*methods)
|
47
|
+
if @@included
|
48
|
+
@@included -= methods.flatten
|
49
|
+
else
|
50
|
+
@@excluded += methods.flatten
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# instance level overrides
|
56
|
+
#
|
57
|
+
|
58
|
+
# determine if a method is NOT to be processed
|
59
|
+
def excluded?(method)
|
60
|
+
if @included
|
61
|
+
not @included.include? method
|
62
|
+
else
|
63
|
+
@excluded.include? method
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# indicate that all methods are to be processed
|
68
|
+
def include_all
|
69
|
+
@included = nil
|
70
|
+
@excluded = []
|
71
|
+
end
|
72
|
+
|
73
|
+
# indicate that only the specified methods are to be processed
|
74
|
+
def include_only(*methods)
|
75
|
+
@included = methods.flatten
|
76
|
+
end
|
77
|
+
|
78
|
+
# indicate that the specified methods are to be processed
|
79
|
+
def include(*methods)
|
80
|
+
if @included
|
81
|
+
@included += methods.flatten
|
82
|
+
else
|
83
|
+
@excluded -= methods.flatten
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# indicate that the specified methods are not to be processed
|
88
|
+
def exclude(*methods)
|
89
|
+
if @included
|
90
|
+
@included -= methods.flatten
|
91
|
+
else
|
92
|
+
@excluded += methods.flatten
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -5,6 +5,9 @@ module Ruby2JS
|
|
5
5
|
module Functions
|
6
6
|
include SEXP
|
7
7
|
|
8
|
+
# require explicit opt-in to to class => constructor mapping
|
9
|
+
Filter.exclude :class
|
10
|
+
|
8
11
|
VAR_TO_ASSIGN = {
|
9
12
|
lvar: :lvasgn,
|
10
13
|
ivar: :ivasgn,
|
@@ -14,6 +17,7 @@ module Ruby2JS
|
|
14
17
|
|
15
18
|
def on_send(node)
|
16
19
|
target, method, *args = node.children
|
20
|
+
return super if excluded?(method)
|
17
21
|
|
18
22
|
if [:max, :min].include? method and args.length == 0
|
19
23
|
return super unless node.is_method?
|
@@ -320,6 +324,9 @@ module Ruby2JS
|
|
320
324
|
elsif es2017 and method==:ljust
|
321
325
|
process node.updated(nil, [target, :padEnd, *args])
|
322
326
|
|
327
|
+
elsif method == :class and args.length==0 and not node.is_method?
|
328
|
+
process node.updated(:attr, [target, :constructor])
|
329
|
+
|
323
330
|
else
|
324
331
|
super
|
325
332
|
end
|
@@ -327,50 +334,53 @@ module Ruby2JS
|
|
327
334
|
|
328
335
|
def on_block(node)
|
329
336
|
call = node.children.first
|
330
|
-
|
337
|
+
method = call.children[1]
|
338
|
+
return super if excluded?(method)
|
339
|
+
|
340
|
+
if [:setInterval, :setTimeout].include? method
|
331
341
|
return super unless call.children.first == nil
|
332
342
|
block = process s(:block, s(:send, nil, :proc), *node.children[1..-1])
|
333
343
|
on_send call.updated nil, [*call.children[0..1], block,
|
334
344
|
*call.children[2..-1]]
|
335
345
|
|
336
|
-
elsif [:sub, :gsub, :sub!, :gsub!, :sort!].include?
|
346
|
+
elsif [:sub, :gsub, :sub!, :gsub!, :sort!].include? method
|
337
347
|
return super if call.children.first == nil
|
338
348
|
block = s(:block, s(:send, nil, :proc), node.children[1],
|
339
349
|
s(:autoreturn, *node.children[2..-1]))
|
340
350
|
process call.updated(nil, [*call.children, block])
|
341
351
|
|
342
|
-
elsif
|
352
|
+
elsif method == :select and call.children.length == 2
|
343
353
|
call = call.updated nil, [call.children.first, :filter]
|
344
354
|
node.updated nil, [process(call), process(node.children[1]),
|
345
355
|
s(:autoreturn, *process_all(node.children[2..-1]))]
|
346
356
|
|
347
|
-
elsif
|
357
|
+
elsif method == :any? and call.children.length == 2
|
348
358
|
call = call.updated nil, [call.children.first, :some]
|
349
359
|
node.updated nil, [process(call), process(node.children[1]),
|
350
360
|
s(:autoreturn, *process_all(node.children[2..-1]))]
|
351
361
|
|
352
|
-
elsif
|
362
|
+
elsif method == :all? and call.children.length == 2
|
353
363
|
call = call.updated nil, [call.children.first, :every]
|
354
364
|
node.updated nil, [process(call), process(node.children[1]),
|
355
365
|
s(:autoreturn, *process_all(node.children[2..-1]))]
|
356
366
|
|
357
|
-
elsif
|
367
|
+
elsif method == :find and call.children.length == 2
|
358
368
|
node.updated nil, [process(call), process(node.children[1]),
|
359
369
|
s(:autoreturn, *process_all(node.children[2..-1]))]
|
360
370
|
|
361
|
-
elsif
|
371
|
+
elsif method == :find_index and call.children.length == 2
|
362
372
|
call = call.updated nil, [call.children.first, :findIndex]
|
363
373
|
node.updated nil, [process(call), process(node.children[1]),
|
364
374
|
s(:autoreturn, *process_all(node.children[2..-1]))]
|
365
375
|
|
366
|
-
elsif
|
376
|
+
elsif method == :map and call.children.length == 2
|
367
377
|
node.updated nil, [process(call), process(node.children[1]),
|
368
378
|
s(:autoreturn, *process_all(node.children[2..-1]))]
|
369
379
|
|
370
|
-
elsif [:map!, :select!].include?
|
380
|
+
elsif [:map!, :select!].include? method
|
371
381
|
# input: a.map! {expression}
|
372
382
|
# output: a.splice(0, a.length, *a.map {expression})
|
373
|
-
method = (
|
383
|
+
method = (method == :map! ? :map : :select)
|
374
384
|
target = call.children.first
|
375
385
|
process call.updated(:send, [target, :splice, s(:splat, s(:send,
|
376
386
|
s(:array, s(:int, 0), s(:attr, target, :length)), :concat,
|
@@ -382,7 +392,7 @@ module Ruby2JS
|
|
382
392
|
# output: while(true) {statements}
|
383
393
|
S(:while, s(:true), node.children[2])
|
384
394
|
|
385
|
-
elsif
|
395
|
+
elsif method == :delete
|
386
396
|
# restore delete methods that are prematurely mapped to undef
|
387
397
|
result = super
|
388
398
|
|
@@ -401,18 +411,18 @@ module Ruby2JS
|
|
401
411
|
|
402
412
|
result
|
403
413
|
|
404
|
-
elsif
|
414
|
+
elsif method == :downto
|
405
415
|
range = s(:irange, call.children[0], call.children[2])
|
406
416
|
call = call.updated(nil, [s(:begin, range), :step, s(:int, -1)])
|
407
417
|
process node.updated(nil, [call, *node.children[1..-1]])
|
408
418
|
|
409
|
-
elsif
|
419
|
+
elsif method == :upto
|
410
420
|
range = s(:irange, call.children[0], call.children[2])
|
411
421
|
call = call.updated(nil, [s(:begin, range), :step, s(:int, 1)])
|
412
422
|
process node.updated(nil, [call, *node.children[1..-1]])
|
413
423
|
|
414
424
|
elsif
|
415
|
-
|
425
|
+
method == :each and call.children[0].type == :send and
|
416
426
|
call.children[0].children[1] == :step
|
417
427
|
then
|
418
428
|
# i.step(j, n).each {|v| ...}
|
@@ -425,7 +435,7 @@ module Ruby2JS
|
|
425
435
|
|
426
436
|
elsif
|
427
437
|
# (a..b).each {|v| ...}
|
428
|
-
|
438
|
+
method == :each and
|
429
439
|
call.children[0].type == :begin and
|
430
440
|
call.children[0].children.length == 1 and
|
431
441
|
[:irange, :erange].include? call.children[0].children[0].type and
|
@@ -435,7 +445,7 @@ module Ruby2JS
|
|
435
445
|
call.children[0].children[0], node.children[2])
|
436
446
|
|
437
447
|
elsif
|
438
|
-
[:each, :each_value].include?
|
448
|
+
[:each, :each_value].include? method and
|
439
449
|
node.children[1].children.length == 1
|
440
450
|
then
|
441
451
|
if es2015
|
@@ -448,20 +458,20 @@ module Ruby2JS
|
|
448
458
|
end
|
449
459
|
|
450
460
|
elsif
|
451
|
-
|
452
|
-
[:each, :each_key].include?
|
461
|
+
method == :each_key and
|
462
|
+
[:each, :each_key].include? method and
|
453
463
|
node.children[1].children.length == 1
|
454
464
|
then
|
455
465
|
process node.updated(:for,
|
456
466
|
[s(:lvasgn, node.children[1].children[0].children[0]),
|
457
467
|
node.children[0].children[0], node.children[2]])
|
458
468
|
|
459
|
-
elsif es2015 and
|
469
|
+
elsif es2015 and method == :inject
|
460
470
|
process node.updated(:send, [call.children[0], :reduce,
|
461
471
|
s(:block, s(:send, nil, :lambda), *node.children[1..2]),
|
462
472
|
*call.children[2..-1]])
|
463
473
|
|
464
|
-
elsif es2017 and
|
474
|
+
elsif es2017 and method == :each_pair
|
465
475
|
process node.updated(nil, [s(:send, s(:send, s(:const, nil, :Object),
|
466
476
|
:entries, call.children[0]), :forEach), s(:args, s(:mlhs,
|
467
477
|
*node.children[1].children)), node.children[2]])
|
@@ -11,6 +11,9 @@ module Ruby2JS
|
|
11
11
|
return super if target and [:_s, :_a, :_h, :_n, :_i, :_t].
|
12
12
|
include? target.children[1]
|
13
13
|
|
14
|
+
method = node.children[1]
|
15
|
+
return super if excluded?(method)
|
16
|
+
|
14
17
|
# leave classic ("OO") style call chains alone
|
15
18
|
while target and target.type == :send
|
16
19
|
return super if target.children[1] == :R
|
@@ -19,33 +22,33 @@ module Ruby2JS
|
|
19
22
|
|
20
23
|
if
|
21
24
|
[:capitalize, :center, :chomp, :ljust, :lstrip, :rindex, :rjust,
|
22
|
-
:rstrip, :scan, :swapcase, :tr].include?
|
25
|
+
:rstrip, :scan, :swapcase, :tr].include? method
|
23
26
|
then
|
24
27
|
# map selected string functions
|
25
|
-
s(:send, s(:lvar, :_s),
|
28
|
+
s(:send, s(:lvar, :_s), method,
|
26
29
|
*process_all([node.children[0], *node.children[2..-1]]))
|
27
30
|
|
28
31
|
elsif
|
29
32
|
[:at, :compact, :compact!, :delete_at, :delete_at, :flatten, :insert,
|
30
33
|
:reverse, :reverse!, :rotate, :rotate, :rotate!, :shift, :shuffle,
|
31
34
|
:shuffle!, :slice, :slice!, :transpose, :union, :uniq, :uniq!]
|
32
|
-
.include?
|
35
|
+
.include? method
|
33
36
|
then
|
34
37
|
# map selected array functions
|
35
|
-
s(:send, s(:lvar, :_a),
|
38
|
+
s(:send, s(:lvar, :_a), method.to_s.sub("!", '_bang'),
|
36
39
|
*process_all([node.children[0], *node.children[2..-1]]))
|
37
40
|
|
38
41
|
|
39
|
-
elsif [:strftime].include?
|
42
|
+
elsif [:strftime].include? method
|
40
43
|
# map selected time functions
|
41
|
-
s(:send, s(:lvar, :_t),
|
44
|
+
s(:send, s(:lvar, :_t), method,
|
42
45
|
*process_all([node.children[0], *node.children[2..-1]]))
|
43
46
|
|
44
|
-
elsif
|
47
|
+
elsif method == :<=>
|
45
48
|
s(:send, s(:attr, s(:const, nil, :R), :Comparable), :cmp,
|
46
49
|
node.children[0], *node.children[2..-1])
|
47
50
|
|
48
|
-
elsif
|
51
|
+
elsif method == :between?
|
49
52
|
s(:send, s(:send, nil, :R, node.children[0]), :between,
|
50
53
|
*node.children[2..-1])
|
51
54
|
|
@@ -56,31 +59,32 @@ module Ruby2JS
|
|
56
59
|
|
57
60
|
def on_block(node)
|
58
61
|
call, args, *block = node.children
|
62
|
+
method = call.children[1]
|
63
|
+
return super if excluded?(method)
|
59
64
|
|
60
65
|
if
|
61
66
|
[:collect_concat, :count, :cycle, :delete_if, :drop_while,
|
62
67
|
:each_index, :each_slice, :each_with_index, :each_with_object,
|
63
68
|
:find, :find_all, :flat_map, :inject, :grep, :group_by, :keep_if,
|
64
69
|
:map, :max_by, :min_by, :one?, :partition, :reject, :reverse_each,
|
65
|
-
:select!, :sort_by, :take_while].include?
|
70
|
+
:select!, :sort_by, :take_while].include? method
|
66
71
|
then
|
67
72
|
if
|
68
73
|
[:collect_concat, :count, :delete_if, :drop_while, :find,
|
69
74
|
:find_all, :flat_map, :grep, :group_by, :keep_if, :map, :max_by,
|
70
75
|
:min_by, :one?, :partition, :reject, :select!, :sort_by,
|
71
|
-
:take_while].include?
|
76
|
+
:take_while].include? method
|
72
77
|
then
|
73
78
|
block = [ s(:autoreturn, *block) ]
|
74
79
|
end
|
75
80
|
|
76
|
-
lvar = [:each_index, :keep_if, :select!].
|
77
|
-
include?(call.children[1]) ? :_a : :_e
|
81
|
+
lvar = [:each_index, :keep_if, :select!].include?(method) ? :_a : :_e
|
78
82
|
|
79
|
-
if
|
83
|
+
if method == :find and call.children.length == 2
|
80
84
|
call = s(:send, *call.children, s(:nil))
|
81
|
-
elsif
|
85
|
+
elsif method == :inject and call.children.length == 3
|
82
86
|
call = s(:send, *call.children, s(:nil))
|
83
|
-
elsif
|
87
|
+
elsif method == :select!
|
84
88
|
call = s(:send, call.children.first, :select_bang,
|
85
89
|
*call.children[2..-1])
|
86
90
|
end
|
@@ -8,43 +8,46 @@ module Ruby2JS
|
|
8
8
|
def on_send(node)
|
9
9
|
return super if node.children.first and node.children.first.children.last == :_
|
10
10
|
|
11
|
+
method = node.children[1]
|
12
|
+
return super if excluded?(method)
|
13
|
+
|
11
14
|
if [:clone, :shuffle, :size, :compact, :flatten, :invert, :values,
|
12
|
-
:uniq].include?
|
15
|
+
:uniq].include? method
|
13
16
|
if node.is_method? and node.children.length == 2
|
14
|
-
process S(:send, s(:lvar, :_),
|
17
|
+
process S(:send, s(:lvar, :_), method, node.children[0])
|
15
18
|
else
|
16
19
|
super
|
17
20
|
end
|
18
|
-
elsif
|
21
|
+
elsif method == :sample and node.children.length <= 3
|
19
22
|
process S(:send, s(:lvar, :_), :sample, node.children[0],
|
20
23
|
*node.children[2..-1])
|
21
|
-
elsif
|
24
|
+
elsif method == :has_key? and node.children.length == 3
|
22
25
|
process S(:send, s(:lvar, :_), :has, node.children[0],
|
23
26
|
node.children[2])
|
24
|
-
elsif
|
27
|
+
elsif method == :sort and node.children.length == 2
|
25
28
|
if node.is_method?
|
26
29
|
process S(:send, s(:lvar, :_), :sortBy, node.children[0],
|
27
30
|
s(:attr, s(:lvar, :_), :identity))
|
28
31
|
else
|
29
32
|
super
|
30
33
|
end
|
31
|
-
elsif
|
34
|
+
elsif method == :map
|
32
35
|
if node.children.length == 3 and node.children[2].type == :block_pass
|
33
36
|
process S(:send, s(:lvar, :_), :pluck, node.children[0],
|
34
37
|
node.children[2].children.first)
|
35
38
|
else
|
36
39
|
super
|
37
40
|
end
|
38
|
-
elsif
|
41
|
+
elsif method == :merge and node.children.length >= 3
|
39
42
|
process S(:send, s(:lvar, :_), :extend, s(:hash), node.children[0],
|
40
43
|
*node.children[2..-1])
|
41
|
-
elsif
|
44
|
+
elsif method == :merge! and node.children.length >= 3
|
42
45
|
process S(:send, s(:lvar, :_), :extend, node.children[0],
|
43
46
|
*node.children[2..-1])
|
44
|
-
elsif
|
47
|
+
elsif method == :zip and node.children.length >= 3
|
45
48
|
process S(:send, s(:lvar, :_), :zip, node.children[0],
|
46
49
|
*node.children[2..-1])
|
47
|
-
elsif
|
50
|
+
elsif method == :invoke
|
48
51
|
if node.children.length >= 3 and node.children.last.type==:block_pass
|
49
52
|
process S(:send, s(:lvar, :_), :invoke, node.children[0],
|
50
53
|
node.children.last.children.first,
|
@@ -52,11 +55,11 @@ module Ruby2JS
|
|
52
55
|
else
|
53
56
|
super
|
54
57
|
end
|
55
|
-
elsif [:where, :find_by].include?
|
56
|
-
method =
|
58
|
+
elsif [:where, :find_by].include? method
|
59
|
+
method = (method == :where ? :where : :findWhere)
|
57
60
|
process S(:send, s(:lvar, :_), method, node.children[0],
|
58
61
|
*node.children[2..-1])
|
59
|
-
elsif
|
62
|
+
elsif method == :reduce
|
60
63
|
if node.children.length == 3 and node.children[2].type == :sym
|
61
64
|
# input: a.reduce(:+)
|
62
65
|
# output: _.reduce(_.rest(a),
|
@@ -86,13 +89,13 @@ module Ruby2JS
|
|
86
89
|
end
|
87
90
|
|
88
91
|
elsif [:compact!, :flatten!, :shuffle!, :uniq!].
|
89
|
-
include?
|
92
|
+
include? method and node.is_method?
|
90
93
|
# input: a.compact!
|
91
94
|
# output: a.splice(0, a.length, *a.compact)
|
92
95
|
target = node.children.first
|
93
96
|
process S(:send, target, :splice, s(:int, 0),
|
94
97
|
s(:attr, target, :length), s(:splat, s(:send, target,
|
95
|
-
:"#{
|
98
|
+
:"#{method.to_s[0..-2]}", *node.children[2..-1])))
|
96
99
|
else
|
97
100
|
super
|
98
101
|
end
|
@@ -100,31 +103,34 @@ module Ruby2JS
|
|
100
103
|
|
101
104
|
def on_block(node)
|
102
105
|
call = node.children.first
|
103
|
-
|
106
|
+
method = call.children[1]
|
107
|
+
return super if excluded?(method)
|
108
|
+
|
109
|
+
if [:sort_by, :group_by, :index_by, :count_by].include? method
|
104
110
|
# input: a.sort_by {}
|
105
111
|
# output: _.sortBy {return expression}
|
106
|
-
method =
|
112
|
+
method = method.to_s.sub(/\_by$/,'By').to_sym
|
107
113
|
process S(:block, s(:send, s(:lvar, :_), method,
|
108
114
|
call.children.first), node.children[1],
|
109
115
|
s(:autoreturn, node.children[2]))
|
110
|
-
elsif [:find, :reject].include?
|
116
|
+
elsif [:find, :reject].include? method
|
111
117
|
if call.children.length == 2
|
112
118
|
# input: a.find {|item| item > 0}
|
113
119
|
# output: _.find(a) {|item| return item > 0}
|
114
|
-
process S(:block, s(:send, s(:lvar, :_),
|
120
|
+
process S(:block, s(:send, s(:lvar, :_), method,
|
115
121
|
call.children.first), node.children[1],
|
116
122
|
s(:autoreturn, node.children[2]))
|
117
123
|
else
|
118
124
|
super
|
119
125
|
end
|
120
126
|
|
121
|
-
elsif
|
127
|
+
elsif method == :times and call.children.length == 2
|
122
128
|
# input: 5.times {|i| console.log i}
|
123
129
|
# output: _.find(5) {|i| console.log(i)}
|
124
|
-
process S(:block, s(:send, s(:lvar, :_),
|
130
|
+
process S(:block, s(:send, s(:lvar, :_), method,
|
125
131
|
call.children.first), node.children[1], node.children[2])
|
126
132
|
|
127
|
-
elsif
|
133
|
+
elsif method == :reduce
|
128
134
|
if call.children.length == 2
|
129
135
|
# input: a.reduce {|memo, item| memo+item}
|
130
136
|
# output: _.reduce(_.rest(a),
|
@@ -144,10 +150,10 @@ module Ruby2JS
|
|
144
150
|
call.children[2])
|
145
151
|
end
|
146
152
|
|
147
|
-
elsif [:map!, :reject!, :select!, :sort_by!].include?
|
153
|
+
elsif [:map!, :reject!, :select!, :sort_by!].include? method
|
148
154
|
# input: a.map! {expression}
|
149
155
|
# output: a.splice(0, a.length, *a.map {expression})
|
150
|
-
method = :"#{
|
156
|
+
method = :"#{method.to_s[0..-2]}"
|
151
157
|
target = call.children.first
|
152
158
|
process S(:call, target, :splice, s(:splat, s(:send, s(:array,
|
153
159
|
s(:int, 0), s(:attr, target, :length)), :concat,
|
data/lib/ruby2js/filter/vue.rb
CHANGED
@@ -623,7 +623,11 @@ module Ruby2JS
|
|
623
623
|
hash['nativeOn']['input'] ||
|
624
624
|
hash['nativeOn']['change']
|
625
625
|
attr = 'value'
|
626
|
-
|
626
|
+
if hash[:attrs]['type'] == s(:str, 'file')
|
627
|
+
event = 'change'
|
628
|
+
else
|
629
|
+
event = 'input'
|
630
|
+
end
|
627
631
|
end
|
628
632
|
|
629
633
|
# search for the presence of a 'onClick' attribute
|
data/lib/ruby2js/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby2js
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -93,6 +93,7 @@ files:
|
|
93
93
|
- lib/ruby2js/es2017.rb
|
94
94
|
- lib/ruby2js/es2017/strict.rb
|
95
95
|
- lib/ruby2js/execjs.rb
|
96
|
+
- lib/ruby2js/filter.rb
|
96
97
|
- lib/ruby2js/filter/camelCase.rb
|
97
98
|
- lib/ruby2js/filter/functions.rb
|
98
99
|
- lib/ruby2js/filter/jquery.rb
|
@@ -130,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
131
|
version: '0'
|
131
132
|
requirements: []
|
132
133
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.7.
|
134
|
+
rubygems_version: 2.7.6
|
134
135
|
signing_key:
|
135
136
|
specification_version: 4
|
136
137
|
summary: Minimal yet extensible Ruby to JavaScript conversion.
|