This repository has been archived by the owner on Mar 23, 2024. It is now read-only.
/
requirejs_helper.rb
99 lines (81 loc) · 2.65 KB
/
requirejs_helper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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)
end
data.merge!(yield controller) if block_given?
end.map do |k, v|
%Q{data-#{k}="#{v}"}
end.join(" ")
end
def _data_main(name)
if name
name += ".js" unless name =~ /\.js$/
%Q{data-main="#{_javascript_path(name)}"}
else
""
end
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$/,'' }
# Add paths for assets specified by full URL (on a CDN)
run_config['paths'].each { |k,v| paths[k] = v if v =~ /^https?:/ }
# Override user paths, whose mappings are only relevant in dev mode
# and in the build_config.
run_config['paths'] = paths
end
html.concat <<-HTML
<script>var require = #{run_config.to_json};</script>
HTML
end
html.concat <<-HTML
<script #{_requirejs_data(name, &block)} src="#{_javascript_path 'require.js'}"></script>
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)
"<script src='#{_javascript_path name}'></script>\n".html_safe
end
def _javascript_path(name)
if defined?(javascript_path)
javascript_path(name)
else
"/assets/#{name}"
end
end
end