class OpalWebpackLoader::Installer::CLI

Public Instance Methods

flat() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 75
def flat
  @application_css = '../styles/application.css'
  @asset_output_directory = File.join('public', 'assets')
  @js_entrypoints_directory = File.join('javascripts')
  @conf_rel_prefix = '..'
  @js_rel_prefix = '..'
  @opal_directory = options[:opal_name]
  @styles_directory = 'styles'
  @webpack_config_directory = 'webpack'
  @dev_default_targets = 'browser'
  @pro_default_targets = 'browser'
  @hmr_hook = ''
  create_common_directories
  install_common_things
  create_file_from_template('application.css.erb', File.join('styles', 'application.css'), {})
  create_file_from_template('initializer.rb.erb', 'owl_init.rb', { opal_load_path: '' })
  create_file_from_template('app_loader.rb.erb', 'app_loader.rb', { opal_directory: @opal_directory })
  add_gem
  print_message
end
iso() click to toggle source

Showing directories and files relevant to iso owl:

project_root
  +- config.ru # rack app starter
  +- config # webpack and other config
      +- owl.rb # owl.configuration
  +- isomorfeus
      +- components
      +- imports # javascript entrypoints, import other components etc.
           +- application.js
           +- application_common.js
           +- application_ssr.js
      +- isomorfeus_loader.rb
      +- models
      +- operations
      +- policies
      +- styles
           +- css
  +- log
  +- node_modules
  +- package.json
  +- Procfile
  +- public
       +- assets # compiled assets and other things
  +- spec
  +- tmp
# File lib/opal-webpack-loader/installer_cli.rb, line 34
def iso
  @application_css = '../styles/application.css'
  @asset_output_directory = File.join('public', 'assets')
  @js_entrypoints_directory = File.join('isomorfeus', 'imports')
  @conf_rel_prefix = '..'
  @js_rel_prefix = '..'
  @opal_directory = 'isomorfeus'
  @styles_directory = File.join(@opal_directory, 'styles')
  @webpack_config_directory = 'webpack'
  @dev_default_targets = 'browser'
  @pro_default_targets = 'browser, ssr'
  @hmr_hook = 'Opal.Isomorfeus.$force_render()'
  create_directory(@webpack_config_directory)
  create_directory(@asset_output_directory)
  FileUtils.touch(File.join(@asset_output_directory, '.keep'))
  install_webpack_config
  create_file_from_template('initializer.rb.erb', File.join('owl_init.rb'), { opal_load_path: '' })
  # add_gem
end
rails() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 121
def rails
  @application_css = '../stylesheets/application.css'
  @asset_output_directory = File.join('public', 'assets')
  @js_entrypoints_directory = File.join('app', 'assets', 'javascripts')
  @conf_rel_prefix = File.join('..', '..')
  @js_rel_prefix = File.join('..', '..', '..')
  @opal_directory = File.join('app', options[:opal_name])
  @styles_directory = File.join('app', 'assets', 'stylesheets')
  @webpack_config_directory = File.join('config', 'webpack')
  @dev_default_targets = 'browser'
  @pro_default_targets = 'browser'
  @hmr_hook = ''
  create_directory('app')
  create_common_directories
  install_common_things
  create_file_from_template('initializer.rb.erb', File.join('config', 'initializers', 'opal_webpack_loader.rb'),
                            { opal_load_path: "Opal.append_path(File.realdirpath('#{@opal_directory}'))" })
  add_gem
  print_message
end
webpacker() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 167
def webpacker
  @application_css = '../stylesheets/application.css'
  @asset_output_directory = File.join('public', 'assets')
  @js_entrypoints_directory = File.join('app', 'assets', 'javascripts')
  @conf_rel_prefix = File.join('..', '..')
  @js_rel_prefix = File.join('..', '..', '..')
  @opal_directory = File.join('app', options[:opal_name])
  @styles_directory = File.join('app', 'assets', 'stylesheets')
  @webpack_config_directory = File.join('config', 'webpack')
  @dev_default_targets = 'browser'
  @pro_default_targets = 'browser'
  @hmr_hook = ''
  create_directory('app')
  create_common_directories
  install_webpacker_config
  install_webpacker_package_json
  install_webpacker_js_entry
  install_opal_entries
  create_file_from_template('initializer.rb.erb', File.join('config', 'initializers', 'opal_webpack_loader.rb'),
                            { opal_load_path: "Opal.append_path(File.realdirpath('#{@opal_directory}'))" })
  add_gem
  print_message
