opal-browser 0.2.0 → 0.3.3

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.
Files changed (202) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/build.yml +78 -0
  3. data/.gitignore +3 -0
  4. data/CHANGELOG.md +11 -0
  5. data/Gemfile +17 -3
  6. data/LICENSE +2 -1
  7. data/README.md +131 -54
  8. data/Rakefile +29 -1
  9. data/config.ru +20 -3
  10. data/docs/polyfills.md +24 -0
  11. data/examples/2048/Gemfile +6 -0
  12. data/examples/2048/README.md +13 -0
  13. data/examples/2048/app/application.rb +169 -0
  14. data/examples/2048/config.ru +9 -0
  15. data/examples/canvas/Gemfile +6 -0
  16. data/examples/canvas/README.md +9 -0
  17. data/examples/canvas/app/application.rb +55 -0
  18. data/examples/canvas/config.ru +9 -0
  19. data/examples/component/Gemfile +6 -0
  20. data/examples/component/README.md +10 -0
  21. data/examples/component/app/application.rb +66 -0
  22. data/examples/component/config.ru +9 -0
  23. data/examples/integrations/README.md +24 -0
  24. data/examples/integrations/dynamic-rack-opal-sprockets-server/Gemfile +6 -0
  25. data/examples/integrations/dynamic-rack-opal-sprockets-server/README.md +16 -0
  26. data/examples/integrations/dynamic-rack-opal-sprockets-server/app/application.rb +6 -0
  27. data/examples/integrations/dynamic-rack-opal-sprockets-server/config.ru +9 -0
  28. data/examples/integrations/dynamic-roda-roda-sprockets/.gitignore +1 -0
  29. data/examples/integrations/dynamic-roda-roda-sprockets/Gemfile +7 -0
  30. data/examples/integrations/dynamic-roda-roda-sprockets/README.md +22 -0
  31. data/examples/integrations/dynamic-roda-roda-sprockets/Rakefile +4 -0
  32. data/examples/integrations/dynamic-roda-roda-sprockets/app/application.rb +6 -0
  33. data/examples/integrations/dynamic-roda-roda-sprockets/app.rb +32 -0
  34. data/examples/integrations/dynamic-roda-roda-sprockets/config.ru +3 -0
  35. data/examples/integrations/dynamic-roda-tilt/.gitignore +1 -0
  36. data/examples/integrations/dynamic-roda-tilt/Gemfile +8 -0
  37. data/examples/integrations/dynamic-roda-tilt/README.md +17 -0
  38. data/examples/integrations/dynamic-roda-tilt/Rakefile +6 -0
  39. data/examples/integrations/dynamic-roda-tilt/app/application.rb +6 -0
  40. data/examples/integrations/dynamic-roda-tilt/app.rb +50 -0
  41. data/examples/integrations/dynamic-roda-tilt/config.ru +3 -0
  42. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/Gemfile +7 -0
  43. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/README.md +16 -0
  44. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/app/application.rb +6 -0
  45. data/examples/integrations/dynamic-sinatra-opal-sprockets-server/config.ru +29 -0
  46. data/examples/integrations/static-bash/.gitignore +2 -0
  47. data/examples/integrations/static-bash/Gemfile +3 -0
  48. data/examples/integrations/static-bash/README.md +8 -0
  49. data/examples/integrations/static-bash/app/application.rb +6 -0
  50. data/examples/integrations/static-bash/build.sh +4 -0
  51. data/examples/integrations/static-bash/index.html +10 -0
  52. data/examples/integrations/static-bash-opal-parser/.gitignore +3 -0
  53. data/examples/integrations/static-bash-opal-parser/Gemfile +3 -0
  54. data/examples/integrations/static-bash-opal-parser/README.md +10 -0
  55. data/examples/integrations/static-bash-opal-parser/build.sh +4 -0
  56. data/examples/integrations/static-bash-opal-parser/index.html +19 -0
  57. data/examples/integrations/static-rake/.gitignore +1 -0
  58. data/examples/integrations/static-rake/Gemfile +4 -0
  59. data/examples/integrations/static-rake/README.md +7 -0
  60. data/examples/integrations/static-rake/Rakefile +10 -0
  61. data/examples/integrations/static-rake/app/application.rb +6 -0
  62. data/examples/integrations/static-rake/index.html +9 -0
  63. data/examples/integrations/static-rake-guard/.gitignore +1 -0
  64. data/examples/integrations/static-rake-guard/Gemfile +6 -0
  65. data/examples/integrations/static-rake-guard/Guardfile +3 -0
  66. data/examples/integrations/static-rake-guard/README.md +10 -0
  67. data/examples/integrations/static-rake-guard/Rakefile +10 -0
  68. data/examples/integrations/static-rake-guard/app/application.rb +6 -0
  69. data/examples/integrations/static-rake-guard/index.html +9 -0
  70. data/examples/svg/.gitignore +1 -0
  71. data/examples/svg/Gemfile +4 -0
  72. data/examples/svg/README.md +7 -0
  73. data/examples/svg/Rakefile +10 -0
  74. data/examples/svg/app/application.rb +11 -0
  75. data/examples/svg/index.html +17 -0
  76. data/examples/svg/index.svg +6 -0
  77. data/index.html.erb +2 -3
  78. data/opal/browser/audio/node.rb +121 -0
  79. data/opal/browser/audio/param_schedule.rb +43 -0
  80. data/opal/browser/audio.rb +66 -0
  81. data/opal/browser/blob.rb +94 -0
  82. data/opal/browser/canvas/data.rb +1 -1
  83. data/opal/browser/canvas/gradient.rb +1 -1
  84. data/opal/browser/canvas/style.rb +3 -1
  85. data/opal/browser/canvas/text.rb +1 -1
  86. data/opal/browser/canvas.rb +17 -3
  87. data/opal/browser/console.rb +3 -1
  88. data/opal/browser/cookies.rb +72 -34
  89. data/opal/browser/crypto.rb +79 -0
  90. data/opal/browser/css/declaration.rb +1 -1
  91. data/opal/browser/css/rule.rb +1 -1
  92. data/opal/browser/css/style_sheet.rb +2 -2
  93. data/opal/browser/css.rb +23 -7
  94. data/opal/browser/database/sql.rb +7 -8
  95. data/opal/browser/delay.rb +16 -0
  96. data/opal/browser/dom/attribute.rb +1 -1
  97. data/opal/browser/dom/builder.rb +29 -10
  98. data/opal/browser/dom/document.rb +81 -13
  99. data/opal/browser/dom/document_fragment.rb +18 -0
  100. data/opal/browser/dom/document_or_shadow_root.rb +19 -0
  101. data/opal/browser/dom/element/attributes.rb +28 -4
  102. data/opal/browser/dom/element/button.rb +31 -0
  103. data/opal/browser/dom/element/custom.rb +177 -0
  104. data/opal/browser/dom/element/data.rb +17 -2
  105. data/opal/browser/dom/element/editable.rb +47 -0
  106. data/opal/browser/dom/element/form.rb +38 -0
  107. data/opal/browser/dom/element/iframe.rb +37 -0
  108. data/opal/browser/dom/element/image.rb +2 -0
  109. data/opal/browser/dom/element/input.rb +36 -0
  110. data/opal/browser/dom/element/media.rb +17 -0
  111. data/opal/browser/dom/element/scroll.rb +106 -74
  112. data/opal/browser/dom/element/select.rb +6 -0
  113. data/opal/browser/dom/element/size.rb +12 -0
  114. data/opal/browser/dom/element/template.rb +2 -0
  115. data/opal/browser/dom/element/textarea.rb +2 -0
  116. data/opal/browser/dom/element.rb +194 -50
  117. data/opal/browser/dom/mutation_observer.rb +2 -2
  118. data/opal/browser/dom/node.rb +53 -13
  119. data/opal/browser/dom/node_set.rb +13 -2
  120. data/opal/browser/dom/shadow_root.rb +12 -0
  121. data/opal/browser/dom/text.rb +2 -2
  122. data/opal/browser/dom.rb +38 -5
  123. data/opal/browser/effects.rb +170 -4
  124. data/opal/browser/event/all.rb +26 -0
  125. data/opal/browser/event/animation.rb +2 -0
  126. data/opal/browser/event/audio_processing.rb +2 -0
  127. data/opal/browser/event/base.rb +35 -4
  128. data/opal/browser/event/before_unload.rb +2 -0
  129. data/opal/browser/event/clipboard.rb +9 -0
  130. data/opal/browser/event/close.rb +2 -0
  131. data/opal/browser/event/composition.rb +2 -0
  132. data/opal/browser/event/custom.rb +1 -1
  133. data/opal/browser/event/data_transfer.rb +95 -0
  134. data/opal/browser/event/device_light.rb +2 -0
  135. data/opal/browser/event/device_motion.rb +2 -0
  136. data/opal/browser/event/device_orientation.rb +2 -0
  137. data/opal/browser/event/device_proximity.rb +2 -0
  138. data/opal/browser/event/drag.rb +9 -5
  139. data/opal/browser/event/focus.rb +2 -0
  140. data/opal/browser/event/gamepad.rb +3 -1
  141. data/opal/browser/event/hash_change.rb +2 -0
  142. data/opal/browser/event/keyboard.rb +14 -1
  143. data/opal/browser/event/message.rb +2 -0
  144. data/opal/browser/event/mouse.rb +10 -6
  145. data/opal/browser/event/page_transition.rb +2 -0
  146. data/opal/browser/event/pop_state.rb +2 -0
  147. data/opal/browser/event/progress.rb +2 -0
  148. data/opal/browser/event/sensor.rb +2 -0
  149. data/opal/browser/event/storage.rb +2 -0
  150. data/opal/browser/event/touch.rb +2 -0
  151. data/opal/browser/event/wheel.rb +2 -0
  152. data/opal/browser/event.rb +26 -116
  153. data/opal/browser/event_source.rb +1 -1
  154. data/opal/browser/form_data.rb +225 -0
  155. data/opal/browser/history.rb +4 -8
  156. data/opal/browser/http/request.rb +32 -10
  157. data/opal/browser/http/response.rb +5 -1
  158. data/opal/browser/http.rb +0 -2
  159. data/opal/browser/immediate.rb +0 -2
  160. data/opal/browser/location.rb +7 -1
  161. data/opal/browser/navigator.rb +105 -4
  162. data/opal/browser/polyfill/visual_viewport.rb +216 -0
  163. data/opal/browser/screen.rb +2 -2
  164. data/opal/browser/setup/base.rb +6 -0
  165. data/opal/browser/setup/full.rb +13 -0
  166. data/opal/browser/setup/large.rb +17 -0
  167. data/opal/browser/setup/mini.rb +8 -0
  168. data/opal/browser/setup/traditional.rb +10 -0
  169. data/opal/browser/socket.rb +3 -3
  170. data/opal/browser/storage.rb +2 -2
  171. data/opal/browser/support.rb +46 -22
  172. data/opal/browser/utils.rb +94 -14
  173. data/opal/browser/version.rb +1 -1
  174. data/opal/browser/visual_viewport.rb +39 -0
  175. data/opal/browser/window/size.rb +14 -0
  176. data/opal/browser/window/view.rb +15 -0
  177. data/opal/browser/window.rb +29 -16
  178. data/opal/browser.rb +1 -11
  179. data/opal-browser.gemspec +3 -3
  180. data/spec/database/sql_spec.rb +43 -35
  181. data/spec/delay_spec.rb +15 -12
  182. data/spec/dom/document_spec.rb +10 -8
  183. data/spec/dom/element/custom_spec.rb +106 -0
  184. data/spec/dom/element/subclass_spec.rb +144 -0
  185. data/spec/dom/element_spec.rb +42 -0
  186. data/spec/dom/mutation_observer_spec.rb +12 -8
  187. data/spec/dom/node_spec.rb +48 -0
  188. data/spec/dom_spec.rb +8 -0
  189. data/spec/event_source_spec.rb +15 -12
  190. data/spec/{dom/event_spec.rb → event_spec.rb} +44 -15
  191. data/spec/history_spec.rb +23 -19
  192. data/spec/http_spec.rb +19 -31
  193. data/spec/immediate_spec.rb +5 -4
  194. data/spec/interval_spec.rb +18 -9
  195. data/spec/native_cached_wrapper_spec.rb +46 -0
  196. data/spec/runner.rb +37 -62
  197. data/spec/socket_spec.rb +15 -12
  198. data/spec/spec_helper.rb +2 -1
  199. data/spec/spec_helper_promise.rb.erb +25 -0
  200. metadata +120 -16
  201. data/.travis.yml +0 -74
  202. 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,9 @@
