ruby2js 3.3.5 → 3.5.2
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 +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
|
|