sprockets 3.7.2 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +47 -267
- data/README.md +477 -321
- data/bin/sprockets +11 -7
- data/lib/rake/sprocketstask.rb +3 -2
- data/lib/sprockets.rb +99 -39
- data/lib/sprockets/add_source_map_comment_to_asset_processor.rb +60 -0
- data/lib/sprockets/asset.rb +31 -23
- data/lib/sprockets/autoload.rb +5 -0
- data/lib/sprockets/autoload/babel.rb +8 -0
- data/lib/sprockets/autoload/closure.rb +1 -0
- data/lib/sprockets/autoload/coffee_script.rb +1 -0
- data/lib/sprockets/autoload/eco.rb +1 -0
- data/lib/sprockets/autoload/ejs.rb +1 -0
- data/lib/sprockets/autoload/jsminc.rb +8 -0
- data/lib/sprockets/autoload/sass.rb +1 -0
- data/lib/sprockets/autoload/sassc.rb +8 -0
- data/lib/sprockets/autoload/uglifier.rb +1 -0
- data/lib/sprockets/autoload/yui.rb +1 -0
- data/lib/sprockets/autoload/zopfli.rb +7 -0
- data/lib/sprockets/babel_processor.rb +66 -0
- data/lib/sprockets/base.rb +49 -12
- data/lib/sprockets/bower.rb +5 -2
- data/lib/sprockets/bundle.rb +40 -4
- data/lib/sprockets/cache.rb +36 -1
- data/lib/sprockets/cache/file_store.rb +25 -3
- data/lib/sprockets/cache/memory_store.rb +9 -0
- data/lib/sprockets/cache/null_store.rb +8 -0
- data/lib/sprockets/cached_environment.rb +14 -19
- data/lib/sprockets/closure_compressor.rb +1 -0
- data/lib/sprockets/coffee_script_processor.rb +18 -4
- data/lib/sprockets/compressing.rb +43 -3
- data/lib/sprockets/configuration.rb +3 -7
- data/lib/sprockets/context.rb +97 -24
- data/lib/sprockets/dependencies.rb +1 -0
- data/lib/sprockets/digest_utils.rb +25 -5
- data/lib/sprockets/directive_processor.rb +45 -35
- data/lib/sprockets/eco_processor.rb +1 -0
- data/lib/sprockets/ejs_processor.rb +1 -0
- data/lib/sprockets/encoding_utils.rb +1 -0
- data/lib/sprockets/environment.rb +9 -4
- data/lib/sprockets/erb_processor.rb +28 -21
- data/lib/sprockets/errors.rb +1 -0
- data/lib/sprockets/exporters/base.rb +71 -0
- data/lib/sprockets/exporters/file_exporter.rb +24 -0
- data/lib/sprockets/exporters/zlib_exporter.rb +33 -0
- data/lib/sprockets/exporters/zopfli_exporter.rb +14 -0
- data/lib/sprockets/exporting.rb +73 -0
- data/lib/sprockets/file_reader.rb +1 -0
- data/lib/sprockets/http_utils.rb +25 -7
- data/lib/sprockets/jsminc_compressor.rb +32 -0
- data/lib/sprockets/jst_processor.rb +11 -10
- data/lib/sprockets/loader.rb +87 -67
- data/lib/sprockets/manifest.rb +64 -62
- data/lib/sprockets/manifest_utils.rb +9 -6
- data/lib/sprockets/mime.rb +8 -42
- data/lib/sprockets/npm.rb +52 -0
- data/lib/sprockets/path_dependency_utils.rb +3 -11
- data/lib/sprockets/path_digest_utils.rb +2 -1
- data/lib/sprockets/path_utils.rb +87 -7
- data/lib/sprockets/paths.rb +1 -0
- data/lib/sprockets/preprocessors/default_source_map.rb +49 -0
- data/lib/sprockets/processing.rb +31 -61
- data/lib/sprockets/processor_utils.rb +24 -35
- data/lib/sprockets/resolve.rb +177 -93
- data/lib/sprockets/sass_cache_store.rb +2 -6
- data/lib/sprockets/sass_compressor.rb +13 -1
- data/lib/sprockets/sass_functions.rb +1 -0
- data/lib/sprockets/sass_importer.rb +1 -0
- data/lib/sprockets/sass_processor.rb +30 -9
- data/lib/sprockets/sassc_compressor.rb +56 -0
- data/lib/sprockets/sassc_processor.rb +297 -0
- data/lib/sprockets/server.rb +26 -23
- data/lib/sprockets/source_map_processor.rb +66 -0
- data/lib/sprockets/source_map_utils.rb +483 -0
- data/lib/sprockets/transformers.rb +63 -35
- data/lib/sprockets/uglifier_compressor.rb +21 -11
- data/lib/sprockets/unloaded_asset.rb +13 -11
- data/lib/sprockets/uri_tar.rb +1 -0
- data/lib/sprockets/uri_utils.rb +11 -8
- data/lib/sprockets/utils.rb +41 -74
- data/lib/sprockets/utils/gzip.rb +46 -14
- data/lib/sprockets/version.rb +2 -1
- data/lib/sprockets/yui_compressor.rb +1 -0
- metadata +127 -23
- data/LICENSE +0 -21
- data/lib/sprockets/coffee_script_template.rb +0 -17
- data/lib/sprockets/deprecation.rb +0 -90
- data/lib/sprockets/eco_template.rb +0 -17
- data/lib/sprockets/ejs_template.rb +0 -17
- data/lib/sprockets/engines.rb +0 -92
- data/lib/sprockets/erb_template.rb +0 -11
- data/lib/sprockets/legacy.rb +0 -330
- data/lib/sprockets/legacy_proc_processor.rb +0 -35
- data/lib/sprockets/legacy_tilt_processor.rb +0 -29
- data/lib/sprockets/sass_template.rb +0 -19
data/bin/sprockets
CHANGED
@@ -12,7 +12,7 @@ unless ARGV.delete("--noenv")
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
paths = []
|
16
16
|
environment = Sprockets::Environment.new(Dir.pwd)
|
17
17
|
manifest = nil
|
18
18
|
|
@@ -52,6 +52,10 @@ OptionParser.new do |opts|
|
|
52
52
|
opts.on("--noenv", "Disables .sprocketsrc file") do
|
53
53
|
end
|
54
54
|
|
55
|
+
opts.on("--cache=DIRECTORY", "Enables the FileStore cache using the specified directory") do |directory|
|
56
|
+
environment.cache = Sprockets::Cache::FileStore.new(directory)
|
57
|
+
end
|
58
|
+
|
55
59
|
opts.on_tail("-h", "--help", "Shows this help message") do
|
56
60
|
opts.show_usage
|
57
61
|
end
|
@@ -64,8 +68,8 @@ OptionParser.new do |opts|
|
|
64
68
|
opts.show_usage if ARGV.empty?
|
65
69
|
|
66
70
|
begin
|
67
|
-
opts.order(ARGV) do |
|
68
|
-
|
71
|
+
opts.order(ARGV) do |path|
|
72
|
+
paths << path
|
69
73
|
end
|
70
74
|
rescue OptionParser::ParseError => e
|
71
75
|
opts.warn e.message
|
@@ -75,14 +79,14 @@ end
|
|
75
79
|
|
76
80
|
if environment.paths.empty?
|
77
81
|
warn "No load paths given"
|
78
|
-
warn "Usage: sprockets -Ijavascripts/
|
82
|
+
warn "Usage: sprockets -Ijavascripts/ path"
|
79
83
|
exit 1
|
80
84
|
end
|
81
85
|
|
82
86
|
if manifest
|
83
|
-
manifest.compile(
|
84
|
-
elsif
|
85
|
-
puts environment.find_asset(
|
87
|
+
manifest.compile(paths)
|
88
|
+
elsif paths.length == 1
|
89
|
+
puts environment.find_asset(paths.first).to_s
|
86
90
|
else
|
87
91
|
warn "Only one file can be compiled to stdout at a time"
|
88
92
|
exit 1
|
data/lib/rake/sprocketstask.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'rake'
|
2
3
|
require 'rake/tasklib'
|
3
4
|
|
@@ -124,7 +125,7 @@ module Rake
|
|
124
125
|
end
|
125
126
|
end
|
126
127
|
|
127
|
-
task :
|
128
|
+
task clobber: ["clobber_#{name}"]
|
128
129
|
|
129
130
|
desc name == :assets ? "Clean old assets" : "Clean old #{name} assets"
|
130
131
|
task "clean_#{name}" do
|
@@ -133,7 +134,7 @@ module Rake
|
|
133
134
|
end
|
134
135
|
end
|
135
136
|
|
136
|
-
task :
|
137
|
+
task clean: ["clean_#{name}"]
|
137
138
|
end
|
138
139
|
|
139
140
|
private
|
data/lib/sprockets.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require 'sprockets/version'
|
3
5
|
require 'sprockets/cache'
|
4
6
|
require 'sprockets/environment'
|
5
7
|
require 'sprockets/errors'
|
6
8
|
require 'sprockets/manifest'
|
7
|
-
require 'sprockets/deprecation'
|
8
9
|
|
9
10
|
module Sprockets
|
10
11
|
require 'sprockets/processor_utils'
|
@@ -23,21 +24,21 @@ module Sprockets
|
|
23
24
|
dependencies: Set.new.freeze,
|
24
25
|
dependency_resolvers: {}.freeze,
|
25
26
|
digest_class: Digest::SHA256,
|
26
|
-
engine_mime_types: {}.freeze,
|
27
|
-
engines: {}.freeze,
|
28
27
|
mime_exts: {}.freeze,
|
29
28
|
mime_types: {}.freeze,
|
30
29
|
paths: [].freeze,
|
31
30
|
pipelines: {}.freeze,
|
31
|
+
pipeline_exts: {}.freeze,
|
32
32
|
postprocessors: Hash.new { |h, k| [].freeze }.freeze,
|
33
33
|
preprocessors: Hash.new { |h, k| [].freeze }.freeze,
|
34
|
-
registered_transformers:
|
35
|
-
root:
|
34
|
+
registered_transformers: [].freeze,
|
35
|
+
root: __dir__.dup.freeze,
|
36
36
|
transformers: Hash.new { |h, k| {}.freeze }.freeze,
|
37
|
+
exporters: Hash.new { |h, k| Set.new.freeze }.freeze,
|
37
38
|
version: "",
|
38
|
-
gzip_enabled: true
|
39
|
+
gzip_enabled: true,
|
40
|
+
export_concurrent: true
|
39
41
|
}.freeze
|
40
|
-
self.computed_config = {}
|
41
42
|
|
42
43
|
@context_class = Context
|
43
44
|
|
@@ -48,6 +49,7 @@ module Sprockets
|
|
48
49
|
# Common asset text types
|
49
50
|
register_mime_type 'application/javascript', extensions: ['.js'], charset: :unicode
|
50
51
|
register_mime_type 'application/json', extensions: ['.json'], charset: :unicode
|
52
|
+
register_mime_type 'application/ruby', extensions: ['.rb']
|
51
53
|
register_mime_type 'application/xml', extensions: ['.xml']
|
52
54
|
register_mime_type 'text/css', extensions: ['.css'], charset: :css
|
53
55
|
register_mime_type 'text/html', extensions: ['.html', '.htm'], charset: :html
|
@@ -70,84 +72,133 @@ module Sprockets
|
|
70
72
|
register_mime_type 'audio/aiff', extensions: ['.aiff']
|
71
73
|
register_mime_type 'audio/mpeg', extensions: ['.mp3', '.mp2', '.m2a', '.m3a']
|
72
74
|
register_mime_type 'application/ogg', extensions: ['.ogx']
|
75
|
+
register_mime_type 'audio/ogg', extensions: ['.ogg', '.oga']
|
73
76
|
register_mime_type 'audio/midi', extensions: ['.midi', '.mid']
|
74
77
|
register_mime_type 'video/avi', extensions: ['.avi']
|
75
78
|
register_mime_type 'audio/wave', extensions: ['.wav', '.wave']
|
76
79
|
register_mime_type 'video/mp4', extensions: ['.mp4', '.m4v']
|
80
|
+
register_mime_type 'audio/aac', extensions: ['.aac']
|
81
|
+
register_mime_type 'audio/mp4', extensions: ['.m4a']
|
82
|
+
register_mime_type 'audio/flac', extensions: ['.flac']
|
77
83
|
|
78
84
|
# Common font types
|
79
85
|
register_mime_type 'application/vnd.ms-fontobject', extensions: ['.eot']
|
80
86
|
register_mime_type 'application/x-font-opentype', extensions: ['.otf']
|
81
87
|
register_mime_type 'application/x-font-ttf', extensions: ['.ttf']
|
82
88
|
register_mime_type 'application/font-woff', extensions: ['.woff']
|
89
|
+
register_mime_type 'application/font-woff2', extensions: ['.woff2']
|
90
|
+
|
91
|
+
require 'sprockets/source_map_processor'
|
92
|
+
register_mime_type 'application/js-sourcemap+json', extensions: ['.js.map']
|
93
|
+
register_mime_type 'application/css-sourcemap+json', extensions: ['.css.map']
|
94
|
+
register_transformer 'application/javascript', 'application/js-sourcemap+json', SourceMapProcessor
|
95
|
+
register_transformer 'text/css', 'application/css-sourcemap+json', SourceMapProcessor
|
83
96
|
|
84
97
|
register_pipeline :source do |env|
|
85
98
|
[]
|
86
99
|
end
|
87
100
|
|
88
|
-
register_pipeline :self do |env, type, file_type
|
89
|
-
env.self_processors_for(type, file_type
|
101
|
+
register_pipeline :self do |env, type, file_type|
|
102
|
+
env.self_processors_for(type, file_type)
|
103
|
+
end
|
104
|
+
|
105
|
+
register_pipeline :default do |env, type, file_type|
|
106
|
+
env.default_processors_for(type, file_type)
|
90
107
|
end
|
91
108
|
|
92
|
-
|
93
|
-
|
109
|
+
require 'sprockets/add_source_map_comment_to_asset_processor'
|
110
|
+
register_pipeline :debug do
|
111
|
+
[AddSourceMapCommentToAssetProcessor]
|
94
112
|
end
|
95
113
|
|
96
114
|
require 'sprockets/directive_processor'
|
97
|
-
register_preprocessor 'text/css', DirectiveProcessor.new(
|
98
|
-
|
99
|
-
)
|
100
|
-
register_preprocessor 'application/javascript', DirectiveProcessor.new(
|
101
|
-
comments: ["//", ["/*", "*/"]] + ["#", ["###", "###"]]
|
102
|
-
)
|
115
|
+
register_preprocessor 'text/css', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
|
116
|
+
register_preprocessor 'application/javascript', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
|
103
117
|
|
104
118
|
require 'sprockets/bundle'
|
105
119
|
register_bundle_processor 'application/javascript', Bundle
|
106
120
|
register_bundle_processor 'text/css', Bundle
|
107
121
|
|
108
|
-
register_bundle_metadata_reducer '*/*', :data, proc { "" }, :concat
|
109
|
-
register_bundle_metadata_reducer 'application/javascript', :data, proc { "" }, Utils.method(:concat_javascript_sources)
|
122
|
+
register_bundle_metadata_reducer '*/*', :data, proc { +"" }, :concat
|
123
|
+
register_bundle_metadata_reducer 'application/javascript', :data, proc { +"" }, Utils.method(:concat_javascript_sources)
|
110
124
|
register_bundle_metadata_reducer '*/*', :links, :+
|
125
|
+
register_bundle_metadata_reducer '*/*', :sources, proc { [] }, :+
|
111
126
|
|
112
127
|
require 'sprockets/closure_compressor'
|
113
128
|
require 'sprockets/sass_compressor'
|
129
|
+
require 'sprockets/sassc_compressor'
|
130
|
+
require 'sprockets/jsminc_compressor'
|
114
131
|
require 'sprockets/uglifier_compressor'
|
115
132
|
require 'sprockets/yui_compressor'
|
116
133
|
register_compressor 'text/css', :sass, SassCompressor
|
134
|
+
register_compressor 'text/css', :sassc, SasscCompressor
|
117
135
|
register_compressor 'text/css', :scss, SassCompressor
|
136
|
+
register_compressor 'text/css', :scssc, SasscCompressor
|
118
137
|
register_compressor 'text/css', :yui, YUICompressor
|
119
138
|
register_compressor 'application/javascript', :closure, ClosureCompressor
|
139
|
+
register_compressor 'application/javascript', :jsmin, JSMincCompressor
|
140
|
+
register_compressor 'application/javascript', :jsminc, JSMincCompressor
|
120
141
|
register_compressor 'application/javascript', :uglifier, UglifierCompressor
|
121
142
|
register_compressor 'application/javascript', :uglify, UglifierCompressor
|
122
143
|
register_compressor 'application/javascript', :yui, YUICompressor
|
123
144
|
|
145
|
+
# Babel, TheFuture™ is now
|
146
|
+
require 'sprockets/babel_processor'
|
147
|
+
register_mime_type 'application/ecmascript-6', extensions: ['.es6'], charset: :unicode
|
148
|
+
register_transformer 'application/ecmascript-6', 'application/javascript', BabelProcessor
|
149
|
+
register_preprocessor 'application/ecmascript-6', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
|
150
|
+
|
124
151
|
# Mmm, CoffeeScript
|
125
152
|
require 'sprockets/coffee_script_processor'
|
126
|
-
|
127
|
-
|
128
|
-
|
153
|
+
register_mime_type 'text/coffeescript', extensions: ['.coffee', '.js.coffee']
|
154
|
+
register_transformer 'text/coffeescript', 'application/javascript', CoffeeScriptProcessor
|
155
|
+
register_preprocessor 'text/coffeescript', DirectiveProcessor.new(comments: ["#", ["###", "###"]])
|
129
156
|
|
130
|
-
# JST
|
157
|
+
# JST processors
|
131
158
|
require 'sprockets/eco_processor'
|
132
159
|
require 'sprockets/ejs_processor'
|
133
160
|
require 'sprockets/jst_processor'
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
# CSS
|
141
|
-
require 'sprockets/
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
161
|
+
register_mime_type 'text/eco', extensions: ['.eco', '.jst.eco']
|
162
|
+
register_mime_type 'text/ejs', extensions: ['.ejs', '.jst.ejs']
|
163
|
+
register_transformer 'text/eco', 'application/javascript+function', EcoProcessor
|
164
|
+
register_transformer 'text/ejs', 'application/javascript+function', EjsProcessor
|
165
|
+
register_transformer 'application/javascript+function', 'application/javascript', JstProcessor
|
166
|
+
|
167
|
+
# CSS processors
|
168
|
+
require 'sprockets/sassc_processor'
|
169
|
+
register_mime_type 'text/sass', extensions: ['.sass', '.css.sass']
|
170
|
+
register_mime_type 'text/scss', extensions: ['.scss', '.css.scss']
|
171
|
+
register_transformer 'text/sass', 'text/css', SasscProcessor
|
172
|
+
register_transformer 'text/scss', 'text/css', ScsscProcessor
|
173
|
+
register_preprocessor 'text/sass', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
|
174
|
+
register_preprocessor 'text/scss', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
|
146
175
|
register_bundle_metadata_reducer 'text/css', :sass_dependencies, Set.new, :+
|
147
176
|
|
148
|
-
#
|
177
|
+
# ERB
|
149
178
|
require 'sprockets/erb_processor'
|
150
|
-
|
179
|
+
register_transformer_suffix(%w(
|
180
|
+
application/ecmascript-6
|
181
|
+
application/javascript
|
182
|
+
application/json
|
183
|
+
application/xml
|
184
|
+
text/coffeescript
|
185
|
+
text/css
|
186
|
+
text/html
|
187
|
+
text/plain
|
188
|
+
text/sass
|
189
|
+
text/scss
|
190
|
+
text/yaml
|
191
|
+
text/eco
|
192
|
+
), 'application/\2+ruby', '.erb', ERBProcessor)
|
193
|
+
|
194
|
+
register_mime_type 'application/html+ruby', extensions: ['.html.erb', '.erb', '.rhtml'], charset: :html
|
195
|
+
register_mime_type 'application/xml+ruby', extensions: ['.xml.erb', '.rxml']
|
196
|
+
|
197
|
+
require 'sprockets/exporters/file_exporter'
|
198
|
+
require 'sprockets/exporters/zlib_exporter'
|
199
|
+
require 'sprockets/exporters/zopfli_exporter'
|
200
|
+
register_exporter '*/*', Exporters::FileExporter
|
201
|
+
register_exporter '*/*', Exporters::ZlibExporter
|
151
202
|
|
152
203
|
register_dependency_resolver 'environment-version' do |env|
|
153
204
|
env.version
|
@@ -161,9 +212,18 @@ module Sprockets
|
|
161
212
|
register_dependency_resolver 'processors' do |env, str|
|
162
213
|
env.resolve_processors_cache_key_uri(str)
|
163
214
|
end
|
215
|
+
register_dependency_resolver 'env' do |env, str|
|
216
|
+
_, var = str.split(':', 2)
|
217
|
+
ENV[var]
|
218
|
+
end
|
164
219
|
|
165
220
|
depend_on 'environment-version'
|
166
221
|
depend_on 'environment-paths'
|
167
|
-
end
|
168
222
|
|
169
|
-
require 'sprockets/
|
223
|
+
require 'sprockets/preprocessors/default_source_map'
|
224
|
+
register_preprocessor 'text/css', Preprocessors::DefaultSourceMap.new
|
225
|
+
register_preprocessor 'application/javascript', Preprocessors::DefaultSourceMap.new
|
226
|
+
|
227
|
+
register_bundle_metadata_reducer 'text/css', :map, proc { |input| { "version" => 3, "file" => PathUtils.split_subpath(input[:load_path], input[:filename]), "sections" => [] } }, SourceMapUtils.method(:concat_source_maps)
|
228
|
+
register_bundle_metadata_reducer 'application/javascript', :map, proc { |input| { "version" => 3, "file" => PathUtils.split_subpath(input[:load_path], input[:filename]), "sections" => [] } }, SourceMapUtils.method(:concat_source_maps)
|
229
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'sprockets/uri_utils'
|
3
|
+
require 'sprockets/path_utils'
|
4
|
+
|
5
|
+
module Sprockets
|
6
|
+
# This is a processor designed to add a source map "comment"
|
7
|
+
# to the bottom of a css or JS file that is serving a source
|
8
|
+
# map. An example of a comment might look like this
|
9
|
+
#
|
10
|
+
# //# application.js-80af0efcc960fc2ac93eda2f7b12e3db40ab360bf6ea269ceed3bea3678326f9.map
|
11
|
+
#
|
12
|
+
# As an asset is built it gets source map information added
|
13
|
+
# to the `asset.to_hash[:metadata][:map]` key. This contains all the
|
14
|
+
# information that is needed to build a source map file.
|
15
|
+
#
|
16
|
+
# To add this comment we must have an asset we can link to.
|
17
|
+
# To do this we ensure that the original aset is loaded, then
|
18
|
+
# we use a use a special mime type. For example `application/js-sourcemap+json`
|
19
|
+
# for a JS source map.
|
20
|
+
#
|
21
|
+
# This will trigger a new asset to be loaded and generated by the
|
22
|
+
# `SourceMapProcessor` processor.
|
23
|
+
#
|
24
|
+
# Finally once we have that file, we can generate a link to it
|
25
|
+
# with it's full fingerprint. This is done and then
|
26
|
+
# added to the original asset as a comment at the bottom.
|
27
|
+
#
|
28
|
+
class AddSourceMapCommentToAssetProcessor
|
29
|
+
def self.call(input)
|
30
|
+
|
31
|
+
case input[:content_type]
|
32
|
+
when "application/javascript"
|
33
|
+
comment = "\n//# sourceMappingURL=%s"
|
34
|
+
map_type = "application/js-sourcemap+json"
|
35
|
+
when "text/css"
|
36
|
+
comment = "\n/*# sourceMappingURL=%s */"
|
37
|
+
map_type = "application/css-sourcemap+json"
|
38
|
+
else
|
39
|
+
fail input[:content_type]
|
40
|
+
end
|
41
|
+
|
42
|
+
env = input[:environment]
|
43
|
+
|
44
|
+
uri, _ = env.resolve!(input[:filename], accept: input[:content_type])
|
45
|
+
asset = env.load(uri)
|
46
|
+
|
47
|
+
uri, _ = env.resolve!(input[:filename], accept: map_type)
|
48
|
+
map = env.load(uri)
|
49
|
+
|
50
|
+
uri, params = URIUtils.parse_asset_uri(input[:uri])
|
51
|
+
uri = env.expand_from_root(params[:index_alias]) if params[:index_alias]
|
52
|
+
path = PathUtils.relative_path_from(PathUtils.split_subpath(input[:load_path], uri), map.digest_path)
|
53
|
+
|
54
|
+
asset.metadata.merge(
|
55
|
+
data: asset.source + (comment % path) + "\n",
|
56
|
+
links: asset.links + [asset.uri, map.uri]
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/sprockets/asset.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'fileutils'
|
2
3
|
require 'sprockets/digest_utils'
|
3
4
|
|
@@ -13,8 +14,7 @@ module Sprockets
|
|
13
14
|
# attributes - Hash of ivars
|
14
15
|
#
|
15
16
|
# Returns Asset.
|
16
|
-
def initialize(
|
17
|
-
@environment = environment
|
17
|
+
def initialize(attributes = {})
|
18
18
|
@attributes = attributes
|
19
19
|
@content_type = attributes[:content_type]
|
20
20
|
@filename = attributes[:filename]
|
@@ -22,7 +22,6 @@ module Sprockets
|
|
22
22
|
@load_path = attributes[:load_path]
|
23
23
|
@logical_path = attributes[:logical_path]
|
24
24
|
@metadata = attributes[:metadata]
|
25
|
-
@mtime = attributes[:mtime]
|
26
25
|
@name = attributes[:name]
|
27
26
|
@source = attributes[:source]
|
28
27
|
@uri = attributes[:uri]
|
@@ -68,6 +67,13 @@ module Sprockets
|
|
68
67
|
logical_path.sub(/\.(\w+)$/) { |ext| "-#{etag}#{ext}" }
|
69
68
|
end
|
70
69
|
|
70
|
+
# Public: Return load path + logical path with digest spliced in.
|
71
|
+
#
|
72
|
+
# Returns String.
|
73
|
+
def full_digest_path
|
74
|
+
File.join(@load_path, digest_path)
|
75
|
+
end
|
76
|
+
|
71
77
|
# Public: Returns String MIME type of asset. Returns nil if type is unknown.
|
72
78
|
attr_reader :content_type
|
73
79
|
|
@@ -80,14 +86,6 @@ module Sprockets
|
|
80
86
|
metadata[:links] || Set.new
|
81
87
|
end
|
82
88
|
|
83
|
-
# Public: Get all internally required assets that were concated into this
|
84
|
-
# asset.
|
85
|
-
#
|
86
|
-
# Returns Array of String asset URIs.
|
87
|
-
def included
|
88
|
-
metadata[:included]
|
89
|
-
end
|
90
|
-
|
91
89
|
# Public: Return `String` of concatenated source.
|
92
90
|
#
|
93
91
|
# Returns String.
|
@@ -120,27 +118,40 @@ module Sprockets
|
|
120
118
|
end
|
121
119
|
alias_method :bytesize, :length
|
122
120
|
|
121
|
+
# Public: Returns String byte digest of source.
|
122
|
+
def digest
|
123
|
+
metadata[:digest]
|
124
|
+
end
|
125
|
+
|
126
|
+
# Private: Return the version of the environment where the asset was generated.
|
127
|
+
def environment_version
|
128
|
+
metadata[:environment_version]
|
129
|
+
end
|
130
|
+
|
123
131
|
# Public: Returns String hexdigest of source.
|
124
132
|
def hexdigest
|
125
|
-
DigestUtils.pack_hexdigest(
|
133
|
+
DigestUtils.pack_hexdigest(digest)
|
126
134
|
end
|
127
135
|
|
128
|
-
# Deprecated: Returns String hexdigest of source.
|
129
|
-
#
|
130
|
-
# In 4.x this will be changed to return a raw Digest byte String.
|
131
|
-
alias_method :digest, :hexdigest
|
132
|
-
|
133
136
|
# Pubic: ETag String of Asset.
|
134
|
-
|
137
|
+
def etag
|
138
|
+
version = environment_version
|
139
|
+
|
140
|
+
if version && version != ""
|
141
|
+
DigestUtils.hexdigest(version + digest)
|
142
|
+
else
|
143
|
+
DigestUtils.pack_hexdigest(digest)
|
144
|
+
end
|
145
|
+
end
|
135
146
|
|
136
147
|
# Public: Returns String base64 digest of source.
|
137
148
|
def base64digest
|
138
|
-
DigestUtils.pack_base64digest(
|
149
|
+
DigestUtils.pack_base64digest(digest)
|
139
150
|
end
|
140
151
|
|
141
152
|
# Public: A "named information" URL for subresource integrity.
|
142
153
|
def integrity
|
143
|
-
DigestUtils.integrity_uri(
|
154
|
+
DigestUtils.integrity_uri(digest)
|
144
155
|
end
|
145
156
|
|
146
157
|
# Public: Add enumerator to allow `Asset` instances to be used as Rack
|
@@ -166,9 +177,6 @@ module Sprockets
|
|
166
177
|
f.write source
|
167
178
|
end
|
168
179
|
|
169
|
-
# Set mtime correctly
|
170
|
-
File.utime(mtime, mtime, filename)
|
171
|
-
|
172
180
|
nil
|
173
181
|
end
|
174
182
|
|