requirejs-rails 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +77 -62
- data/app/helpers/requirejs_helper.rb +17 -4
- data/bin/r.js +2232 -1223
- data/lib/requirejs-rails.rb +1 -1
- data/lib/requirejs/rails.rb +1 -1
- data/lib/requirejs/rails/builder.rb +16 -24
- data/lib/requirejs/rails/config.rb +86 -73
- data/lib/requirejs/rails/engine.rb +3 -3
- data/lib/requirejs/rails/version.rb +2 -2
- data/lib/requirejs/rails/view_proxy.rb +9 -0
- data/lib/tasks/requirejs-rails_tasks.rake +34 -25
- data/test/requirejs-rails_test.rb +9 -5
- data/vendor/assets/javascripts/almond.js +9 -8
- data/vendor/assets/javascripts/require.js +10 -3
- metadata +4 -4
data/lib/requirejs-rails.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require "requirejs/rails"
|
data/lib/requirejs/rails.rb
CHANGED
@@ -1,32 +1,24 @@
|
|
1
|
-
require
|
1
|
+
require "ostruct"
|
2
|
+
require "pathname"
|
2
3
|
|
3
|
-
require
|
4
|
-
require 'ostruct'
|
4
|
+
require "requirejs/rails"
|
5
5
|
|
6
|
-
module Requirejs
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
def build
|
15
|
-
@config.tmp_dir
|
16
|
-
end
|
6
|
+
module Requirejs
|
7
|
+
module Rails
|
8
|
+
class Builder
|
9
|
+
def initialize(config)
|
10
|
+
@config = config
|
11
|
+
end
|
17
12
|
|
18
|
-
|
19
|
-
|
20
|
-
Rails.application.assets.file_digest(path).hexdigest
|
21
|
-
else
|
22
|
-
raise Requirejs::BuildError, "Cannot compute digest for missing asset: #{path}"
|
13
|
+
def build
|
14
|
+
@config.tmp_dir
|
23
15
|
end
|
24
|
-
end
|
25
16
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
17
|
+
def generate_rjs_driver
|
18
|
+
templ = Erubis::Eruby.new(@config.driver_template_path.read)
|
19
|
+
@config.driver_path.open('w') do |f|
|
20
|
+
f.write(templ.result(@config.get_binding))
|
21
|
+
end
|
30
22
|
end
|
31
23
|
end
|
32
24
|
end
|
@@ -1,35 +1,47 @@
|
|
1
|
-
require
|
2
|
-
require 'requirejs/error'
|
1
|
+
require "pathname"
|
3
2
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require 'pathname'
|
3
|
+
require "active_support/ordered_options"
|
4
|
+
require "erubis"
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
LOADERS = [ :requirejs, :almond ]
|
6
|
+
require "requirejs/error"
|
7
|
+
require "requirejs/rails"
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
module Requirejs
|
10
|
+
module Rails
|
11
|
+
class Config < ::ActiveSupport::OrderedOptions
|
12
|
+
LOADERS = [:requirejs, :almond]
|
15
13
|
|
16
|
-
|
17
|
-
self.tmp_dir = application.root + 'tmp'
|
18
|
-
self.bin_dir = Pathname.new(__FILE__+'/../../../../bin').cleanpath
|
14
|
+
BOWER_PATH_PATTERN = Regexp.new("\\A(.*)/(?:\\.bower|bower|component)\\.json\\z")
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
LOGICAL_PATH_PATTERNS = [
|
17
|
+
Regexp.new("\\.html\\z"),
|
18
|
+
Regexp.new("\\.js\\z"),
|
19
|
+
Regexp.new("\\.txt\\z"),
|
20
|
+
BOWER_PATH_PATTERN
|
21
|
+
]
|
24
22
|
|
25
|
-
|
23
|
+
def initialize(application)
|
24
|
+
super
|
26
25
|
|
27
|
-
|
28
|
-
|
26
|
+
self.manifest = nil
|
27
|
+
self.logical_path_patterns = LOGICAL_PATH_PATTERNS
|
29
28
|
|
30
|
-
|
29
|
+
self.tmp_dir = application.root + 'tmp'
|
30
|
+
self.bin_dir = Pathname.new(__FILE__+'/../../../../bin').cleanpath
|
31
31
|
|
32
|
-
|
32
|
+
self.source_dir = self.tmp_dir.join("requirejs/src")
|
33
|
+
self.build_dir = self.tmp_dir.join("requirejs/dst")
|
34
|
+
self.target_dir = application.root + 'public/assets'
|
35
|
+
self.rjs_path = self.bin_dir+'r.js'
|
36
|
+
|
37
|
+
self.loader = :requirejs
|
38
|
+
|
39
|
+
self.driver_template_path = Pathname.new(__FILE__+'/../rjs_driver.js.erb').cleanpath
|
40
|
+
self.driver_path = self.tmp_dir.join("requirejs/rjs_driver.js")
|
41
|
+
|
42
|
+
self.user_config = {}
|
43
|
+
|
44
|
+
self.run_config_whitelist = %w{
|
33
45
|
baseUrl
|
34
46
|
callback
|
35
47
|
catchError
|
@@ -49,7 +61,7 @@ module Requirejs::Rails
|
|
49
61
|
xhtml
|
50
62
|
}
|
51
63
|
|
52
|
-
|
64
|
+
self.build_config_whitelist = %w{
|
53
65
|
appDir
|
54
66
|
baseUrl
|
55
67
|
closure
|
@@ -88,69 +100,70 @@ module Requirejs::Rails
|
|
88
100
|
useStrict
|
89
101
|
wrap
|
90
102
|
}
|
91
|
-
|
103
|
+
end
|
92
104
|
|
93
|
-
|
94
|
-
|
95
|
-
|
105
|
+
def loader=(sym)
|
106
|
+
unless LOADERS.include?(sym)
|
107
|
+
raise Requirejs::ConfigError, "Attempt to set unknown loader: #{sym}"
|
108
|
+
end
|
109
|
+
self[:loader] = sym
|
96
110
|
end
|
97
|
-
self[:loader] = sym
|
98
|
-
end
|
99
111
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
+
def build_config
|
113
|
+
unless self.has_key?(:build_config)
|
114
|
+
self[:build_config] = self.run_config.merge "baseUrl" => source_dir.to_s,
|
115
|
+
"modules" => [{'name' => 'application'}]
|
116
|
+
self[:build_config].merge!(self.user_config).slice!(*self.build_config_whitelist)
|
117
|
+
case self.loader
|
118
|
+
when :requirejs
|
119
|
+
# nothing to do
|
120
|
+
when :almond
|
121
|
+
mods = self[:build_config]['modules']
|
122
|
+
unless mods.length == 1
|
123
|
+
raise Requirejs::ConfigError, "Almond build requires exactly one module, config has #{mods.length}."
|
124
|
+
end
|
125
|
+
mod = mods[0]
|
126
|
+
name = mod['name']
|
127
|
+
mod['name'] = 'almond'
|
128
|
+
mod['include'] = name
|
112
129
|
end
|
113
|
-
mod = mods[0]
|
114
|
-
name = mod['name']
|
115
|
-
mod['name'] = 'almond'
|
116
|
-
mod['include'] = name
|
117
130
|
end
|
131
|
+
self[:build_config]
|
118
132
|
end
|
119
|
-
self[:build_config]
|
120
|
-
end
|
121
133
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
134
|
+
def run_config
|
135
|
+
unless self.has_key?(:run_config)
|
136
|
+
self[:run_config] = {"baseUrl" => "/assets"}
|
137
|
+
self[:run_config].merge!(self.user_config).slice!(*self.run_config_whitelist)
|
138
|
+
end
|
139
|
+
self[:run_config]
|
126
140
|
end
|
127
|
-
self[:run_config]
|
128
|
-
end
|
129
141
|
|
130
|
-
|
131
|
-
|
132
|
-
|
142
|
+
def user_config=(cfg)
|
143
|
+
if url = cfg.delete('baseUrl')
|
144
|
+
raise Requirejs::ConfigError, "baseUrl is not needed or permitted in the configuration"
|
145
|
+
end
|
146
|
+
self[:user_config] = cfg
|
133
147
|
end
|
134
|
-
self[:user_config] = cfg
|
135
|
-
end
|
136
148
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
149
|
+
def module_name_for(mod)
|
150
|
+
case self.loader
|
151
|
+
when :almond
|
152
|
+
return mod['include']
|
153
|
+
when :requirejs
|
154
|
+
return mod['name']
|
155
|
+
end
|
143
156
|
end
|
144
|
-
end
|
145
157
|
|
146
|
-
|
147
|
-
|
148
|
-
|
158
|
+
def get_binding
|
159
|
+
return binding()
|
160
|
+
end
|
149
161
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
162
|
+
def asset_allowed?(logical_path)
|
163
|
+
logical_path_patterns.reduce(false) do |accum, pattern|
|
164
|
+
accum || !!(pattern.match(logical_path))
|
165
|
+
end
|
166
|
+
end
|
154
167
|
end
|
155
168
|
end
|
156
169
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "pathname"
|
2
2
|
|
3
|
-
require
|
3
|
+
require "requirejs/rails/config"
|
4
4
|
|
5
5
|
module Requirejs
|
6
6
|
module Rails
|
@@ -54,7 +54,7 @@ module Requirejs
|
|
54
54
|
config.after_initialize do |app|
|
55
55
|
config = app.config
|
56
56
|
rails_manifest_path = File.join(app.root, 'public', config.assets.prefix)
|
57
|
-
rails_manifest = Sprockets::Manifest.new(app.assets, rails_manifest_path)
|
57
|
+
rails_manifest = ::Sprockets::Manifest.new(app.assets, rails_manifest_path)
|
58
58
|
if config.requirejs.manifest_path.exist? && rails_manifest
|
59
59
|
rjs_digests = YAML.load(ERB.new(File.new(config.requirejs.manifest_path).read).result)
|
60
60
|
rails_manifest.assets.merge!(rjs_digests)
|
@@ -1,13 +1,12 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "fileutils"
|
2
|
+
require "pathname"
|
3
|
+
require "tempfile"
|
3
4
|
|
4
|
-
require
|
5
|
-
require
|
5
|
+
require "active_support/ordered_options"
|
6
|
+
require "sprockets"
|
6
7
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
|
10
|
-
require 'active_support/ordered_options'
|
8
|
+
require "requirejs/rails/builder"
|
9
|
+
require "requirejs/rails/config"
|
11
10
|
|
12
11
|
namespace :requirejs do
|
13
12
|
# This method was backported from an earlier version of Sprockets.
|
@@ -40,7 +39,7 @@ namespace :requirejs do
|
|
40
39
|
end
|
41
40
|
|
42
41
|
task setup: ["assets:environment"] do
|
43
|
-
unless defined?(Sprockets)
|
42
|
+
unless defined?(::Sprockets)
|
44
43
|
warn "Cannot precompile assets if sprockets is disabled. Please set config.assets.enabled to true"
|
45
44
|
exit
|
46
45
|
end
|
@@ -89,9 +88,6 @@ OS X Homebrew users can use 'brew install node'.
|
|
89
88
|
# Copy all assets to the temporary staging directory.
|
90
89
|
task prepare_source: ["requirejs:setup",
|
91
90
|
"requirejs:clean"] do
|
92
|
-
bower_json_pattern = Regexp.new("\\A(.*)/bower\\.json\\z")
|
93
|
-
js_ext = requirejs.env.extension_for_mime_type("application/javascript")
|
94
|
-
|
95
91
|
requirejs.config.source_dir.mkpath
|
96
92
|
|
97
93
|
# Save the original JS compressor and cache, which will be restored later.
|
@@ -102,20 +98,31 @@ OS X Homebrew users can use 'brew install node'.
|
|
102
98
|
original_cache = requirejs.env.cache
|
103
99
|
requirejs.env.cache = nil
|
104
100
|
|
105
|
-
requirejs.env.
|
106
|
-
m = bower_json_pattern.match(logical_path)
|
107
|
-
bower_logical_path = m && "#{m[1]}#{js_ext}"
|
101
|
+
js_ext = requirejs.env.mime_types["application/javascript"][:extensions].first
|
108
102
|
|
103
|
+
requirejs.env.logical_paths do |logical_path, physical_path|
|
109
104
|
next \
|
110
|
-
if !
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
if
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
105
|
+
if !requirejs.config.asset_allowed?(logical_path)
|
106
|
+
|
107
|
+
m = ::Requirejs::Rails::Config::BOWER_PATH_PATTERN.match(logical_path)
|
108
|
+
|
109
|
+
if !m
|
110
|
+
asset = requirejs.env.find_asset(logical_path)
|
111
|
+
|
112
|
+
if asset
|
113
|
+
file = requirejs.config.source_dir.join(asset.logical_path)
|
114
|
+
file.dirname.mkpath
|
115
|
+
asset.write_to(file)
|
116
|
+
end
|
117
|
+
else
|
118
|
+
bower_logical_path = Pathname.new(logical_path).dirname.sub_ext(js_ext).to_s
|
119
|
+
asset = requirejs.env.find_asset(bower_logical_path)
|
120
|
+
|
121
|
+
if asset
|
122
|
+
file = requirejs.config.source_dir.join(bower_logical_path)
|
123
|
+
file.dirname.mkpath
|
124
|
+
asset.write_to(file)
|
125
|
+
end
|
119
126
|
end
|
120
127
|
end
|
121
128
|
|
@@ -145,8 +152,10 @@ OS X Homebrew users can use 'brew install node'.
|
|
145
152
|
task digestify_and_compress: ["requirejs:setup"] do
|
146
153
|
requirejs.config.build_config['modules'].each do |m|
|
147
154
|
asset_name = "#{requirejs.config.module_name_for(m)}.js"
|
155
|
+
asset = requirejs.env.find_asset(asset_name)
|
156
|
+
|
148
157
|
built_asset_path = requirejs.config.build_dir.join(asset_name)
|
149
|
-
digest_name =
|
158
|
+
digest_name = asset.digest_path
|
150
159
|
digest_asset_path = requirejs.config.target_dir + digest_name
|
151
160
|
|
152
161
|
# Ensure that the parent directory `a/b` for modules with names like `a/b/c` exist.
|
@@ -17,7 +17,7 @@ class RequirejsRailsTest < ActiveSupport::TestCase
|
|
17
17
|
end
|
18
18
|
|
19
19
|
test "CHANGELOG up to date" do
|
20
|
-
changelog_match = (
|
20
|
+
changelog_match = (/^### v#{Requirejs::Rails::Version}/ =~ Pathname.new(__FILE__+'/../../CHANGELOG.md').cleanpath.read)
|
21
21
|
assert changelog_match, "CHANGELOG has no section for v#{Requirejs::Rails::Version}"
|
22
22
|
end
|
23
23
|
end
|
@@ -41,7 +41,7 @@ class RequirejsRailsConfigTest < ActiveSupport::TestCase
|
|
41
41
|
test "matches configured logical assets" do
|
42
42
|
assert_equal true, @cfg.asset_allowed?('foo.js')
|
43
43
|
assert_equal false, @cfg.asset_allowed?('bar.frobnitz')
|
44
|
-
@cfg.
|
44
|
+
@cfg.logical_path_patterns += [/\.frobnitz$/]
|
45
45
|
assert_equal true, @cfg.asset_allowed?('bar.frobnitz')
|
46
46
|
end
|
47
47
|
|
@@ -136,9 +136,13 @@ class RequirejsHelperTest < ActionView::TestCase
|
|
136
136
|
end
|
137
137
|
|
138
138
|
test "requirejs_include_tag_with_block" do
|
139
|
-
|
140
|
-
|
141
|
-
|
139
|
+
result = wrap(
|
140
|
+
requirejs_include_tag("application") do
|
141
|
+
{"class" => controller.class.name.demodulize}
|
142
|
+
end
|
143
|
+
)
|
144
|
+
|
145
|
+
render text: result
|
142
146
|
|
143
147
|
assert_select "script:first-of-type[src=\"/javascripts/require.js\"]" \
|
144
148
|
"[data-class=\"TestController\"]", count: 1
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license almond 0.3.
|
2
|
+
* @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
|
3
3
|
* Available via the MIT or new BSD license.
|
4
4
|
* see: http://github.com/jrburke/almond for details
|
5
5
|
*/
|
@@ -44,12 +44,6 @@ var requirejs, require, define;
|
|
44
44
|
//otherwise, assume it is a top-level require that will
|
45
45
|
//be relative to baseUrl in the end.
|
46
46
|
if (baseName) {
|
47
|
-
//Convert baseName to array, and lop off the last part,
|
48
|
-
//so that . matches that "directory" and not name of the baseName's
|
49
|
-
//module. For instance, baseName of "one/two/three", maps to
|
50
|
-
//"one/two/three.js", but we want the directory, "one/two" for
|
51
|
-
//this normalization.
|
52
|
-
baseParts = baseParts.slice(0, baseParts.length - 1);
|
53
47
|
name = name.split('/');
|
54
48
|
lastIndex = name.length - 1;
|
55
49
|
|
@@ -58,7 +52,11 @@ var requirejs, require, define;
|
|
58
52
|
name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
|
59
53
|
}
|
60
54
|
|
61
|
-
|
55
|
+
//Lop off the last part of baseParts, so that . matches the
|
56
|
+
//"directory" and not name of the baseName's module. For instance,
|
57
|
+
//baseName of "one/two/three", maps to "one/two/three.js", but we
|
58
|
+
//want the directory, "one/two" for this normalization.
|
59
|
+
name = baseParts.slice(0, baseParts.length - 1).concat(name);
|
62
60
|
|
63
61
|
//start trimDots
|
64
62
|
for (i = 0; i < name.length; i += 1) {
|
@@ -408,6 +406,9 @@ var requirejs, require, define;
|
|
408
406
|
requirejs._defined = defined;
|
409
407
|
|
410
408
|
define = function (name, deps, callback) {
|
409
|
+
if (typeof name !== 'string') {
|
410
|
+
throw new Error('See almond README: incorrect module build, no module name');
|
411
|
+
}
|
411
412
|
|
412
413
|
//This module may not have dependencies
|
413
414
|
if (!deps.splice) {
|