mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 09:42:07 +08:00
ac896755bb
Previously, the app HTML served by the Ember-CLI proxy was generated based on a 'bootstrap json' payload generated by Rails. This inevitably leads to differences between the Rails HTML and the Ember-CLI HTML. This commit overhauls our proxying strategy. Now, we totally ignore the ember-cli `index.html` file. Instead, we take the full HTML from Rails and surgically replace script URLs based on a `data-discourse-entrypoint` attribute. This should be faster (only one request to Rails), more robust, and less confusing for developers.
76 lines
2.0 KiB
Ruby
76 lines
2.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class EmberCli < ActiveSupport::CurrentAttributes
|
|
# Cache which persists for the duration of a request
|
|
attribute :request_cache
|
|
|
|
def self.dist_dir
|
|
"#{Rails.root}/app/assets/javascripts/discourse/dist"
|
|
end
|
|
|
|
def self.assets
|
|
cache[:assets] ||= Dir.glob("**/*.{js,map,txt}", base: "#{dist_dir}/assets")
|
|
end
|
|
|
|
def self.script_chunks
|
|
return cache[:script_chunks] if cache[:script_chunks]
|
|
|
|
chunk_infos = JSON.parse(File.read("#{dist_dir}/assets.json"))
|
|
|
|
chunk_infos.transform_keys! { |key| key.delete_prefix("assets/").delete_suffix(".js") }
|
|
|
|
chunk_infos.transform_values! do |value|
|
|
value["assets"].map { |chunk| chunk.delete_prefix("assets/").delete_suffix(".js") }
|
|
end
|
|
|
|
# Special case - vendor.js is fingerprinted by Embroider in production, but not run through Webpack
|
|
if !assets.include?("vendor.js") &&
|
|
fingerprinted = assets.find { |a| a.match?(/^vendor\..*\.js$/) }
|
|
chunk_infos["vendor"] = [fingerprinted.delete_suffix(".js")]
|
|
end
|
|
|
|
cache[:script_chunks] = chunk_infos
|
|
rescue Errno::ENOENT
|
|
{}
|
|
end
|
|
|
|
def self.is_ember_cli_asset?(name)
|
|
assets.include?(name) || script_chunks.values.flatten.include?(name.delete_suffix(".js"))
|
|
end
|
|
|
|
def self.ember_version
|
|
@version ||=
|
|
begin
|
|
ember_source_package_raw =
|
|
File.read("#{Rails.root}/app/assets/javascripts/node_modules/ember-source/package.json")
|
|
JSON.parse(ember_source_package_raw)["version"]
|
|
end
|
|
end
|
|
|
|
def self.workbox_dir_name
|
|
return @workbox_base_dir if defined?(@workbox_base_dir)
|
|
|
|
@workbox_base_dir =
|
|
if (full_path = Dir.glob("app/assets/javascripts/discourse/dist/assets/workbox-*")[0])
|
|
File.basename(full_path)
|
|
end
|
|
end
|
|
|
|
def self.has_tests?
|
|
File.exist?("#{dist_dir}/tests/index.html")
|
|
end
|
|
|
|
def self.cache
|
|
if Rails.env.development?
|
|
self.request_cache ||= {}
|
|
else
|
|
@production_cache ||= {}
|
|
end
|
|
end
|
|
|
|
def self.clear_cache!
|
|
self.request.cache = nil
|
|
@production_cache = nil
|
|
end
|
|
end
|