module PageflowScrolled module Generators # @api private class InstallGenerator < Rails::Generators::Base CUSTOM_THEME_ICONS = [:information, :muted, :share, :unmuted].freeze desc 'Installs Pageflow Scrolled entry type.' source_root File.expand_path('templates', __dir__) def initializer inject_into_file('config/initializers/pageflow.rb', after: "Pageflow.configure do |config|\n") do " config.plugin(PageflowScrolled.plugin)\n\n" \ " config.for_entry_type(PageflowScrolled.entry_type) do |entry_type_config|\n" \ " entry_type_config.plugin(ScrolledThemesPlugin.new)\n" \ " end\n\n" end end def theme_plugin @custom_theme_icons = CUSTOM_THEME_ICONS.inspect # Ruby files in the lib directory are eager loaded in # production. This includes template files in # lib/generators. Template file extension (.tt) is removed by # Thor automatically and ensures the file is not picked up by # eager loading. template 'themes_plugin.rb.tt', 'app/plugins/scrolled_themes_plugin.rb' end def install_packages run 'yarn add css-loader style-loader' \ ' mini-css-extract-plugin css-minimizer-webpack-plugin' \ ' postcss postcss-preset-env postcss-loader' \ ' postcss-import postcss-url postcss-flexbugs-fixes' \ ' @fontsource/source-sans-pro' end def webpack_config gsub_file( 'config/webpack/webpack.config.js', "const { generateWebpackConfig } = require('shakapacker')", "const { generateWebpackConfig, merge, mergeWithRules } = require('shakapacker')" ) gsub_file( 'config/webpack/webpack.config.js', 'const webpackConfig = generateWebpackConfig()', <<~JS const webpackConfig = merge( generateWebpackConfig({ resolve: { extensions: ['.css'] } }), require('pageflow/config/webpack5'), require('pageflow-scrolled/config/webpack') ) JS ) gsub_file( 'config/webpack/webpack.config.js', 'module.exports = webpackConfig', <<~JS // Extend file rule to include mp3 extension module.exports = mergeWithRules({ module: { rules: { test: 'replace', type: 'match' }, }, })(webpackConfig, { module: { rules: [ { test: /\.(bmp|gif|jpe?g|png|tiff|ico|avif|webp|eot|otf|ttf|woff|woff2|svg|mp3)$/, type: 'asset/resource' } ] } }) JS ) end def postcss_config create_file 'postcss.config.js', <<~JS module.exports = { plugins: [ require('postcss-import'), // Make relative urls in fontsource packages work require('postcss-url')({url: 'rebase'}), require('postcss-flexbugs-fixes'), require('postcss-preset-env')({ autoprefixer: { flexbox: 'no-2009' }, stage: 3 }) ] } JS end def editor_pack create_file 'app/javascript/packs/pageflow-scrolled-editor.js', <<-JS import 'pageflow-scrolled/editor'; import 'pageflow-scrolled/contentElements-editor'; import 'pageflow-scrolled/contentElements-frontend'; JS end def frontend_pack create_file 'app/javascript/packs/pageflow-scrolled-frontend.js', <<-JS import 'pageflow-scrolled/frontend/index.css'; import 'pageflow-scrolled/contentElements-frontend.css'; import 'pageflow-scrolled/frontend'; import 'pageflow-scrolled/contentElements-frontend'; require.context('../pageflow-scrolled/themes', true); JS end def server_pack create_file 'app/javascript/packs/pageflow-scrolled-server.js', <<-JS import 'pageflow-scrolled/frontend-server'; import 'pageflow-scrolled/contentElements-frontend'; import 'pageflow-scrolled/widgets-server'; JS end def default_font_pack create_file 'app/javascript/packs/fonts/sourceSansPro.css', <<-CSS @import "@fontsource/source-sans-pro/400.css"; @import "@fontsource/source-sans-pro/700.css"; CSS end def default_theme theme_dir = 'app/javascript/pageflow-scrolled/themes/default' icons_src_dir = PageflowScrolled::Engine.root.join('package/src/frontend/icons') directory 'theme', theme_dir CUSTOM_THEME_ICONS.each do |icon| copy_file icons_src_dir.join("#{icon}.svg"), File.join(theme_dir, "icons/#{icon}.svg") end end end end end