ruby_wasm_ui 0.8.3 → 0.9.1

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +0 -2
  3. data/Makefile +56 -0
  4. data/README.md +26 -6
  5. data/examples/.gitignore +4 -0
  6. data/examples/Gemfile.lock +15 -17
  7. data/examples/src/index.html +21 -0
  8. data/examples/src/index.rb +26 -0
  9. data/exe/ruby-wasm-ui +6 -0
  10. data/lib/ruby_wasm_ui/cli/command/base.rb +192 -0
  11. data/lib/ruby_wasm_ui/cli/command/dev.rb +207 -0
  12. data/lib/ruby_wasm_ui/cli/command/pack.rb +36 -0
  13. data/lib/ruby_wasm_ui/cli/command/rebuild.rb +38 -0
  14. data/lib/ruby_wasm_ui/cli/command/setup.rb +159 -0
  15. data/lib/ruby_wasm_ui/cli/command.rb +48 -0
  16. data/lib/ruby_wasm_ui/version.rb +1 -1
  17. data/lib/ruby_wasm_ui.rb +8 -8
  18. data/package-lock.json +2 -2
  19. data/package.json +1 -1
  20. data/packages/npm-packages/runtime/package-lock.json +2 -2
  21. data/packages/npm-packages/runtime/package.json +1 -1
  22. data/packages/npm-packages/runtime/rollup.config.mjs +1 -1
  23. data/spec/ruby_wasm_ui/cli/command/base_spec.rb +503 -0
  24. data/spec/ruby_wasm_ui/cli/command/dev_spec.rb +442 -0
  25. data/spec/ruby_wasm_ui/cli/command/pack_spec.rb +131 -0
  26. data/spec/ruby_wasm_ui/cli/command/rebuild_spec.rb +95 -0
  27. data/spec/ruby_wasm_ui/cli/command/setup_spec.rb +251 -0
  28. data/spec/ruby_wasm_ui/cli/command_spec.rb +118 -0
  29. data/{packages/npm-packages/runtime/spec → spec}/spec_helper.rb +1 -1
  30. metadata +96 -38
  31. data/packages/npm-packages/runtime/Gemfile +0 -3
  32. data/packages/npm-packages/runtime/Gemfile.lock +0 -26
  33. /data/lib/ruby_wasm_ui/{app.rb → runtime/app.rb} +0 -0
  34. /data/lib/ruby_wasm_ui/{component.rb → runtime/component.rb} +0 -0
  35. /data/lib/ruby_wasm_ui/{dispatcher.rb → runtime/dispatcher.rb} +0 -0
  36. /data/lib/ruby_wasm_ui/{dom → runtime/dom}/attributes.rb +0 -0
  37. /data/lib/ruby_wasm_ui/{dom → runtime/dom}/destroy_dom.rb +0 -0
  38. /data/lib/ruby_wasm_ui/{dom → runtime/dom}/events.rb +0 -0
  39. /data/lib/ruby_wasm_ui/{dom → runtime/dom}/mount_dom.rb +0 -0
  40. /data/lib/ruby_wasm_ui/{dom → runtime/dom}/patch_dom.rb +0 -0
  41. /data/lib/ruby_wasm_ui/{dom → runtime/dom}/scheduler.rb +0 -0
  42. /data/lib/ruby_wasm_ui/{dom.rb → runtime/dom.rb} +0 -0
  43. /data/lib/ruby_wasm_ui/{nodes_equal.rb → runtime/nodes_equal.rb} +0 -0
  44. /data/lib/ruby_wasm_ui/{template → runtime/template}/build_conditional_group.rb +0 -0
  45. /data/lib/ruby_wasm_ui/{template → runtime/template}/build_for_group.rb +0 -0
  46. /data/lib/ruby_wasm_ui/{template → runtime/template}/build_vdom.rb +0 -0
  47. /data/lib/ruby_wasm_ui/{template → runtime/template}/parser.rb +0 -0
  48. /data/lib/ruby_wasm_ui/{template.rb → runtime/template.rb} +0 -0
  49. /data/lib/ruby_wasm_ui/{utils → runtime/utils}/arrays.rb +0 -0
  50. /data/lib/ruby_wasm_ui/{utils → runtime/utils}/objects.rb +0 -0
  51. /data/lib/ruby_wasm_ui/{utils → runtime/utils}/props.rb +0 -0
  52. /data/lib/ruby_wasm_ui/{utils → runtime/utils}/strings.rb +0 -0
  53. /data/lib/ruby_wasm_ui/{utils.rb → runtime/utils.rb} +0 -0
  54. /data/lib/ruby_wasm_ui/{vdom.rb → runtime/vdom.rb} +0 -0
  55. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/component_spec.rb +0 -0
  56. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/dom/scheduler_spec.rb +0 -0
  57. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/nodes_equal_spec.rb +0 -0
  58. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/build_conditional_group_spec.rb +0 -0
  59. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/build_for_group_spec.rb +0 -0
  60. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/build_vdom_spec.rb +0 -0
  61. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/parser_spec.rb +0 -0
  62. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/utils/arrays_spec.rb +0 -0
  63. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/utils/objects_spec.rb +0 -0
  64. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/utils/props_spec.rb +0 -0
  65. /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/utils/strings_spec.rb +0 -0
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module RubyWasmUi
6
+ module Cli
7
+ class Command
8
+ class Rebuild < Base
9
+ def self.description
10
+ "Rebuild Ruby WASM file (useful when gems are added)"
11
+ end
12
+
13
+ def run(_argv)
14
+ log_info("Rebuilding Ruby WASM...")
15
+ puts ""
16
+
17
+ # Check Ruby version
18
+ ruby_version_str = check_ruby_version
19
+
20
+ # Configure excluded gems for WASM build
21
+ log_info("Step 1/2: Configuring excluded gems...")
22
+ configure_excluded_gems
23
+ log_success("✓ Excluded gems configured")
24
+
25
+ # Build Ruby WASM
26
+ puts ""
27
+ log_info("Step 2/2: Building Ruby WASM...")
28
+ log_info("Running: rbwasm build --ruby-version #{ruby_version_str} -o ruby.wasm")
29
+ build_ruby_wasm(ruby_version_str)
30
+ log_success("✓ Ruby WASM build completed")
31
+
32
+ puts ""
33
+ log_success("Rebuild completed successfully!")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module RubyWasmUi
6
+ module Cli
7
+ class Command
8
+ class Setup < Base
9
+ def self.description
10
+ "Set up the project for ruby-wasm-ui"
11
+ end
12
+
13
+ def run(_argv)
14
+ log_info("Setting up ruby-wasm-ui project...")
15
+ puts ""
16
+
17
+ # Check Ruby version
18
+ ruby_version_str = check_ruby_version
19
+
20
+ # Configure excluded gems for WASM build
21
+ log_info("Step 1/3: Configuring excluded gems...")
22
+ configure_excluded_gems
23
+ log_success("✓ Excluded gems configured")
24
+
25
+ # Build Ruby WASM
26
+ puts ""
27
+ log_info("Step 2/3: Building Ruby WASM...")
28
+ log_info("Running: rbwasm build --ruby-version #{ruby_version_str} -o ruby.wasm")
29
+ build_ruby_wasm(ruby_version_str)
30
+ log_success("✓ Ruby WASM build completed")
31
+
32
+ # Update .gitignore
33
+ puts ""
34
+ log_info("Step 3/4: Updating .gitignore...")
35
+ update_gitignore(["ruby.wasm", "/rubies", "/build", "/dist"])
36
+ log_success("✓ .gitignore updated")
37
+
38
+ # Create initial files
39
+ puts ""
40
+ log_info("Step 4/4: Creating initial files...")
41
+ create_initial_files
42
+
43
+ puts ""
44
+ log_success("Setup completed successfully!")
45
+ end
46
+
47
+ private
48
+
49
+ def update_gitignore(entries_to_add)
50
+ gitignore_path = ".gitignore"
51
+
52
+ # Read existing .gitignore or create new content
53
+ if File.exist?(gitignore_path)
54
+ content = File.read(gitignore_path)
55
+ lines = content.lines.map(&:chomp)
56
+ else
57
+ lines = []
58
+ end
59
+
60
+ # Add entries that don't already exist
61
+ added_entries = []
62
+ entries_to_add.each do |entry|
63
+ unless lines.include?(entry)
64
+ lines << entry
65
+ added_entries << entry
66
+ end
67
+ end
68
+
69
+ # Write back to .gitignore
70
+ File.write(gitignore_path, lines.join("\n") + "\n")
71
+ if added_entries.any?
72
+ log_info("Added to .gitignore: #{added_entries.join(', ')}")
73
+ else
74
+ log_info("No new entries added to .gitignore (all entries already exist)")
75
+ end
76
+ end
77
+
78
+ def create_initial_files
79
+ # Skip if src directory exists
80
+ if Dir.exist?("src")
81
+ log_info("src directory already exists, skipping initial file creation")
82
+ return
83
+ end
84
+
85
+ # Skip if files already exist
86
+ if File.exist?("src/index.html")
87
+ log_info("src/index.html already exists, skipping initial file creation")
88
+ return
89
+ end
90
+
91
+ if File.exist?("src/index.rb")
92
+ log_info("src/index.rb already exists, skipping initial file creation")
93
+ return
94
+ end
95
+
96
+ # Create src directory
97
+ Dir.mkdir("src")
98
+
99
+ # Create index.html
100
+ File.write("src/index.html", <<~HTML)
101
+ <!DOCTYPE html>
102
+ <html lang="en">
103
+ <head>
104
+ <meta charset="UTF-8" />
105
+ <title>My App</title>
106
+ <script type="module">
107
+ import { DefaultRubyVM } from "https://cdn.jsdelivr.net/npm/@ruby/wasm-wasi@2.7.2/dist/browser/+esm";
108
+ const response = await fetch("./src.wasm");
109
+ const module = await WebAssembly.compileStreaming(response);
110
+ const { vm } = await DefaultRubyVM(module);
111
+ vm.evalAsync(`
112
+ require "ruby_wasm_ui"
113
+ require_relative './src/index.rb'
114
+ `);
115
+ </script>
116
+ </head>
117
+ <body>
118
+ <h1>My App</h1>
119
+ <div id="app"></div>
120
+ </body>
121
+ </html>
122
+ HTML
123
+
124
+ # Create index.rb
125
+ File.write("src/index.rb", <<~RUBY)
126
+ # Simple Hello World component
127
+ HelloComponent = RubyWasmUi.define_component(
128
+ state: ->(props) {
129
+ { message: props[:message] || "Hello, Ruby WASM UI!" }
130
+ },
131
+ template: ->() {
132
+ RubyWasmUi::Template::Parser.parse_and_eval(<<~HTML, binding)
133
+ <div>
134
+ <h2>{state[:message]}</h2>
135
+ <button on="{ click: -> { update_message } }">
136
+ Click me!
137
+ </button>
138
+ </div>
139
+ HTML
140
+ },
141
+ methods: {
142
+ update_message: ->() {
143
+ update_state(message: "You clicked the button!")
144
+ }
145
+ }
146
+ )
147
+
148
+ # Create and mount the app
149
+ app = RubyWasmUi::App.create(HelloComponent, message: "Hello, Ruby WASM UI!")
150
+ app_element = JS.global[:document].getElementById("app")
151
+ app.mount(app_element)
152
+ RUBY
153
+
154
+ log_success("✓ Initial files created: src/index.html, src/index.rb")
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "command/setup"
4
+ require_relative "command/dev"
5
+ require_relative "command/pack"
6
+ require_relative "command/rebuild"
7
+
8
+ module RubyWasmUi
9
+ module Cli
10
+ class Command
11
+ COMMANDS = {
12
+ "setup" => Command::Setup,
13
+ "dev" => Command::Dev,
14
+ "pack" => Command::Pack,
15
+ "rebuild" => Command::Rebuild
16
+ }.freeze
17
+
18
+ def self.run(argv)
19
+ command_name = argv[0]
20
+
21
+ if command_name.nil?
22
+ show_usage
23
+ raise SystemExit.new(1)
24
+ end
25
+
26
+ command_class = COMMANDS[command_name]
27
+ if command_class.nil?
28
+ puts "Unknown command: #{command_name}"
29
+ puts ""
30
+ show_usage
31
+ raise SystemExit.new(1)
32
+ end
33
+
34
+ command_class.new.run(argv[1..-1])
35
+ end
36
+
37
+ def self.show_usage
38
+ puts "Usage: ruby-wasm-ui <command>"
39
+ puts ""
40
+ puts "Commands:"
41
+ COMMANDS.each do |name, klass|
42
+ description = klass.description || ""
43
+ puts " #{name.ljust(12)}#{description}"
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyWasmUi
4
- VERSION = "0.8.3"
4
+ VERSION = "0.9.1"
5
5
  end
