sprockets 3.0.0.beta.6 → 3.0.0.beta.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +171 -100
- data/lib/rake/sprocketstask.rb +2 -2
- data/lib/sprockets.rb +69 -63
- data/lib/sprockets/asset.rb +2 -61
- data/lib/sprockets/autoload_processor.rb +48 -0
- data/lib/sprockets/base.rb +4 -6
- data/lib/sprockets/bower.rb +8 -5
- data/lib/sprockets/bundle.rb +9 -13
- data/lib/sprockets/cache.rb +19 -14
- data/lib/sprockets/cache/file_store.rb +2 -1
- data/lib/sprockets/cached_environment.rb +15 -68
- data/lib/sprockets/closure_compressor.rb +17 -4
- data/lib/sprockets/coffee_script_processor.rb +26 -0
- data/lib/sprockets/coffee_script_template.rb +3 -20
- data/lib/sprockets/compressing.rb +10 -4
- data/lib/sprockets/configuration.rb +21 -37
- data/lib/sprockets/context.rb +37 -67
- data/lib/sprockets/dependencies.rb +73 -0
- data/lib/sprockets/digest_utils.rb +8 -2
- data/lib/sprockets/directive_processor.rb +122 -165
- data/lib/sprockets/eco_processor.rb +32 -0
- data/lib/sprockets/eco_template.rb +3 -26
- data/lib/sprockets/ejs_processor.rb +31 -0
- data/lib/sprockets/ejs_template.rb +3 -25
- data/lib/sprockets/encoding_utils.rb +9 -21
- data/lib/sprockets/engines.rb +25 -27
- data/lib/sprockets/environment.rb +9 -1
- data/lib/sprockets/erb_processor.rb +30 -0
- data/lib/sprockets/erb_template.rb +3 -20
- data/lib/sprockets/file_reader.rb +15 -0
- data/lib/sprockets/http_utils.rb +2 -0
- data/lib/sprockets/jst_processor.rb +9 -2
- data/lib/sprockets/legacy.rb +212 -3
- data/lib/sprockets/legacy_tilt_processor.rb +1 -1
- data/lib/sprockets/loader.rb +95 -89
- data/lib/sprockets/manifest.rb +23 -59
- data/lib/sprockets/mime.rb +28 -41
- data/lib/sprockets/path_dependency_utils.rb +76 -0
- data/lib/sprockets/path_utils.rb +21 -1
- data/lib/sprockets/paths.rb +23 -8
- data/lib/sprockets/processing.rb +102 -91
- data/lib/sprockets/processor_utils.rb +97 -0
- data/lib/sprockets/resolve.rb +110 -97
- data/lib/sprockets/sass_cache_store.rb +2 -2
- data/lib/sprockets/sass_compressor.rb +17 -4
- data/lib/sprockets/sass_functions.rb +2 -2
- data/lib/sprockets/sass_importer.rb +2 -2
- data/lib/sprockets/sass_processor.rb +305 -0
- data/lib/sprockets/sass_template.rb +4 -286
- data/lib/sprockets/server.rb +1 -13
- data/lib/sprockets/transformers.rb +62 -25
- data/lib/sprockets/uglifier_compressor.rb +17 -4
- data/lib/sprockets/uri_utils.rb +190 -0
- data/lib/sprockets/utils.rb +87 -6
- data/lib/sprockets/version.rb +1 -1
- data/lib/sprockets/yui_compressor.rb +17 -4
- metadata +14 -5
- data/lib/sprockets/asset_uri.rb +0 -80
- data/lib/sprockets/lazy_processor.rb +0 -15
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'sprockets/digest_utils'
|
2
|
+
require 'sprockets/path_digest_utils'
|
3
|
+
require 'sprockets/uri_utils'
|
4
|
+
|
5
|
+
module Sprockets
|
6
|
+
# `Dependencies` is an internal mixin whose public methods are exposed on the
|
7
|
+
# `Environment` and `CachedEnvironment` classes.
|
8
|
+
module Dependencies
|
9
|
+
include DigestUtils, PathDigestUtils, URIUtils
|
10
|
+
|
11
|
+
# Public: Mapping dependency schemes to resolver functions.
|
12
|
+
#
|
13
|
+
# key - String scheme
|
14
|
+
# value - Proc.call(Environment, String)
|
15
|
+
#
|
16
|
+
# Returns Hash.
|
17
|
+
def dependency_resolvers
|
18
|
+
config[:dependency_resolvers]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Public: Default set of dependency URIs for assets.
|
22
|
+
#
|
23
|
+
# Returns Set of String URIs.
|
24
|
+
def dependencies
|
25
|
+
config[:dependencies]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Public: Register new dependency URI resolver.
|
29
|
+
#
|
30
|
+
# scheme - String scheme
|
31
|
+
# block -
|
32
|
+
# environment - Environment
|
33
|
+
# uri - String dependency URI
|
34
|
+
#
|
35
|
+
# Returns nothing.
|
36
|
+
def register_dependency_resolver(scheme, &block)
|
37
|
+
self.config = hash_reassoc(config, :dependency_resolvers) do |hash|
|
38
|
+
hash.merge(scheme => block)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Public: Add environmental dependency inheirted by all assets.
|
43
|
+
#
|
44
|
+
# uri - String dependency URI
|
45
|
+
#
|
46
|
+
# Returns nothing.
|
47
|
+
def add_dependency(uri)
|
48
|
+
self.config = hash_reassoc(config, :dependencies) do |set|
|
49
|
+
set + Set.new([uri])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
alias_method :depend_on, :add_dependency
|
53
|
+
|
54
|
+
# Internal: Resolve set of dependency URIs.
|
55
|
+
#
|
56
|
+
# Returns Array of resolved Objects.
|
57
|
+
def resolve_dependencies(uris)
|
58
|
+
uris.map { |uri| resolve_dependency(uri) }
|
59
|
+
end
|
60
|
+
|
61
|
+
# Internal: Resolve dependency URIs.
|
62
|
+
#
|
63
|
+
# Returns resolved Object.
|
64
|
+
def resolve_dependency(str)
|
65
|
+
scheme = str[/([^:]+)/, 1]
|
66
|
+
if resolver = dependency_resolvers[scheme]
|
67
|
+
resolver.call(self, str)
|
68
|
+
else
|
69
|
+
raise TypeError, "unknown cache scheme: #{scheme}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'digest/md5'
|
2
2
|
require 'digest/sha1'
|
3
3
|
require 'digest/sha2'
|
4
|
+
require 'set'
|
4
5
|
|
5
6
|
module Sprockets
|
7
|
+
# Internal: Hash functions and digest related utilities. Mixed into
|
8
|
+
# Environment.
|
6
9
|
module DigestUtils
|
7
10
|
extend self
|
8
11
|
|
@@ -33,6 +36,9 @@ module Sprockets
|
|
33
36
|
|
34
37
|
# Internal: Generate a hexdigest for a nested JSON serializable object.
|
35
38
|
#
|
39
|
+
# This is used for generating cache keys, so its pretty important its
|
40
|
+
# wicked fast. Microbenchmarks away!
|
41
|
+
#
|
36
42
|
# obj - A JSON serializable object.
|
37
43
|
#
|
38
44
|
# Returns a String digest of the object.
|
@@ -111,7 +117,7 @@ module Sprockets
|
|
111
117
|
# Internal: Maps digest class to the named information hash algorithm name.
|
112
118
|
#
|
113
119
|
# http://www.iana.org/assignments/named-information/named-information.xhtml
|
114
|
-
|
120
|
+
NI_HASH_ALGORITHMS = {
|
115
121
|
Digest::SHA256 => 'sha-256'.freeze,
|
116
122
|
Digest::SHA384 => 'sha-384'.freeze,
|
117
123
|
Digest::SHA512 => 'sha-512'.freeze
|
@@ -137,7 +143,7 @@ module Sprockets
|
|
137
143
|
raise TypeError, "unknown digest: #{digest.inspect}"
|
138
144
|
end
|
139
145
|
|
140
|
-
if hash_name =
|
146
|
+
if hash_name = NI_HASH_ALGORITHMS[digest_class]
|
141
147
|
uri = "ni:///#{hash_name};#{pack_urlsafe_base64digest(digest)}"
|
142
148
|
uri << "?ct=#{content_type}" if content_type
|
143
149
|
uri
|
@@ -36,24 +36,6 @@ module Sprockets
|
|
36
36
|
class DirectiveProcessor
|
37
37
|
VERSION = '1'
|
38
38
|
|
39
|
-
# Directives will only be picked up if they are in the header
|
40
|
-
# of the source file. C style (/* */), JavaScript (//), and
|
41
|
-
# Ruby (#) comments are supported.
|
42
|
-
#
|
43
|
-
# Directives in comments after the first non-whitespace line
|
44
|
-
# of code will not be processed.
|
45
|
-
#
|
46
|
-
HEADER_PATTERN = /
|
47
|
-
\A (
|
48
|
-
(?m:\s*) (
|
49
|
-
(\/\* (?m:.*?) \*\/) |
|
50
|
-
(\#\#\# (?m:.*?) \#\#\#) |
|
51
|
-
(\/\/ .* \n?)+ |
|
52
|
-
(\# .* \n?)+
|
53
|
-
)
|
54
|
-
)+
|
55
|
-
/x
|
56
|
-
|
57
39
|
# Directives are denoted by a `=` followed by the name, then
|
58
40
|
# argument list.
|
59
41
|
#
|
@@ -67,40 +49,69 @@ module Sprockets
|
|
67
49
|
^ \W* = \s* (\w+.*?) (\*\/)? $
|
68
50
|
/x
|
69
51
|
|
52
|
+
def self.instance
|
53
|
+
@instance ||= new(
|
54
|
+
# Deprecated: Default to C and Ruby comment styles
|
55
|
+
comments: ["//", ["/*", "*/"]] + ["#", ["###", "###"]]
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
70
59
|
def self.call(input)
|
71
|
-
|
60
|
+
instance.call(input)
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize(options = {})
|
64
|
+
@header_pattern = compile_header_pattern(Array(options[:comments]))
|
72
65
|
end
|
73
66
|
|
74
67
|
def call(input)
|
68
|
+
dup._call(input)
|
69
|
+
end
|
70
|
+
|
71
|
+
def _call(input)
|
75
72
|
@environment = input[:environment]
|
76
73
|
@uri = input[:uri]
|
77
|
-
@load_path = input[:load_path]
|
78
74
|
@filename = input[:filename]
|
79
75
|
@dirname = File.dirname(@filename)
|
80
76
|
@content_type = input[:content_type]
|
77
|
+
@required = Set.new(input[:metadata][:required])
|
78
|
+
@stubbed = Set.new(input[:metadata][:stubbed])
|
79
|
+
@links = Set.new(input[:metadata][:links])
|
80
|
+
@dependencies = Set.new(input[:metadata][:dependencies])
|
81
81
|
|
82
|
-
data = input[:data]
|
83
|
-
result = process_source(data)
|
84
|
-
|
85
|
-
data, directives = result.values_at(:data, :directives)
|
86
|
-
|
87
|
-
@required = Set.new(input[:metadata][:required])
|
88
|
-
@stubbed = Set.new(input[:metadata][:stubbed])
|
89
|
-
@links = Set.new(input[:metadata][:links])
|
90
|
-
@dependency_paths = Set.new(input[:metadata][:dependency_paths])
|
91
|
-
|
82
|
+
data, directives = process_source(input[:data])
|
92
83
|
process_directives(directives)
|
93
84
|
|
94
85
|
{ data: data,
|
95
86
|
required: @required,
|
96
87
|
stubbed: @stubbed,
|
97
88
|
links: @links,
|
98
|
-
|
89
|
+
dependencies: @dependencies }
|
99
90
|
end
|
100
91
|
|
101
92
|
protected
|
93
|
+
# Directives will only be picked up if they are in the header
|
94
|
+
# of the source file. C style (/* */), JavaScript (//), and
|
95
|
+
# Ruby (#) comments are supported.
|
96
|
+
#
|
97
|
+
# Directives in comments after the first non-whitespace line
|
98
|
+
# of code will not be processed.
|
99
|
+
def compile_header_pattern(comments)
|
100
|
+
re = comments.map { |c|
|
101
|
+
case c
|
102
|
+
when String
|
103
|
+
"(?:#{Regexp.escape(c)}.*\\n?)+"
|
104
|
+
when Array
|
105
|
+
"(?:#{Regexp.escape(c[0])}(?m:.*?)#{Regexp.escape(c[1])})"
|
106
|
+
else
|
107
|
+
raise TypeError, "unknown comment type: #{c.class}"
|
108
|
+
end
|
109
|
+
}.join("|")
|
110
|
+
Regexp.compile("\\A(?:(?m:\\s*)(?:#{re}))+")
|
111
|
+
end
|
112
|
+
|
102
113
|
def process_source(source)
|
103
|
-
header = source[
|
114
|
+
header = source[@header_pattern, 0] || ""
|
104
115
|
body = $' || source
|
105
116
|
|
106
117
|
header, directives = extract_directives(header)
|
@@ -112,7 +123,7 @@ module Sprockets
|
|
112
123
|
# Ensure body ends in a new line
|
113
124
|
data << "\n" if data.length > 0 && data[-1] != "\n"
|
114
125
|
|
115
|
-
|
126
|
+
return data, directives
|
116
127
|
end
|
117
128
|
|
118
129
|
# Returns an Array of directive structures. Each structure
|
@@ -193,7 +204,7 @@ module Sprockets
|
|
193
204
|
# //= require "./bar"
|
194
205
|
#
|
195
206
|
def process_require_directive(path)
|
196
|
-
@required <<
|
207
|
+
@required << resolve(path, accept: @content_type, bundle: false)
|
197
208
|
end
|
198
209
|
|
199
210
|
# `require_self` causes the body of the current file to be inserted
|
@@ -220,28 +231,8 @@ module Sprockets
|
|
220
231
|
# //= require_directory "./javascripts"
|
221
232
|
#
|
222
233
|
def process_require_directory_directive(path = ".")
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
unless (stats = @environment.stat(root)) && stats.directory?
|
227
|
-
raise ArgumentError, "require_directory argument must be a directory"
|
228
|
-
end
|
229
|
-
|
230
|
-
@dependency_paths << root
|
231
|
-
|
232
|
-
@environment.stat_directory(root).each do |subpath, stat|
|
233
|
-
if subpath == @filename
|
234
|
-
next
|
235
|
-
elsif stat.directory?
|
236
|
-
next
|
237
|
-
elsif uri = @environment.locate(subpath, accept: @content_type, bundle: false)
|
238
|
-
@required << uri
|
239
|
-
end
|
240
|
-
end
|
241
|
-
else
|
242
|
-
# The path must be relative and start with a `./`.
|
243
|
-
raise ArgumentError, "require_directory argument must be a relative path"
|
244
|
-
end
|
234
|
+
path = expand_relative_dirname(:require_directory, path)
|
235
|
+
require_paths(*@environment.stat_directory_with_dependencies(path))
|
245
236
|
end
|
246
237
|
|
247
238
|
# `require_tree` requires all the nested files in a directory.
|
@@ -250,28 +241,8 @@ module Sprockets
|
|
250
241
|
# //= require_tree "./public"
|
251
242
|
#
|
252
243
|
def process_require_tree_directive(path = ".")
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
unless (stats = @environment.stat(root)) && stats.directory?
|
257
|
-
raise ArgumentError, "require_tree argument must be a directory"
|
258
|
-
end
|
259
|
-
|
260
|
-
@dependency_paths << root
|
261
|
-
|
262
|
-
@environment.stat_sorted_tree(root).each do |subpath, stat|
|
263
|
-
if subpath == @filename
|
264
|
-
next
|
265
|
-
elsif stat.directory?
|
266
|
-
@dependency_paths << subpath
|
267
|
-
elsif uri = @environment.locate(subpath, accept: @content_type, bundle: false)
|
268
|
-
@required << uri
|
269
|
-
end
|
270
|
-
end
|
271
|
-
else
|
272
|
-
# The path must be relative and start with a `./`.
|
273
|
-
raise ArgumentError, "require_tree argument must be a relative path"
|
274
|
-
end
|
244
|
+
path = expand_relative_dirname(:require_tree, path)
|
245
|
+
require_paths(*@environment.stat_sorted_tree_with_dependencies(path))
|
275
246
|
end
|
276
247
|
|
277
248
|
# Allows you to state a dependency on a file without
|
@@ -287,7 +258,7 @@ module Sprockets
|
|
287
258
|
# //= depend_on "foo.png"
|
288
259
|
#
|
289
260
|
def process_depend_on_directive(path)
|
290
|
-
|
261
|
+
resolve(path)
|
291
262
|
end
|
292
263
|
|
293
264
|
# Allows you to state a dependency on an asset without including
|
@@ -302,9 +273,7 @@ module Sprockets
|
|
302
273
|
# //= depend_on_asset "bar.js"
|
303
274
|
#
|
304
275
|
def process_depend_on_asset_directive(path)
|
305
|
-
|
306
|
-
@dependency_paths.merge(asset.metadata[:dependency_paths])
|
307
|
-
end
|
276
|
+
load(resolve(path))
|
308
277
|
end
|
309
278
|
|
310
279
|
# Allows dependency to be excluded from the asset bundle.
|
@@ -316,7 +285,7 @@ module Sprockets
|
|
316
285
|
# //= stub "jquery"
|
317
286
|
#
|
318
287
|
def process_stub_directive(path)
|
319
|
-
@stubbed <<
|
288
|
+
@stubbed << resolve(path, accept: @content_type, bundle: false)
|
320
289
|
end
|
321
290
|
|
322
291
|
# Declares a linked dependency on the target asset.
|
@@ -328,10 +297,7 @@ module Sprockets
|
|
328
297
|
# /*= link "logo.png" */
|
329
298
|
#
|
330
299
|
def process_link_directive(path)
|
331
|
-
|
332
|
-
@dependency_paths.merge(asset.metadata[:dependency_paths])
|
333
|
-
@links << asset.uri
|
334
|
-
end
|
300
|
+
@links << load(resolve(path)).uri
|
335
301
|
end
|
336
302
|
|
337
303
|
# `link_directory` links all the files inside a single
|
@@ -340,31 +306,15 @@ module Sprockets
|
|
340
306
|
#
|
341
307
|
# //= link_directory "./fonts"
|
342
308
|
#
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
@environment.stat_directory(root).each do |subpath, stat|
|
354
|
-
if subpath == @filename
|
355
|
-
next
|
356
|
-
elsif stat.directory?
|
357
|
-
next
|
358
|
-
elsif uri = @environment.locate(subpath)
|
359
|
-
asset = @environment.load(uri)
|
360
|
-
@dependency_paths.merge(asset.metadata[:dependency_paths])
|
361
|
-
@links << asset.uri
|
362
|
-
end
|
363
|
-
end
|
364
|
-
else
|
365
|
-
# The path must be relative and start with a `./`.
|
366
|
-
raise ArgumentError, "link_directory argument must be a relative path"
|
367
|
-
end
|
309
|
+
# Use caution when linking against JS or CSS assets. Include an explicit
|
310
|
+
# extension or content type in these cases
|
311
|
+
#
|
312
|
+
# //= link_directory "./scripts" .js
|
313
|
+
#
|
314
|
+
def process_link_directory_directive(path = ".", accept = nil)
|
315
|
+
path = expand_relative_dirname(:link_directory, path)
|
316
|
+
accept = expand_accept_shorthand(accept)
|
317
|
+
link_paths(*@environment.stat_directory_with_dependencies(path), accept)
|
368
318
|
end
|
369
319
|
|
370
320
|
# `link_tree` links all the nested files in a directory.
|
@@ -372,76 +322,83 @@ module Sprockets
|
|
372
322
|
#
|
373
323
|
# //= link_tree "./images"
|
374
324
|
#
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
325
|
+
# Use caution when linking against JS or CSS assets. Include an explicit
|
326
|
+
# extension or content type in these cases
|
327
|
+
#
|
328
|
+
# //= link_tree "./styles" .css
|
329
|
+
#
|
330
|
+
def process_link_tree_directive(path = ".", accept = nil)
|
331
|
+
path = expand_relative_dirname(:link_tree, path)
|
332
|
+
accept = expand_accept_shorthand(accept)
|
333
|
+
link_paths(*@environment.stat_sorted_tree_with_dependencies(path), accept)
|
334
|
+
end
|
382
335
|
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
asset = @environment.load(uri)
|
392
|
-
@dependency_paths.merge(asset.metadata[:dependency_paths])
|
393
|
-
@links << asset.uri
|
394
|
-
end
|
395
|
-
end
|
336
|
+
private
|
337
|
+
def expand_accept_shorthand(accept)
|
338
|
+
if accept.nil?
|
339
|
+
nil
|
340
|
+
elsif accept.include?("/")
|
341
|
+
accept
|
342
|
+
elsif accept.start_with?(".")
|
343
|
+
@environment.mime_exts[accept]
|
396
344
|
else
|
397
|
-
|
398
|
-
raise ArgumentError, "link_tree argument must be a relative path"
|
345
|
+
@environment.mime_exts[".#{accept}"]
|
399
346
|
end
|
400
347
|
end
|
401
348
|
|
402
|
-
|
403
|
-
|
404
|
-
|
349
|
+
def require_paths(paths, deps)
|
350
|
+
resolve_paths(paths, deps, accept: @content_type, bundle: false) do |uri|
|
351
|
+
@required << uri
|
352
|
+
end
|
405
353
|
end
|
406
354
|
|
407
|
-
def
|
408
|
-
|
355
|
+
def link_paths(paths, deps, accept)
|
356
|
+
resolve_paths(paths, deps, accept: accept) do |uri|
|
357
|
+
@links << load(uri).uri
|
358
|
+
end
|
409
359
|
end
|
410
360
|
|
411
|
-
def
|
412
|
-
|
361
|
+
def resolve_paths(paths, deps, options = {})
|
362
|
+
@dependencies.merge(deps)
|
363
|
+
paths.each do |subpath, stat|
|
364
|
+
next if subpath == @filename || stat.directory?
|
365
|
+
uri, deps = @environment.resolve(subpath, options.merge(compat: false))
|
366
|
+
@dependencies.merge(deps)
|
367
|
+
yield uri if uri
|
368
|
+
end
|
413
369
|
end
|
414
370
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
if filename = @environment.send(method, logical_path, options.merge(load_paths: [@load_path]))
|
423
|
-
filename
|
424
|
-
else
|
425
|
-
accept = options[:accept]
|
426
|
-
message = "couldn't find file '#{logical_path}' under '#{@load_path}'"
|
427
|
-
message << " with type '#{accept}'" if accept
|
428
|
-
raise FileNotFound, message
|
429
|
-
end
|
371
|
+
def expand_relative_dirname(directive, path)
|
372
|
+
if @environment.relative_path?(path)
|
373
|
+
path = File.expand_path(path, @dirname)
|
374
|
+
stat = @environment.stat(path)
|
375
|
+
|
376
|
+
if stat && stat.directory?
|
377
|
+
path
|
430
378
|
else
|
431
|
-
raise
|
379
|
+
raise ArgumentError, "#{directive} argument must be a directory"
|
432
380
|
end
|
433
381
|
else
|
434
|
-
|
382
|
+
# The path must be relative and start with a `./`.
|
383
|
+
raise ArgumentError, "#{directive} argument must be a relative path"
|
435
384
|
end
|
385
|
+
end
|
436
386
|
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
387
|
+
def load(uri)
|
388
|
+
asset = @environment.load(uri)
|
389
|
+
@dependencies.merge(asset.metadata[:dependencies])
|
390
|
+
asset
|
391
|
+
end
|
392
|
+
|
393
|
+
def resolve(path, options = {})
|
394
|
+
# Prevent absolute paths in directives
|
395
|
+
if @environment.absolute_path?(path)
|
396
|
+
raise FileOutsidePaths, "can't require absolute file: #{path}"
|
444
397
|
end
|
398
|
+
|
399
|
+
uri, deps = @environment.resolve!(path, options.merge(base_path: @dirname))
|
400
|
+
@dependencies.merge(deps)
|
401
|
+
uri
|
445
402
|
end
|
446
403
|
end
|
447
404
|
end
|