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.
- checksums.yaml +4 -4
- data/.github/workflows/rspec.yml +0 -2
- data/Makefile +56 -0
- data/README.md +26 -6
- data/examples/.gitignore +4 -0
- data/examples/Gemfile.lock +15 -17
- data/examples/src/index.html +21 -0
- data/examples/src/index.rb +26 -0
- data/exe/ruby-wasm-ui +6 -0
- data/lib/ruby_wasm_ui/cli/command/base.rb +192 -0
- data/lib/ruby_wasm_ui/cli/command/dev.rb +207 -0
- data/lib/ruby_wasm_ui/cli/command/pack.rb +36 -0
- data/lib/ruby_wasm_ui/cli/command/rebuild.rb +38 -0
- data/lib/ruby_wasm_ui/cli/command/setup.rb +159 -0
- data/lib/ruby_wasm_ui/cli/command.rb +48 -0
- data/lib/ruby_wasm_ui/version.rb +1 -1
- data/lib/ruby_wasm_ui.rb +8 -8
- data/package-lock.json +2 -2
- data/package.json +1 -1
- data/packages/npm-packages/runtime/package-lock.json +2 -2
- data/packages/npm-packages/runtime/package.json +1 -1
- data/packages/npm-packages/runtime/rollup.config.mjs +1 -1
- data/spec/ruby_wasm_ui/cli/command/base_spec.rb +503 -0
- data/spec/ruby_wasm_ui/cli/command/dev_spec.rb +442 -0
- data/spec/ruby_wasm_ui/cli/command/pack_spec.rb +131 -0
- data/spec/ruby_wasm_ui/cli/command/rebuild_spec.rb +95 -0
- data/spec/ruby_wasm_ui/cli/command/setup_spec.rb +251 -0
- data/spec/ruby_wasm_ui/cli/command_spec.rb +118 -0
- data/{packages/npm-packages/runtime/spec → spec}/spec_helper.rb +1 -1
- metadata +96 -38
- data/packages/npm-packages/runtime/Gemfile +0 -3
- data/packages/npm-packages/runtime/Gemfile.lock +0 -26
- /data/lib/ruby_wasm_ui/{app.rb → runtime/app.rb} +0 -0
- /data/lib/ruby_wasm_ui/{component.rb → runtime/component.rb} +0 -0
- /data/lib/ruby_wasm_ui/{dispatcher.rb → runtime/dispatcher.rb} +0 -0
- /data/lib/ruby_wasm_ui/{dom → runtime/dom}/attributes.rb +0 -0
- /data/lib/ruby_wasm_ui/{dom → runtime/dom}/destroy_dom.rb +0 -0
- /data/lib/ruby_wasm_ui/{dom → runtime/dom}/events.rb +0 -0
- /data/lib/ruby_wasm_ui/{dom → runtime/dom}/mount_dom.rb +0 -0
- /data/lib/ruby_wasm_ui/{dom → runtime/dom}/patch_dom.rb +0 -0
- /data/lib/ruby_wasm_ui/{dom → runtime/dom}/scheduler.rb +0 -0
- /data/lib/ruby_wasm_ui/{dom.rb → runtime/dom.rb} +0 -0
- /data/lib/ruby_wasm_ui/{nodes_equal.rb → runtime/nodes_equal.rb} +0 -0
- /data/lib/ruby_wasm_ui/{template → runtime/template}/build_conditional_group.rb +0 -0
- /data/lib/ruby_wasm_ui/{template → runtime/template}/build_for_group.rb +0 -0
- /data/lib/ruby_wasm_ui/{template → runtime/template}/build_vdom.rb +0 -0
- /data/lib/ruby_wasm_ui/{template → runtime/template}/parser.rb +0 -0
- /data/lib/ruby_wasm_ui/{template.rb → runtime/template.rb} +0 -0
- /data/lib/ruby_wasm_ui/{utils → runtime/utils}/arrays.rb +0 -0
- /data/lib/ruby_wasm_ui/{utils → runtime/utils}/objects.rb +0 -0
- /data/lib/ruby_wasm_ui/{utils → runtime/utils}/props.rb +0 -0
- /data/lib/ruby_wasm_ui/{utils → runtime/utils}/strings.rb +0 -0
- /data/lib/ruby_wasm_ui/{utils.rb → runtime/utils.rb} +0 -0
- /data/lib/ruby_wasm_ui/{vdom.rb → runtime/vdom.rb} +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/component_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/dom/scheduler_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/nodes_equal_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/build_conditional_group_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/build_for_group_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/build_vdom_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/template/parser_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/utils/arrays_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/utils/objects_spec.rb +0 -0
- /data/{packages/npm-packages/runtime/spec/ruby_wasm_ui → spec/ruby_wasm_ui/runtime}/utils/props_spec.rb +0 -0
- /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
|
data/lib/ruby_wasm_ui/version.rb
CHANGED
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.
|
|
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.
|
|
9
|
+
"version": "0.9.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"workspaces": [
|
|
12
12
|
"packages/*"
|
data/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ruby-wasm-ui",
|
|
3
|
-
"version": "0.
|
|
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.
|
|
9
|
+
"version": "0.9.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@rollup/plugin-replace": "^6.0.2",
|
|
@@ -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
|