data/lib/ruby_wasm_ui.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "ruby_wasm_ui/app"
4
- require_relative "ruby_wasm_ui/component"
5
- require_relative "ruby_wasm_ui/dispatcher"
6
- require_relative "ruby_wasm_ui/dom"
7
- require_relative "ruby_wasm_ui/nodes_equal"
8
- require_relative "ruby_wasm_ui/template"
9
- require_relative "ruby_wasm_ui/utils"
10
- require_relative "ruby_wasm_ui/vdom"
3
+ require_relative "ruby_wasm_ui/runtime/app"
4
+ require_relative "ruby_wasm_ui/runtime/component"
5
+ require_relative "ruby_wasm_ui/runtime/dispatcher"
6
+ require_relative "ruby_wasm_ui/runtime/dom"
7
+ require_relative "ruby_wasm_ui/runtime/nodes_equal"
8
+ require_relative "ruby_wasm_ui/runtime/template"
9
+ require_relative "ruby_wasm_ui/runtime/utils"
10
+ require_relative "ruby_wasm_ui/runtime/vdom"
11
11
  require_relative "ruby_wasm_ui/version"
12
12
 
13
13
  module RubyWasmUi
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ruby-wasm-ui-project",
3
- "version": "0.8.2",
3
+ "version": "0.9.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "ruby-wasm-ui-project",
9
- "version": "0.8.2",
9
+ "version": "0.9.1",
10
10
  "license": "MIT",
