ruby2js 5.0.1 → 5.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -23
- data/demo/ruby2js.rb +51 -39
- data/lib/ruby2js/cgi.rb +2 -0
- data/lib/ruby2js/configuration_dsl.rb +95 -0
- data/lib/ruby2js/converter/return.rb +1 -1
- data/lib/ruby2js/execjs.rb +2 -0
- data/lib/ruby2js/filter/camelCase.rb +4 -0
- data/lib/ruby2js/filter/jquery.rb +2 -0
- data/lib/ruby2js/filter/jsx.rb +2 -0
- data/lib/ruby2js/filter/matchAll.rb +2 -0
- data/lib/ruby2js/filter/minitest-jasmine.rb +2 -0
- data/lib/ruby2js/filter/react.rb +2 -0
- data/lib/ruby2js/filter/require.rb +20 -0
- data/lib/ruby2js/filter/underscore.rb +2 -0
- data/lib/ruby2js/filter/vue.rb +2 -0
- data/lib/ruby2js/filter.rb +50 -0
- data/lib/ruby2js/haml.rb +37 -6
- data/lib/ruby2js/jsx.rb +2 -0
- data/lib/ruby2js/rails.rb +2 -0
- data/lib/ruby2js/sinatra.rb +2 -0
- data/lib/ruby2js/sprockets.rb +2 -0
- data/lib/ruby2js/strict.rb +2 -0
- data/lib/ruby2js/version.rb +1 -1
- data/lib/ruby2js.rb +52 -11
- data/lib/tasks/README.md +2 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6436ac11f25e564ac1a5c8efdc17cd8c2f20e6d024899abdaa9badcb35c7c2b
|
4
|
+
data.tar.gz: c9f18781880390e3fd6db9a699a9de8c92c0ca34d853d416ff0a1daf3fa5b64f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6531b7bdae9313e665ed2801e78db70aa8fc22fd667aaed1d2ec9ce17824f2a812efa123c0341e518a40303c264c929d084f2160e98f9c6132a47684a3cf4c7
|
7
|
+
data.tar.gz: f0a805108a89a46132625ab5541a490e8e08c1fdd62483009a415aa2bff71d11c4427f35d8f9bc6b6e24f4512ab8bc50108ba18d3abb3370e76216f2c51bbcca
|
data/README.md
CHANGED
@@ -4,15 +4,13 @@ Ruby2JS
|
|
4
4
|
Minimal yet extensible Ruby to JavaScript conversion.
|
5
5
|
|
6
6
|
[![Gem Version](https://badge.fury.io/rb/ruby2js.svg)](https://badge.fury.io/rb/ruby2js)
|
7
|
-
[![Gitter](https://badges.gitter.im/ruby2js/community.svg)](https://gitter.im/ruby2js/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
8
|
-
|
9
7
|
|
10
8
|
## Documentation
|
11
9
|
---
|
12
10
|
|
13
11
|
* Visit **[ruby2js.com](https://www.ruby2js.com)** for detailed setup instructions and API reference.
|
14
12
|
|
15
|
-
* [Try Ruby2JS online](https://ruby2js.com/demo)
|
13
|
+
* [Try Ruby2JS online](https://ruby2js.com/demo?preset=true)
|
16
14
|
|
17
15
|
|
18
16
|
## Synopsis
|
@@ -22,26 +20,7 @@ Basic:
|
|
22
20
|
|
23
21
|
```ruby
|
24
22
|
require 'ruby2js'
|
25
|
-
puts Ruby2JS.convert("a={age:3}\na.age+=1")
|
26
|
-
```
|
27
|
-
|
28
|
-
With filter:
|
29
|
-
|
30
|
-
```ruby
|
31
|
-
require 'ruby2js/filter/functions'
|
32
|
-
puts Ruby2JS.convert('"2A".to_i(16)')
|
33
|
-
```
|
34
|
-
|
35
|
-
Host variable substitution:
|
36
|
-
|
37
|
-
```ruby
|
38
|
-
puts Ruby2JS.convert("@name", ivars: {:@name => "Joe"})
|
39
|
-
```
|
40
|
-
|
41
|
-
Enable ES2015 support:
|
42
|
-
|
43
|
-
```ruby
|
44
|
-
puts Ruby2JS.convert('"#{a}"', eslevel: 2015)
|
23
|
+
puts Ruby2JS.convert("a={age:3}\na.age+=1", preset: true)
|
45
24
|
```
|
46
25
|
|
47
26
|
## Testing
|
data/demo/ruby2js.rb
CHANGED
@@ -23,15 +23,11 @@ $:.unshift File.absolute_path('../../lib', __FILE__)
|
|
23
23
|
require 'ruby2js/demo'
|
24
24
|
require 'cgi'
|
25
25
|
require 'pathname'
|
26
|
+
require 'json'
|
26
27
|
|
27
28
|
def parse_request(env=ENV)
|
28
|
-
|
29
29
|
# autoregister filters
|
30
|
-
filters =
|
31
|
-
Dir["#{$:.first}/ruby2js/filter/*.rb"].sort.each do |file|
|
32
|
-
filter = File.basename(file, '.rb')
|
33
|
-
filters[filter] = file
|
34
|
-
end
|
30
|
+
filters = Ruby2JS::Filter.autoregister($:.first)
|
35
31
|
|
36
32
|
# web/CGI query string support
|
37
33
|
selected = env['PATH_INFO'].to_s.split('/')
|
@@ -59,6 +55,14 @@ def parse_request(env=ENV)
|
|
59
55
|
opts = OptionParser.new
|
60
56
|
opts.banner = "Usage: #$0 [options] [file]"
|
61
57
|
|
58
|
+
opts.on('--preset', "use sane defaults (modern eslevel & common filters)") {options[:preset] = true}
|
59
|
+
|
60
|
+
unless env['QUERY_STRING']
|
61
|
+
opts.on('-C', '--config [FILE]', "configuration file to use (default is config/ruby2js.rb)") {|filename|
|
62
|
+
options[:config_file] = filename
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
62
66
|
opts.on('--autoexports [default]', "add export statements for top level constants") {|option|
|
63
67
|
options[:autoexports] = option ? option.to_sym : true
|
64
68
|
}
|
@@ -92,6 +96,10 @@ def parse_request(env=ENV)
|
|
92
96
|
selected.push(*names)
|
93
97
|
end
|
94
98
|
|
99
|
+
opts.on('--filepath [PATH]', "supply a path if stdin is related to a source file") do |filepath|
|
100
|
+
options[:file] = filepath
|
101
|
+
end
|
102
|
+
|
95
103
|
opts.on('--identity', "triple equal comparison operators") {options[:comparison] = :identity}
|
96
104
|
|
97
105
|
opts.on('--import_from_skypack', "use Skypack for internal functions import statements") do
|
@@ -132,6 +140,10 @@ def parse_request(env=ENV)
|
|
132
140
|
options[:underscored_private] = true
|
133
141
|
end
|
134
142
|
|
143
|
+
opts.on("--sourcemap", "Provide a JSON object with the code and sourcemap") do
|
144
|
+
@provide_sourcemap = true
|
145
|
+
end
|
146
|
+
|
135
147
|
# shameless hack. Instead of repeating the available options, extract them
|
136
148
|
# from the OptionParser. Exclude default options and es20xx options.
|
137
149
|
options_available = opts.instance_variable_get(:@stack).last.list.
|
@@ -159,30 +171,7 @@ def parse_request(env=ENV)
|
|
159
171
|
require 'wunderbar' unless wunderbar_options.empty?
|
160
172
|
|
161
173
|
# load selected filters
|
162
|
-
options[:filters] =
|
163
|
-
|
164
|
-
selected.each do |name|
|
165
|
-
begin
|
166
|
-
if filters.include? name
|
167
|
-
require filters[name]
|
168
|
-
|
169
|
-
# find the module and add it to the list of filters.
|
170
|
-
# Note: explicit filter option is used instead of
|
171
|
-
# relying on Ruby2JS::Filter::DEFAULTS as the demo
|
172
|
-
# may be run as a server and as such DEFAULTS may
|
173
|
-
# contain filters from previous requests.
|
174
|
-
Ruby2JS::Filter::DEFAULTS.each do |mod|
|
175
|
-
method = mod.instance_method(mod.instance_methods.first)
|
176
|
-
if filters[name] == method.source_location.first
|
177
|
-
options[:filters] << mod
|
178
|
-
end
|
179
|
-
end
|
180
|
-
elsif not name.empty? and name =~ /^[-\w+]$/
|
181
|
-
$load_error = "UNKNOWN filter: #{name}"
|
182
|
-
end
|
183
|
-
rescue Exception => $load_error
|
184
|
-
end
|
185
|
-
end
|
174
|
+
options[:filters] = Ruby2JS::Filter.require_filters(selected)
|
186
175
|
|
187
176
|
return options, selected, options_available
|
188
177
|
end
|
@@ -193,9 +182,29 @@ if (not defined? Wunderbar or not env['SERVER_PORT']) and not @live
|
|
193
182
|
# command line support
|
194
183
|
if ARGV.length > 0
|
195
184
|
options[:file] = ARGV.first
|
196
|
-
|
185
|
+
conv = Ruby2JS.convert(File.read(ARGV.first), options)
|
186
|
+
if @provide_sourcemap
|
187
|
+
puts(
|
188
|
+
{
|
189
|
+
code: conv.to_s,
|
190
|
+
sourcemap: conv.sourcemap,
|
191
|
+
}.to_json
|
192
|
+
)
|
193
|
+
else
|
194
|
+
puts conv.to_s
|
195
|
+
end
|
197
196
|
else
|
198
|
-
|
197
|
+
conv = Ruby2JS.convert($stdin.read, options)
|
198
|
+
if @provide_sourcemap
|
199
|
+
puts(
|
200
|
+
{
|
201
|
+
code: conv.to_s,
|
202
|
+
sourcemap: conv.sourcemap,
|
203
|
+
}.to_json
|
204
|
+
)
|
205
|
+
else
|
206
|
+
puts conv.to_s
|
207
|
+
end
|
199
208
|
end
|
200
209
|
|
201
210
|
else
|
@@ -332,11 +341,11 @@ else
|
|
332
341
|
def _sl_menu_item(name, args)
|
333
342
|
if args.include? :checked
|
334
343
|
_div do
|
335
|
-
_input type: 'checkbox', **args
|
344
|
+
_input type: 'checkbox', **args.reject { |k| k == :type }
|
336
345
|
_span name
|
337
346
|
end
|
338
347
|
else
|
339
|
-
_option name, args
|
348
|
+
_option name, args.reject { |k| k == :type }
|
340
349
|
end
|
341
350
|
end
|
342
351
|
|
@@ -348,7 +357,7 @@ else
|
|
348
357
|
|
349
358
|
_form method: 'post' do
|
350
359
|
_div data_controller: @live && 'ruby' do
|
351
|
-
_textarea.ruby.form_control @ruby, name: 'ruby', rows: 8,
|
360
|
+
_textarea.ruby.form_control @ruby || 'puts "Hello world!"', name: 'ruby', rows: 8,
|
352
361
|
placeholder: 'Ruby source'
|
353
362
|
end
|
354
363
|
|
@@ -356,15 +365,17 @@ else
|
|
356
365
|
_input.btn.btn_primary type: 'submit', value: 'Convert',
|
357
366
|
style: "display: #{@live ? 'none' : 'inline'}"
|
358
367
|
|
368
|
+
_sl_checkbox 'Use Preset', id: 'preset', name: 'preset', checked: options[:preset] ? !!options[:preset] : true
|
369
|
+
|
359
370
|
_label 'ESLevel:', for: 'eslevel'
|
360
371
|
if @live
|
361
372
|
_sl_dropdown.eslevel! name: 'eslevel' do
|
362
373
|
_sl_button @eslevel || 'default', slot: 'trigger', caret: true
|
363
374
|
_sl_menu do
|
364
|
-
_sl_menu_item 'default', checked: !@eslevel || @eslevel == 'default'
|
375
|
+
_sl_menu_item 'default', type: "checkbox", checked: !@eslevel || @eslevel == 'default'
|
365
376
|
Dir["#{$:.first}/ruby2js/es20*.rb"].sort.each do |file|
|
366
377
|
eslevel = File.basename(file, '.rb').sub('es', '')
|
367
|
-
_sl_menu_item eslevel, value: eslevel, checked: @eslevel == eslevel
|
378
|
+
_sl_menu_item eslevel, type: "checkbox", value: eslevel, checked: @eslevel == eslevel
|
368
379
|
end
|
369
380
|
end
|
370
381
|
end
|
@@ -386,7 +397,7 @@ else
|
|
386
397
|
Dir["#{$:.first}/ruby2js/filter/*.rb"].sort.each do |file|
|
387
398
|
filter = File.basename(file, '.rb')
|
388
399
|
next if filter == 'require'
|
389
|
-
_sl_menu_item filter, name: filter,
|
400
|
+
_sl_menu_item filter, type: "checkbox", name: filter,
|
390
401
|
checked: selected.include?(filter)
|
391
402
|
end
|
392
403
|
end
|
@@ -400,9 +411,10 @@ else
|
|
400
411
|
checked[:nullish] = options[:or] == :nullish
|
401
412
|
|
402
413
|
options_available.each do |option, args|
|
414
|
+
next if option == 'preset'
|
403
415
|
next if option == 'filter'
|
404
416
|
next if option.start_with? 'require_'
|
405
|
-
_sl_menu_item option, name: option,
|
417
|
+
_sl_menu_item option, type: "checkbox", name: option,
|
406
418
|
checked: checked[option.to_sym],
|
407
419
|
data_args: options_available[option]
|
408
420
|
end
|
data/lib/ruby2js/cgi.rb
CHANGED
@@ -0,0 +1,95 @@
|
|
1
|
+
module Ruby2JS
|
2
|
+
class ConfigurationDSL
|
3
|
+
def self.load_from_file(config_file, options = {})
|
4
|
+
new(options).tap { _1.instance_eval(File.read(config_file), config_file, 1) }
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def preset(bool = true)
|
12
|
+
@options[:preset] = bool
|
13
|
+
end
|
14
|
+
|
15
|
+
def filter(name)
|
16
|
+
@options[:filters] ||= []
|
17
|
+
@options[:filters] << name
|
18
|
+
end
|
19
|
+
|
20
|
+
def remove_filter(name)
|
21
|
+
@options[:disable_filters] ||= []
|
22
|
+
@options[:disable_filters] << name
|
23
|
+
end
|
24
|
+
|
25
|
+
def eslevel(level)
|
26
|
+
@options[:eslevel] = level
|
27
|
+
end
|
28
|
+
|
29
|
+
def equality_comparison
|
30
|
+
@options[:comparison] = :equality
|
31
|
+
end
|
32
|
+
|
33
|
+
def identity_comparison
|
34
|
+
@options[:comparison] = :identity
|
35
|
+
end
|
36
|
+
|
37
|
+
def esm_modules
|
38
|
+
@options[:module] = :esm
|
39
|
+
end
|
40
|
+
|
41
|
+
def cjs_modules
|
42
|
+
@options[:module] = :cjs
|
43
|
+
end
|
44
|
+
|
45
|
+
def underscored_ivars
|
46
|
+
@options[:underscored_private] = true
|
47
|
+
end
|
48
|
+
|
49
|
+
# Only applies for ES2022+
|
50
|
+
def private_field_ivars
|
51
|
+
@options[:underscored_private] = false
|
52
|
+
end
|
53
|
+
|
54
|
+
def logical_or
|
55
|
+
@options[:or] = :logical
|
56
|
+
end
|
57
|
+
|
58
|
+
def nullish_or
|
59
|
+
@options[:or] = :nullish
|
60
|
+
end
|
61
|
+
|
62
|
+
def autoimport(identifier = nil, file = nil, &block)
|
63
|
+
if block
|
64
|
+
@options[:autoimports] = block
|
65
|
+
return
|
66
|
+
elsif @options[:autoimports].is_a?(Proc)
|
67
|
+
@options[:autoimports] = {}
|
68
|
+
end
|
69
|
+
|
70
|
+
@options[:autoimports] ||= {}
|
71
|
+
@options[:autoimports][identifier] = file
|
72
|
+
end
|
73
|
+
|
74
|
+
def autoimport_defs(value)
|
75
|
+
@options[:defs] = value
|
76
|
+
end
|
77
|
+
|
78
|
+
def autoexports(value)
|
79
|
+
@options[:autoexports] = value
|
80
|
+
end
|
81
|
+
|
82
|
+
def include_method(method_name)
|
83
|
+
@options[:include] ||= []
|
84
|
+
@options[:include] << method_name unless @options[:include].include?(method_name)
|
85
|
+
end
|
86
|
+
|
87
|
+
def template_literal_tags(tags)
|
88
|
+
@options[:template_literal_tags] = tags
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_h
|
92
|
+
@options
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -15,7 +15,7 @@ module Ruby2JS
|
|
15
15
|
EXPRESSIONS = [ :array, :float, :hash, :int, :lvar, :nil, :send, :attr,
|
16
16
|
:str, :sym, :dstr, :dsym, :cvar, :ivar, :zsuper, :super, :or, :and,
|
17
17
|
:block, :const, :true, :false, :xnode, :taglit, :self,
|
18
|
-
:op_asgn, :and_asgn, :or_asgn, :taglit, :gvar, :csend ]
|
18
|
+
:op_asgn, :and_asgn, :or_asgn, :taglit, :gvar, :csend, :call ]
|
19
19
|
|
20
20
|
handle :autoreturn do |*statements|
|
21
21
|
return if statements == [nil]
|
data/lib/ruby2js/execjs.rb
CHANGED
@@ -132,6 +132,10 @@ module Ruby2JS
|
|
132
132
|
handle_generic_node(super, :sym)
|
133
133
|
end
|
134
134
|
|
135
|
+
def on_assign(node)
|
136
|
+
S(:assign , node.children[0], *node.children[1..-1].map{ process _1 })
|
137
|
+
end
|
138
|
+
|
135
139
|
def on_defs(node)
|
136
140
|
node = super
|
137
141
|
return node if node.type != :defs
|
data/lib/ruby2js/filter/jsx.rb
CHANGED
data/lib/ruby2js/filter/react.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# TODO: This feature is deprecated.
|
2
|
+
|
1
3
|
require 'ruby2js'
|
2
4
|
require 'pathname'
|
3
5
|
|
@@ -91,6 +93,18 @@ module Ruby2JS
|
|
91
93
|
target << child.children[1]
|
92
94
|
elsif child.type == :def
|
93
95
|
target << child.children[0]
|
96
|
+
elsif child.type == :send && child.children[1] == :async
|
97
|
+
target << child.children[2].children[0]
|
98
|
+
elsif child.type == :const
|
99
|
+
target << child.children[1]
|
100
|
+
elsif child.type == :array
|
101
|
+
child.children.each do |export_statement|
|
102
|
+
if export_statement.type == :const
|
103
|
+
target << export_statement.children[1]
|
104
|
+
elsif export_statement.type == :hash
|
105
|
+
default_exports << export_statement.children[0].children[1].children[1]
|
106
|
+
end
|
107
|
+
end
|
94
108
|
end
|
95
109
|
end
|
96
110
|
|
@@ -99,6 +113,12 @@ module Ruby2JS
|
|
99
113
|
else
|
100
114
|
named_exports += auto_exports
|
101
115
|
end
|
116
|
+
default_exports.map! { _1.to_s.sub(/[?!]/, '').then do |name|
|
117
|
+
respond_to?(:camelCase) ? camelCase(name) : name.to_sym
|
118
|
+
end }
|
119
|
+
named_exports.map! { _1.to_s.sub(/[?!]/, '').then do |name|
|
120
|
+
respond_to?(:camelCase) ? camelCase(name) : name.to_sym
|
121
|
+
end }
|
102
122
|
|
103
123
|
imports = @require_seen[realpath]
|
104
124
|
imports << s(:const, nil, default_exports.first) unless default_exports.empty?
|
data/lib/ruby2js/filter/vue.rb
CHANGED
data/lib/ruby2js/filter.rb
CHANGED
@@ -5,6 +5,56 @@
|
|
5
5
|
|
6
6
|
module Ruby2JS
|
7
7
|
module Filter
|
8
|
+
PRESET_FILTERS = [:esm, :functions, :return]
|
9
|
+
|
10
|
+
def self.registered_filters
|
11
|
+
@@registered_filters ||= {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.autoregister(lib_dir = File.expand_path("..", __dir__))
|
15
|
+
Dir["#{lib_dir}/ruby2js/filter/*.rb"].sort.each do |file|
|
16
|
+
filter = File.basename(file, '.rb')
|
17
|
+
registered_filters[filter] = file
|
18
|
+
end
|
19
|
+
|
20
|
+
registered_filters
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO: better document this code path
|
24
|
+
def self.require_filters(filters)
|
25
|
+
mods = []
|
26
|
+
filters.each do |name|
|
27
|
+
if name.is_a?(Module)
|
28
|
+
mods << name
|
29
|
+
next
|
30
|
+
end
|
31
|
+
|
32
|
+
name = name.to_s
|
33
|
+
|
34
|
+
if registered_filters[name].is_a?(Module)
|
35
|
+
mods << registered_filters[name]
|
36
|
+
next
|
37
|
+
end
|
38
|
+
|
39
|
+
begin
|
40
|
+
if registered_filters.include? name
|
41
|
+
require registered_filters[name]
|
42
|
+
|
43
|
+
Ruby2JS::Filter::DEFAULTS.each do |mod|
|
44
|
+
method = mod.instance_method(mod.instance_methods.first)
|
45
|
+
if registered_filters[name] == method.source_location.first
|
46
|
+
mods << mod
|
47
|
+
end
|
48
|
+
end
|
49
|
+
elsif not name.empty? and name =~ /^[-\w+]$/
|
50
|
+
$load_error = "UNKNOWN filter: #{name}"
|
51
|
+
end
|
52
|
+
rescue Exception => $load_error
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
mods
|
57
|
+
end
|
8
58
|
|
9
59
|
#
|
10
60
|
# module level defaults
|
data/lib/ruby2js/haml.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# TODO: This feature is deprecated.
|
2
|
+
#
|
1
3
|
# Example usage:
|
2
4
|
#
|
3
5
|
# Add:
|
@@ -15,13 +17,42 @@
|
|
15
17
|
# (Note missing brackets: ruby syntax, js sematics)
|
16
18
|
#
|
17
19
|
require "haml"
|
20
|
+
require "haml/filters"
|
21
|
+
require "haml/filters/base"
|
22
|
+
|
23
|
+
module Haml
|
24
|
+
class Filters
|
25
|
+
class Ruby2JS < Base
|
26
|
+
def compile(node)
|
27
|
+
temple = [:multi]
|
28
|
+
temple << [:static, "<script type='text/javascript'>\n"]
|
29
|
+
compile_ruby!( temple , node )
|
30
|
+
temple << [:static, "\n</script>"]
|
31
|
+
temple
|
32
|
+
end
|
33
|
+
|
34
|
+
#Copird from text base, added ruby2js convert
|
35
|
+
def compile_ruby!(temple, node)
|
36
|
+
text = node.value[:text]
|
37
|
+
if ::Haml::Util.contains_interpolation?(node.value[:text])
|
38
|
+
# original: Haml::Filters#compile
|
39
|
+
text = ::Haml::Util.unescape_interpolation(text).gsub(/(\\+)n/) do |s|
|
40
|
+
escapes = $1.size
|
41
|
+
next s if escapes % 2 == 0
|
42
|
+
"#{'\\' * (escapes - 1)}\n"
|
43
|
+
end
|
44
|
+
text.prepend("\n")
|
45
|
+
|
46
|
+
temple << [:dynamic, "::Ruby2JS.convert(#{text} ).to_s"]
|
47
|
+
else
|
48
|
+
temple << [:static, ::Ruby2JS.convert(text).to_s]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
18
52
|
|
19
|
-
module Ruby2JS
|
20
|
-
module Haml::Ruby2JS
|
21
|
-
include Haml::Filters::Base
|
22
|
-
def render(text)
|
23
|
-
converted = Ruby2JS.convert(text).to_s
|
24
|
-
"<script type='text/javascript'>\n#{converted}\n</script>"
|
25
53
|
end
|
26
54
|
end
|
27
55
|
end
|
56
|
+
|
57
|
+
|
58
|
+
Haml::Filters.registered[:ruby2js] ||= Haml::Filters::Ruby2JS
|
data/lib/ruby2js/jsx.rb
CHANGED
data/lib/ruby2js/rails.rb
CHANGED
data/lib/ruby2js/sinatra.rb
CHANGED
data/lib/ruby2js/sprockets.rb
CHANGED
data/lib/ruby2js/strict.rb
CHANGED
data/lib/ruby2js/version.rb
CHANGED
data/lib/ruby2js.rb
CHANGED
@@ -8,6 +8,7 @@ ensure
|
|
8
8
|
$VERBOSE = old_verbose
|
9
9
|
end
|
10
10
|
|
11
|
+
require 'ruby2js/configuration_dsl' unless RUBY_ENGINE == 'opal'
|
11
12
|
require 'ruby2js/converter'
|
12
13
|
require 'ruby2js/filter'
|
13
14
|
require 'ruby2js/namespace'
|
@@ -22,6 +23,7 @@ module Ruby2JS
|
|
22
23
|
end
|
23
24
|
|
24
25
|
@@eslevel_default = 2009 # ecmascript 5
|
26
|
+
@@eslevel_preset_default = 2021
|
25
27
|
@@strict_default = false
|
26
28
|
@@module_default = nil
|
27
29
|
|
@@ -67,16 +69,11 @@ module Ruby2JS
|
|
67
69
|
include Ruby2JS::Filter
|
68
70
|
BINARY_OPERATORS = Converter::OPERATORS[2..-1].flatten
|
69
71
|
|
70
|
-
attr_accessor :prepend_list, :disable_autoimports, :namespace
|
72
|
+
attr_accessor :prepend_list, :disable_autoimports, :disable_autoexports, :namespace
|
71
73
|
|
72
74
|
def initialize(comments)
|
73
75
|
@comments = comments
|
74
76
|
|
75
|
-
# check if magic comment is present:
|
76
|
-
first_comment = @comments.values.first&.map(&:text)&.first
|
77
|
-
@disable_autoimports = first_comment&.include?(" autoimports: false")
|
78
|
-
@disable_autoexports = first_comment&.include?(" autoexports: false")
|
79
|
-
|
80
77
|
@ast = nil
|
81
78
|
@exclude_methods = []
|
82
79
|
@prepend_list = Set.new
|
@@ -217,11 +214,10 @@ module Ruby2JS
|
|
217
214
|
end
|
218
215
|
end
|
219
216
|
|
217
|
+
# TODO: this method has gotten long and unwieldy!
|
220
218
|
def self.convert(source, options={})
|
219
|
+
Filter.autoregister unless RUBY_ENGINE == 'opal'
|
221
220
|
options = options.dup
|
222
|
-
options[:eslevel] ||= @@eslevel_default
|
223
|
-
options[:strict] = @@strict_default if options[:strict] == nil
|
224
|
-
options[:module] ||= @@module_default || :esm
|
225
221
|
|
226
222
|
if Proc === source
|
227
223
|
file,line = source.source_location
|
@@ -238,11 +234,54 @@ module Ruby2JS
|
|
238
234
|
comments = ast ? Parser::Source::Comment.associate(ast, comments) : {}
|
239
235
|
end
|
240
236
|
|
237
|
+
# check if magic comment is present
|
238
|
+
first_comment = comments.values.first&.map(&:text)&.first
|
239
|
+
if first_comment
|
240
|
+
if first_comment.include?(" ruby2js: preset")
|
241
|
+
options[:preset] = true
|
242
|
+
if first_comment.include?("filters: ")
|
243
|
+
options[:filters] = first_comment.match(%r(filters:\s*?([^\s]+)\s?.*$))[1].split(",").map(&:to_sym)
|
244
|
+
end
|
245
|
+
if first_comment.include?("eslevel: ")
|
246
|
+
options[:eslevel] = first_comment.match(%r(eslevel:\s*?([^\s]+)\s?.*$))[1].to_i
|
247
|
+
end
|
248
|
+
if first_comment.include?("disable_filters: ")
|
249
|
+
options[:disable_filters] = first_comment.match(%r(disable_filters:\s*?([^\s]+)\s?.*$))[1].split(",").map(&:to_sym)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
disable_autoimports = first_comment.include?(" autoimports: false")
|
253
|
+
disable_autoexports = first_comment.include?(" autoexports: false")
|
254
|
+
end
|
255
|
+
|
256
|
+
unless RUBY_ENGINE == 'opal'
|
257
|
+
unless options.key?(:config_file) || !File.exist?("config/ruby2js.rb")
|
258
|
+
options[:config_file] ||= "config/ruby2js.rb"
|
259
|
+
end
|
260
|
+
|
261
|
+
if options[:config_file]
|
262
|
+
options = ConfigurationDSL.load_from_file(options[:config_file], options).to_h
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
if options[:preset]
|
267
|
+
options[:eslevel] ||= @@eslevel_preset_default
|
268
|
+
options[:filters] = Filter::PRESET_FILTERS + Array(options[:filters]).uniq
|
269
|
+
if options[:disable_filters]
|
270
|
+
options[:filters] -= options[:disable_filters]
|
271
|
+
end
|
272
|
+
options[:comparison] ||= :identity
|
273
|
+
options[:underscored_private] = true unless options[:underscored_private] == false
|
274
|
+
end
|
275
|
+
options[:eslevel] ||= @@eslevel_default
|
276
|
+
options[:strict] = @@strict_default if options[:strict] == nil
|
277
|
+
options[:module] ||= @@module_default || :esm
|
278
|
+
|
241
279
|
namespace = Namespace.new
|
242
280
|
|
243
|
-
filters = (options[:filters] || Filter::DEFAULTS)
|
281
|
+
filters = Filter.require_filters(options[:filters] || Filter::DEFAULTS)
|
244
282
|
|
245
283
|
unless filters.empty?
|
284
|
+
filter_options = options.merge({ filters: filters })
|
246
285
|
filters.dup.each do |filter|
|
247
286
|
filters = filter.reorder(filters) if filter.respond_to? :reorder
|
248
287
|
end
|
@@ -253,7 +292,9 @@ module Ruby2JS
|
|
253
292
|
end
|
254
293
|
filter = filter.new(comments)
|
255
294
|
|
256
|
-
filter.
|
295
|
+
filter.disable_autoimports = disable_autoimports
|
296
|
+
filter.disable_autoexports = disable_autoexports
|
297
|
+
filter.options = filter_options
|
257
298
|
filter.namespace = namespace
|
258
299
|
ast = filter.process(ast)
|
259
300
|
|
data/lib/tasks/README.md
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby2js
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Ruby
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-01-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parser
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- demo/ruby2js.rb
|
55
55
|
- lib/ruby2js.rb
|
56
56
|
- lib/ruby2js/cgi.rb
|
57
|
+
- lib/ruby2js/configuration_dsl.rb
|
57
58
|
- lib/ruby2js/converter.rb
|
58
59
|
- lib/ruby2js/converter/arg.rb
|
59
60
|
- lib/ruby2js/converter/args.rb
|