wasmify-rails 0.1.0

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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +7 -0
  3. data/LICENSE.txt +23 -0
  4. data/README.md +168 -0
  5. data/lib/active_record/connection_adapters/nulldb_adapter/checkpoint.rb +13 -0
  6. data/lib/active_record/connection_adapters/nulldb_adapter/column.rb +4 -0
  7. data/lib/active_record/connection_adapters/nulldb_adapter/configuration.rb +5 -0
  8. data/lib/active_record/connection_adapters/nulldb_adapter/core.rb +391 -0
  9. data/lib/active_record/connection_adapters/nulldb_adapter/empty_result.rb +41 -0
  10. data/lib/active_record/connection_adapters/nulldb_adapter/index_definition.rb +5 -0
  11. data/lib/active_record/connection_adapters/nulldb_adapter/null_object.rb +13 -0
  12. data/lib/active_record/connection_adapters/nulldb_adapter/quoting.rb +3 -0
  13. data/lib/active_record/connection_adapters/nulldb_adapter/statement.rb +15 -0
  14. data/lib/active_record/connection_adapters/nulldb_adapter/table_definition.rb +23 -0
  15. data/lib/active_record/connection_adapters/nulldb_adapter.rb +67 -0
  16. data/lib/active_record/connection_adapters/sqlite3_wasm_adapter.rb +163 -0
  17. data/lib/active_storage/null_delivery.rb +15 -0
  18. data/lib/generators/wasmify/install/USAGE +5 -0
  19. data/lib/generators/wasmify/install/install_generator.rb +73 -0
  20. data/lib/generators/wasmify/install/templates/config/environments/wasm.rb +30 -0
  21. data/lib/generators/wasmify/install/templates/config/wasmify.yml +17 -0
  22. data/lib/generators/wasmify/pwa/USAGE +5 -0
  23. data/lib/generators/wasmify/pwa/pwa_generator.rb +13 -0
  24. data/lib/generators/wasmify/pwa/templates/pwa/README.md +40 -0
  25. data/lib/generators/wasmify/pwa/templates/pwa/boot.html +102 -0
  26. data/lib/generators/wasmify/pwa/templates/pwa/boot.js +96 -0
  27. data/lib/generators/wasmify/pwa/templates/pwa/database.js +18 -0
  28. data/lib/generators/wasmify/pwa/templates/pwa/index.html +2 -0
  29. data/lib/generators/wasmify/pwa/templates/pwa/package.json.tt +20 -0
  30. data/lib/generators/wasmify/pwa/templates/pwa/rails.sw.js +115 -0
  31. data/lib/generators/wasmify/pwa/templates/pwa/vite.config.js +29 -0
  32. data/lib/image_processing/null.rb +22 -0
  33. data/lib/wasmify/rails/builder.rb +45 -0
  34. data/lib/wasmify/rails/configuration.rb +41 -0
  35. data/lib/wasmify/rails/packer.rb +60 -0
  36. data/lib/wasmify/rails/railtie.rb +11 -0
  37. data/lib/wasmify/rails/shim.rb +65 -0
  38. data/lib/wasmify/rails/shims/io/console/size.rb +0 -0
  39. data/lib/wasmify/rails/shims/io/console.rb +11 -0
  40. data/lib/wasmify/rails/shims/io/wait.rb +0 -0
  41. data/lib/wasmify/rails/shims/ipaddr.rb +7 -0
  42. data/lib/wasmify/rails/shims/nio.rb +0 -0
  43. data/lib/wasmify/rails/shims/nokogiri/nokogiri.rb +0 -0
  44. data/lib/wasmify/rails/shims/nokogiri.rb +0 -0
  45. data/lib/wasmify/rails/shims/rails-html-sanitizer.rb +163 -0
  46. data/lib/wasmify/rails/shims/socket.rb +21 -0
  47. data/lib/wasmify/rails/shims/sqlite3.rb +0 -0
  48. data/lib/wasmify/rails/tasks.rake +120 -0
  49. data/lib/wasmify/rails/version.rb +7 -0
  50. data/lib/wasmify/rails/wasmtimer.rb +31 -0
  51. data/lib/wasmify-rails.rb +25 -0
  52. metadata +200 -0
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :wasmify do
4
+ desc "Install wasmify-rails"
5
+ task :install do
6
+ Rails::Command.invoke :generate, ["wasmify:install"]
7
+ end
8
+
9
+ desc "Generate a PWA application to serve the Rails Wasm app"
10
+ task :pwa do
11
+ Rails::Command.invoke :generate, ["wasmify:pwa"]
12
+ end
13
+
14
+ desc "Build ruby.wasm with all dependencies"
15
+ task :build do
16
+ unless ENV["BUNDLE_ONLY"] == "wasm"
17
+ next spawn("BUNDLE_ONLY=wasm bundle exec rails wasmify:build").then { Process.wait(_1) }
18
+ end
19
+
20
+ require "wasmify/rails/builder"
21
+
22
+ builder = Wasmify::Rails::Builder.new
23
+ builder.run(name: "ruby.wasm")
24
+ end
25
+
26
+ namespace :build do
27
+ desc "Build ruby.wasm with all dependencies but JS shim (to use with wasmtime)"
28
+ task :core do
29
+ unless ENV["BUNDLE_ONLY"] == "wasm"
30
+ next spawn("BUNDLE_ONLY=wasm bundle exec rails wasmify:build:core").then { Process.wait(_1) }
31
+ end
32
+
33
+ require "wasmify/rails/builder"
34
+
35
+ builder = Wasmify::Rails::Builder.new
36
+ builder.run(name: "ruby-core.wasm", exclude_gems: ["js"])
37
+ end
38
+
39
+ namespace :core do
40
+ desc "Test that compiled ruby-core.wasm works (print Rails version)"
41
+ task :verify do
42
+ require "wasmify/rails/wasmtimer"
43
+
44
+ wasm_path = File.join(Wasmify::Rails.config.tmp_dir, "ruby-core.wasm")
45
+ Wasmify::Rails::Wasmtimer.run(
46
+ wasm_path,
47
+ <<~'RUBY'
48
+ require "wasmify/rails/shim"
49
+ require "rails"
50
+ puts "Your Rails version is: #{Rails.version} [#{RUBY_PLATFORM}]"
51
+ RUBY
52
+ )
53
+ end
54
+ end
55
+ end
56
+
57
+ desc "Pack the application into to a single module"
58
+ task pack: :build do
59
+ # First, precompile assets
60
+ unless Wasmify::Rails.config.skip_assets_precompile
61
+ Bundler.with_unbundled_env do
62
+ spawn("SECRET_KEY_BASE_DUMMY=1 RAILS_ENV=production bundle exec rails assets:precompile").then { Process.wait(_1) }
63
+ end
64
+ end
65
+
66
+ require "wasmify/rails/packer"
67
+
68
+ packer = Wasmify::Rails::Packer.new
69
+
70
+ packer.run(name: "app.wasm", ruby_wasm_path: File.join(Wasmify::Rails.config.tmp_dir, "ruby.wasm"))
71
+ end
72
+
73
+ namespace :pack do
74
+ desc "Pack the application into to a single module without JS shim"
75
+ task :core do
76
+ # First, precompile assets
77
+ unless Wasmify::Rails.config.skip_assets_precompile
78
+ Bundler.with_unbundled_env do
79
+ spawn("SECRET_KEY_BASE_DUMMY=1 RAILS_ENV=production bundle exec rails assets:precompile").then { Process.wait(_1) }
80
+ end
81
+ end
82
+
83
+ require "wasmify/rails/packer"
84
+
85
+ # Pack core module to the tmp dir (we only use it for testing purposes right now)
86
+ packer = Wasmify::Rails::Packer.new(
87
+ output_dir: Wasmify::Rails.config.tmp_dir
88
+ )
89
+
90
+ packer.run(name: "app-core.wasm",
91
+ ruby_wasm_path: File.join(Wasmify::Rails.config.tmp_dir, "ruby-core.wasm"),
92
+ storage_dir: "storage"
93
+ )
94
+ end
95
+
96
+ namespace :core do
97
+ desc "Test that the Rails application boots"
98
+ task :verify do
99
+ require "wasmify/rails/wasmtimer"
100
+
101
+ wasm_path = File.join(Wasmify::Rails.config.tmp_dir, "app-core.wasm")
102
+ Wasmify::Rails::Wasmtimer.run(
103
+ wasm_path,
104
+ <<~'RUBY'
105
+ ENV["RAILS_ENV"] = "wasm"
106
+ ENV["DEBUG"] = "1"
107
+ # ENV["ACTIVE_RECORD_ADAPTER"] = "sqlite3_wasm"
108
+ require "/rails/config/application"
109
+ puts "Initializing Rails application..."
110
+ Rails.application.initialize!
111
+ puts "Rails application initialized!\n\nLets try to make a request..."
112
+
113
+ request = Rack::MockRequest.env_for("http://localhost:3000", {"HTTP_HOST" => "localhost"})
114
+ puts Rails.application.call(request)
115
+ RUBY
116
+ )
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wasmify
4
+ module Rails # :nodoc:
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wasmify
4
+ module Rails
5
+ # A wrapper for the wasmtime CLI used to
6
+ # verify compiled modules.
7
+ module Wasmtimer
8
+ class << self
9
+ def run(wasm_path, script)
10
+ return unless wasmtime_installed?
11
+
12
+ exec(%Q(wasmtime run --dir ./storage::/rails/storage #{wasm_path} -W0 -r/bundle/setup -e '#{script}'))
13
+ end
14
+
15
+ private
16
+
17
+ def wasmtime_installed?
18
+ unless system("which wasmtime > /dev/null 2>&1")
19
+ $stderr.puts "Wasmtime is required to verify Wasm builds.\nPlease see installations instructions at https://wasmtime.dev."
20
+ if RUBY_PLATFORM =~ /darwin/
21
+ $stderr.puts "You can also install it via Homebrew:\n brew install wasmtime"
22
+ end
23
+ return false
24
+ end
25
+
26
+ true
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "wasmify/rails/version"
4
+ require "wasmify/rails/configuration"
5
+ require "wasmify/rails/shim"
6
+ require "wasmify/rails/railtie"
7
+
8
+ module Wasmify
9
+ module Rails
10
+ class << self
11
+ def config = @config ||= Configuration.new
12
+ end
13
+ end
14
+ end
15
+
16
+ # Autoloadable extensions
17
+ module ImageProcessing
18
+ autoload :Null, "image_processing/null"
19
+ end
20
+
21
+ # NullDB for Active Record
22
+ ActiveRecord::ConnectionAdapters.register("nulldb", "ActiveRecord::ConnectionAdapters::NullDBAdapter", "active_record/connection_adapters/nulldb_adapter")
23
+
24
+ # SQLite3 Wasm adapter
25
+ ActiveRecord::ConnectionAdapters.register("sqlite3_wasm", "ActiveRecord::ConnectionAdapters::SQLite3WasmAdapter", "active_record/connection_adapters/sqlite3_wasm_adapter")
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wasmify-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Vladimir Dementyev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-09-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '7.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '9.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '7.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '9.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: ruby_wasm
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.6'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '3.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '2.6'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: js
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '2.6'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '2.6'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '3.0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: bundler
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '1.15'
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '1.15'
87
+ - !ruby/object:Gem::Dependency
88
+ name: rake
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '13.0'
94
+ type: :development
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '13.0'
101
+ - !ruby/object:Gem::Dependency
102
+ name: minitest
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '5.0'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '5.0'
115
+ description: Tools and extensions to package Rails apps as Wasm modules
116
+ email:
117
+ - Vladimir Dementyev
118
+ executables: []
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - CHANGELOG.md
123
+ - LICENSE.txt
124
+ - README.md
125
+ - lib/active_record/connection_adapters/nulldb_adapter.rb
126
+ - lib/active_record/connection_adapters/nulldb_adapter/checkpoint.rb
127
+ - lib/active_record/connection_adapters/nulldb_adapter/column.rb
128
+ - lib/active_record/connection_adapters/nulldb_adapter/configuration.rb
129
+ - lib/active_record/connection_adapters/nulldb_adapter/core.rb
130
+ - lib/active_record/connection_adapters/nulldb_adapter/empty_result.rb
131
+ - lib/active_record/connection_adapters/nulldb_adapter/index_definition.rb
132
+ - lib/active_record/connection_adapters/nulldb_adapter/null_object.rb
133
+ - lib/active_record/connection_adapters/nulldb_adapter/quoting.rb
134
+ - lib/active_record/connection_adapters/nulldb_adapter/statement.rb
135
+ - lib/active_record/connection_adapters/nulldb_adapter/table_definition.rb
136
+ - lib/active_record/connection_adapters/sqlite3_wasm_adapter.rb
137
+ - lib/active_storage/null_delivery.rb
138
+ - lib/generators/wasmify/install/USAGE
139
+ - lib/generators/wasmify/install/install_generator.rb
140
+ - lib/generators/wasmify/install/templates/config/environments/wasm.rb
141
+ - lib/generators/wasmify/install/templates/config/wasmify.yml
142
+ - lib/generators/wasmify/pwa/USAGE
143
+ - lib/generators/wasmify/pwa/pwa_generator.rb
144
+ - lib/generators/wasmify/pwa/templates/pwa/README.md
145
+ - lib/generators/wasmify/pwa/templates/pwa/boot.html
146
+ - lib/generators/wasmify/pwa/templates/pwa/boot.js
147
+ - lib/generators/wasmify/pwa/templates/pwa/database.js
148
+ - lib/generators/wasmify/pwa/templates/pwa/index.html
149
+ - lib/generators/wasmify/pwa/templates/pwa/package.json.tt
150
+ - lib/generators/wasmify/pwa/templates/pwa/rails.sw.js
151
+ - lib/generators/wasmify/pwa/templates/pwa/vite.config.js
152
+ - lib/image_processing/null.rb
153
+ - lib/wasmify-rails.rb
154
+ - lib/wasmify/rails/builder.rb
155
+ - lib/wasmify/rails/configuration.rb
156
+ - lib/wasmify/rails/packer.rb
157
+ - lib/wasmify/rails/railtie.rb
158
+ - lib/wasmify/rails/shim.rb
159
+ - lib/wasmify/rails/shims/io/console.rb
160
+ - lib/wasmify/rails/shims/io/console/size.rb
161
+ - lib/wasmify/rails/shims/io/wait.rb
162
+ - lib/wasmify/rails/shims/ipaddr.rb
163
+ - lib/wasmify/rails/shims/nio.rb
164
+ - lib/wasmify/rails/shims/nokogiri.rb
165
+ - lib/wasmify/rails/shims/nokogiri/nokogiri.rb
166
+ - lib/wasmify/rails/shims/rails-html-sanitizer.rb
167
+ - lib/wasmify/rails/shims/socket.rb
168
+ - lib/wasmify/rails/shims/sqlite3.rb
169
+ - lib/wasmify/rails/tasks.rake
170
+ - lib/wasmify/rails/version.rb
171
+ - lib/wasmify/rails/wasmtimer.rb
172
+ homepage: https://github.com/palkan/wasmify-rails
173
+ licenses:
174
+ - MIT
175
+ metadata:
176
+ bug_tracker_uri: https://github.com/palkan/wasmify-rails/issues
177
+ changelog_uri: https://github.com/palkan/wasmify-rails/blob/master/CHANGELOG.md
178
+ documentation_uri: https://github.com/palkan/wasmify-rails
179
+ homepage_uri: https://github.com/palkan/wasmify-rails
180
+ source_code_uri: https://github.com/palkan/wasmify-rails
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '3.2'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubygems_version: 3.5.18
197
+ signing_key:
198
+ specification_version: 4
199
+ summary: Tools and extensions to package Rails apps as Wasm modules
200
+ test_files: []