require 'requirejs/error'
module RequirejsHelper
# EXPERIMENTAL: Additional priority settings appended to
# any user-specified priority setting by requirejs_include_tag.
# Used for JS test suite integration.
mattr_accessor :_priority
@@_priority = []
def _requirejs_data(name, &block)
{}.tap do |data|
if name
name += ".js" unless name =~ /\.js$/
data['main'] = _javascript_path(name).
sub(/\.js$/,'').
sub(base_url(name), '').
sub(/\A\//, '')
end
data.merge!(yield controller) if block_given?
end.map do |k, v|
%Q{data-#{k}="#{v}"}
end.join(" ")
end
def requirejs_include_tag(name=nil, &block)
requirejs = Rails.application.config.requirejs
if requirejs.loader == :almond
name = requirejs.module_name_for(requirejs.build_config['modules'][0])
return _almond_include_tag(name, &block)
end
html = ""
_once_guard do
unless requirejs.run_config.empty?
run_config = requirejs.run_config.dup
unless _priority.empty?
run_config = run_config.dup
run_config[:priority] ||= []
run_config[:priority].concat _priority
end
if Rails.application.config.assets.digest
modules = requirejs.build_config['modules'].map { |m| requirejs.module_name_for m }
# Generate digestified paths from the modules spec
paths = {}
modules.each { |m| paths[m] = _javascript_path(m).sub /\.js$/,'' }
if run_config.has_key? 'paths'
# Add paths for assets specified by full URL (on a CDN)
run_config['paths'].each { |k,v| paths[k] = v if v =~ /^https?:/ }
end
# Override user paths, whose mappings are only relevant in dev mode
# and in the build_config.
run_config['paths'] = paths
end
run_config['baseUrl'] = base_url(name)
html.concat <<-HTML
HTML
end
html.concat <<-HTML
HTML
html.html_safe
end
end
def _once_guard
if defined?(controller) && controller.requirejs_included
raise Requirejs::MultipleIncludeError, "Only one requirejs_include_tag allowed per page."
end
retval = yield
controller.requirejs_included = true if defined?(controller)
retval
end
def _almond_include_tag(name, &block)
"\n".html_safe
end
def _javascript_path(name)
if defined?(javascript_path)
javascript_path(name)
else
"/assets/#{name}"
end
end
def base_url(js_asset)
js_asset_path = javascript_path(js_asset)
uri = URI.parse(js_asset_path)
asset_host = uri.host && js_asset_path.sub(uri.request_uri, '')
[asset_host, Rails.application.config.relative_url_root, Rails.application.config.assets.prefix].join
end
end