end

Private Instance Methods

add_gem() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 380
def add_gem
  # TODO specifying a version results in bundler printing a error and not adding the gem
  # `bundle add opal-webpack-loader -v "#{OpalWebpackLoader::VERSION}" --skip-install`ß´
end
create_common_directories() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 200
def create_common_directories
  create_directory(@webpack_config_directory)
  create_directory(@js_entrypoints_directory)
  create_directory(@opal_directory)
  create_directory(@asset_output_directory)
  FileUtils.touch(File.join(@asset_output_directory, '.gitkeep'))
  create_directory(@styles_directory)
end
create_directory(directory) click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 193
def create_directory(directory)
  unless Dir.exist?(directory)
    puts "Creating directory #{directory}."
    FileUtils.mkdir_p(directory)
  end
end
create_file_from_template(template_path, target_file_path, data_hash) click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 366
def create_file_from_template(template_path, target_file_path, data_hash)
  template = ERB.new(File.read(File.join(templates_path, template_path), mode: 'r'))
  result = template.result_with_hash(data_hash)
  if File.exist?(target_file_path)
    ext = '_owl_new'
    puts "#{target_file_path} exists, not overwriting, creating #{target_file_path + ext} instead."
  else
    ext = ''
    puts "Creating #{target_file_path}."
  end

  File.write(target_file_path + ext, result, mode: 'w')
end
debug_script() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 277
def debug_script
  "webpack-dev-server --config #{File.join(@webpack_config_directory, 'debug.js')}"
end
development_script() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 281
def development_script
  "webpack-dev-server --config #{File.join(@webpack_config_directory, 'development.js')}"
end
install_common_things() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 209
def install_common_things
  install_webpack_config
  install_package_json
  install_js_entries
  install_opal_entries
  install_procfile
end
install_js_entries() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 217
def install_js_entries
  erb_hash = { opal_dir: File.join(@js_rel_prefix, @opal_directory), opal_name: options[:opal_name], application_css: @application_css }
  create_file_from_template('application.js.erb', File.join(@js_entrypoints_directory, 'application.js'), erb_hash)
  create_file_from_template('application_common.js.erb', File.join(@js_entrypoints_directory, 'application_common.js'),erb_hash)
  create_file_from_template('application_ssr.js.erb', File.join(@js_entrypoints_directory, 'application_ssr.js'), erb_hash)
  create_file_from_template('application_web_worker.js.erb', File.join(@js_entrypoints_directory, 'application_web_worker.js'), erb_hash)
end
install_opal_entries() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 225
def install_opal_entries
  create_file_from_template('opal_loader.rb.erb', File.join(@opal_directory, "#{options[:opal_name]}_loader.rb"), {})
  create_file_from_template('opal_web_worker_loader.rb.erb', File.join(@opal_directory, "#{options[:opal_name]}_web_worker_loader.rb"), {})
end
install_package_json() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 230
def install_package_json
  if File.exist?('package.json')
    gem_package_json_template = File.read(File.join(templates_path, 'package.json.erb'))
    gem_package_json = Oj.load(gem_package_json_template, mode: :strict)
    package_json_file = File.read('package.json')
    package_json = Oj.load(package_json_file, mode: :strict)
    package_json["scripts"] = {} unless package_json.has_key?("scripts")
    package_json["scripts"]["debug"] = debug_script
    package_json["scripts"]["development"] = development_script
    package_json["scripts"]["production_build"] = production_script
    package_json["devDependencies"] = {} unless package_json.has_key?("devDependencies")
    package_json["devDependencies"].merge!(gem_package_json["devDependencies"])
    package_json["dependencies"]["opal-webpack-loader"] = "^#{OpalWebpackLoader::VERSION}"
    File.write('package.json', Oj.dump(package_json, mode: :strict, indent: 2))
    puts "Updated package.json, updated scripts and owl dependencies"
  else
    erb_hash = {
      debug_script: debug_script,
      development_script: development_script,
      production_script: production_script,
      owl_version: OpalWebpackLoader::VERSION
    }
    create_file_from_template('package.json.erb', 'package.json', erb_hash)
  end
