Skip to content

Commit

Permalink
Add installer support for webpack/webpacker
Browse files Browse the repository at this point in the history
  • Loading branch information
mshibuya committed Nov 28, 2021
1 parent 7918dc7 commit b84d065
Show file tree
Hide file tree
Showing 11 changed files with 131 additions and 6 deletions.
1 change: 1 addition & 0 deletions .prettierignore
@@ -1,4 +1,5 @@
coverage
lib/generators/rails_admin/templates
spec/dummy_app/public
spec/dummy_app/tmp
spec/support/jquery.simulate.drag-sortable.js
Expand Down
12 changes: 12 additions & 0 deletions app/helpers/rails_admin/application_helper.rb
Expand Up @@ -195,5 +195,17 @@ def flash_alert_class(flash_key)
else "alert-#{flash_key}"
end
end

def handle_asset_dependency_error
yield
rescue LoadError => e
if e.message =~ /sassc/
e = e.exception <<-MSG.gsub(/^\s{10}/, '')
#{e.message}
RailsAdmin requires the gem sassc-rails, make sure to put `gem 'sassc-rails'` to Gemfile.
MSG
end
raise e
end
end
end
17 changes: 11 additions & 6 deletions app/views/layouts/rails_admin/_head.html.erb
Expand Up @@ -3,10 +3,15 @@
<meta content="width=device-width, initial-scale=1" name="viewport; charset=utf-8"/>
<meta content="NONE,NOARCHIVE" name="robots"/>
<%= csrf_meta_tag %>
<% if RailsAdmin::config.asset_source == :webpacker %>
<%= javascript_pack_tag "rails_admin" %>
<% case RailsAdmin::config.asset_source
when :webpacker %>
<%= stylesheet_pack_tag "rails_admin" %>
<% else %>
<%= stylesheet_link_tag "rails_admin.css", media: :all %>
<%= javascript_include_tag "rails_admin.js" %>
<% end %>
<%= javascript_pack_tag "rails_admin" %>
<% when :webpack, :sprockets %>
<% handle_asset_dependency_error do %>
<%= stylesheet_link_tag "rails_admin.css", media: :all %>
<%= javascript_include_tag "rails_admin.js", defer: true %>
<% end %>
<% else
raise "Unknown asset_source: #{RailsAdmin::config.asset_source}"
end %>
44 changes: 44 additions & 0 deletions lib/generators/rails_admin/install_generator.rb
Expand Up @@ -7,12 +7,56 @@ class InstallGenerator < Rails::Generators::Base
include Generators::Utils::InstanceMethods

argument :_namespace, type: :string, required: false, desc: 'RailsAdmin url namespace'
class_option :asset, type: :string, required: false, default: nil, desc: 'Asset delivery method [options: webpack, webpacker, sprockets]'
desc 'RailsAdmin installation generator'

def install
namespace = ask_for('Where do you want to mount rails_admin?', 'admin', _namespace)
route("mount RailsAdmin::Engine => '/#{namespace}', as: 'rails_admin'")
template 'initializer.erb', 'config/initializers/rails_admin.rb'
display "Using [#{asset}] for asset delivery method"
case asset
when 'webpack'
configure_for_webpack
when 'webpacker'
configure_for_webpacker5
when 'sprockets'
configure_for_sprockets
end
end

private

def asset
return options['asset'] if options['asset']

if Rails.root.join('webpack.config.js').exist?
'webpack'
elsif defined?(Webpacker)
'webpacker'
else
'sprockets'
end
end

def configure_for_sprockets
gem 'sassc-rails'
end

def configure_for_webpacker5
run "yarn add rails_admin@#{RailsAdmin::Version.js}"
@scss_relative_dir = '../stylesheets/'
template 'rails_admin.js.erb', 'app/javascript/packs/rails_admin.js'
template 'rails_admin.scss', 'app/javascript/stylesheets/rails_admin.scss'
template 'environment.js', 'config/webpack/environment.js'
end

def configure_for_webpack
run "yarn add rails_admin@#{RailsAdmin::Version.js} css-loader mini-css-extract-plugin sass sass-loader"
@scss_relative_dir = './'
template 'rails_admin.js.erb', 'app/javascript/rails_admin.js'
template 'rails_admin.scss', 'app/javascript/rails_admin.scss'
template 'webpack.config.js', 'webpack.config.js'
end
end
end
6 changes: 6 additions & 0 deletions lib/generators/rails_admin/templates/environment.js
@@ -0,0 +1,6 @@
const webpack = require('webpack');
const { environment } = require('@rails/webpacker')

environment.plugins.append('ProvidePlugin-jQuery', new webpack.ProvidePlugin({jQuery: 'jquery'}));

module.exports = environment
1 change: 1 addition & 0 deletions lib/generators/rails_admin/templates/initializer.erb
@@ -1,4 +1,5 @@
RailsAdmin.config do |config|
config.asset_source = :<%= asset %>

### Popular gems integration

Expand Down
2 changes: 2 additions & 0 deletions lib/generators/rails_admin/templates/rails_admin.js.erb
@@ -0,0 +1,2 @@
import "rails_admin/src/rails_admin/base";
import "<%= @scss_relative_dir %>rails_admin.scss";
1 change: 1 addition & 0 deletions lib/generators/rails_admin/templates/rails_admin.scss
@@ -0,0 +1 @@
@import "~rails_admin/src/rails_admin/styles/base";
32 changes: 32 additions & 0 deletions lib/generators/rails_admin/templates/webpack.config.js
@@ -0,0 +1,32 @@
const path = require("path")
const webpack = require('webpack')
const MiniCssExtractPlugin = require("mini-css-extract-plugin")

module.exports = {
mode: "production",
entry: {
application: "./app/javascript/application.js",
rails_admin: "./app/javascript/rails_admin.js",
},
output: {
filename: "[name].js",
path: path.resolve(__dirname, "app/assets/builds"),
},
module: {
rules: [
{
test: /.s?css$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
},
],
},
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1
}),
new webpack.ProvidePlugin({
jQuery: "jquery"
}),
new MiniCssExtractPlugin(),
]
}
4 changes: 4 additions & 0 deletions lib/rails_admin/version.rb
Expand Up @@ -10,6 +10,10 @@ class << self
def to_s
[MAJOR, MINOR, PATCH, PRE].compact.join('.')
end

def js
JSON.parse(File.read("#{__dir__}/../../package.json"))['version']
end
end
end
end
17 changes: 17 additions & 0 deletions spec/rails_admin/install_generator_spec.rb
Expand Up @@ -7,6 +7,7 @@

before do
prepare_destination
FileUtils.touch File.join(destination_root, 'Gemfile')
end

it 'mounts RailsAdmin as Engine and generates RailsAdmin Initializer' do
Expand All @@ -23,6 +24,22 @@
end
end
end
case CI_ASSET
when :webpacker
file 'app/javascript/packs/rails_admin.js' do
contains 'import "rails_admin/src/rails_admin/base"'
end
file 'app/javascript/stylesheets/rails_admin.scss' do
contains '@import "~rails_admin/src/rails_admin/styles/base"'
end
file 'config/webpack/environment.js' do
contains 'ProvidePlugin({jQuery'
end
when :sprockets
file 'Gemfile' do
contains 'sassc-rails'
end
end
}
end
end

0 comments on commit b84d065

Please sign in to comment.