mirror of
https://github.com/discourse/discourse.git
synced 2024-12-15 08:28:34 +08:00
30990006a9
This reduces chances of errors where consumers of strings mutate inputs and reduces memory usage of the app. Test suite passes now, but there may be some stuff left, so we will run a few sites on a branch prior to merging
79 lines
2.2 KiB
Ruby
79 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# barber patches to re-route raw compilation via ember compat handlebars
|
|
|
|
class Barber::Precompiler
|
|
def sources
|
|
[File.open("#{Rails.root}/vendor/assets/javascripts/handlebars.js"),
|
|
precompiler]
|
|
end
|
|
|
|
def precompiler
|
|
if !@precompiler
|
|
|
|
source = File.read("#{Rails.root}/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6")
|
|
template = Tilt::ES6ModuleTranspilerTemplate.new {}
|
|
transpiled = template.babel_transpile(source)
|
|
|
|
# very hacky but lets us use ES6. I'm ashamed of this code -RW
|
|
transpiled = transpiled[0...transpiled.index('export ')]
|
|
|
|
@precompiler = StringIO.new <<END
|
|
var __RawHandlebars;
|
|
(function() {
|
|
#{transpiled};
|
|
__RawHandlebars = RawHandlebars;
|
|
})();
|
|
|
|
Barber = {
|
|
precompile: function(string) {
|
|
return __RawHandlebars.precompile(string, false).toString();
|
|
}
|
|
};
|
|
END
|
|
end
|
|
|
|
@precompiler
|
|
end
|
|
end
|
|
|
|
module Discourse
|
|
module Ember
|
|
module Handlebars
|
|
module Helper
|
|
def precompile_handlebars(string)
|
|
"requirejs('discourse-common/lib/raw-handlebars').template(#{Barber::Precompiler.compile(string)});"
|
|
end
|
|
|
|
def compile_handlebars(string)
|
|
"requirejs('discourse-common/lib/raw-handlebars').compile(#{indent(string).inspect});"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
class Ember::Handlebars::Template
|
|
include Discourse::Ember::Handlebars::Helper
|
|
|
|
def precompile_handlebars(string, input = nil)
|
|
"requirejs('discourse-common/lib/raw-handlebars').template(#{Barber::Precompiler.compile(string)});"
|
|
end
|
|
|
|
def compile_handlebars(string, input = nil)
|
|
"requirejs('discourse-common/lib/raw-handlebars').compile(#{indent(string).inspect});"
|
|
end
|
|
|
|
def global_template_target(namespace, module_name, config)
|
|
"#{namespace}[#{template_path(module_name, config).inspect}]"
|
|
end
|
|
|
|
# FIXME: Previously, ember-handlebars-templates uses the logical path which incorrectly
|
|
# returned paths with the `.raw` extension and our code is depending on the `.raw`
|
|
# to find the right template to use.
|
|
def actual_name(input)
|
|
actual_name = input[:name]
|
|
input[:filename].include?('.raw') ? "#{actual_name}.raw" : actual_name
|
|
end
|
|
end
|