ruby2js 3.3.5 → 3.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +99 -65
- data/lib/ruby2js.rb +22 -0
- data/lib/ruby2js/converter.rb +9 -4
- data/lib/ruby2js/converter/block.rb +5 -0
- data/lib/ruby2js/converter/class2.rb +9 -3
- data/lib/ruby2js/converter/cvar.rb +1 -1
- data/lib/ruby2js/converter/cvasgn.rb +1 -1
- data/lib/ruby2js/converter/def.rb +16 -0
- data/lib/ruby2js/converter/dstr.rb +1 -1
- data/lib/ruby2js/converter/hash.rb +3 -1
- data/lib/ruby2js/converter/import.rb +94 -10
- data/lib/ruby2js/converter/ivar.rb +13 -5
- data/lib/ruby2js/converter/ivasgn.rb +1 -1
- data/lib/ruby2js/converter/logical.rb +1 -1
- data/lib/ruby2js/converter/return.rb +3 -1
- data/lib/ruby2js/converter/taglit.rb +13 -0
- data/lib/ruby2js/converter/yield.rb +12 -0
- data/lib/ruby2js/filter/camelCase.rb +78 -35
- data/lib/ruby2js/filter/esm.rb +70 -41
- data/lib/ruby2js/filter/esm_migration.rb +72 -0
- data/lib/ruby2js/filter/fast-deep-equal.rb +23 -0
- data/lib/ruby2js/filter/functions.rb +24 -1
- data/lib/ruby2js/filter/node.rb +37 -53
- data/lib/ruby2js/filter/nokogiri.rb +3 -25
- data/lib/ruby2js/filter/require.rb +0 -2
- data/lib/ruby2js/filter/return.rb +9 -3
- data/lib/ruby2js/filter/securerandom.rb +33 -0
- data/lib/ruby2js/filter/tagged_templates.rb +40 -0
- data/lib/ruby2js/filter/vue.rb +9 -0
- data/lib/ruby2js/serializer.rb +1 -1
- data/lib/ruby2js/version.rb +2 -2
- data/ruby2js.gemspec +1 -1
- metadata +9 -4
- data/lib/ruby2js/filter/rubyjs.rb +0 -112
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'ruby2js'
|
2
|
+
|
3
|
+
module Ruby2JS
|
4
|
+
module Filter
|
5
|
+
module ESMMigration
|
6
|
+
include SEXP
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
@esm_include = nil
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def process(node)
|
14
|
+
return super if @esm_include
|
15
|
+
@esm_include = Set.new
|
16
|
+
@esm_exclude = Set.new
|
17
|
+
@esm_export = nil
|
18
|
+
result = super
|
19
|
+
|
20
|
+
esm_walk(result)
|
21
|
+
|
22
|
+
inventory = (@esm_include - @esm_exclude).to_a.sort
|
23
|
+
|
24
|
+
if inventory.empty? and not @esm_export
|
25
|
+
result
|
26
|
+
else
|
27
|
+
list = inventory.map do |name|
|
28
|
+
if name == "React" and defined? Ruby2JS::Filter::React
|
29
|
+
s(:import, "#{name.downcase}", s(:const, nil, name))
|
30
|
+
elsif not %w(JSON Object).include? name
|
31
|
+
s(:import, "./#{name.downcase}.js", s(:const, nil, name))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
list.push result
|
36
|
+
|
37
|
+
if @esm_export
|
38
|
+
list.push s(:export, :default, s(:const, nil, @esm_export))
|
39
|
+
end
|
40
|
+
|
41
|
+
s(:begin, *list.compact)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# gather constants
|
46
|
+
def esm_walk(node)
|
47
|
+
# extract ivars and cvars
|
48
|
+
if node.type == :const and node.children.first == nil
|
49
|
+
@esm_include << node.children.last.to_s
|
50
|
+
elsif node.type == :xnode
|
51
|
+
name = node.children.first
|
52
|
+
@esm_include << name unless name.empty? or name =~ /^[a-z]/
|
53
|
+
elsif node.type == :casgn and node.children.first == nil
|
54
|
+
@esm_exclude << node.children[1].to_s
|
55
|
+
elsif node.type == :class and node.children.first.type == :const
|
56
|
+
if node.children.first.children.first == nil
|
57
|
+
name = node.children.first.children.last.to_s
|
58
|
+
@esm_exclude << name
|
59
|
+
@esm_export ||= name
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# recurse
|
64
|
+
node.children.each do |child|
|
65
|
+
esm_walk(child) if Parser::AST::Node === child
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
DEFAULTS.push ESMMigration
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'ruby2js'
|
2
|
+
|
3
|
+
module Ruby2JS
|
4
|
+
module Filter
|
5
|
+
module Fast_Deep_Equal
|
6
|
+
include SEXP
|
7
|
+
|
8
|
+
SCALAR = [ :float, :int, :nil, :str ]
|
9
|
+
|
10
|
+
def on_send(node)
|
11
|
+
return super unless node.children.length == 3
|
12
|
+
left, method, right = node.children
|
13
|
+
return super unless method == :==
|
14
|
+
return super if SCALAR.include? left.type
|
15
|
+
return super if SCALAR.include? right.type
|
16
|
+
|
17
|
+
node.updated nil, [nil, :$eq, left, right]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
DEFAULTS.push Fast_Deep_Equal
|
22
|
+
end
|
23
|
+
end
|
@@ -528,6 +528,18 @@ module Ruby2JS
|
|
528
528
|
elsif method == :new and target == s(:const, nil, :Exception)
|
529
529
|
process S(:send, s(:const, nil, :Error), :new, *args)
|
530
530
|
|
531
|
+
elsif method == :block_given? and target == nil and args.length == 0
|
532
|
+
process process s(:lvar, "_implicitBlockYield")
|
533
|
+
|
534
|
+
elsif method == :abs and args.length == 0
|
535
|
+
process S(:send, s(:const, nil, :Math), :abs, target)
|
536
|
+
|
537
|
+
elsif method == :ceil and args.length == 0
|
538
|
+
process S(:send, s(:const, nil, :Math), :ceil, target)
|
539
|
+
|
540
|
+
elsif method == :floor and args.length == 0
|
541
|
+
process S(:send, s(:const, nil, :Math), :floor, target)
|
542
|
+
|
531
543
|
else
|
532
544
|
super
|
533
545
|
end
|
@@ -538,7 +550,7 @@ module Ruby2JS
|
|
538
550
|
method = call.children[1]
|
539
551
|
return super if excluded?(method)
|
540
552
|
|
541
|
-
if [:setInterval, :setTimeout].include? method
|
553
|
+
if [:setInterval, :setTimeout, :set_interval, :set_timeout].include? method
|
542
554
|
return super unless call.children.first == nil
|
543
555
|
block = process s(:block, s(:send, nil, :proc), *node.children[1..-1])
|
544
556
|
on_send call.updated nil, [*call.children[0..1], block,
|
@@ -703,6 +715,17 @@ module Ruby2JS
|
|
703
715
|
process call.updated(nil, [*call.children, s(:block,
|
704
716
|
s(:send, nil, :proc), *node.children[1..-1])])
|
705
717
|
|
718
|
+
elsif method == :yield_self and call.children.length == 2
|
719
|
+
process node.updated(:send, [s(:block, s(:send, nil, :proc),
|
720
|
+
node.children[1], s(:autoreturn, node.children[2])),
|
721
|
+
:[], call.children[0]])
|
722
|
+
|
723
|
+
elsif method == :tap and call.children.length == 2
|
724
|
+
process node.updated(:send, [s(:block, s(:send, nil, :proc),
|
725
|
+
node.children[1], s(:begin, node.children[2],
|
726
|
+
s(:return, s(:lvar, node.children[1].children[0].children[0])))),
|
727
|
+
:[], call.children[0]])
|
728
|
+
|
706
729
|
else
|
707
730
|
super
|
708
731
|
end
|
data/lib/ruby2js/filter/node.rb
CHANGED
@@ -1,37 +1,21 @@
|
|
1
1
|
require 'ruby2js'
|
2
2
|
require 'set'
|
3
3
|
|
4
|
+
Ruby2JS.module_default ||= :cjs
|
5
|
+
|
4
6
|
module Ruby2JS
|
5
7
|
module Filter
|
6
8
|
module Node
|
7
9
|
include SEXP
|
8
10
|
extend SEXP
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
s(:send, nil, :require, s(:str, "child_process"))),
|
13
|
-
fs: s(:casgn, nil, :fs, s(:send, nil, :require, s(:str, "fs"))),
|
14
|
-
ARGV: s(:lvasgn, :ARGV, s(:send, s(:attr,
|
15
|
-
s(:attr, nil, :process), :argv), :slice, s(:int, 2)))
|
16
|
-
}
|
17
|
-
|
18
|
-
def initialize(*args)
|
19
|
-
@node_setup = nil
|
20
|
-
super
|
21
|
-
end
|
12
|
+
IMPORT_CHILD_PROCESS = s(:import, ['child_process'],
|
13
|
+
s(:attr, nil, :child_process))
|
22
14
|
|
23
|
-
|
24
|
-
return super if @node_setup
|
25
|
-
@node_setup = Set.new
|
26
|
-
result = super
|
15
|
+
IMPORT_FS = s(:import, ['fs'], s(:attr, nil, :fs))
|
27
16
|
|
28
|
-
|
29
|
-
|
30
|
-
else
|
31
|
-
s(:begin, *@node_setup.to_a.map {|token| NODE_SETUP[token]},
|
32
|
-
result)
|
33
|
-
end
|
34
|
-
end
|
17
|
+
SETUP_ARGV = s(:lvasgn, :ARGV, s(:send, s(:attr,
|
18
|
+
s(:attr, nil, :process), :argv), :slice, s(:int, 2)))
|
35
19
|
|
36
20
|
def on_send(node)
|
37
21
|
target, method, *args = node.children
|
@@ -44,7 +28,7 @@ module Ruby2JS
|
|
44
28
|
s(:send, s(:attr, nil, :process), :exit, *process_all(args));
|
45
29
|
|
46
30
|
elsif method == :system
|
47
|
-
|
31
|
+
prepend_list << IMPORT_CHILD_PROCESS
|
48
32
|
|
49
33
|
if args.length == 1
|
50
34
|
s(:send, s(:attr, nil, :child_process), :execSync,
|
@@ -72,38 +56,38 @@ module Ruby2JS
|
|
72
56
|
target.type == :const and target.children.first == nil
|
73
57
|
then
|
74
58
|
if method == :read and args.length == 1
|
75
|
-
|
59
|
+
prepend_list << IMPORT_FS
|
76
60
|
s(:send, s(:attr, nil, :fs), :readFileSync, *process_all(args),
|
77
61
|
s(:str, 'utf8'))
|
78
62
|
|
79
63
|
elsif method == :write and args.length == 2
|
80
|
-
|
64
|
+
prepend_list << IMPORT_FS
|
81
65
|
S(:send, s(:attr, nil, :fs), :writeFileSync, *process_all(args))
|
82
66
|
|
83
67
|
elsif target.children.last == :IO
|
84
68
|
super
|
85
69
|
|
86
70
|
elsif [:exist?, :exists?].include? method and args.length == 1
|
87
|
-
|
71
|
+
prepend_list << IMPORT_FS
|
88
72
|
S(:send, s(:attr, nil, :fs), :existsSync, process(args.first))
|
89
73
|
|
90
74
|
elsif method == :readlink and args.length == 1
|
91
|
-
|
75
|
+
prepend_list << IMPORT_FS
|
92
76
|
S(:send, s(:attr, nil, :fs), :readlinkSync, process(args.first))
|
93
77
|
|
94
78
|
elsif method == :realpath and args.length == 1
|
95
|
-
|
79
|
+
prepend_list << IMPORT_FS
|
96
80
|
S(:send, s(:attr, nil, :fs), :realpathSync, process(args.first))
|
97
81
|
|
98
82
|
elsif method == :rename and args.length == 2
|
99
|
-
|
83
|
+
prepend_list << IMPORT_FS
|
100
84
|
S(:send, s(:attr, nil, :fs), :renameSync, *process_all(args))
|
101
85
|
|
102
86
|
elsif \
|
103
87
|
[:chmod, :lchmod].include? method and
|
104
88
|
args.length > 1 and args.first.type == :int
|
105
89
|
then
|
106
|
-
|
90
|
+
prepend_list << IMPORT_FS
|
107
91
|
|
108
92
|
S(:begin, *args[1..-1].map{|file|
|
109
93
|
S(:send, s(:attr, nil, :fs), method.to_s + 'Sync', process(file),
|
@@ -114,7 +98,7 @@ module Ruby2JS
|
|
114
98
|
[:chown, :lchown].include? method and args.length > 2 and
|
115
99
|
args[0].type == :int and args[1].type == :int
|
116
100
|
then
|
117
|
-
|
101
|
+
prepend_list << IMPORT_FS
|
118
102
|
|
119
103
|
S(:begin, *args[2..-1].map{|file|
|
120
104
|
s(:send, s(:attr, nil, :fs), method.to_s + 'Sync', process(file),
|
@@ -122,24 +106,24 @@ module Ruby2JS
|
|
122
106
|
})
|
123
107
|
|
124
108
|
elsif [:ln, :link].include? method and args.length == 2
|
125
|
-
|
109
|
+
prepend_list << IMPORT_FS
|
126
110
|
s(:send, s(:attr, nil, :fs), :linkSync, *process_all(args))
|
127
111
|
|
128
112
|
elsif method == :symlink and args.length == 2
|
129
|
-
|
113
|
+
prepend_list << IMPORT_FS
|
130
114
|
s(:send, s(:attr, nil, :fs), :symlinkSync, *process_all(args))
|
131
115
|
|
132
116
|
elsif method == :truncate and args.length == 2
|
133
|
-
|
117
|
+
prepend_list << IMPORT_FS
|
134
118
|
s(:send, s(:attr, nil, :fs), :truncateSync, *process_all(args))
|
135
119
|
|
136
120
|
elsif [:stat, :lstat].include? method and args.length == 1
|
137
|
-
|
121
|
+
prepend_list << IMPORT_FS
|
138
122
|
s(:send, s(:attr, nil, :fs), method.to_s + 'Sync',
|
139
123
|
process(args.first))
|
140
124
|
|
141
125
|
elsif method == :unlink and args.length == 1
|
142
|
-
|
126
|
+
prepend_list << IMPORT_FS
|
143
127
|
S(:begin, *args.map{|file|
|
144
128
|
S(:send, s(:attr, nil, :fs), :unlinkSync, process(file))
|
145
129
|
})
|
@@ -162,15 +146,15 @@ module Ruby2JS
|
|
162
146
|
end
|
163
147
|
|
164
148
|
if [:cp, :copy].include? method and args.length == 2
|
165
|
-
|
149
|
+
prepend_list << IMPORT_FS
|
166
150
|
s(:send, s(:attr, nil, :fs), :copyFileSync, *process_all(args))
|
167
151
|
|
168
152
|
elsif [:mv, :move].include? method and args.length == 2
|
169
|
-
|
153
|
+
prepend_list << IMPORT_FS
|
170
154
|
S(:send, s(:attr, nil, :fs), :renameSync, *process_all(args))
|
171
155
|
|
172
156
|
elsif method == :mkdir and args.length == 1
|
173
|
-
|
157
|
+
prepend_list << IMPORT_FS
|
174
158
|
S(:begin, *list[args.last].map {|file|
|
175
159
|
s(:send, s(:attr, nil, :fs), :mkdirSync, process(file))
|
176
160
|
})
|
@@ -182,21 +166,21 @@ module Ruby2JS
|
|
182
166
|
s(:send, s(:attr, nil, :process), :cwd)
|
183
167
|
|
184
168
|
elsif method == :rmdir and args.length == 1
|
185
|
-
|
169
|
+
prepend_list << IMPORT_FS
|
186
170
|
S(:begin, *list[args.last].map {|file|
|
187
171
|
s(:send, s(:attr, nil, :fs), :rmdirSync, process(file))
|
188
172
|
})
|
189
173
|
|
190
174
|
elsif method == :ln and args.length == 2
|
191
|
-
|
175
|
+
prepend_list << IMPORT_FS
|
192
176
|
s(:send, s(:attr, nil, :fs), :linkSync, *process_all(args))
|
193
177
|
|
194
178
|
elsif method == :ln_s and args.length == 2
|
195
|
-
|
179
|
+
prepend_list << IMPORT_FS
|
196
180
|
s(:send, s(:attr, nil, :fs), :symlinkSync, *process_all(args))
|
197
181
|
|
198
182
|
elsif method == :rm and args.length == 1
|
199
|
-
|
183
|
+
prepend_list << IMPORT_FS
|
200
184
|
S(:begin, *list[args.last].map {|file|
|
201
185
|
s(:send, s(:attr, nil, :fs), :unlinkSync, process(file))
|
202
186
|
})
|
@@ -204,7 +188,7 @@ module Ruby2JS
|
|
204
188
|
elsif \
|
205
189
|
method == :chmod and args.length == 2 and args.first.type == :int
|
206
190
|
then
|
207
|
-
|
191
|
+
prepend_list << IMPORT_FS
|
208
192
|
|
209
193
|
S(:begin, *list[args.last].map {|file|
|
210
194
|
S(:send, s(:attr, nil, :fs), method.to_s + 'Sync', process(file),
|
@@ -215,14 +199,14 @@ module Ruby2JS
|
|
215
199
|
method == :chown and args.length == 3 and
|
216
200
|
args[0].type == :int and args[1].type == :int
|
217
201
|
then
|
218
|
-
|
202
|
+
prepend_list << IMPORT_FS
|
219
203
|
|
220
204
|
S(:begin, *list[args.last].map {|file|
|
221
205
|
s(:send, s(:attr, nil, :fs), method.to_s + 'Sync', process(file),
|
222
206
|
*process_all(args[0..1]))})
|
223
207
|
|
224
208
|
elsif method == :touch
|
225
|
-
|
209
|
+
prepend_list << IMPORT_FS
|
226
210
|
|
227
211
|
S(:begin, *list[args.first].map {|file|
|
228
212
|
S(:send, s(:attr, nil, :fs), :closeSync,
|
@@ -242,16 +226,16 @@ module Ruby2JS
|
|
242
226
|
elsif method == :pwd and args.length == 0
|
243
227
|
s(:send, s(:attr, nil, :process), :cwd)
|
244
228
|
elsif method == :entries
|
245
|
-
|
229
|
+
prepend_list << IMPORT_FS
|
246
230
|
s(:send, s(:attr, nil, :fs), :readdirSync, *process_all(args))
|
247
231
|
elsif method == :mkdir and args.length == 1
|
248
|
-
|
232
|
+
prepend_list << IMPORT_FS
|
249
233
|
s(:send, s(:attr, nil, :fs), :mkdirSync, process(args.first))
|
250
234
|
elsif method == :rmdir and args.length == 1
|
251
|
-
|
235
|
+
prepend_list << IMPORT_FS
|
252
236
|
s(:send, s(:attr, nil, :fs), :rmdirSync, process(args.first))
|
253
237
|
elsif method == :mktmpdir and args.length <=1
|
254
|
-
|
238
|
+
prepend_list << IMPORT_FS
|
255
239
|
if args.length == 0
|
256
240
|
prefix = s(:str, 'd')
|
257
241
|
elsif args.first.type == :array
|
@@ -291,7 +275,7 @@ module Ruby2JS
|
|
291
275
|
|
292
276
|
def on_const(node)
|
293
277
|
if node.children == [nil, :ARGV]
|
294
|
-
|
278
|
+
prepend_list << SETUP_ARGV
|
295
279
|
super
|
296
280
|
elsif node.children == [nil, :ENV]
|
297
281
|
S(:attr, s(:attr, nil, :process), :env)
|
@@ -319,7 +303,7 @@ module Ruby2JS
|
|
319
303
|
end
|
320
304
|
|
321
305
|
def on_xstr(node)
|
322
|
-
|
306
|
+
prepend_list << IMPORT_CHILD_PROCESS
|
323
307
|
|
324
308
|
children = node.children.dup
|
325
309
|
command = children.shift
|
@@ -7,29 +7,7 @@ module Ruby2JS
|
|
7
7
|
include SEXP
|
8
8
|
extend SEXP
|
9
9
|
|
10
|
-
|
11
|
-
jsdom: s(:casgn, nil, :JSDOM,
|
12
|
-
s(:attr, s(:send, nil, :require, s(:str, "jsdom")), :JSDOM))
|
13
|
-
}
|
14
|
-
|
15
|
-
def initialize(*args)
|
16
|
-
@nokogiri_setup = nil
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def process(node)
|
21
|
-
return super if @nokogiri_setup
|
22
|
-
@nokogiri_setup = Set.new
|
23
|
-
result = super
|
24
|
-
|
25
|
-
if @nokogiri_setup.empty?
|
26
|
-
result
|
27
|
-
else
|
28
|
-
s(:begin,
|
29
|
-
*@nokogiri_setup.to_a.map {|token| NOKOGIRI_SETUP[token]},
|
30
|
-
result)
|
31
|
-
end
|
32
|
-
end
|
10
|
+
IMPORT_JSDOM = s(:import, ["jsdom"], [s(:attr, nil, :JSDOM)])
|
33
11
|
|
34
12
|
def on_send(node)
|
35
13
|
target, method, *args = node.children
|
@@ -51,7 +29,7 @@ module Ruby2JS
|
|
51
29
|
[:HTML, :HTML5].include? method and
|
52
30
|
target == s(:const, nil, :Nokogiri)
|
53
31
|
then
|
54
|
-
|
32
|
+
prepend_list << IMPORT_JSDOM
|
55
33
|
S(:attr, s(:attr, s(:send, s(:const, nil, :JSDOM), :new,
|
56
34
|
*process_all(args)), :window), :document)
|
57
35
|
|
@@ -61,7 +39,7 @@ module Ruby2JS
|
|
61
39
|
target.children.first == s(:const, nil, :Nokogiri) and
|
62
40
|
[:HTML, :HTML5].include? target.children.last
|
63
41
|
then
|
64
|
-
|
42
|
+
prepend_list << IMPORT_JSDOM
|
65
43
|
S(:attr, s(:attr, s(:send, s(:const, nil, :JSDOM), :new,
|
66
44
|
*process_all(args)), :window), :document)
|
67
45
|
|
@@ -8,16 +8,22 @@ module Ruby2JS
|
|
8
8
|
EXPRESSIONS = [ :array, :float, :hash, :if, :int, :lvar, :nil, :send ]
|
9
9
|
|
10
10
|
def on_block(node)
|
11
|
-
|
11
|
+
node = super
|
12
|
+
return node unless node.type == :block
|
13
|
+
children = node.children.dup
|
12
14
|
|
13
15
|
children[-1] = s(:nil) if children.last == nil
|
14
16
|
|
15
|
-
node.updated nil, [*
|
17
|
+
node.updated nil, [*children[0..1],
|
16
18
|
s(:autoreturn, *children[2..-1])]
|
17
19
|
end
|
18
20
|
|
19
21
|
def on_def(node)
|
20
|
-
|
22
|
+
node = super
|
23
|
+
return node unless node.type == :def
|
24
|
+
return node if [:constructor, :initialize].include?(node.children.first)
|
25
|
+
|
26
|
+
children = node.children[1..-1]
|
21
27
|
|
22
28
|
children[-1] = s(:nil) if children.last == nil
|
23
29
|
|