Class: WasmRails::Generators::InstallGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/generators/wasm_rails/install/install_generator.rb

Instance Method Summary collapse

Instance Method Details

#copy_bin_scriptsObject



30
31
32
33
34
35
36
37
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 30

def copy_bin_scripts
  copy_file "build_app_bundle.mjs", "bin/build_app_bundle.mjs"
  copy_file "esbuild_wasm.mjs",     "bin/esbuild_wasm.mjs"
  copy_file "serve_wasm.mjs",       "bin/serve_wasm.mjs"
  chmod "bin/build_app_bundle.mjs", 0o755
  chmod "bin/esbuild_wasm.mjs",     0o755
  chmod "bin/serve_wasm.mjs",       0o755
end

#copy_js_filesObject



25
26
27
28
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 25

def copy_js_files
  copy_file "service_worker.js", "app/javascript/wasm/service_worker.js"
  copy_file "boot.js",           "app/javascript/wasm/boot.js"
end

#copy_public_filesObject



39
40
41
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 39

def copy_public_files
  copy_file "wasm_shell.html", "public/wasm_shell.html"
end

#copy_wasm_adapterObject



11
12
13
14
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 11

def copy_wasm_adapter
  copy_file "wasm_sqlite3_adapter.rb",
            "lib/active_record/connection_adapters/wasm_sqlite3_adapter.rb"
end

#copy_wasm_stubsObject



16
17
18
19
20
21
22
23
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 16

def copy_wasm_stubs
  stubs_src = File.expand_path("../../../../../wasm_stubs", __dir__)
  Dir.glob("#{stubs_src}/**/*").each do |src|
    next if File.directory?(src)
    rel = Pathname.new(src).relative_path_from(Pathname.new(stubs_src))
    copy_file src, "wasm_stubs/#{rel}"
  end
end

#patch_application_rbObject



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 52

def patch_application_rb
  application_rb = "config/application.rb"
  return if File.read(application_rb).include?("wasm_sqlite3_adapter")
  inject_into_class application_rb, "Application" do
    <<~RUBY.indent(4)
      if RUBY_PLATFORM == "wasm32-wasi"
        require_relative "../../lib/active_record/connection_adapters/wasm_sqlite3_adapter"
      end
    RUBY
  end
end

#patch_assets_initializerObject



64
65
66
67
68
69
70
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 64

def patch_assets_initializer
  initializer = "config/initializers/assets.rb"
  create_file initializer unless File.exist?(initializer)
  return if File.read(initializer).include?("app/javascript")
  append_to_file initializer,
    "\nRails.application.config.assets.paths << Rails.root.join(\"app/javascript\")\n"
end

#patch_boot_rbObject



43
44
45
46
47
48
49
50
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 43

def patch_boot_rb
  boot = "config/boot.rb"
  return unless File.exist?(boot)
  return if File.read(boot).include?("wasm32-wasi")
  gsub_file boot,
    /^(ENV\["BUNDLE_GEMFILE"\].+\nrequire "bundler\/setup"\nrequire "bootsnap\/setup")$/m,
    "unless RUBY_PLATFORM == \"wasm32-wasi\"\n  \\1\nend"
end

#show_post_install_messageObject



93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 93

def show_post_install_message
  say "\n"
  say "  ✓ wasm_rails installed!", :green
  say "\n"
  say "  Next steps:"
  say "    1. npm install"
  say "    2. In config/application.rb, require these before Bundler.require:"
  say "         require 'wasm_rails'"
  say "         require 'turbo-rails'"
  say "         require 'stimulus-rails'"
  say "    3. npm run build:app && npm run build:wasm"
  say "    4. node bin/serve_wasm.mjs  →  http://localhost:3100"
  say "\n"
end

#update_package_jsonObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/generators/wasm_rails/install/install_generator.rb', line 72

def update_package_json
  return unless File.exist?("package.json")
  pkg = JSON.parse(File.read("package.json"))

  (pkg["dependencies"] ||= {}).merge!(
    "@ruby/3.3-wasm-wasi"     => "^3.3.0",
    "@ruby/wasm-wasi"         => "^3.3.0",
    "@sqlite.org/sqlite-wasm" => "^3.0.0",
    "esbuild"                 => "^0.25.0"
  ) { |_k, old, _new| old }

  (pkg["scripts"] ||= {}).merge!(
    "build:wasm" => "node bin/esbuild_wasm.mjs",
    "watch:wasm" => "node bin/esbuild_wasm.mjs --watch",
    "build:app"  => "node bin/build_app_bundle.mjs"
  ) { |_k, old, _new| old }

  File.write("package.json", JSON.pretty_generate(pkg))
  say_status :update, "package.json"
end