1
+ require "opal-browser"
2
+ require "opal-sprockets"
3
+
4
+ run Opal::Sprockets::Server.new { |s|
5
+ s.main = 'application'
6
+ s.append_path 'app'
7
+ #s.index_path = 'index.html.erb'
8
+ s.debug = true
9
+ }
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "opal-sprockets"
4
+ gem "puma"
5
+ gem "rack"
6
+ gem "opal-browser", path: "../.."
@@ -0,0 +1,9 @@
1
+ Example canvas application
2
+ ==========================
3
+
4
+ This is a loose port of https://developer.mozilla.org/en-US/docs/Web/API/Element/mousemove_event
5
+
6
+ To launch, run:
7
+
8
+ $ bundle install
9
+ $ bundle exec rackup
@@ -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,9 @@
1
+ require "opal-browser"
2
+ require "opal-sprockets"
3
+
4
+ run Opal::Sprockets::Server.new { |s|
5
+ s.main = 'application'
6
+ s.append_path 'app'
7
+ #s.index_path = 'index.html.erb'
8
+ s.debug = true
9
+ }
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "opal-browser", path: "../.."
4
+ gem "opal-sprockets"
5
+ gem "rack"
6
+ gem "puma"
@@ -0,0 +1,10 @@
1
+ Custom element example
2
+ ======================
3
+
4
+ This is a rather technical example on how to use custom elements with
5
+ Opal-Browser.
6
+
7
+ To run, simply execute:
8
+
9
+ $ bundle install
10
+ $ bundle exec rackup
@@ -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,9 @@
1
+ require "opal-browser"
2
+ require "opal-sprockets"
3
+
4
+ run Opal::Sprockets::Server.new { |s|
5
+ s.main = 'application'
6
+ s.append_path 'app'
7
+ #s.index_path = 'index.html.erb'
8
+ s.debug = true
9
+ }
@@ -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,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "opal-sprockets"
4
+ gem "puma"
5
+ gem "rack"
6
+ gem "opal-browser", path: "../../.."
@@ -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,6 @@
1
+ require 'opal'
2
+ require 'native'
3
+ require 'promise'
4
+ require 'browser/setup/full'
5
+
6
+ $document.body << "Hello world!"
@@ -0,0 +1,9 @@
1
+ require "opal-browser"
2
+ require "opal-sprockets"
3
+
4
+ run Opal::Sprockets::Server.new { |s|
5
+ s.main = 'application'
6
+ s.append_path 'app'
7
+ #s.index_path = 'index.html.erb'
8
+ s.debug = true
9
+ }
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "opal-sprockets"
4
+ gem "roda-sprockets", ">= 2.0.0a"
5
+ gem "puma"
6
+ gem "rake"
7
+ gem "opal-browser", path: "../../.."
@@ -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,4 @@
1
+ require_relative 'app'
2
+ require 'roda/plugins/sprockets_task'
3
+
4
+ Roda::RodaPlugins::Sprockets::Task.define!(App)
@@ -0,0 +1,6 @@
1
+ require 'opal'
2
+ require 'native'
3
+ require 'promise'
4
+ require 'browser/setup/full'
5
+
6
+ $document.body << "Hello world!"
@@ -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,3 @@
1
+ require_relative "./app"
2
+
3
+ run App.app
@@ -0,0 +1 @@
1
+ public/assets
@@ -0,0 +1,8 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "opal-sprockets"
4
+ gem "roda-sprockets"
5
+ gem "puma"
6
+ gem "rake"
7
+ gem "opal-browser", path: "../../.."
8
+ gem "sassc"
@@ -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,6 @@
1
+ desc "Recompile assets"
2
+ task "assets" do
3
+ ENV['RACK_ENV'] = 'production'
4
+ require_relative 'app'
5
+ App.compile_assets
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'opal'
2
+ require 'native'
3
+ require 'promise'
4
+ require 'browser/setup/full'
5
+
6
+ $document.body << "Hello world!"
@@ -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,3 @@
1
+ require_relative "./app"
2
+
3
+ run App.app
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "opal-sprockets"
4
+ gem "puma"
5
+ gem "rake"
6
+ gem "sinatra"
7
+ gem "opal-browser", path: "../../.."
@@ -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,6 @@
1
+ require 'opal'
2
+ require 'native'
3
+ require 'promise'
4
+ require 'browser/setup/full'
5
+
6
+ $document.body << "Hello world!"
@@ -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