mirror of
https://github.com/discourse/discourse.git
synced 2026-08-12 05:55:39 -05:00
Update sprockets. (#4167)
* Update sass-rails. * FIX: Tilt dependency has been removed from Ember::Handlebars::Template. * Update `DiscourseIIFE` to new Sprockets API. * `Rails.application.assets` returns `nil` in production. * Move sprockets-rails out of the assets group. * Pin ember-rails to 0.18.5 which works with Sprockets 3.x. * Update sprockets to 3.6.0. * Make `DiscourseSassCompiler` work with Sprockets 3. * Use `Sass::Rails::SassImporterGlobbing` instead of haxxing our own. * Moneky patch so that we don't add dependencies for our custom css. * FIX: Missing class. * Upgrade ember-handlebars-template. * FIX: require path needs to share the same root as the folder's path. * Bump discourse-qunit-rails. * Update ember-template-compiler.js to 1.12.2. * `prepend` is private in Ruby 2.0.0.
This commit is contained in:
@@ -20,7 +20,7 @@ class DiscourseSafeSassImporter < DiscourseSassImporter
|
||||
special_imports[name].each do |css_file|
|
||||
contents << File.read(css_file)
|
||||
end
|
||||
Sass::Engine.new(contents, options.merge(
|
||||
::Sass::Engine.new(contents, options.merge(
|
||||
filename: "#{name}.scss",
|
||||
importer: self,
|
||||
syntax: :scss
|
||||
|
||||
@@ -39,17 +39,17 @@ class DiscourseSassCompiler
|
||||
# Options:
|
||||
# safe: (boolean) if true, theme and plugin stylesheets will not be included. Default is false.
|
||||
def compile(opts={})
|
||||
env = Rails.application.assets
|
||||
|
||||
# In production Rails.application.assets is a Sprockets::Index
|
||||
# instead of Sprockets::Environment, there is no cleaner way
|
||||
# to get the environment from the index.
|
||||
if env.is_a?(Sprockets::Index)
|
||||
env = env.instance_variable_get('@environment')
|
||||
end
|
||||
app = Rails.application
|
||||
env = app.assets || Sprockets::Railtie.build_environment(app)
|
||||
|
||||
pathname = Pathname.new("app/assets/stylesheets/#{@target}.scss")
|
||||
context = env.context_class.new(env, "#{@target}.scss", pathname)
|
||||
|
||||
context = env.context_class.new(
|
||||
environment: env,
|
||||
filename: "#{@target}.scss",
|
||||
pathname: pathname,
|
||||
metadata: {}
|
||||
)
|
||||
|
||||
debug_opts = Rails.env.production? ? {} : {
|
||||
line_numbers: true,
|
||||
@@ -57,12 +57,15 @@ class DiscourseSassCompiler
|
||||
style: :expanded
|
||||
}
|
||||
|
||||
importer_class = opts[:safe] ? DiscourseSafeSassImporter : DiscourseSassImporter
|
||||
|
||||
css = ::Sass::Engine.new(@scss, {
|
||||
syntax: :scss,
|
||||
cache: false,
|
||||
read_cache: false,
|
||||
style: :compressed,
|
||||
filesystem_importer: opts[:safe] ? DiscourseSafeSassImporter : DiscourseSassImporter,
|
||||
filesystem_importer: importer_class,
|
||||
load_paths: context.environment.paths.map { |path| importer_class.new(path.to_s) },
|
||||
sprockets: {
|
||||
context: context,
|
||||
environment: context.environment
|
||||
|
||||
@@ -2,156 +2,118 @@
|
||||
# Sprockets::SassImporter implementation provided in sass-rails since that is used
|
||||
# during asset precompilation.
|
||||
class DiscourseSassImporter < Sass::Importers::Filesystem
|
||||
GLOB = /\*|\[.+\]/ unless defined? GLOB
|
||||
module Sass
|
||||
def extensions
|
||||
{
|
||||
'css' => :scss,
|
||||
'css.scss' => :scss,
|
||||
'css.sass' => :sass,
|
||||
'css.erb' => :scss,
|
||||
'scss.erb' => :scss,
|
||||
'sass.erb' => :sass,
|
||||
'css.scss.erb' => :scss,
|
||||
'css.sass.erb' => :sass
|
||||
}.merge!(super)
|
||||
end
|
||||
|
||||
# Depending upon where this is passed we might either be passed a string as the
|
||||
# first argument or a sprockets context. If the first argument is a sprockets
|
||||
# context we store it and use it to mark dependencies.
|
||||
def initialize(*args)
|
||||
@context = args.first unless args.first.is_a? String
|
||||
@root = Rails.root.join('app', 'assets', 'stylesheets').to_s
|
||||
@same_name_warnings = Set.new
|
||||
end
|
||||
def special_imports
|
||||
{
|
||||
"plugins" => DiscoursePluginRegistry.stylesheets,
|
||||
"plugins_mobile" => DiscoursePluginRegistry.mobile_stylesheets,
|
||||
"plugins_desktop" => DiscoursePluginRegistry.desktop_stylesheets,
|
||||
"plugins_variables" => DiscoursePluginRegistry.sass_variables,
|
||||
"theme_variables" => [ColorScheme::BASE_COLORS_FILE],
|
||||
"category_backgrounds" => Proc.new { |c| "body.category-#{c.full_slug} { background-image: url(#{apply_cdn(c.background_url)}) }\n" }
|
||||
}
|
||||
end
|
||||
|
||||
def extensions
|
||||
{
|
||||
'css' => :scss,
|
||||
'css.scss' => :scss,
|
||||
'css.sass' => :sass,
|
||||
'css.erb' => :scss,
|
||||
'scss.erb' => :scss,
|
||||
'sass.erb' => :sass,
|
||||
'css.scss.erb' => :scss,
|
||||
'css.sass.erb' => :sass
|
||||
}.merge!(super)
|
||||
end
|
||||
|
||||
def special_imports
|
||||
{
|
||||
"plugins" => DiscoursePluginRegistry.stylesheets,
|
||||
"plugins_mobile" => DiscoursePluginRegistry.mobile_stylesheets,
|
||||
"plugins_desktop" => DiscoursePluginRegistry.desktop_stylesheets,
|
||||
"plugins_variables" => DiscoursePluginRegistry.sass_variables,
|
||||
"theme_variables" => [ColorScheme::BASE_COLORS_FILE]
|
||||
}
|
||||
end
|
||||
|
||||
def find_relative(name, base, options)
|
||||
if name =~ GLOB
|
||||
glob_imports(name, Pathname.new(base), options)
|
||||
else
|
||||
def find_relative(name, base, options)
|
||||
engine_from_path(name, File.dirname(base), options)
|
||||
end
|
||||
end
|
||||
|
||||
def apply_cdn(url)
|
||||
"#{GlobalSetting.cdn_url}#{url}"
|
||||
end
|
||||
|
||||
def find(name, options)
|
||||
|
||||
if name == "category_backgrounds"
|
||||
contents = ""
|
||||
Category.where('background_url IS NOT NULL').each do |c|
|
||||
if c.background_url.present?
|
||||
contents << "body.category-#{c.full_slug} { background-image: url(#{apply_cdn(c.background_url)}) }\n"
|
||||
end
|
||||
end
|
||||
return Sass::Engine.new(contents, options.merge(
|
||||
filename: "#{name}.scss",
|
||||
importer: self,
|
||||
syntax: :scss
|
||||
))
|
||||
def apply_cdn(url)
|
||||
"#{GlobalSetting.cdn_url}#{url}"
|
||||
end
|
||||
|
||||
if special_imports.has_key? name
|
||||
if name == "theme_variables"
|
||||
def find(name, options)
|
||||
|
||||
if name == "category_backgrounds"
|
||||
contents = ""
|
||||
if color_scheme = ColorScheme.enabled
|
||||
ColorScheme.base_colors.each do |n, base_hex|
|
||||
override = color_scheme.colors_by_name[n]
|
||||
contents << "$#{n}: ##{override ? override.hex : base_hex} !default;\n"
|
||||
end
|
||||
else
|
||||
special_imports[name].each do |css_file|
|
||||
contents << File.read(css_file)
|
||||
end
|
||||
Category.where('background_url IS NOT NULL').each do |c|
|
||||
contents << special_imports[name].call(c) if c.background_url.present?
|
||||
end
|
||||
|
||||
Sass::Engine.new(contents, options.merge(
|
||||
return ::Sass::Engine.new(contents, options.merge(
|
||||
filename: "#{name}.scss",
|
||||
importer: self,
|
||||
syntax: :scss
|
||||
))
|
||||
else
|
||||
stylesheets = special_imports[name]
|
||||
contents = ""
|
||||
stylesheets.each do |css_file|
|
||||
if css_file =~ /\.scss$/
|
||||
contents << "@import '#{css_file}';"
|
||||
end
|
||||
|
||||
if special_imports.has_key? name
|
||||
if name == "theme_variables"
|
||||
contents = ""
|
||||
if color_scheme = ColorScheme.enabled
|
||||
ColorScheme.base_colors.each do |n, base_hex|
|
||||
override = color_scheme.colors_by_name[n]
|
||||
contents << "$#{n}: ##{override ? override.hex : base_hex} !default;\n"
|
||||
end
|
||||
else
|
||||
contents << File.read(css_file)
|
||||
special_imports[name].each do |css_file|
|
||||
contents << File.read(css_file)
|
||||
end
|
||||
end
|
||||
depend_on(css_file)
|
||||
|
||||
::Sass::Engine.new(contents, options.merge(
|
||||
filename: "#{name}.scss",
|
||||
importer: self,
|
||||
syntax: :scss
|
||||
))
|
||||
else
|
||||
stylesheets = special_imports[name]
|
||||
contents = ""
|
||||
stylesheets.each do |css_file|
|
||||
if css_file =~ /\.scss$/
|
||||
contents << "@import '#{css_file}';"
|
||||
else
|
||||
contents << File.read(css_file)
|
||||
end
|
||||
depend_on(css_file)
|
||||
end
|
||||
|
||||
::Sass::Engine.new(contents, options.merge(
|
||||
filename: "#{name}.scss",
|
||||
importer: self,
|
||||
syntax: :scss
|
||||
))
|
||||
end
|
||||
Sass::Engine.new(contents, options.merge(
|
||||
filename: "#{name}.scss",
|
||||
importer: self,
|
||||
syntax: :scss
|
||||
))
|
||||
end
|
||||
elsif name =~ GLOB
|
||||
nil # globs must be relative
|
||||
else
|
||||
engine_from_path(name, root, options)
|
||||
end
|
||||
end
|
||||
|
||||
def each_globbed_file(glob, base_pathname, options)
|
||||
Dir["#{base_pathname}/#{glob}"].sort.each do |filename|
|
||||
next if filename == options[:filename]
|
||||
yield filename # assume all matching files are requirable
|
||||
end
|
||||
end
|
||||
|
||||
def glob_imports(glob, base_pathname, options)
|
||||
contents = ""
|
||||
each_globbed_file(glob, base_pathname.dirname, options) do |filename|
|
||||
depend_on(filename)
|
||||
unless File.directory?(filename)
|
||||
contents << "@import #{Pathname.new(filename).relative_path_from(base_pathname.dirname).to_s.inspect};\n"
|
||||
end
|
||||
end
|
||||
return nil if contents.empty?
|
||||
Sass::Engine.new(contents, options.merge(
|
||||
filename: base_pathname.to_s,
|
||||
importer: self,
|
||||
syntax: :scss
|
||||
))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def depend_on(filename)
|
||||
if @context
|
||||
@context.depend_on(filename)
|
||||
@context.depend_on(globbed_file_parent(filename))
|
||||
end
|
||||
end
|
||||
|
||||
def globbed_file_parent(filename)
|
||||
if File.directory?(filename)
|
||||
File.expand_path('..', filename)
|
||||
else
|
||||
File.dirname(filename)
|
||||
engine_from_path(name, root, options)
|
||||
end
|
||||
end
|
||||
|
||||
def engine_from_path(name, dir, options)
|
||||
full_filename, _ = Sass::Util.destructure(find_real_file(dir, name, options))
|
||||
return unless full_filename && File.readable?(full_filename)
|
||||
private
|
||||
|
||||
depend_on(full_filename)
|
||||
Sass::Engine.for_file(full_filename, options)
|
||||
end
|
||||
def depend_on(filename)
|
||||
if @context
|
||||
@context.depend_on(filename)
|
||||
@context.depend_on(globbed_file_parent(filename))
|
||||
end
|
||||
end
|
||||
|
||||
def engine_from_path(name, dir, options)
|
||||
full_filename, _ = ::Sass::Util.destructure(find_real_file(dir, name, options))
|
||||
return unless full_filename && File.readable?(full_filename)
|
||||
|
||||
depend_on(full_filename)
|
||||
::Sass::Engine.for_file(full_filename, options)
|
||||
end
|
||||
end
|
||||
|
||||
include Sass
|
||||
include ::Sass::Rails::SassImporter::Globbing
|
||||
|
||||
def self.special_imports
|
||||
self.new('').special_imports
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user