11
11
  "workspaces": [
12
12
  "packages/*"
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ruby-wasm-ui-project",
3
- "version": "0.8.2",
3
+ "version": "0.9.1",
4
4
  "private": true,
5
5
  "description": "A project to ruby.wasm ui framework",
6
6
  "scripts": {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ruby-wasm-ui",
3
- "version": "0.8.3",
3
+ "version": "0.9.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "ruby-wasm-ui",
9
- "version": "0.8.3",
9
+ "version": "0.9.1",
10
10
  "license": "MIT",
11
11
  "devDependencies": {
12
12
  "@rollup/plugin-replace": "^6.0.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ruby-wasm-ui",
3
- "version": "0.8.3",
3
+ "version": "0.9.1",
4
4
  "description": "",
5
5
  "main": "dist/ruby-wasm-ui.js",
6
6
  "files": [
@@ -18,7 +18,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
18
18
 
19
19
  // Find all Ruby files in ruby_wasm_ui directory
20
20
  const rubyFiles = glob
21
- .sync("src/ruby_wasm_ui/**/*.rb")
21
+ .sync("src/ruby_wasm_ui/runtime/**/*.rb")
22
22
  .map((file) => file.replace("src/", ""))
23
23
  .sort((a, b) => {
24
24
  // Files in root directory should be loaded first