diff --git a/app/helpers/preview_helper.rb b/app/helpers/preview_helper.rb index 0485b4775..222334985 100644 --- a/app/helpers/preview_helper.rb +++ b/app/helpers/preview_helper.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module PreviewHelper + include ActionView::Helpers::AssetUrlHelper if Rails.version.to_f < 6.1 + AVAILABLE_PRISM_LANGUAGES = %w[ruby erb haml] FALLBACK_LANGUAGE = "ruby" @@ -10,6 +12,14 @@ def preview_source render "preview_source" end + def prism_css_source_url + serve_static_preview_assets? ? asset_path("prism.css", skip_pipeline: true) : "https://cdn.jsdelivr.net/npm/prismjs@1.28.0/themes/prism.min.css" + end + + def prism_js_source_url + serve_static_preview_assets? ? asset_path("prism.min.js", skip_pipeline: true) : "https://cdn.jsdelivr.net/npm/prismjs@1.28.0/prism.min.js" + end + def find_template_data(lookup_context:, template_identifier:) template = lookup_context.find_template(template_identifier) @@ -62,4 +72,8 @@ def prism_language_name_by_template_path(template_file_path:) language end + + def serve_static_preview_assets? + ViewComponent::Base.config.show_previews && Rails.application.config.public_file_server.enabled + end end diff --git a/app/views/view_components/_preview_source.html.erb b/app/views/view_components/_preview_source.html.erb index f1259f291..606b8ac80 100644 --- a/app/views/view_components/_preview_source.html.erb +++ b/app/views/view_components/_preview_source.html.erb @@ -1,4 +1,4 @@ - +

Source:

@@ -14,4 +14,4 @@
     <% end %>
   
- + diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ffd121035..b66e6ec70 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,11 @@ nav_order: 5 ## main +* Don't add ActionDispatch::Static middleware unless `public_file_server.enabled`. + + *Daniel Gonzalez* + *Reegan Viljoen* + * Resolve an issue where slots starting with `call` would cause a `NameError` *Blake Williams* diff --git a/docs/index.md b/docs/index.md index b20009efd..24f750a5c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -204,6 +204,7 @@ ViewComponent is built by over a hundred members of the community, including: xronos-i-am yykamei matheuspolicamilo +danigonza erinnachen ihollander svetlins diff --git a/lib/view_component/engine.rb b/lib/view_component/engine.rb index 7c3740bce..47618fe26 100644 --- a/lib/view_component/engine.rb +++ b/lib/view_component/engine.rb @@ -110,11 +110,15 @@ class Engine < Rails::Engine # :nodoc: end initializer "static assets" do |app| - if app.config.view_component.show_previews + if serve_static_preview_assets?(app.config) app.middleware.use(::ActionDispatch::Static, "#{root}/app/assets/vendor") end end + def serve_static_preview_assets?(app_config) + app_config.view_component.show_previews && app_config.public_file_server.enabled + end + initializer "compiler mode" do |_app| ViewComponent::Compiler.mode = if Rails.env.development? || Rails.env.test? ViewComponent::Compiler::DEVELOPMENT_MODE diff --git a/test/sandbox/test/preview_helper_test.rb b/test/sandbox/test/preview_helper_test.rb index 108a8a71d..5921a525d 100644 --- a/test/sandbox/test/preview_helper_test.rb +++ b/test/sandbox/test/preview_helper_test.rb @@ -155,5 +155,37 @@ def test_raises_with_conflict_in_template_resolution assert_equal("Found multiple templates for #{template_identifier}.", exception.message) end end + + def test_prism_css_source_url_with_asset_pipeline + Rails.application.config.public_file_server.stub(:enabled, true) do + if Rails.version.to_f >= 6.1 + assert_equal "/assets/prism.css", PreviewHelper.prism_css_source_url + else + assert_equal "/prism.css", PreviewHelper.prism_css_source_url + end + end + end + + def test_prism_css_source_url_with_no_asset_pipeline + Rails.application.config.public_file_server.stub(:enabled, false) do + assert_equal "https://cdn.jsdelivr.net/npm/prismjs@1.28.0/themes/prism.min.css", PreviewHelper.prism_css_source_url + end + end + + def test_prism_js_source_with_asset_pipeline + Rails.application.config.public_file_server.stub(:enabled, true) do + if Rails.version.to_f >= 6.1 + assert_equal "/assets/prism.min.js", PreviewHelper.prism_js_source_url + else + assert_equal "/prism.min.js", PreviewHelper.prism_js_source_url + end + end + end + + def test_prism_js_source_url_with_no_asset_pipeline + Rails.application.config.public_file_server.stub(:enabled, false) do + assert_equal "https://cdn.jsdelivr.net/npm/prismjs@1.28.0/prism.min.js", PreviewHelper.prism_js_source_url + end + end end end diff --git a/test/view_component/engine_test.rb b/test/view_component/engine_test.rb new file mode 100644 index 000000000..5c5c03726 --- /dev/null +++ b/test/view_component/engine_test.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "test_helper" + +class ViewComponent::EngineTest < ActionDispatch::IntegrationTest + def test_serve_static_previews? + app.config.public_file_server.enabled = false + refute ViewComponent::Engine.instance.serve_static_preview_assets?(app.config) + end +end