OpalProxy

Opal Proxy provides a dynamic interface to JavaScript objects in Opal,
allowing seamless property access, method calls, and Promise handling using idiomatic Ruby syntax.

Installation

Add this line to your Gemfile:

gem 'opal_proxy'

Execute:

bundle install

Document example

require "js/proxy"

class Document < JSProxy
  def initialize
    super($$.document)
  end
end

document = Document.new
headers = document.querySelectorAll("h1") # or query_selector_all
headers.each do |h1|
  h1.text_content = "Opal is great!" # or textContent
end

document.body.style.background_color = "lightblue"
document.body.style.font_family = "Arial, sans-serif"
document.body.style.color = "darkblue"

Window example

require "js/proxy"
# ... including document

class Window < JSProxy
  def initialize
    super($$.window)
  end
end

window = Window.new
window.alert "Hello world!"
window.set_timeout(-> {
  puts "1. Timeout test OK (1s delay)"
}, 1000)
window.fetch("https://jsonplaceholder.typicode.com/todos/1")
  .then do |response|
    response.json().then do |data|
      puts "5. Fetched: #{data["title"]}"
      document.get_element_by_id("output").inner_html += "<p>5. Fetched: #{data["title"]}</p>"
    end
  end

JQuery example

require "js/proxy"
# ... including document

doc = Document.new
jquery_script = doc.createElement('script')
jquery_script.src = "https://code.jquery.com/jquery-3.7.1.min.js"
doc.head.appendChild(jquery_script)
jquery_script.onload = -&gt; {
  class JQuery &lt; JS::Proxy
    def initialize(node)
      super(`$(node)`)
    end
  end

  document = JQuery.new($$.document)
  document.ready do
    paragraph = doc.createElement('p')
    paragraph.text_content = "If you click on me, I will disappear."
    doc.body.appendChild(paragraph)
    JQuery.new("p").click(&amp;:hide)
  end
}

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/josephschito/opal_proxy.

License

The gem is available as open source under the terms of the MIT License.