opal-browser 0.2.0.beta1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/build.yml +95 -0
- data/.gitignore +3 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +17 -3
- data/LICENSE +2 -1
- data/README.md +183 -52
- data/Rakefile +29 -1
- data/config.ru +20 -3
- data/docs/polyfills.md +24 -0
- data/examples/2048/Gemfile +6 -0
- data/examples/2048/README.md +13 -0
- data/examples/2048/app/application.rb +169 -0
- data/examples/2048/config.ru +9 -0
- data/examples/canvas/Gemfile +6 -0
- data/examples/canvas/README.md +9 -0
- data/examples/canvas/app/application.rb +55 -0
- data/examples/canvas/config.ru +9 -0
- data/examples/component/Gemfile +6 -0
- data/examples/component/README.md +10 -0
- data/examples/component/app/application.rb +66 -0
- data/examples/component/config.ru +9 -0
- data/examples/integrations/README.md +24 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/Gemfile +6 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/README.md +16 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/app/application.rb +6 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/config.ru +9 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/.gitignore +1 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/Gemfile +7 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/README.md +22 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/Rakefile +4 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/app/application.rb +6 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/app.rb +32 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/config.ru +3 -0
- data/examples/integrations/dynamic-roda-tilt/.gitignore +1 -0
- data/examples/integrations/dynamic-roda-tilt/Gemfile +8 -0
- data/examples/integrations/dynamic-roda-tilt/README.md +17 -0
- data/examples/integrations/dynamic-roda-tilt/Rakefile +6 -0
- data/examples/integrations/dynamic-roda-tilt/app/application.rb +6 -0
- data/examples/integrations/dynamic-roda-tilt/app.rb +50 -0
- data/examples/integrations/dynamic-roda-tilt/config.ru +3 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/Gemfile +7 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/README.md +16 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/app/application.rb +6 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/config.ru +29 -0
- data/examples/integrations/static-bash/.gitignore +2 -0
- data/examples/integrations/static-bash/Gemfile +3 -0
- data/examples/integrations/static-bash/README.md +8 -0
- data/examples/integrations/static-bash/app/application.rb +6 -0
- data/examples/integrations/static-bash/build.sh +4 -0
- data/examples/integrations/static-bash/index.html +10 -0
- data/examples/integrations/static-bash-opal-parser/.gitignore +3 -0
- data/examples/integrations/static-bash-opal-parser/Gemfile +3 -0
- data/examples/integrations/static-bash-opal-parser/README.md +10 -0
- data/examples/integrations/static-bash-opal-parser/build.sh +4 -0
- data/examples/integrations/static-bash-opal-parser/index.html +19 -0
- data/examples/integrations/static-rake/.gitignore +1 -0
- data/examples/integrations/static-rake/Gemfile +4 -0
- data/examples/integrations/static-rake/README.md +7 -0
- data/examples/integrations/static-rake/Rakefile +10 -0
- data/examples/integrations/static-rake/app/application.rb +6 -0
- data/examples/integrations/static-rake/index.html +9 -0
- data/examples/integrations/static-rake-guard/.gitignore +1 -0
- data/examples/integrations/static-rake-guard/Gemfile +6 -0
- data/examples/integrations/static-rake-guard/Guardfile +3 -0
- data/examples/integrations/static-rake-guard/README.md +10 -0
- data/examples/integrations/static-rake-guard/Rakefile +10 -0
- data/examples/integrations/static-rake-guard/app/application.rb +6 -0
- data/examples/integrations/static-rake-guard/index.html +9 -0
- data/examples/svg/.gitignore +1 -0
- data/examples/svg/Gemfile +4 -0
- data/examples/svg/README.md +7 -0
- data/examples/svg/Rakefile +10 -0
- data/examples/svg/app/application.rb +11 -0
- data/examples/svg/index.html +17 -0
- data/examples/svg/index.svg +6 -0
- data/index.html.erb +8 -6
- data/lib/opal-browser.rb +1 -0
- data/opal/browser/animation_frame.rb +26 -1
- data/opal/browser/audio/node.rb +121 -0
- data/opal/browser/audio/param_schedule.rb +43 -0
- data/opal/browser/audio.rb +66 -0
- data/opal/browser/blob.rb +94 -0
- data/opal/browser/canvas/data.rb +1 -11
- data/opal/browser/canvas/gradient.rb +1 -11
- data/opal/browser/canvas/style.rb +3 -11
- data/opal/browser/canvas/text.rb +1 -11
- data/opal/browser/canvas.rb +17 -13
- data/opal/browser/console.rb +3 -1
- data/opal/browser/cookies.rb +78 -42
- data/opal/browser/crypto.rb +79 -0
- data/opal/browser/css/declaration.rb +1 -1
- data/opal/browser/css/rule.rb +1 -1
- data/opal/browser/css/style_sheet.rb +2 -2
- data/opal/browser/css.rb +23 -7
- data/opal/browser/database/sql.rb +193 -0
- data/opal/browser/delay.rb +41 -7
- data/opal/browser/dom/attribute.rb +13 -12
- data/opal/browser/dom/builder.rb +31 -17
- data/opal/browser/dom/document.rb +174 -42
- data/opal/browser/dom/document_fragment.rb +18 -0
- data/opal/browser/dom/document_or_shadow_root.rb +19 -0
- data/opal/browser/dom/element/attributes.rb +111 -0
- data/opal/browser/dom/element/button.rb +31 -0
- data/opal/browser/dom/element/custom.rb +177 -0
- data/opal/browser/dom/element/data.rb +82 -0
- data/opal/browser/dom/element/editable.rb +47 -0
- data/opal/browser/dom/element/form.rb +38 -0
- data/opal/browser/dom/element/iframe.rb +37 -0
- data/opal/browser/dom/element/image.rb +2 -0
- data/opal/browser/dom/element/input.rb +48 -1
- data/opal/browser/dom/element/media.rb +17 -0
- data/opal/browser/dom/element/offset.rb +5 -0
- data/opal/browser/dom/element/position.rb +11 -2
- data/opal/browser/dom/element/scroll.rb +123 -24
- data/opal/browser/dom/element/select.rb +42 -0
- data/opal/browser/dom/element/size.rb +17 -0
- data/opal/browser/dom/element/template.rb +11 -0
- data/opal/browser/dom/element/textarea.rb +26 -0
- data/opal/browser/dom/element.rb +468 -238
- data/opal/browser/dom/mutation_observer.rb +4 -4
- data/opal/browser/dom/node.rb +142 -60
- data/opal/browser/dom/node_set.rb +73 -44
- data/opal/browser/dom/shadow_root.rb +12 -0
- data/opal/browser/dom/text.rb +2 -2
- data/opal/browser/dom.rb +40 -16
- data/opal/browser/effects.rb +180 -3
- data/opal/browser/event/all.rb +26 -0
- data/opal/browser/{dom/event → event}/animation.rb +4 -2
- data/opal/browser/{dom/event → event}/audio_processing.rb +4 -2
- data/opal/browser/{dom/event → event}/base.rb +98 -9
- data/opal/browser/{dom/event → event}/before_unload.rb +4 -2
- data/opal/browser/{dom/event → event}/clipboard.rb +11 -2
- data/opal/browser/{dom/event → event}/close.rb +4 -2
- data/opal/browser/{dom/event → event}/composition.rb +4 -2
- data/opal/browser/{dom/event → event}/custom.rb +3 -3
- data/opal/browser/event/data_transfer.rb +95 -0
- data/opal/browser/{dom/event → event}/device_light.rb +4 -2
- data/opal/browser/{dom/event → event}/device_motion.rb +4 -2
- data/opal/browser/{dom/event → event}/device_orientation.rb +4 -2
- data/opal/browser/{dom/event → event}/device_proximity.rb +4 -2
- data/opal/browser/{dom/event → event}/drag.rb +11 -7
- data/opal/browser/{dom/event → event}/focus.rb +4 -2
- data/opal/browser/{dom/event → event}/gamepad.rb +5 -3
- data/opal/browser/{dom/event → event}/hash_change.rb +4 -2
- data/opal/browser/{dom/event → event}/keyboard.rb +16 -3
- data/opal/browser/{dom/event → event}/message.rb +4 -2
- data/opal/browser/{dom/event → event}/mouse.rb +12 -8
- data/opal/browser/{dom/event → event}/page_transition.rb +4 -2
- data/opal/browser/{dom/event → event}/pop_state.rb +4 -2
- data/opal/browser/{dom/event → event}/progress.rb +4 -2
- data/opal/browser/{dom/event → event}/sensor.rb +4 -2
- data/opal/browser/{dom/event → event}/storage.rb +4 -2
- data/opal/browser/{dom/event → event}/touch.rb +4 -2
- data/opal/browser/{dom/event → event}/ui.rb +2 -2
- data/opal/browser/{dom/event → event}/wheel.rb +4 -2
- data/opal/browser/event.rb +163 -0
- data/opal/browser/event_source.rb +2 -2
- data/opal/browser/form_data.rb +225 -0
- data/opal/browser/history.rb +4 -8
- data/opal/browser/http/binary.rb +1 -0
- data/opal/browser/http/headers.rb +16 -2
- data/opal/browser/http/request.rb +46 -48
- data/opal/browser/http/response.rb +5 -1
- data/opal/browser/http.rb +25 -2
- data/opal/browser/immediate.rb +9 -5
- data/opal/browser/interval.rb +34 -11
- data/opal/browser/location.rb +7 -1
- data/opal/browser/navigator.rb +127 -7
- data/opal/browser/polyfill/visual_viewport.rb +216 -0
- data/opal/browser/screen.rb +3 -3
- data/opal/browser/setup/base.rb +6 -0
- data/opal/browser/setup/full.rb +13 -0
- data/opal/browser/setup/large.rb +17 -0
- data/opal/browser/setup/mini.rb +8 -0
- data/opal/browser/setup/traditional.rb +10 -0
- data/opal/browser/socket.rb +8 -4
- data/opal/browser/storage.rb +53 -35
- data/opal/browser/support.rb +72 -5
- data/opal/browser/utils.rb +94 -14
- data/opal/browser/version.rb +1 -1
- data/opal/browser/visual_viewport.rb +39 -0
- data/opal/browser/window/size.rb +31 -3
- data/opal/browser/window/view.rb +15 -0
- data/opal/browser/window.rb +46 -25
- data/opal/browser.rb +1 -10
- data/opal/opal-browser.rb +1 -0
- data/opal-browser.gemspec +3 -3
- data/spec/database/sql_spec.rb +139 -0
- data/spec/delay_spec.rb +41 -0
- data/spec/dom/attribute_spec.rb +49 -0
- data/spec/dom/builder_spec.rb +25 -8
- data/spec/dom/document_spec.rb +22 -0
- data/spec/dom/element/attributes_spec.rb +52 -0
- data/spec/dom/element/custom_spec.rb +106 -0
- data/spec/dom/element/subclass_spec.rb +144 -0
- data/spec/dom/element_spec.rb +181 -4
- data/spec/dom/mutation_observer_spec.rb +12 -8
- data/spec/dom/node_set_spec.rb +44 -0
- data/spec/dom/node_spec.rb +48 -0
- data/spec/dom_spec.rb +8 -0
- data/spec/event_source_spec.rb +15 -12
- data/spec/{dom/event_spec.rb → event_spec.rb} +44 -15
- data/spec/history_spec.rb +23 -19
- data/spec/http_spec.rb +19 -31
- data/spec/immediate_spec.rb +5 -4
- data/spec/interval_spec.rb +59 -0
- data/spec/native_cached_wrapper_spec.rb +46 -0
- data/spec/runner.rb +62 -69
- data/spec/socket_spec.rb +16 -12
- data/spec/spec_helper.rb +2 -5
- data/spec/spec_helper_promise.rb.erb +25 -0
- data/spec/storage_spec.rb +1 -1
- metadata +172 -50
- data/.travis.yml +0 -60
- data/opal/browser/dom/event.rb +0 -253
- data/opal/browser/http/parameters.rb +0 -8
- data/opal/browser/window/scroll.rb +0 -59
@@ -0,0 +1,169 @@
|
|
1
|
+
require 'opal'
|
2
|
+
require 'native'
|
3
|
+
require 'promise'
|
4
|
+
require 'browser/setup/full'
|
5
|
+
|
6
|
+
class Game
|
7
|
+
def initialize
|
8
|
+
@grid = ([[nil] * 4] * 4).map(&:dup)
|
9
|
+
|
10
|
+
2.times { add_field }
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :grid
|
14
|
+
|
15
|
+
def lost?
|
16
|
+
@grid.all? { |row| row.all? } && !(begin
|
17
|
+
(0..2).any? do |y|
|
18
|
+
(0..3).any? do |x|
|
19
|
+
@grid[y][x] == @grid[y+1][x]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end || begin
|
23
|
+
(0..3).any? do |y|
|
24
|
+
(0..2).any? do |x|
|
25
|
+
@grid[y][x] == @grid[y][x+1]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end)
|
29
|
+
end
|
30
|
+
|
31
|
+
def won?
|
32
|
+
@grid.any? { |row| row.any? { |f| f == 2048 } }
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_field
|
36
|
+
return if lost? or won?
|
37
|
+
|
38
|
+
y,x = nil
|
39
|
+
|
40
|
+
loop do
|
41
|
+
y,x = random_field
|
42
|
+
break unless @grid[y][x]
|
43
|
+
end
|
44
|
+
|
45
|
+
@grid[y][x] = [2,4].sample
|
46
|
+
end
|
47
|
+
|
48
|
+
def shake(dir)
|
49
|
+
grid = @grid
|
50
|
+
conversion = proc {}
|
51
|
+
back_conversion = nil
|
52
|
+
|
53
|
+
case dir
|
54
|
+
when :left
|
55
|
+
when :right
|
56
|
+
conversion = proc { grid = grid.map(&:reverse) }
|
57
|
+
when :top
|
58
|
+
conversion = proc { grid = grid.transpose }
|
59
|
+
when :bottom
|
60
|
+
conversion = proc do
|
61
|
+
grid = grid.transpose
|
62
|
+
grid = grid.map(&:reverse)
|
63
|
+
end
|
64
|
+
|
65
|
+
back_conversion = proc do
|
66
|
+
grid = grid.map(&:reverse)
|
67
|
+
grid = grid.transpose
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
back_conversion ||= conversion
|
72
|
+
|
73
|
+
conversion.()
|
74
|
+
|
75
|
+
grid = grid.map do |row|
|
76
|
+
row = row.compact
|
77
|
+
(0..2).each do |x|
|
78
|
+
if row[x] && row[x+1] && row[x] == row[x+1]
|
79
|
+
row[x], row[x+1] = row[x] + row[x+1], nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
row = row.compact
|
83
|
+
row = (row + [nil]*4)[0..3]
|
84
|
+
end
|
85
|
+
|
86
|
+
back_conversion.()
|
87
|
+
|
88
|
+
changed = grid != @grid
|
89
|
+
|
90
|
+
@grid = grid
|
91
|
+
|
92
|
+
add_field if changed && !lost?
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def random_field
|
98
|
+
[rand(4), rand(4)]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def render(game)
|
103
|
+
$document[:arena].inner_dom { |b|
|
104
|
+
(0..3).each do |y|
|
105
|
+
b.tr {
|
106
|
+
(0..3).each do |x|
|
107
|
+
b.td(class: "f_"+(game.grid[y][x] || "nil").to_s) {
|
108
|
+
(game.grid[y][x] || "").to_s
|
109
|
+
}
|
110
|
+
end
|
111
|
+
}
|
112
|
+
end
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
$document.head << DOM("<style>
|
117
|
+
#arena {
|
118
|
+
border-collapse: separate;
|
119
|
+
border-spacing: 4px;
|
120
|
+
}
|
121
|
+
#arena td {
|
122
|
+
width: 150px;
|
123
|
+
height: 150px;
|
124
|
+
border: 2px solid black;
|
125
|
+
font-size: 50px;
|
126
|
+
vertical-align: middle;
|
127
|
+
text-align: center;
|
128
|
+
}
|
129
|
+
#arena .f_2 { background-color: #eff; }
|
130
|
+
#arena .f_4 { background-color: #eef; }
|
131
|
+
#arena .f_8 { background-color: #def; }
|
132
|
+
#arena .f_16 { background-color: #dee; }
|
133
|
+
#arena .f_32 { background-color: #ded; }
|
134
|
+
#arena .f_64 { background-color: #ced; }
|
135
|
+
#arena .f_128 { background-color: #cdd; }
|
136
|
+
#arena .f_256 { background-color: #cdc; }
|
137
|
+
#arena .f_512 { background-color: #bdc; }
|
138
|
+
#arena .f_1024 { background-color: #bcc; }
|
139
|
+
#arena .f_2048 { background-color: #bbc; }
|
140
|
+
</style>")
|
141
|
+
$document.body << DOM("<div id='arena'></div>")
|
142
|
+
|
143
|
+
$game = game = Game.new
|
144
|
+
render(game)
|
145
|
+
|
146
|
+
$document.on(:keydown) do |e|
|
147
|
+
case e.key
|
148
|
+
when :ArrowUp
|
149
|
+
game.shake(:top)
|
150
|
+
when :ArrowDown
|
151
|
+
game.shake(:bottom)
|
152
|
+
when :ArrowLeft
|
153
|
+
game.shake(:left)
|
154
|
+
when :ArrowRight
|
155
|
+
game.shake(:right)
|
156
|
+
end
|
157
|
+
|
158
|
+
render(game)
|
159
|
+
|
160
|
+
if game.lost?
|
161
|
+
alert "You lost!"
|
162
|
+
game = Game.new
|
163
|
+
elsif game.won?
|
164
|
+
alert "You won!"
|
165
|
+
game = Game.new
|
166
|
+
end
|
167
|
+
|
168
|
+
render(game)
|
169
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'opal'
|
2
|
+
require 'native'
|
3
|
+
require 'promise'
|
4
|
+
require 'browser/setup/full'
|
5
|
+
|
6
|
+
$document.head << CSS {
|
7
|
+
rule("body") {
|
8
|
+
margin 0
|
9
|
+
padding 0
|
10
|
+
overflow :hidden
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
c = Browser::Canvas.new($window.view.width, $window.view.height)
|
15
|
+
$document.body << c
|
16
|
+
|
17
|
+
$window.on :resize do |e|
|
18
|
+
c.height = $window.view.height
|
19
|
+
c.width = $window.view.width
|
20
|
+
end
|
21
|
+
|
22
|
+
# A port of https://developer.mozilla.org/en-US/docs/Web/API/Element/mousemove_event
|
23
|
+
|
24
|
+
is_drawing = false
|
25
|
+
x, y = 0, 0
|
26
|
+
y = 0
|
27
|
+
|
28
|
+
c.on :mousedown do |e|
|
29
|
+
x, y = e.offset.x, e.offset.y
|
30
|
+
is_drawing = true
|
31
|
+
end
|
32
|
+
|
33
|
+
c.on :mousemove do |e|
|
34
|
+
if is_drawing
|
35
|
+
draw_line(c, x, y, e.offset.x, e.offset.y)
|
36
|
+
x, y = e.offset.x, e.offset.y
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
$window.on :mouseup do |e|
|
41
|
+
if is_drawing
|
42
|
+
draw_line(c, x, y, e.offset.x, e.offset.y)
|
43
|
+
x, y = e.offset.x, e.offset.y
|
44
|
+
is_drawing = false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def draw_line(c, x1, y1, x2, y2)
|
49
|
+
c.path do
|
50
|
+
c.style.stroke = :black
|
51
|
+
c.style.line.width = 1
|
52
|
+
c.line(x1, y1, x2, y2)
|
53
|
+
c.stroke
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "opal"
|
2
|
+
require "console"
|
3
|
+
require "promise"
|
4
|
+
require "browser/setup/full"
|
5
|
+
|
6
|
+
# Let's test some element before we have been initialized.
|
7
|
+
# This is so we can test the upgrading behavior.
|
8
|
+
$document.body << $document.create_element("app-mycounter")
|
9
|
+
|
10
|
+
d = DOM("<div>")
|
11
|
+
$document.body << d
|
12
|
+
d.inner_html = "<app-mycounter>"
|
13
|
+
|
14
|
+
class MyCounter < Browser::DOM::Element::Custom
|
15
|
+
# Custom Element interface:
|
16
|
+
|
17
|
+
self.observed_attributes = %w[value]
|
18
|
+
|
19
|
+
def initialize(node)
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def attached
|
24
|
+
self[:value] ||= "0"
|
25
|
+
on :click do
|
26
|
+
increase!
|
27
|
+
end
|
28
|
+
render
|
29
|
+
end
|
30
|
+
|
31
|
+
def detached
|
32
|
+
off :click
|
33
|
+
end
|
34
|
+
|
35
|
+
def attribute_changed(attr, from, to)
|
36
|
+
render
|
37
|
+
end
|
38
|
+
|
39
|
+
# Our interface:
|
40
|
+
|
41
|
+
def increase!
|
42
|
+
self[:value] = (self[:value].to_i + 1)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Private:
|
46
|
+
|
47
|
+
def render
|
48
|
+
self.inner_html = "<h1>[#{self[:value]}]</h1>"
|
49
|
+
end
|
50
|
+
|
51
|
+
# This should come after the methods have been defined.
|
52
|
+
def_custom "app-mycounter"
|
53
|
+
end
|
54
|
+
|
55
|
+
$document.body << DOM("<app-mycounter></app-mycounter>")
|
56
|
+
$document.body << $document.create_element("app-mycounter")
|
57
|
+
$document.body << MyCounter.new
|
58
|
+
$document.body << DOM { e('app-mycounter') }
|
59
|
+
|
60
|
+
all = DOM("<h1>Increase all!</h1>")
|
61
|
+
all.on(:click) do
|
62
|
+
$document.css("app-mycounter").each do |c|
|
63
|
+
c.increase!
|
64
|
+
end
|
65
|
+
end
|
66
|
+
$document.body << all
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Integrations
|
2
|
+
============
|
3
|
+
|
4
|
+
It's possible to combine Opal-Browser with a lot of different workflows. Some are
|
5
|
+
better than others, but some are more suited at certain applications.
|
6
|
+
|
7
|
+
If you plan to do a static website, possibly you would like to base your work on
|
8
|
+
some static-* template. The downside is that you will need to recompile your work
|
9
|
+
each time you change something (except for static-rake-guard and
|
10
|
+
static-bash-opal-parser which is interesting only from experimentation viewpoint).
|
11
|
+
|
12
|
+
The dynamic-* templates will most of the time allow you to create a website with
|
13
|
+
both a frontend and a backend (some, like dynamic-rack-opal-sprockets-server won't
|
14
|
+
make your life easy though).
|
15
|
+
|
16
|
+
The sprockets integrations have a unique property, that you can name files like
|
17
|
+
`file.rb.erb` and then they will be preprocessed by ERB.
|
18
|
+
|
19
|
+
This directory is meant in general as a guideline, so the examples are as brief
|
20
|
+
as possible. I took a lot of time trying to understand how to integrate Opal, so
|
21
|
+
you can treat this directory as a library of my knowledge that you will be able
|
22
|
+
to use to get to use Opal as soon as possible!
|
23
|
+
|
24
|
+
TODO: dynamic-rails-opal-rails-with-sprockets
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Dynamic Opal-Browser integration with Rack via Opal-Sprockets-Server
|
2
|
+
====================================================================
|
3
|
+
|
4
|
+
To install, run:
|
5
|
+
|
6
|
+
$ bundle install
|
7
|
+
|
8
|
+
Development mode
|
9
|
+
----------------
|
10
|
+
|
11
|
+
$ bundle exec rackup
|
12
|
+
|
13
|
+
Production mode
|
14
|
+
---------------
|
15
|
+
|
16
|
+
Left as an exercise for the reader. In general - don't do it. Use some more robust integration.
|
@@ -0,0 +1 @@
|
|
1
|
+
public/assets
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Dynamic Opal-Browser integration with Roda via Roda-Sprockets
|
2
|
+
=============================================================
|
3
|
+
|
4
|
+
To install, run:
|
5
|
+
|
6
|
+
$ bundle install
|
7
|
+
|
8
|
+
Development mode
|
9
|
+
----------------
|
10
|
+
|
11
|
+
$ bundle exec rackup
|
12
|
+
|
13
|
+
Production mode
|
14
|
+
---------------
|
15
|
+
|
16
|
+
$ bundle exec rake assets:precompile
|
17
|
+
$ RACK_ENV=production bundle exec rackup
|
18
|
+
|
19
|
+
See more:
|
20
|
+
---------
|
21
|
+
|
22
|
+
https://github.com/hmdne/roda-sprockets
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'roda'
|
2
|
+
require 'opal-browser'
|
3
|
+
|
4
|
+
class App < Roda
|
5
|
+
plugin :sprockets, precompile: %w(application.js),
|
6
|
+
prefix: %w(app/),
|
7
|
+
root: __dir__,
|
8
|
+
public_path: 'public/assets/',
|
9
|
+
opal: true,
|
10
|
+
debug: ENV['RACK_ENV'] != 'production'
|
11
|
+
plugin :public
|
12
|
+
|
13
|
+
route do |r|
|
14
|
+
r.public
|
15
|
+
r.sprockets
|
16
|
+
|
17
|
+
r.root do
|
18
|
+
<<~END
|
19
|
+
<!doctype html>
|
20
|
+
<html>
|
21
|
+
<head>
|
22
|
+
<title>My application</title>
|
23
|
+
</head>
|
24
|
+
<body>
|
25
|
+
#{ javascript_tag 'application' }
|
26
|
+
#{ opal_require 'application' }
|
27
|
+
</body>
|
28
|
+
</html>
|
29
|
+
END
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
public/assets
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Dynamic Opal-Browser integration with Roda via Tilt
|
2
|
+
===================================================
|
3
|
+
|
4
|
+
To install, run:
|
5
|
+
|
6
|
+
$ bundle install
|
7
|
+
|
8
|
+
Development mode
|
9
|
+
----------------
|
10
|
+
|
11
|
+
$ bundle exec rackup
|
12
|
+
|
13
|
+
Production mode
|
14
|
+
---------------
|
15
|
+
|
16
|
+
$ RACK_ENV=production bundle exec rake assets
|
17
|
+
$ RACK_ENV=production bundle exec rackup
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'roda'
|
2
|
+
require 'tilt/sass'
|
3
|
+
require 'tilt/opal'
|
4
|
+
require 'opal/builder_processors'
|
5
|
+
require 'opal-browser'
|
6
|
+
|
7
|
+
class OpalBuilder < Opal::Builder
|
8
|
+
attr_accessor :build_source_map
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
if @build_source_map
|
12
|
+
super + "\n" + source_map.to_data_uri_comment
|
13
|
+
else
|
14
|
+
super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class App < Roda
|
20
|
+
js_builder = OpalBuilder.new(stubs: []) #'opal'
|
21
|
+
js_builder.build_source_map = ENV['RACK_ENV'] == 'development'
|
22
|
+
js_builder.append_paths('app')
|
23
|
+
|
24
|
+
plugin :assets, js: ['application.rb'],
|
25
|
+
js_opts: { builder: js_builder },
|
26
|
+
path: '.',
|
27
|
+
js_dir: 'app',
|
28
|
+
timestamp_paths: true,
|
29
|
+
precompiled: ENV['RACK_ENV'] != 'development' ? 'public/assets/assets-precompiled.json' : nil
|
30
|
+
plugin :public
|
31
|
+
|
32
|
+
route do |r|
|
33
|
+
r.public
|
34
|
+
r.assets
|
35
|
+
|
36
|
+
r.root do
|
37
|
+
<<~END
|
38
|
+
<!doctype html>
|
39
|
+
<html>
|
40
|
+
<head>
|
41
|
+
<title>My application</title>
|
42
|
+
</head>
|
43
|
+
<body>
|
44
|
+
#{ assets :js }
|
45
|
+
</body>
|
46
|
+
</html>
|
47
|
+
END
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Dynamic Opal-Browser integration with Sinatra via Opal-Sprockets-Server
|
2
|
+
=======================================================================
|
3
|
+
|
4
|
+
To install, run:
|
5
|
+
|
6
|
+
$ bundle install
|
7
|
+
|
8
|
+
Development mode
|
9
|
+
----------------
|
10
|
+
|
11
|
+
$ bundle exec rackup
|
12
|
+
|
13
|
+
Production mode
|
14
|
+
---------------
|
15
|
+
|
16
|
+
Left as an exercise for the reader.
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'opal-sprockets'
|
2
|
+
require 'opal-browser'
|
3
|
+
require 'sinatra'
|
4
|
+
|
5
|
+
opal = Opal::Sprockets::Server.new {|s|
|
6
|
+
s.append_path 'app'
|
7
|
+
s.main = 'application'
|
8
|
+
s.debug = ENV['RACK_ENV'] != 'production'
|
9
|
+
}
|
10
|
+
|
11
|
+
map '/assets' do
|
12
|
+
run opal.sprockets
|
13
|
+
end
|
14
|
+
|
15
|
+
get '/' do
|
16
|
+
<<-HTML
|
17
|
+
<!doctype html>
|
18
|
+
<html>
|
19
|
+
<head>
|
20
|
+
<title>My Application</title>
|
21
|
+
</head>
|
22
|
+
<body>
|
23
|
+
#{ Opal::Sprockets.javascript_include_tag('application', debug: opal.debug, sprockets: opal.sprockets, prefix: 'assets/' ) }
|
24
|
+
</body>
|
25
|
+
</html>
|
26
|
+
HTML
|
27
|
+
end
|
28
|
+
|
29
|
+
run Sinatra::Application
|