end
install_procfile() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 256
def install_procfile
  if File.exist?('Procfile')
    procfile = File.read('Procfile')
    has_webpack = false
    lines = procfile.lines
    lines.each do |line|
      has_webpack = true if line.start_with?('webpack')
    end
    unless has_webpack
      lines << 'webpack: yarn run development'
      File.write('Procfile', lines.join("\n"))
    end
  else
    erb_hash = { web_starter: '' }
    if @js_entrypoints_directory.start_with?('app')
      erb_hash[:web_starter] = 'web: bundle exec rails s'
    end
    create_file_from_template('Procfile.erb', 'Procfile',erb_hash)
  end
end
install_webpack_config() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 289
      def install_webpack_config
        erb_hash = {
          asset_output_directory: File.join(@conf_rel_prefix, @asset_output_directory),
          default_targets: @dev_default_targets,
          js_entry: File.join(@conf_rel_prefix, @js_entrypoints_directory, 'application.js'),
          js_common_entry: File.join(@conf_rel_prefix, @js_entrypoints_directory, 'application_common.js'),
          js_ssr_entry: File.join(@conf_rel_prefix, @js_entrypoints_directory, 'application_ssr.js'),
          js_web_worker_entry: File.join(@conf_rel_prefix, @js_entrypoints_directory, 'application_web_worker.js'),
          opal_directory: File.join(@conf_rel_prefix, @opal_directory),
          stylesheets_directory: File.join(@conf_rel_prefix, @styles_directory),
          hmr_hook: @hmr_hook
        }
        if @js_entrypoints_directory.start_with?('app')
          erb_hash[:dev_server_before] = <<~JAVASCRIPT
                // enable page reload for updates within the app/views directory
                before: function(app, server) {
                    chokidar.watch(path.resolve(__dirname, path.join('..', '..', 'app', 'views'))).on('all', function () {
                        server.sockWrite(server.sockets, 'content-changed');
                    })
                },
          JAVASCRIPT
        else
          erb_hash[:dev_server_before] = <<~JAVASCRIPT
                // uncomment to enable page reload for updates within another directory, which may contain just html files,
                // for example the 'views' directory:
                // before: function(app, server) {
                //     chokidar.watch(path.resolve(__dirname, path.join('..', 'views')).on('all', function () {
                //         server.sockWrite(server.sockets, 'content-changed');
                //     })
                // },
          JAVASCRIPT
        end
        create_file_from_template('debug.js.erb', File.join(@webpack_config_directory, 'debug.js'), erb_hash)
        create_file_from_template('development.js.erb', File.join(@webpack_config_directory, 'development.js'), erb_hash)
        erb_hash[:default_targets] = @pro_default_targets
        create_file_from_template('production.js.erb', File.join(@webpack_config_directory, 'production.js'), erb_hash)
      end
install_webpacker_config() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 327
def install_webpacker_config
  environment_js = File.read(File.join('config', 'webpack', 'environment.js'), mode: 'r')
  new_environment_js = ''
  environment_js.lines.each do |line|
    new_environment_js << line
    if line.start_with?('const { environment }')
      new_environment_js << "\n"
      new_environment_js << File.read(File.join(templates_path, 'webpacker.js'), mode: 'r')
      new_environment_js << "\n"
    end
  end
  File.write(File.join('config', 'webpack', 'environment.js'), new_environment_js)
end
install_webpacker_js_entry() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 341
      def install_webpacker_js_entry
        application_js = File.read(File.join('app', 'javascript', 'packs', 'application.js'), mode: 'r')
        application_js << <<~JAVASCRIPT

        // import and load opal ruby files
        import init_app from '#{options[:opal_name]}_loader.rb';
        init_app();
        Opal.load('#{options[:opal_name]}_loader');

        JAVASCRIPT
        File.write(File.join('app', 'javascript', 'packs', 'application.js'), application_js)
      end
install_webpacker_package_json() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 354
def install_webpacker_package_json
  package_json_file = File.read('package.json')
  package_json = Oj.load(package_json_file, mode: :strict)
  package_json["dependencies"]["opal-webpack-loader"] = "^#{OpalWebpackLoader::VERSION}"
  File.write('package.json', Oj.dump(package_json, mode: :strict, indent: 2))
  puts "Updated package.json for opal-webpack-loader"
end
print_message() click to toggle source
production_script() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 285
def production_script
  "parallel-webpack --config=#{File.join(@webpack_config_directory, 'production.js')}"
end
templates_path() click to toggle source
# File lib/opal-webpack-loader/installer_cli.rb, line 362
def templates_path
  File.realpath(File.join(File.dirname(File.realpath(__FILE__)),  'templates'))
end