diff --git a/Gemfile b/Gemfile index 2766c3feadc..c66a3f25542 100644 --- a/Gemfile +++ b/Gemfile @@ -31,7 +31,9 @@ end gem 'json' -gem 'sprockets' +# TODO: At the moment Discourse does not work with Sprockets 4, we would need to correct internals +# This is a desired upgrade we should get to. +gem 'sprockets', '3.7.2' # this will eventually be added to rails, # allows us to precompile all our templates in the unicorn master diff --git a/Gemfile.lock b/Gemfile.lock index b18689e9519..7c85ccfa6be 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -443,7 +443,7 @@ GEM simplecov_json_formatter (~> 0.1) simplecov-html (0.12.3) simplecov_json_formatter (0.1.4) - sprockets (4.0.3) + sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.4.2) @@ -602,7 +602,7 @@ DEPENDENCIES shoulda-matchers sidekiq simplecov - sprockets + sprockets (= 3.7.2) sprockets-rails sshkey stackprof diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js deleted file mode 100644 index ac907b36776..00000000000 --- a/app/assets/config/manifest.js +++ /dev/null @@ -1 +0,0 @@ -//= link_tree ../images diff --git a/config/application.rb b/config/application.rb index fe08749c862..1bd7ba921ec 100644 --- a/config/application.rb +++ b/config/application.rb @@ -142,12 +142,11 @@ module Discourse config.assets.skip_minification = [] # explicitly precompile any images in plugins ( /assets/images ) path - Dir.glob("#{config.root}/plugins/*/assets/images/**/*").each do |filename| - config.assets.precompile << filename if !%w(.js .css).include?(File.extname(filename)) - end + config.assets.precompile += [lambda do |filename, path| + path =~ /assets\/images/ && !%w(.js .css).include?(File.extname(filename)) + end] config.assets.precompile += %w{ - application.js vendor.js admin.js browser-detect.js @@ -194,6 +193,25 @@ module Discourse end end + # out of the box sprockets 3 grabs loose files that are hanging in assets, + # the exclusion list does not include hbs so you double compile all this stuff + initializer :fix_sprockets_loose_file_searcher, after: :set_default_precompile do |app| + app.config.assets.precompile.delete(Sprockets::Railtie::LOOSE_APP_ASSETS) + + # We don't want application from node_modules, only from the root + app.config.assets.precompile.delete(/(?:\/|\\|\A)application\.(css|js)$/) + app.config.assets.precompile += ['application.js'] + + start_path = ::Rails.root.join("app/assets").to_s + exclude = ['.es6', '.hbs', '.hbr', '.js', '.css', '.lock', '.json', '.log', '.html', ''] + app.config.assets.precompile << lambda do |logical_path, filename| + filename.start_with?(start_path) && + !filename.include?("/node_modules/") && + !filename.include?("/dist/") && + !exclude.include?(File.extname(logical_path)) + end + end + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. config.time_zone = 'UTC' @@ -272,11 +290,6 @@ module Discourse Sprockets.register_mime_type 'application/javascript', extensions: ['.js', '.es6', '.js.es6'], charset: :unicode Sprockets.register_postprocessor 'application/javascript', DiscourseJsProcessor - # This class doesn't exist in Sprockets 4, but ember-rails tries to 'autoload' it - # Define an empty class to prevent an error - class Sprockets::Engines - end - require 'discourse_redis' require 'logster/redis_store' # Use redis for our cache diff --git a/lib/freedom_patches/ember_sprockets_4.rb b/lib/freedom_patches/ember_sprockets_4.rb deleted file mode 100644 index fdfe5c0a748..00000000000 --- a/lib/freedom_patches/ember_sprockets_4.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -# One of the initializers in `discourse-ember-rails/lib/ember_rails.rb` tries to set -# the ember template compiler path based on a call to `Sprockets::Environment#resolve` -# which started returning an array in Sprockets 4. -# This doesn't seem to be needed - it was setting to the existing value, so we can just ignore it. -Ember::Handlebars::Template.singleton_class.prepend(Module.new do - def setup_ember_template_compiler(path) - return if path.is_a? Array - super - end -end)