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:
+
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